diff --git a/.clang-format b/.clang-format index a27438b0..01be22f 100644 --- a/.clang-format +++ b/.clang-format
@@ -7,6 +7,10 @@ # 'int>>' if the file already contains at least one such instance.) Standard: Cpp11 +# TODO(crbug.com/1392808): Remove when InsertBraces has been upstreamed into +# the Chromium style (is implied by BasedOnStyle: Chromium). +InsertBraces: true + # Make sure code like: # IPC_BEGIN_MESSAGE_MAP() # IPC_MESSAGE_HANDLER(WidgetHostViewHost_Update, OnUpdate)
diff --git a/DEPS b/DEPS index c86c4a63..6cbded9 100644 --- a/DEPS +++ b/DEPS
@@ -295,19 +295,19 @@ # 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': 'c83eef7dc2a3a40f8e7906fb0f764342c4c36c6b', + 'skia_revision': 'de56cc19134e4b1c835583155e74b4e812f742ad', # 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': 'da3ee47c7e2d2dd1251defc21d35595b4241a899', + 'v8_revision': 'e31afd1a18fed5c730f76da3c55c9e46ecf5f205', # 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': '5dc73efc93dc961f8c2b15bf78c1aa6ea3baf617', + 'angle_revision': '004c5c945254061c89872f4384c9798436680911', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': '570d5b7d832752b54930182f22068bcc0bbc6ee9', + 'swiftshader_revision': '22d5e1e91e82d6819dff40edb912ee4fdf8eb8f0', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. @@ -322,7 +322,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:11.20221209.0.1', + 'fuchsia_version': 'version:11.20221213.0.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -342,7 +342,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling NaCl # and whatever else without interference from each other. - 'nacl_revision': '470ca5571c8f3209aa51e3fa6ea530a85037a5cd', + 'nacl_revision': 'a6f37a854ed808d480f7c61f62accbc031bf348b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -366,7 +366,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '20cf5c69af5d31638182e2a5ab2093dea67ffbc9', + 'catapult_revision': 'ded67ba37049be4ac9843d1000aa6277f468a898', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -434,7 +434,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling nearby # and whatever else without interference from each other. - 'nearby_revision': 'f73b23e720a9c587e1d4663b77775edb30aed4ae', + 'nearby_revision': '228e52e9796e640068b4c64af9fef8870499bed0', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling securemessage # and whatever else without interference from each other. @@ -474,7 +474,7 @@ # If you change this, also update the libc++ revision in # //buildtools/deps_revisions.gni. - 'libcxx_revision': 'c9944183144174e86d5edef03e81a38cd13db4c9', + 'libcxx_revision': '19ffb9c00636bcabb6c6ce76ccaa4370583d3649', # GN CIPD package version. 'gn_version': 'git_revision:5e19d2fb166fbd4f6f32147fbb2f497091a54ad8', @@ -764,12 +764,12 @@ 'src/clank': { 'url': 'https://chrome-internal.googlesource.com/clank/internal/apps.git' + '@' + - '3f25119743363dffaf4a9954bf0b6b33d8bc8cfb', + '91190c3f69987da0b849113f8fe8c940074d18af', 'condition': 'checkout_android and checkout_src_internal', }, 'src/docs/website': { - 'url': Var('chromium_git') + '/website.git' + '@' + '1922effc3b5149dec4cd14c87385055eb75f646f', + 'url': Var('chromium_git') + '/website.git' + '@' + 'cb8b9d916655869fa42a92ebe431d3615b4e5606', }, 'src/ios/third_party/earl_grey2/src': { @@ -863,7 +863,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': '3Dr0CT16nfqgz5Zw_lLuQLTBd-L4xDSFe89ZUT4fpOsC', + 'version': '2Qa-4VYN4gTvNeC6SKF9vMGD7jCJqrxWw7b0wFYMzacC', }, ], 'dep_type': 'cipd', @@ -874,7 +874,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'GBALVTAo7kcv4I1rCDvZ4XvU-wvAd1bXNgFhBhqP3m8C', + 'version': 'N29oCTqJ7Uv24JlDVIfMZdAdXy5PoUTsYfzYVyUCPZIC', }, ], 'dep_type': 'cipd', @@ -885,7 +885,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': 'bXMO7KXi5R5EzcZLRDlwlCIKhaK4a4ZNCn8p9qHSSKoC', + 'version': '4LFXhe8B-cXCMACA99kCrdi6f8hHnM_lyTV5Erqfo7kC', }, ], 'dep_type': 'cipd', @@ -953,7 +953,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'idkbht2PgWimRkZpE0xUViXvBvgDrBrXybFO9U-c2owC', + 'version': 'K9PA12b_FuhgB0jJXPH85QgY2gXlmHuKOH3eafCUTl8C', }, ], 'condition': 'checkout_android', @@ -1778,7 +1778,7 @@ 'dep_type': 'cipd', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@996899e7e718b9977ce84e3d9ad8273cc5fde0dd', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@15f0a4cfeec07e06308f49f5acc79d2050c17ac9', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907', @@ -1818,7 +1818,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'ae20ffa292e10f6761cff57b71e925802a93c3bd', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'b02a8f5a7cb432782fa23afc1cdad3bb1ee5a165', + Var('webrtc_git') + '/src.git' + '@' + '28b7b2458c60d17ea949abd76d2effa58130329b', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -1888,7 +1888,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@da9f92d8cf2a95e23e5f202e4c3b2913d69b5d04', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@aa9e14ed2cf639efbdc83df03c5cd6c2864df520', 'condition': 'checkout_src_internal', }, @@ -1918,7 +1918,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': '7jO7gPmGfS7CB64i7pmCjCHgWE_nRYZkU3KbTfzv0gkC', + 'version': 'xrrNKXfzoDm8PSoYu3YXfPsqjv5_iFWgCrqAXPb3pw4C', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/WATCHLISTS b/WATCHLISTS index c4efb9a..af13a47 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -2808,8 +2808,7 @@ 'multipaste': ['andrewxu+watch-multipaste@google.com', 'ckincaid+watch-multipaste@google.com', 'dmblack+watch-multipaste@google.com', - 'multipaste-eng+reviews@google.com', - 'newcomer+watch-multipaste@google.com'], + 'multipaste-eng+reviews@google.com'], 'nacl': ['native-client-reviews@googlegroups.com'], 'native_client_sdk': ['binji+watch@chromium.org', 'sbc@chromium.org'],
diff --git a/android_webview/browser/aw_client_hints_controller_delegate.cc b/android_webview/browser/aw_client_hints_controller_delegate.cc index 93ecc29..4898d08 100644 --- a/android_webview/browser/aw_client_hints_controller_delegate.cc +++ b/android_webview/browser/aw_client_hints_controller_delegate.cc
@@ -12,6 +12,7 @@ #include "content/public/browser/client_hints_controller_delegate.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" +#include "services/network/public/cpp/client_hints.h" #include "services/network/public/cpp/is_potentially_trustworthy.h" #include "services/network/public/cpp/network_quality_tracker.h" #include "third_party/blink/public/common/client_hints/enabled_client_hints.h" @@ -126,6 +127,7 @@ } // Assemble and store the list if no issues. + const auto& persistence_started = base::TimeTicks::Now(); base::Value::List client_hints_list; client_hints_list.reserve(client_hints.size()); for (const auto& entry : client_hints) { @@ -139,6 +141,8 @@ ch_per_origin.Set(primary_origin.Serialize(), std::move(client_hints_list)); pref_service_->SetDict(prefs::kClientHintsCachedPerOriginMap, std::move(ch_per_origin)); + network::LogClientHintsPersistenceMetrics(persistence_started, + client_hints.size()); } void AwClientHintsControllerDelegate::SetAdditionalClientHints(
diff --git a/android_webview/browser/gfx/scoped_app_gl_state_restore_impl.cc b/android_webview/browser/gfx/scoped_app_gl_state_restore_impl.cc index c57842d..e014332 100644 --- a/android_webview/browser/gfx/scoped_app_gl_state_restore_impl.cc +++ b/android_webview/browser/gfx/scoped_app_gl_state_restore_impl.cc
@@ -300,9 +300,6 @@ if (gl::g_current_gl_driver->fn.glWindowRectanglesEXTFn) glWindowRectanglesEXT(GL_EXCLUSIVE_EXT, 0, nullptr); - if (gl::g_current_gl_driver->fn.glCoverageModulationNVFn) - glCoverageModulationNV(GL_NONE); - if (g_supports_arm_shader_framebuffer_fetch) GLEnableDisable(GL_FETCH_PER_SAMPLE_ARM, fetch_per_sample_arm_enabled_);
diff --git a/android_webview/common/aw_features.cc b/android_webview/common/aw_features.cc index ea893b9..e0c11682 100644 --- a/android_webview/common/aw_features.cc +++ b/android_webview/common/aw_features.cc
@@ -90,7 +90,7 @@ // measured. BASE_FEATURE(kWebViewMeasureScreenCoverage, "WebViewMeasureScreenCoverage", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); // Field trial feature for controlling support of Origin Trials on WebView. BASE_FEATURE(kWebViewOriginTrials,
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java index ee18c8a..24dee108 100644 --- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java +++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -354,6 +354,9 @@ "If enabled, images can be dragged out from Webview"), Flag.baseFeature(BlinkFeatures.WEB_RTC_COMBINED_NETWORK_AND_WORKER_THREAD, "Combines WebRTC's worker thread and network thread onto a single thread."), + Flag.baseFeature(ContentSwitches.DISABLE_DOMAIN_BLOCKING_FOR3DAP_IS, + "Disable the per-domain blocking for 3D APIs after GPU reset. " + + "This switch is intended only for tests."), // Add new commandline switches and features above. The final entry should have a // trailing comma for cleaner diffs. };
diff --git a/android_webview/test/components/run_webview_component_smoketest.pydeps b/android_webview/test/components/run_webview_component_smoketest.pydeps index d36066ea..e03269b 100644 --- a/android_webview/test/components/run_webview_component_smoketest.pydeps +++ b/android_webview/test/components/run_webview_component_smoketest.pydeps
@@ -244,6 +244,7 @@ //third_party/catapult/telemetry/telemetry/internal/platform/fuchsia_platform_backend.py //third_party/catapult/telemetry/telemetry/internal/platform/gpu_device.py //third_party/catapult/telemetry/telemetry/internal/platform/gpu_info.py +//third_party/catapult/telemetry/telemetry/internal/platform/linux_based_device.py //third_party/catapult/telemetry/telemetry/internal/platform/linux_based_platform_backend.py //third_party/catapult/telemetry/telemetry/internal/platform/network_controller_backend.py //third_party/catapult/telemetry/telemetry/internal/platform/platform_backend.py
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 6ca0fd7a8..321c6f6 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -338,6 +338,8 @@ "capture_mode/key_item_view.h", "capture_mode/recording_overlay_controller.cc", "capture_mode/recording_overlay_controller.h", + "capture_mode/recording_type_menu_view.cc", + "capture_mode/recording_type_menu_view.h", "capture_mode/stop_recording_button_tray.cc", "capture_mode/stop_recording_button_tray.h", "capture_mode/user_nudge_controller.cc", @@ -1930,8 +1932,11 @@ "system/usb_peripheral/usb_peripheral_notification_controller.h", "system/user/login_status.cc", "system/user/login_status.h", - "system/video_conference/bubble/video_conference_bubble.cc", - "system/video_conference/bubble/video_conference_bubble.h", + "system/video_conference/bubble/bubble_view.cc", + "system/video_conference/bubble/bubble_view.h", + "system/video_conference/bubble/bubble_view_ids.h", + "system/video_conference/bubble/return_to_app_button.cc", + "system/video_conference/bubble/return_to_app_button.h", "system/video_conference/effects/fake_video_conference_effects.cc", "system/video_conference/effects/fake_video_conference_effects.h", "system/video_conference/effects/video_conference_tray_effects_delegate.cc", @@ -2774,6 +2779,7 @@ "capture_mode/capture_mode_test_util.cc", "capture_mode/capture_mode_test_util.h", "capture_mode/capture_mode_unittests.cc", + "capture_mode/gif_recording_unittests.cc", "child_accounts/parent_access_controller_impl_unittest.cc", "clipboard/clipboard_history_controller_unittest.cc", "clipboard/clipboard_history_resource_manager_unittest.cc",
diff --git a/ash/accessibility/magnifier/fullscreen_magnifier_controller.cc b/ash/accessibility/magnifier/fullscreen_magnifier_controller.cc index 3e2ae5f4..64148b3 100644 --- a/ash/accessibility/magnifier/fullscreen_magnifier_controller.cc +++ b/ash/accessibility/magnifier/fullscreen_magnifier_controller.cc
@@ -672,17 +672,42 @@ // calculates where the center point of the magnified region should be, // such that where the cursor is located in the magnified region corresponds // in proportion to where the cursor is located on the screen overall. + + // Screen size. const gfx::Size host_size_in_dip = GetHostSizeDIP(); - const gfx::SizeF window_size_in_dip = GetWindowRectDIP(scale_).size(); + + // Mouse position. const float x = location_in_dip.x(); const float y = location_in_dip.y(); - const int center_point_in_dip_x = - x - x * window_size_in_dip.width() / host_size_in_dip.width() + - window_size_in_dip.width() / 2; - const int center_point_in_dip_y = - y - y * window_size_in_dip.height() / host_size_in_dip.height() + - window_size_in_dip.height() / 2; + // Viewport dimensions for calculation, increased by variable padding: + // The cursor can never reach the bottom or right of the screen, it's always + // at least one DIP away so that you can see it. (Note the cursor can reach + // the top left at (0, 0)). Calculate the viewport size, adding some scaled + // viewport padding as we move down and right so that the padding 0 in the + // top/left and greater in the bottom right to account for the cursor not + // being able to access the bottom corner. + const float height = + host_size_in_dip.height() / scale_ + 4 * y / host_size_in_dip.height(); + const float width = + host_size_in_dip.width() / scale_ + 4 * x / host_size_in_dip.width(); + + // The viewport center point is the mouse center point, minus the scaled + // mouse center point to get to the viewport left/top edge, plus half + // the viewport size. + // In the example below, the host size is 12 units in width, the + // mouse point x is at 7, and the viewport width is 3 (scale is 4.0). + // The center_point_in_dip_x should be 6, with some integer rounding. + // 6 = int(7 - (7 / 4.0) + (3 / 2.0)) + // ____________ + // | | host + // | ___ | + // | | *| | <-- mouse x = 7, viewport width = 3 + // | |___| | + // |____________| + // 012345678901 <-- Indexes + const int center_point_in_dip_x = x - x / scale_ + width / 2.0; + const int center_point_in_dip_y = y - y / scale_ + height / 2.0; center_point_in_dip = {center_point_in_dip_x, center_point_in_dip_y}; } @@ -691,7 +716,7 @@ keyboard::KeyboardUIController::Get()->IsKeyboardVisible(); MoveMagnifierWindowFollowPoint(center_point_in_dip, x_margin, y_margin, - x_margin, y_margin, reduce_bottom_margin); + reduce_bottom_margin); } void FullscreenMagnifierController::AfterAnimationMoveCursorTo( @@ -716,7 +741,7 @@ } gfx::RectF FullscreenMagnifierController::GetWindowRectDIP(float scale) const { - const gfx::Size size_in_dip = root_window_->bounds().size(); + const gfx::Size size_in_dip = GetHostSizeDIP(); const float width = size_in_dip.width() / scale; const float height = size_in_dip.height() / scale; @@ -813,50 +838,45 @@ void FullscreenMagnifierController::MoveMagnifierWindowFollowPoint( const gfx::Point& point, - int x_panning_margin, - int y_panning_margin, - int x_target_margin, - int y_target_margin, + int x_margin, + int y_margin, bool reduce_bottom_margin) { DCHECK(root_window_); bool start_zoom = false; + // Current position. const gfx::Rect window_rect = GetViewportRect(); - const int left = window_rect.x(); - const int right = window_rect.right(); - - int x_diff = 0; - if (point.x() < left + x_panning_margin) { - // Panning left. - x_diff = point.x() - (left + x_target_margin); - start_zoom = true; - } else if (right - x_panning_margin < point.x()) { - // Panning right. - x_diff = point.x() - (right - x_target_margin); - start_zoom = true; - } - int x = left + x_diff; - const int top = window_rect.y(); const int bottom = window_rect.bottom(); + int x_diff = 0; + if (point.x() < window_rect.x() + x_margin) { + // Panning left. + x_diff = point.x() - (window_rect.x() + x_margin); + start_zoom = true; + } else if (point.x() > window_rect.right() - x_margin) { + // Panning right. + x_diff = point.x() - (window_rect.right() - x_margin); + start_zoom = true; + } + int x = window_rect.x() + x_diff; + // If |reduce_bottom_margin| is true, use kKeyboardBottomPanningMargin instead - // of |y_panning_margin|. This is to prevent the magnifier from panning when + // of |y_margin|. This is to prevent the magnifier from panning when // the user is trying to interact with the bottom of the keyboard. - const int bottom_panning_margin = reduce_bottom_margin - ? kKeyboardBottomPanningMargin / scale_ - : y_panning_margin; + const int bottom_panning_margin = + reduce_bottom_margin ? kKeyboardBottomPanningMargin / scale_ : y_margin; int y_diff = 0; - if (point.y() < top + y_panning_margin) { + if (point.y() < top + y_margin) { // Panning up. - y_diff = point.y() - (top + y_target_margin); + y_diff = point.y() - (top + y_margin); start_zoom = true; } else if (bottom - bottom_panning_margin < point.y()) { // Panning down. const int bottom_target_margin = - reduce_bottom_margin ? std::min(bottom_panning_margin, y_target_margin) - : y_target_margin; + reduce_bottom_margin ? std::min(bottom_panning_margin, y_margin) + : y_margin; y_diff = point.y() - (bottom - bottom_target_margin); start_zoom = true; }
diff --git a/ash/accessibility/magnifier/fullscreen_magnifier_controller.h b/ash/accessibility/magnifier/fullscreen_magnifier_controller.h index 001026f..65ab4ae 100644 --- a/ash/accessibility/magnifier/fullscreen_magnifier_controller.h +++ b/ash/accessibility/magnifier/fullscreen_magnifier_controller.h
@@ -224,17 +224,16 @@ bool ProcessGestures(); // Moves the viewport when |point| is located within - // |x_panning_margin| and |y_panning_margin| to the edge of the visible + // |x_margin| and |y_margin| to the edge of the visible // window region. The viewport will be moved so that the |point| will be - // moved to the point where it has |x_target_margin| and |y_target_margin| - // to the edge of the visible region. If |reduce_bottom_margin| is true, - // then a reduced value will be used as the |y_panning_margin| and + // moved to the point where it has |x_margin| and |y_margin| + // to the edge of the visible region if possible (less if the mouse is closer + // to the edge of the screen). If |reduce_bottom_margin| is true, + // then a reduced value will be used as the |y_margin| and // |y_target_margin| for the bottom edge. void MoveMagnifierWindowFollowPoint(const gfx::Point& point, - int x_panning_margin, - int y_panning_margin, - int x_target_margin, - int y_target_margin, + int x_margin, + int y_margin, bool reduce_bottom_margin); // Moves the viewport to center |point| in magnifier screen.
diff --git a/ash/accessibility/magnifier/fullscreen_magnifier_controller_unittest.cc b/ash/accessibility/magnifier/fullscreen_magnifier_controller_unittest.cc index d43b258..08623a2 100644 --- a/ash/accessibility/magnifier/fullscreen_magnifier_controller_unittest.cc +++ b/ash/accessibility/magnifier/fullscreen_magnifier_controller_unittest.cc
@@ -1041,4 +1041,43 @@ EXPECT_NE(viewport_center, GetViewport().CenterPoint()); } +TEST_F(FullscreenMagnifierControllerTest, ContinuousFollowingReachesEdges) { + auto* magnifier = GetFullscreenMagnifierController(); + magnifier->SetEnabled(true); + float scale = 10.0; + magnifier->SetScale(scale, /*animate=*/false); + magnifier->set_mouse_following_mode(MagnifierMouseFollowingMode::kContinuous); + ui::test::EventGenerator* event_generator = GetEventGenerator(); + + gfx::Point top_left(0, 0); + gfx::Point top_right(kRootWidth - 2, 0); + gfx::Point bottom_left(0, kRootHeight - 2); + gfx::Point bottom_right(kRootWidth - 2, kRootHeight - 2); + + // Move until viewport upper left corner is at (0, 0). + // The generator moves the mouse within the scaled window, + // so it takes several iterations to get to the top corner. + while (GetViewport().ToString() != "0,0 80x60") { + event_generator->MoveMouseToInHost(top_left); + } + // Reset out of the corner a bit. + gfx::Point center(400, 300); + event_generator->MoveMouseToInHost(center); + + // Move until viewport is all the way at the top right. + while (GetViewport().ToString() != "720,0 80x60") { + event_generator->MoveMouseToInHost(top_right); + } + event_generator->MoveMouseToInHost(center); + + while (GetViewport().ToString() != "0,540 80x60") { + event_generator->MoveMouseToInHost(bottom_left); + } + event_generator->MoveMouseToInHost(center); + + while (GetViewport().ToString() != "720,540 80x60") { + event_generator->MoveMouseToInHost(bottom_right); + } +} + } // namespace ash
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc index 78905fb46d..504c0a98 100644 --- a/ash/app_list/app_list_controller_impl.cc +++ b/ash/app_list/app_list_controller_impl.cc
@@ -809,8 +809,6 @@ bubble_presenter_->Dismiss(); - fullscreen_presenter_->OnTabletModeChanged(true); - // Show the app list if the tablet mode starts. if (Shell::Get()->session_controller()->GetSessionState() == session_manager::SessionState::ACTIVE) { @@ -845,7 +843,6 @@ window && RootWindowController::ForWindow(window) ->GetShelfLayoutManager() ->HasVisibleWindow()); - fullscreen_presenter_->OnTabletModeChanged(false); UpdateFullscreenLauncherContainer(); // Dismiss the app list if the tablet mode ends.
diff --git a/ash/app_list/app_list_controller_impl_unittest.cc b/ash/app_list/app_list_controller_impl_unittest.cc index 86d224d2..2a75f06 100644 --- a/ash/app_list/app_list_controller_impl_unittest.cc +++ b/ash/app_list/app_list_controller_impl_unittest.cc
@@ -254,12 +254,12 @@ Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); PopulateItem(30); - ShowAppListNow(AppListViewState::kFullscreenAllApps); - PagedAppsGridView* apps_grid_view = GetAppsGridView(); apps_grid_view->pagination_model()->SelectPage(1, false /* animate */); - DismissAppListNow(); + // Create a test window to hide the app list. + std::unique_ptr<views::Widget> dummy = CreateTestWidget(); + EXPECT_FALSE(Shell::Get()->app_list_controller()->IsVisible()); // When timer is not skipped the selected page should not change when app list // is closed. @@ -268,15 +268,38 @@ // Skip the page reset timer to simulate timer exipration. GetAppListView()->SetSkipPageResetTimerForTesting(true); - ShowAppListNow(AppListViewState::kFullscreenAllApps); + dummy->Minimize(); + + EXPECT_TRUE(Shell::Get()->app_list_controller()->IsVisible()); EXPECT_EQ(1, apps_grid_view->pagination_model()->selected_page()); - DismissAppListNow(); + + dummy->Show(); + EXPECT_FALSE(Shell::Get()->app_list_controller()->IsVisible()); // Once the app list is closed, the page should be reset when the timer is // skipped. EXPECT_EQ(0, apps_grid_view->pagination_model()->selected_page()); } +TEST_F(AppListControllerImplTest, PagePersistanceTabletModeTest) { + PopulateItem(30); + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); + + EXPECT_TRUE(Shell::Get()->app_list_controller()->IsVisible()); + + PagedAppsGridView* const apps_grid_view = GetAppsGridView(); + apps_grid_view->pagination_model()->SelectPage(1, false /* animate */); + + // Close and re-open the app list to ensure the current page persists. + std::unique_ptr<views::Widget> dummy = CreateTestWidget(); + EXPECT_FALSE(Shell::Get()->app_list_controller()->IsVisible()); + dummy->Minimize(); + EXPECT_TRUE(Shell::Get()->app_list_controller()->IsVisible()); + + // The current page should not be reset for the tablet mode app list. + EXPECT_EQ(1, apps_grid_view->pagination_model()->selected_page()); +} + // Verifies that the the virtual keyboard does not get shown if the search box // is activated by user typing when the app list in the fullscreen state in // tablet mode. @@ -840,7 +863,7 @@ ui::ScopedAnimationDurationScaleMode non_zero_duration_mode( ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); - ShowAppListNow(AppListViewState::kFullscreenAllApps); + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); SearchBoxView* const search_box = GetSearchBoxView(); @@ -850,7 +873,7 @@ // If the app list is closed while the animation is still in progress, the // search box opacity should animate from the current opacity. - DismissAppListNow(); + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(false); EXPECT_EQ(0.0f, search_box->layer()->opacity()); EXPECT_EQ(0.0f, search_box->layer()->GetTargetOpacity()); @@ -858,7 +881,7 @@ search_box->layer()->GetAnimator()->StopAnimating(); // When show again, verify the app list animates from 0 opacity again. - ShowAppListNow(AppListViewState::kFullscreenAllApps); + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); EXPECT_EQ(0.0f, search_box->layer()->opacity()); EXPECT_EQ(1.0f, search_box->layer()->GetTargetOpacity()); @@ -868,14 +891,14 @@ // Search box opacity animates from the current (full opacity) when closed // from shown state. - DismissAppListNow(); + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(false); EXPECT_EQ(1.0f, search_box->layer()->opacity()); EXPECT_EQ(0.0f, search_box->layer()->GetTargetOpacity()); // If the app list is show again during close animation, the search box // opacity should animate from the current value. - ShowAppListNow(AppListViewState::kFullscreenAllApps); + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); EXPECT_EQ(1.0f, search_box->layer()->opacity()); EXPECT_EQ(1.0f, search_box->layer()->GetTargetOpacity());
diff --git a/ash/app_list/app_list_metrics.cc b/ash/app_list/app_list_metrics.cc index 96e4ad7..793b7bdd 100644 --- a/ash/app_list/app_list_metrics.cc +++ b/ash/app_list/app_list_metrics.cc
@@ -28,12 +28,8 @@ int g_continue_file_removals_in_session = 0; // The UMA histogram that logs smoothness of pagination animation. -constexpr char kPaginationTransitionAnimationSmoothness[] = - "Apps.PaginationTransition.AnimationSmoothness"; constexpr char kPaginationTransitionAnimationSmoothnessInTablet[] = "Apps.PaginationTransition.AnimationSmoothness.TabletMode"; -constexpr char kPaginationTransitionAnimationSmoothnessInClamshell[] = - "Apps.PaginationTransition.AnimationSmoothness.ClamshellMode"; // The UMA histogram that logs which state search results are opened from. constexpr char kAppListSearchResultOpenSourceHistogram[] = @@ -438,17 +434,9 @@ return false; } -void ReportPaginationSmoothness(bool is_tablet_mode, int smoothness) { - UMA_HISTOGRAM_PERCENTAGE(kPaginationTransitionAnimationSmoothness, +void ReportPaginationSmoothness(int smoothness) { + UMA_HISTOGRAM_PERCENTAGE(kPaginationTransitionAnimationSmoothnessInTablet, smoothness); - - if (is_tablet_mode) { - UMA_HISTOGRAM_PERCENTAGE(kPaginationTransitionAnimationSmoothnessInTablet, - smoothness); - } else { - UMA_HISTOGRAM_PERCENTAGE( - kPaginationTransitionAnimationSmoothnessInClamshell, smoothness); - } } void ReportCardifiedSmoothness(bool is_entering_cardified, int smoothness) {
diff --git a/ash/app_list/app_list_metrics.h b/ash/app_list/app_list_metrics.h index 7ea6822b..40ce3a54 100644 --- a/ash/app_list/app_list_metrics.h +++ b/ash/app_list/app_list_metrics.h
@@ -238,7 +238,7 @@ ASH_EXPORT bool IsCommandIdAnAppLaunch(int command_id); -ASH_EXPORT void ReportPaginationSmoothness(bool is_tablet_mode, int smoothness); +ASH_EXPORT void ReportPaginationSmoothness(int smoothness); ASH_EXPORT void ReportCardifiedSmoothness(bool is_entering_cardified, int smoothness);
diff --git a/ash/app_list/app_list_presenter_impl.cc b/ash/app_list/app_list_presenter_impl.cc index 1da9e72..e689548 100644 --- a/ash/app_list/app_list_presenter_impl.cc +++ b/ash/app_list/app_list_presenter_impl.cc
@@ -516,16 +516,6 @@ return false; } -void AppListPresenterImpl::OnTabletModeChanged(bool started) { - if (started) { - if (GetTargetVisibility()) - view_->OnTabletModeChanged(true); - } else { - if (IsVisibleDeprecated()) - view_->OnTabletModeChanged(false); - } -} - //////////////////////////////////////////////////////////////////////////////// // AppListPresenterImpl, private:
diff --git a/ash/app_list/app_list_presenter_impl.h b/ash/app_list/app_list_presenter_impl.h index f1971cea..5e7a0ef 100644 --- a/ash/app_list/app_list_presenter_impl.h +++ b/ash/app_list/app_list_presenter_impl.h
@@ -140,9 +140,6 @@ // Returns current visibility of the Assistant page. bool IsShowingEmbeddedAssistantUI() const; - // Called when tablet mode starts and ends. - void OnTabletModeChanged(bool started); - private: // Sets the app list view and attempts to show it. void SetView(AppListView* view);
diff --git a/ash/app_list/views/app_list_bubble_view.cc b/ash/app_list/views/app_list_bubble_view.cc index 1b1dea0..b252715b 100644 --- a/ash/app_list/views/app_list_bubble_view.cc +++ b/ash/app_list/views/app_list_bubble_view.cc
@@ -294,7 +294,7 @@ ApplicationDragAndDropHost* drag_and_drop_host) { auto folder_view = std::make_unique<AppListFolderView>( this, apps_page_->scrollable_apps_grid_view(), a11y_announcer_.get(), - view_delegate_); + view_delegate_, /*tablet_mode=*/false); folder_view->items_grid_view()->SetDragAndDropHostOfCurrentAppList( drag_and_drop_host); folder_view->UpdateAppListConfig(GetAppListConfig());
diff --git a/ash/app_list/views/app_list_folder_view.cc b/ash/app_list/views/app_list_folder_view.cc index 5d32d5f..2c25d26 100644 --- a/ash/app_list/views/app_list_folder_view.cc +++ b/ash/app_list/views/app_list_folder_view.cc
@@ -647,7 +647,8 @@ AppListFolderView::AppListFolderView(AppListFolderController* folder_controller, AppsGridView* root_apps_grid_view, AppListA11yAnnouncer* a11y_announcer, - AppListViewDelegate* view_delegate) + AppListViewDelegate* view_delegate, + bool tablet_mode) : folder_controller_(folder_controller), root_apps_grid_view_(root_apps_grid_view), a11y_announcer_(a11y_announcer), @@ -672,7 +673,7 @@ contents_container_ = AddChildView(std::make_unique<views::View>()); contents_container_->SetPaintToLayer(ui::LAYER_NOT_DRAWN); - CreateScrollableAppsGrid(); + CreateScrollableAppsGrid(tablet_mode); // Create a shadow under `background_view_`. shadow_ = SystemShadow::CreateShadowOnNinePatchLayer( @@ -683,7 +684,7 @@ AppListModelProvider::Get()->AddObserver(this); } -void AppListFolderView::CreateScrollableAppsGrid() { +void AppListFolderView::CreateScrollableAppsGrid(bool tablet_mode) { // The top part of the folder contents is a scrollable apps grid. scroll_view_ = contents_container_->AddChildView( std::make_unique<ScrollViewWithMaxHeight>(this)); @@ -735,7 +736,7 @@ views::MaximumFlexSizeRule::kPreferred)); folder_header_view_ = contents_container_->AddChildView( - std::make_unique<FolderHeaderView>(this)); + std::make_unique<FolderHeaderView>(this, tablet_mode)); folder_header_view_->SetProperty(views::kMarginsKey, gfx::Insets::VH(kFolderHeaderPadding, 0)); @@ -1062,10 +1063,6 @@ } } -void AppListFolderView::OnTabletModeChanged(bool started) { - folder_header_view()->set_tablet_mode(started); -} - void AppListFolderView::OnScrollEvent(ui::ScrollEvent* event) { items_grid_view_->HandleScrollFromParentView( gfx::Vector2d(event->x_offset(), event->y_offset()), event->type());
diff --git a/ash/app_list/views/app_list_folder_view.h b/ash/app_list/views/app_list_folder_view.h index 397658f..9d252901 100644 --- a/ash/app_list/views/app_list_folder_view.h +++ b/ash/app_list/views/app_list_folder_view.h
@@ -55,7 +55,8 @@ AppListFolderView(AppListFolderController* folder_controller, AppsGridView* root_apps_grid_view, AppListA11yAnnouncer* a11y_announcer, - AppListViewDelegate* view_delegate); + AppListViewDelegate* view_delegate, + bool tablet_mode); AppListFolderView(const AppListFolderView&) = delete; AppListFolderView& operator=(const AppListFolderView&) = delete; ~AppListFolderView() override; @@ -169,9 +170,6 @@ // ContentsContainerAnimation. void RecordAnimationSmoothness(); - // Called when tablet mode starts and ends. - void OnTabletModeChanged(bool started); - // views::View: void OnScrollEvent(ui::ScrollEvent* event) override; void OnMouseEvent(ui::MouseEvent* event) override; @@ -202,7 +200,7 @@ private: // Creates a vertically scrollable apps grid view. - void CreateScrollableAppsGrid(); + void CreateScrollableAppsGrid(bool tablet_mode); // Returns the compositor associated to the widget containing this view. // Returns nullptr if there isn't one associated with this widget.
diff --git a/ash/app_list/views/app_list_main_view.cc b/ash/app_list/views/app_list_main_view.cc index 74ea98ad..9d50145 100644 --- a/ash/app_list/views/app_list_main_view.cc +++ b/ash/app_list/views/app_list_main_view.cc
@@ -86,7 +86,7 @@ wm::GetActivationClient( app_list_view_->GetWidget()->GetNativeView()->GetRootWindow()) ->GetActiveWindow(); - if (app_list_view_->is_tablet_mode() && active_window) + if (active_window) GetWidget()->ShowInactive(); else GetWidget()->Show(); @@ -103,14 +103,6 @@ ->pagination_model(); } -void AppListMainView::NotifySearchBoxVisibilityChanged() { - // Repaint the AppListView's background which will repaint the background for - // the search box. This is needed because this view paints to a layer and - // won't propagate paints upward. - if (parent()) - parent()->SchedulePaint(); -} - const char* AppListMainView::GetClassName() const { return "AppListMainView"; }
diff --git a/ash/app_list/views/app_list_main_view.h b/ash/app_list/views/app_list_main_view.h index 7996caf..156b3a9 100644 --- a/ash/app_list/views/app_list_main_view.h +++ b/ash/app_list/views/app_list_main_view.h
@@ -48,9 +48,6 @@ ContentsView* contents_view() const { return contents_view_; } AppListViewDelegate* view_delegate() { return delegate_; } - // Called when the search box's visibility is changed. - void NotifySearchBoxVisibilityChanged(); - // Overridden from views::View: const char* GetClassName() const override; void Layout() override;
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc index 369553c..7f8792ad 100644 --- a/ash/app_list/views/app_list_view.cc +++ b/ash/app_list/views/app_list_view.cc
@@ -124,11 +124,6 @@ const StateAnimationMetricsReporter&) = delete; ~StateAnimationMetricsReporter() = default; - // Sets target state of the transition for metrics. - void SetTargetState(AppListViewState target_state) { - target_state_ = target_state; - } - // Sets tablet animation transition type for metrics. void SetTabletModeAnimationTransition( TabletModeAnimationTransition transition) { @@ -139,36 +134,25 @@ void Reset(); // Gets a callback to report smoothness. - metrics_util::SmoothnessCallback GetReportCallback(bool tablet_mode) { - if (tablet_mode) { - return base::BindRepeating( - &StateAnimationMetricsReporter::RecordMetricsInTablet, - std::move(tablet_transition_)); - } - return base::BindRepeating( - &StateAnimationMetricsReporter::RecordMetricsInClamshell, - std::move(target_state_)); + metrics_util::SmoothnessCallback GetReportCallback() { + return base::BindRepeating(&StateAnimationMetricsReporter::RecordMetrics, + std::move(tablet_transition_)); } private: - static void RecordMetricsInTablet( + static void RecordMetrics( absl::optional<TabletModeAnimationTransition> transition, int value); - static void RecordMetricsInClamshell( - absl::optional<AppListViewState> target_state, - int value); - absl::optional<AppListViewState> target_state_; absl::optional<TabletModeAnimationTransition> tablet_transition_; }; void AppListView::StateAnimationMetricsReporter::Reset() { tablet_transition_.reset(); - target_state_.reset(); } // static -void AppListView::StateAnimationMetricsReporter::RecordMetricsInTablet( +void AppListView::StateAnimationMetricsReporter::RecordMetrics( absl::optional<TabletModeAnimationTransition> tablet_transition, int value) { UMA_HISTOGRAM_PERCENTAGE("Apps.StateTransition.AnimationSmoothness", value); @@ -215,38 +199,6 @@ } } -// static -void AppListView::StateAnimationMetricsReporter::RecordMetricsInClamshell( - absl::optional<AppListViewState> target_state, - int value) { - UMA_HISTOGRAM_PERCENTAGE("Apps.StateTransition.AnimationSmoothness", value); - - // It can't ensure the target transition is properly set. Simply give up - // reporting per-state metrics in that case. See https://crbug.com/954907. - if (!target_state) - return; - - switch (*target_state) { - case AppListViewState::kClosed: - UMA_HISTOGRAM_PERCENTAGE( - "Apps.StateTransition.AnimationSmoothness.Close.ClamshellMode", - value); - break; - case AppListViewState::kFullscreenAllApps: - UMA_HISTOGRAM_PERCENTAGE( - "Apps.StateTransition.AnimationSmoothness.FullscreenAllApps." - "ClamshellMode", - value); - break; - case AppListViewState::kFullscreenSearch: - UMA_HISTOGRAM_PERCENTAGE( - "Apps.StateTransition.AnimationSmoothness.FullscreenSearch." - "ClamshellMode", - value); - break; - } -} - //////////////////////////////////////////////////////////////////////////////// // An animation observer to notify AppListView when animations for an app list // view state transition complete. The observer goes through the following @@ -506,18 +458,15 @@ UpdateWidget(); - if (!disable_contents_reset_when_showing_) { + if (!disable_contents_reset_when_showing_) app_list_main_view_->contents_view()->ResetForShow(); - if (!delegate_->IsInTabletMode()) - SelectInitialAppsPage(); - } SetState(preferred_state); + DCHECK(is_fullscreen()); // Ensures that the launcher won't open underneath the a11y keyboard. CloseKeyboardIfVisible(); - OnTabletModeChanged(delegate_->IsInTabletMode()); app_list_main_view_->ShowAppListWhenReady(); UMA_HISTOGRAM_TIMES("Apps.AppListCreationTime", @@ -530,11 +479,6 @@ app_list_main_view_->SetDragAndDropHostOfCurrentAppList(drag_and_drop_host); } -void AppListView::Dismiss() { - CloseKeyboardIfVisible(); - delegate_->DismissAppList(); -} - void AppListView::CloseOpenedPage() { if (HandleCloseOpenFolder()) return; @@ -577,10 +521,7 @@ switch (accelerator.key_code()) { case ui::VKEY_ESCAPE: case ui::VKEY_BROWSER_BACK: - // If the ContentsView does not handle the back action, then this is the - // top level, so we close the app list. - if (!Back() && !delegate_->IsInTabletMode()) - Dismiss(); + Back(); break; default: NOTREACHED(); @@ -624,7 +565,7 @@ } void AppListView::UpdatePageResetTimer(bool app_list_visibility) { - if (app_list_visibility || !delegate_->IsInTabletMode()) { + if (app_list_visibility) { page_reset_timer_.Stop(); return; } @@ -682,10 +623,6 @@ event->AsGestureEvent()->type() == ui::ET_GESTURE_TWO_FINGER_TAP)) || (event->IsMouseEvent() && event->AsMouseEvent()->IsOnlyRightMouseButton())) { - // Don't show menus on empty areas of the AppListView in clamshell mode. - if (!delegate_->IsInTabletMode()) - return; - // Home launcher is shown on top of wallpaper with transparent background. // So trigger the wallpaper context menu for the same events. gfx::Point onscreen_location(event->location()); @@ -696,15 +633,8 @@ return; } - if (!search_box_view_->is_search_box_active() && - delegate_->GetCurrentAppListPage() != - AppListState::kStateEmbeddedAssistant) { - if (!delegate_->IsInTabletMode()) - Dismiss(); - return; - } - - search_box_view_->ClearSearchAndDeactivateSearchBox(); + if (search_box_view_->is_search_box_active()) + search_box_view_->ClearSearchAndDeactivateSearchBox(); } void AppListView::SetChildViewsForStateTransition( @@ -886,14 +816,6 @@ RedirectKeyEventToSearchBox(event); } -void AppListView::OnTabletModeChanged(bool started) { - app_list_main_view_->contents_view()->OnTabletModeChanged(started); - - // Refresh the state if the view is not in a fullscreen state. - if (started && !is_fullscreen()) - SetState(app_list_state_); -} - void AppListView::OnWallpaperColorsChanged() { search_box_view_->OnWallpaperColorsChanged(); } @@ -1102,8 +1024,7 @@ // Reset animation metrics reporter when animation is started. ResetTransitionMetricsReporter(); - if (delegate_->IsInTabletMode() && - target_state != AppListViewState::kClosed) { + if (target_state != AppListViewState::kClosed) { DCHECK(target_state == AppListViewState::kFullscreenAllApps || target_state == AppListViewState::kFullscreenSearch); TabletModeAnimationTransition transition_type = @@ -1112,8 +1033,6 @@ : TabletModeAnimationTransition::kEnterFullscreenSearch; state_animation_metrics_reporter_->SetTabletModeAnimationTransition( transition_type); - } else { - state_animation_metrics_reporter_->SetTargetState(target_state); } ui::ScopedLayerAnimationSettings animation(layer->GetAnimator()); @@ -1200,8 +1119,7 @@ metrics_util::SmoothnessCallback AppListView::GetStateTransitionMetricsReportCallback() { - return state_animation_metrics_reporter_->GetReportCallback( - delegate_->IsInTabletMode()); + return state_animation_metrics_reporter_->GetReportCallback(); } void AppListView::ResetTransitionMetricsReporter() {
diff --git a/ash/app_list/views/app_list_view.h b/ash/app_list/views/app_list_view.h index d73a958..8b1fc27 100644 --- a/ash/app_list/views/app_list_view.h +++ b/ash/app_list/views/app_list_view.h
@@ -160,9 +160,6 @@ void SetDragAndDropHostOfCurrentAppList( ApplicationDragAndDropHost* drag_and_drop_host); - // Dismisses the UI, cleans up and sets the state to CLOSED. - void Dismiss(); - // Resets the child views before showing the AppListView. void ResetForShow(); @@ -191,9 +188,6 @@ void OnMouseEvent(ui::MouseEvent* event) override; void OnGestureEvent(ui::GestureEvent* event) override; - // Called when tablet mode starts and ends. - void OnTabletModeChanged(bool started); - // Called when the wallpaper colors change. void OnWallpaperColorsChanged(); @@ -280,8 +274,6 @@ app_list_state_ == AppListViewState::kFullscreenSearch; } - bool is_tablet_mode() const { return delegate_->IsInTabletMode(); } - void set_onscreen_keyboard_shown(bool onscreen_keyboard_shown) { onscreen_keyboard_shown_ = onscreen_keyboard_shown; }
diff --git a/ash/app_list/views/app_list_view_unittest.cc b/ash/app_list/views/app_list_view_unittest.cc index 1d8a11ce..9a7c641 100644 --- a/ash/app_list/views/app_list_view_unittest.cc +++ b/ash/app_list/views/app_list_view_unittest.cc
@@ -588,10 +588,7 @@ } void SetAppListState(ash::AppListViewState state) { - if (state == ash::AppListViewState::kClosed) { - view_->Dismiss(); - return; - } + ASSERT_NE(state, ash::AppListViewState::kClosed); view_->SetState(state); } @@ -1637,49 +1634,6 @@ EXPECT_FALSE(apps_container_view->IsInFolderView()); } -// Tests that, in clamshell mode, the current app list page resets to the -// initial page when app list is closed and re-opened. -TEST_F(AppListViewTest, InitialPageResetClamshellModeTest) { - Initialize(false /*is_tablet_mode*/); - - AppListTestModel* model = delegate_->GetTestModel(); - const int kAppListItemNum = - SharedAppListConfig::instance().GetMaxNumOfItemsPerPage() + 1; - model->PopulateApps(kAppListItemNum); - - Show(); - - apps_grid_view()->pagination_model()->SelectPage(1, false /* animate */); - - // Close and re-open the app list to ensure the current page doesn't persist. - view_->SetState(ash::AppListViewState::kClosed); - Show(); - - EXPECT_EQ(0, apps_grid_view()->pagination_model()->selected_page()); -} - -TEST_F(AppListViewTest, PagePersistanceTabletModeTest) { - Initialize(/*is_tablet_mode=*/true); - - AppListTestModel* model = delegate_->GetTestModel(); - const int kAppListItemNum = - SharedAppListConfig::instance().GetMaxNumOfItemsPerPage() + 1; - model->PopulateApps(kAppListItemNum); - - Show(); - EXPECT_EQ(ash::AppListViewState::kFullscreenAllApps, view_->app_list_state()); - - apps_grid_view()->pagination_model()->SelectPage(1, false /* animate */); - - // Close and re-open the app list to ensure the current page persists. - view_->SetState(ash::AppListViewState::kClosed); - Show(); - EXPECT_EQ(ash::AppListViewState::kFullscreenAllApps, view_->app_list_state()); - - // The current page should not be reset for the tablet mode app list. - EXPECT_EQ(1, apps_grid_view()->pagination_model()->selected_page()); -} - // Tests selecting search result to show embedded Assistant UI. TEST_P(AppListViewFocusTest, ShowEmbeddedAssistantUI) { Show(); @@ -1716,24 +1670,6 @@ EXPECT_EQ(1, GetTotalOpenAssistantUICount()); } -// Tests that the correct contents is visible in the contents_view upon -// reshowing. See b/142069648 for the details. -TEST_F(AppListViewTest, AppsGridVisibilityOnResetForShow) { - Initialize(/*is_tablet_mode=*/true); - Show(); - - contents_view()->ShowEmbeddedAssistantUI(true); - EXPECT_FALSE(contents_view()->apps_container_view()->GetVisible()); - EXPECT_FALSE(contents_view()->search_result_page_view()->GetVisible()); - EXPECT_TRUE(assistant_page_view()->GetVisible()); - - view_->OnTabletModeChanged(false); - Show(); - EXPECT_TRUE(contents_view()->apps_container_view()->GetVisible()); - EXPECT_FALSE(contents_view()->search_result_page_view()->GetVisible()); - EXPECT_FALSE(assistant_page_view()->GetVisible()); -} - // Tests that pressing escape in embedded Assistant UI returns to fullscreen // if the Assistant UI was launched from fullscreen app list. TEST_F(AppListViewTest, EscapeKeyInEmbeddedAssistantUIReturnsToAppList) {
diff --git a/ash/app_list/views/apps_container_view.cc b/ash/app_list/views/apps_container_view.cc index 65b438d..9bc4bd5 100644 --- a/ash/app_list/views/apps_container_view.cc +++ b/ash/app_list/views/apps_container_view.cc
@@ -303,8 +303,9 @@ std::make_unique<PageSwitcher>(apps_grid_view_->pagination_model()); page_switcher_ = AddChildView(std::move(page_switcher)); - auto app_list_folder_view = std::make_unique<AppListFolderView>( - this, apps_grid_view_, a11y_announcer, view_delegate); + auto app_list_folder_view = + std::make_unique<AppListFolderView>(this, apps_grid_view_, a11y_announcer, + view_delegate, /*tablet_mode=*/true); folder_background_view_ = AddChildView( std::make_unique<FolderBackgroundView>(app_list_folder_view.get())); @@ -761,8 +762,10 @@ // Only play animations if the tablet mode app list is visible. This function // can be called in clamshell mode when the tablet app list is cached. - if (!contents_view_->app_list_view()->is_tablet_mode()) + if (contents_view_->app_list_view()->app_list_state() == + AppListViewState::kClosed) { return; + } // The change in continue container height is the amount by which the apps // grid view will be offset. @@ -862,11 +865,6 @@ animator.Run(default_offset, page_switcher_->layer()); } -void AppsContainerView::OnTabletModeChanged(bool started) { - apps_grid_view_->OnTabletModeChanged(started); - app_list_folder_view_->OnTabletModeChanged(started); -} - void AppsContainerView::Layout() { gfx::Rect rect(GetContentsBounds()); if (rect.IsEmpty()) @@ -884,8 +882,7 @@ top_folder_inset += kFolderMargin; // Account for the hotseat which overlaps with contents bounds in tablet mode. - if (contents_view_->app_list_view()->is_tablet_mode()) - bottom_folder_inset += ShelfConfig::Get()->hotseat_bottom_padding(); + bottom_folder_inset += ShelfConfig::Get()->hotseat_bottom_padding(); folder_bounding_box.Inset(gfx::Insets::TLBR( top_folder_inset, kFolderMargin, bottom_folder_inset, kFolderMargin)); @@ -1544,8 +1541,10 @@ // As the sort update on AppsContainerView can be called in both clamshell // mode and tablet mode, return early if it's currently in clamshell mode // because the AppsContainerView isn't visible. - if (!contents_view_->app_list_view()->is_tablet_mode()) + if (contents_view_->app_list_view()->app_list_state() == + AppListViewState::kClosed) { return; + } // If the sort is done and the toast is visible and not fading out, request // the focus on the undo button on the toast. Otherwise request the focus on
diff --git a/ash/app_list/views/apps_container_view.h b/ash/app_list/views/apps_container_view.h index 12ed5b6..d04e2c5 100644 --- a/ash/app_list/views/apps_container_view.h +++ b/ash/app_list/views/apps_container_view.h
@@ -79,9 +79,6 @@ // |app_list_state|. void UpdateControlVisibility(AppListViewState app_list_state); - // Called when tablet mode starts and ends. - void OnTabletModeChanged(bool started); - // Minimal margin for apps grid within the apps container. Set to ensure there // is enough space to fit page switcher next to the apps grid. int GetMinHorizontalMarginForAppsGrid() const;
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc index 494b335d..35697e2 100644 --- a/ash/app_list/views/apps_grid_view.cc +++ b/ash/app_list/views/apps_grid_view.cc
@@ -1057,12 +1057,6 @@ } } -bool AppsGridView::EventIsBetweenOccupiedTiles(const ui::LocatedEvent* event) { - gfx::Point mirrored_point(GetMirroredXInView(event->location().x()), - event->location().y()); - return IsValidIndex(GetNearestTileIndexForPoint(mirrored_point)); -} - void AppsGridView::Update() { // Abort reorder animation before `view_model_` is cleared. MaybeAbortWholeGridAnimation();
diff --git a/ash/app_list/views/apps_grid_view.h b/ash/app_list/views/apps_grid_view.h index 2ba74027..3b41cfce 100644 --- a/ash/app_list/views/apps_grid_view.h +++ b/ash/app_list/views/apps_grid_view.h
@@ -179,9 +179,6 @@ // Updates the visibility of app list items according to |app_list_state|. void UpdateControlVisibility(AppListViewState app_list_state); - // Returns true if a touch or click lies between two occupied tiles. - bool EventIsBetweenOccupiedTiles(const ui::LocatedEvent* event); - // Returns the item view of the item with the provided item ID. // Returns nullptr if there is no such item. AppListItemView* GetItemViewForItem(const std::string& item_id);
diff --git a/ash/app_list/views/contents_view.cc b/ash/app_list/views/contents_view.cc index cd9f7939..dc2b43f3 100644 --- a/ash/app_list/views/contents_view.cc +++ b/ash/app_list/views/contents_view.cc
@@ -139,13 +139,12 @@ assistant_page_view_->SetVisible(false); SetActiveState(AppListState::kStateApps, /*animate=*/false); - // In tablet mode, opacity of the elements is controlled by the - // AppListControllerImpl which expects these elements to be opaque. - // Otherwise the contents animate from 0 to 1 so set the initial opacity to 0. - if (app_list_view_->is_tablet_mode()) { + if (app_list_features::IsAnimateScaleOnTabletModeTransitionEnabled() || + app_list_view_->app_list_state() != AppListViewState::kClosed) { AnimateToViewState(AppListViewState::kFullscreenAllApps, base::TimeDelta()); - } else if (!last_target_view_state_.has_value() || - *last_target_view_state_ != AppListViewState::kClosed) { + } else if (app_list_view_->app_list_state() == AppListViewState::kClosed && + (!last_target_view_state_.has_value() || + *last_target_view_state_ != AppListViewState::kClosed)) { AnimateToViewState(AppListViewState::kClosed, base::TimeDelta()); } } @@ -175,10 +174,6 @@ } } -void ContentsView::OnTabletModeChanged(bool started) { - apps_container_view_->OnTabletModeChanged(started); -} - void ContentsView::SetActiveState(AppListState state) { SetActiveState(state, true /*animate*/); } @@ -478,13 +473,11 @@ apps_container_view_->apps_grid_view()->pagination_model(); if (apps_container_view_->IsInFolderView()) { apps_container_view_->app_list_folder_view()->CloseFolderPage(); - } else if (app_list_view_->is_tablet_mode() && - pagination_model->total_pages() > 0 && + } else if (pagination_model->total_pages() > 0 && pagination_model->selected_page() > 0) { bool animate = !ui::ScopedAnimationDurationScaleMode::is_zero(); pagination_model->SelectPage(0, animate); } else { - // Close the app list when Back() is called from the apps page. return false; } break;
diff --git a/ash/app_list/views/contents_view.h b/ash/app_list/views/contents_view.h index adfe6b7..5a6c01f 100644 --- a/ash/app_list/views/contents_view.h +++ b/ash/app_list/views/contents_view.h
@@ -98,9 +98,6 @@ // Called when the target state of AppListView changes. void OnAppListViewTargetStateChanged(AppListViewState target_state); - // Called from AppListView when the tablet mode state changes. - void OnTabletModeChanged(bool started); - // Shows/hides the search results. Hiding the search results will cause the // app list to return to the page that was displayed before // ShowSearchResults(true) was invoked.
diff --git a/ash/app_list/views/folder_header_view.cc b/ash/app_list/views/folder_header_view.cc index 79eff8b..319abd9 100644 --- a/ash/app_list/views/folder_header_view.cc +++ b/ash/app_list/views/folder_header_view.cc
@@ -258,14 +258,15 @@ bool has_mouse_already_entered_ = false; }; -FolderHeaderView::FolderHeaderView(FolderHeaderViewDelegate* delegate) +FolderHeaderView::FolderHeaderView(FolderHeaderViewDelegate* delegate, + bool tablet_mode) : folder_item_(nullptr), folder_name_placeholder_text_( ui::ResourceBundle::GetSharedInstance().GetLocalizedString( IDS_APP_LIST_FOLDER_NAME_PLACEHOLDER)), delegate_(delegate), folder_name_visible_(true), - is_tablet_mode_(false) { + is_tablet_mode_(tablet_mode) { folder_name_view_ = AddChildView(std::make_unique<FolderNameView>(this)); folder_name_view_->SetPlaceholderText(folder_name_placeholder_text_); folder_name_view_->set_controller(this);
diff --git a/ash/app_list/views/folder_header_view.h b/ash/app_list/views/folder_header_view.h index e8584a4..55e4f09 100644 --- a/ash/app_list/views/folder_header_view.h +++ b/ash/app_list/views/folder_header_view.h
@@ -23,7 +23,7 @@ public views::TextfieldController, public AppListItemObserver { public: - explicit FolderHeaderView(FolderHeaderViewDelegate* delegate); + FolderHeaderView(FolderHeaderViewDelegate* delegate, bool tablet_mode); FolderHeaderView(const FolderHeaderView&) = delete; FolderHeaderView& operator=(const FolderHeaderView&) = delete; @@ -35,7 +35,6 @@ bool HasTextFocus() const; void SetTextFocus(); bool is_tablet_mode() const { return is_tablet_mode_; } - void set_tablet_mode(bool started) { is_tablet_mode_ = started; } // views::View: gfx::Size CalculatePreferredSize() const override; @@ -96,7 +95,7 @@ bool folder_name_visible_; - bool is_tablet_mode_; + const bool is_tablet_mode_; // Used to restore the folder name when the user presses the escape key. std::u16string previous_folder_name_;
diff --git a/ash/app_list/views/paged_apps_grid_view.cc b/ash/app_list/views/paged_apps_grid_view.cc index cea2ec56..6423378 100644 --- a/ash/app_list/views/paged_apps_grid_view.cc +++ b/ash/app_list/views/paged_apps_grid_view.cc
@@ -54,11 +54,6 @@ namespace { // Presentation time histogram for apps grid scroll by dragging. -constexpr char kPageDragScrollInClamshellHistogram[] = - "Apps.PaginationTransition.DragScroll.PresentationTime.ClamshellMode"; -constexpr char kPageDragScrollInClamshellMaxLatencyHistogram[] = - "Apps.PaginationTransition.DragScroll.PresentationTime.MaxLatency." - "ClamshellMode"; constexpr char kPageDragScrollInTabletHistogram[] = "Apps.PaginationTransition.DragScroll.PresentationTime.TabletMode"; constexpr char kPageDragScrollInTabletMaxLatencyHistogram[] = @@ -217,18 +212,6 @@ pagination_model_.RemoveObserver(this); } -void PagedAppsGridView::OnTabletModeChanged(bool started) { - // Enable/Disable folder icons's background blur based on tablet mode. - for (const auto& entry : view_model()->entries()) { - auto* item_view = static_cast<AppListItemView*>(entry.view); - if (item_view->item() && item_view->item()->is_folder()) - item_view->SetBackgroundBlurEnabled(started); - } - - // Prevent context menus from remaining open after a transition - CancelContextMenusOnCurrentPage(); -} - void PagedAppsGridView::HandleScrollFromParentView(const gfx::Vector2d& offset, ui::EventType type) { // If |pagination_model_| is empty, don't handle scroll events. @@ -263,21 +246,6 @@ // ui::EventHandler: void PagedAppsGridView::OnGestureEvent(ui::GestureEvent* event) { - // If a tap/long-press occurs within a valid tile, it is usually a mistake and - // should not close the launcher in clamshell mode. Otherwise, we should let - // those events pass to the ancestor views. - if (!IsTabletMode() && (event->type() == ui::ET_GESTURE_TAP || - event->type() == ui::ET_GESTURE_LONG_PRESS)) { - if (EventIsBetweenOccupiedTiles(event)) { - contents_view_->app_list_view()->CloseKeyboardIfVisible(); - event->SetHandled(); - } - return; - } - - if (!ShouldHandleDragEvent(*event)) - return; - // Scroll begin events should not be passed to ancestor views from apps grid // in our current design. This prevents both ignoring horizontal scrolls in // app list, and closing open folders. @@ -287,93 +255,6 @@ } } -void PagedAppsGridView::OnMouseEvent(ui::MouseEvent* event) { - if (IsTabletMode() || !event->IsLeftMouseButton()) - return; - - gfx::PointF point_in_root = event->root_location_f(); - - switch (event->type()) { - case ui::ET_MOUSE_PRESSED: - if (!EventIsBetweenOccupiedTiles(event)) - break; - event->SetHandled(); - mouse_drag_start_point_ = point_in_root; - last_mouse_drag_point_ = point_in_root; - // Manually send the press event to the AppListView to update drag root - // location - contents_view_->app_list_view()->OnMouseEvent(event); - break; - case ui::ET_MOUSE_DRAGGED: - if (!ShouldHandleDragEvent(*event)) { - // We need to send mouse drag/release events to AppListView explicitly - // because AppsGridView handles the mouse press event and gets captured. - // Then AppListView cannot receive mouse drag/release events implcitly. - - // Send the fabricated mouse press event to AppListView if AppsGridView - // is not in mouse drag yet. - gfx::Point drag_location_in_app_list; - if (!is_in_mouse_drag_) { - ui::MouseEvent press_event( - *event, static_cast<views::View*>(this), - static_cast<views::View*>(contents_view_->app_list_view()), - ui::ET_MOUSE_PRESSED, event->flags()); - contents_view_->app_list_view()->OnMouseEvent(&press_event); - - is_in_mouse_drag_ = true; - } - - drag_location_in_app_list = event->location(); - ConvertPointToTarget(this, contents_view_->app_list_view(), - &drag_location_in_app_list); - event->set_location(drag_location_in_app_list); - contents_view_->app_list_view()->OnMouseEvent(event); - break; - } - event->SetHandled(); - if (!is_in_mouse_drag_) { - if (abs(point_in_root.y() - mouse_drag_start_point_.y()) < - kMouseDragThreshold) { - break; - } - pagination_controller_->StartMouseDrag(point_in_root - - mouse_drag_start_point_); - is_in_mouse_drag_ = true; - } - - if (!is_in_mouse_drag_) - break; - - pagination_controller_->UpdateMouseDrag( - point_in_root - last_mouse_drag_point_, GetContentsBounds()); - last_mouse_drag_point_ = point_in_root; - break; - case ui::ET_MOUSE_RELEASED: { - // Calculate |should_handle| before resetting |mouse_drag_start_point_| - // because ShouldHandleDragEvent depends on its value. - const bool should_handle = ShouldHandleDragEvent(*event); - - is_in_mouse_drag_ = false; - mouse_drag_start_point_ = gfx::PointF(); - last_mouse_drag_point_ = gfx::PointF(); - - if (!should_handle) { - gfx::Point drag_location_in_app_list = event->location(); - ConvertPointToTarget(this, contents_view_->app_list_view(), - &drag_location_in_app_list); - event->set_location(drag_location_in_app_list); - contents_view_->app_list_view()->OnMouseEvent(event); - break; - } - event->SetHandled(); - pagination_controller_->EndMouseDrag(*event); - break; - } - default: - return; - } -} - //////////////////////////////////////////////////////////////////////////////// // views::View: @@ -697,7 +578,7 @@ pagination_metrics_tracker_ = GetWidget()->GetCompositor()->RequestNewThroughputTracker(); pagination_metrics_tracker_->Start(metrics_util::ForSmoothness( - base::BindRepeating(&ReportPaginationSmoothness, IsTabletMode()))); + base::BindRepeating(&ReportPaginationSmoothness))); } void PagedAppsGridView::TransitionChanged() { @@ -729,15 +610,9 @@ void PagedAppsGridView::ScrollStarted() { DCHECK(!presentation_time_recorder_); - if (IsTabletMode()) { - presentation_time_recorder_ = CreatePresentationTimeHistogramRecorder( - GetWidget()->GetCompositor(), kPageDragScrollInTabletHistogram, - kPageDragScrollInTabletMaxLatencyHistogram); - } else { - presentation_time_recorder_ = CreatePresentationTimeHistogramRecorder( - GetWidget()->GetCompositor(), kPageDragScrollInClamshellHistogram, - kPageDragScrollInClamshellMaxLatencyHistogram); - } + presentation_time_recorder_ = CreatePresentationTimeHistogramRecorder( + GetWidget()->GetCompositor(), kPageDragScrollInTabletHistogram, + kPageDragScrollInTabletMaxLatencyHistogram); } void PagedAppsGridView::ScrollEnded() { @@ -800,31 +675,6 @@ return rect.size(); } -bool PagedAppsGridView::ShouldHandleDragEvent(const ui::LocatedEvent& event) { - // If |pagination_model_| is empty, don't handle scroll events. - if (pagination_model_.total_pages() <= 0) - return false; - - DCHECK(event.IsGestureEvent() || event.IsMouseEvent()); - - // If the event is a scroll down in clamshell mode on the first page, don't - // let |pagination_controller_| handle it. Unless it occurs in a folder. - auto calculate_offset = [this](const ui::LocatedEvent& event) -> int { - if (event.IsGestureEvent()) - return event.AsGestureEvent()->details().scroll_y_hint(); - gfx::PointF root_location = event.root_location_f(); - return root_location.y() - mouse_drag_start_point_.y(); - }; - if ((event.IsMouseEvent() || event.type() == ui::ET_GESTURE_SCROLL_BEGIN) && - !IsTabletMode() && - ((pagination_model_.selected_page() == 0 && - calculate_offset(event) > 0))) { - return false; - } - - return true; -} - bool PagedAppsGridView::IsValidPageFlipTarget(int page) const { return pagination_model_.is_valid_page(page); }
diff --git a/ash/app_list/views/paged_apps_grid_view.h b/ash/app_list/views/paged_apps_grid_view.h index 5801860..4a8883a 100644 --- a/ash/app_list/views/paged_apps_grid_view.h +++ b/ash/app_list/views/paged_apps_grid_view.h
@@ -75,9 +75,6 @@ PagedAppsGridView& operator=(const PagedAppsGridView&) = delete; ~PagedAppsGridView() override; - // Called when tablet mode starts and ends. - void OnTabletModeChanged(bool started); - // Sets the number of max rows and columns in grid pages. Special-cases the // first page, which may allow smaller number of rows in certain cases (to // make room for other UI elements like continue section). @@ -91,7 +88,6 @@ // ui::EventHandler: void OnGestureEvent(ui::GestureEvent* event) override; - void OnMouseEvent(ui::MouseEvent* event) override; // views::View: void Layout() override; @@ -216,10 +212,6 @@ // Gets the tile grid size on the provided apps grid page. gfx::Size GetTileGridSizeForPage(int page) const; - // Indicates whether the drag event (from the gesture or mouse) should be - // handled by PagedAppsGridView. - bool ShouldHandleDragEvent(const ui::LocatedEvent& event); - // Returns true if the page is the right target to flip to. bool IsValidPageFlipTarget(int page) const; @@ -311,19 +303,6 @@ // the edge. base::TimeDelta page_flip_delay_; - // Whether the grid is in mouse drag. Used for between-item drags that move - // the entire grid, not for app icon drags. - bool is_in_mouse_drag_ = false; - - // The initial mouse drag location in root window coordinate. Updates when the - // drag on PagedAppsGridView starts. Used for between-item drags that move the - // entire grid, not for app icon drags. - gfx::PointF mouse_drag_start_point_; - - // The last mouse drag location in root window coordinate. Used for - // between-item drags that move the entire grid, not for app icon drags. - gfx::PointF last_mouse_drag_point_; - // Records smoothness of pagination animation. absl::optional<ui::ThroughputTracker> pagination_metrics_tracker_;
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index f965d3d..9f5db0a 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -4896,8 +4896,11 @@ <message name="IDS_ASH_SCREEN_CAPTURE_LABEL_IMAGE_CAPTURE" desc="The capture label message which shows in the middle of the captured region in region image capture mode."> Capture </message> - <message name="IDS_ASH_SCREEN_CAPTURE_LABEL_VIDEO_RECORD" desc="The capture label message which shows in the middel of the captured region in region video record mode or shows in the middle of the screen in fullscreen video record mode."> - Record + <message name="IDS_ASH_SCREEN_CAPTURE_LABEL_VIDEO_RECORD" desc="The capture label message which shows in the middel of the captured region in region video recording mode."> + Record video + </message> + <message name="IDS_ASH_SCREEN_CAPTURE_LABEL_GIF_RECORD" desc="The capture label message which shows in the middel of the captured region in region GIF recording mode."> + Record GIF </message> <message name="IDS_ASH_SCREEN_CAPTURE_SAVE_TO_DIALOG_TITLE" desc="The title of the folder selection dialog, where users can select a location to save their captured images and screen recordings."> Select a folder to save to @@ -5115,6 +5118,9 @@ <message name="IDS_ASH_SCREEN_CAPTURE_SETTINGS_A11Y_TITLE" desc="The label of window hosting the screen capture settings menu that will be read by ChromeVox when prompted for title."> Screen capture settings </message> + <message name="IDS_ASH_SCREEN_CAPTURE_RECORDING_TYPE_MENU_A11Y_TITLE" desc="The label of window hosting the recording type drop down menu that will be read by ChromeVox when prompted for title."> + Recording format menu + </message> <message name="IDS_ASH_SCREEN_CAPTURE_SAVE_TO_GOOGLE_DRIVE" desc="The label of the menu item button for selecting the root of Google Drive to store the captured images and videos."> Google Drive </message>
diff --git a/ash/ash_strings_grd/IDS_ASH_SCREEN_CAPTURE_LABEL_GIF_RECORD.png.sha1 b/ash/ash_strings_grd/IDS_ASH_SCREEN_CAPTURE_LABEL_GIF_RECORD.png.sha1 new file mode 100644 index 0000000..9cb735b --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_SCREEN_CAPTURE_LABEL_GIF_RECORD.png.sha1
@@ -0,0 +1 @@ +0a240badf861c44ad33c16f26826936a9a1301ac \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_SCREEN_CAPTURE_LABEL_VIDEO_RECORD.png.sha1 b/ash/ash_strings_grd/IDS_ASH_SCREEN_CAPTURE_LABEL_VIDEO_RECORD.png.sha1 index b244956e..9cb735b 100644 --- a/ash/ash_strings_grd/IDS_ASH_SCREEN_CAPTURE_LABEL_VIDEO_RECORD.png.sha1 +++ b/ash/ash_strings_grd/IDS_ASH_SCREEN_CAPTURE_LABEL_VIDEO_RECORD.png.sha1
@@ -1 +1 @@ -5cc44477bc0dde6b2231bca438cae4eebcf8bdc3 \ No newline at end of file +0a240badf861c44ad33c16f26826936a9a1301ac \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_SCREEN_CAPTURE_RECORDING_TYPE_MENU_A11Y_TITLE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_SCREEN_CAPTURE_RECORDING_TYPE_MENU_A11Y_TITLE.png.sha1 new file mode 100644 index 0000000..9cb735b --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_SCREEN_CAPTURE_RECORDING_TYPE_MENU_A11Y_TITLE.png.sha1
@@ -0,0 +1 @@ +0a240badf861c44ad33c16f26826936a9a1301ac \ No newline at end of file
diff --git a/ash/capture_mode/capture_button_view.h b/ash/capture_mode/capture_button_view.h index 6f5e366..7c1e391 100644 --- a/ash/capture_mode/capture_button_view.h +++ b/ash/capture_mode/capture_button_view.h
@@ -32,6 +32,7 @@ ~CaptureButtonView() override = default; views::LabelButton* capture_button() { return capture_button_; } + views::ImageButton* drop_down_button() { return drop_down_button_; } // Updates the icon and text of `capture_button_`, as well as the visibility // of the `separator_` and `drop_down_button_` depending on the current type
diff --git a/ash/capture_mode/capture_label_view.cc b/ash/capture_mode/capture_label_view.cc index 604510f..00282936 100644 --- a/ash/capture_mode/capture_label_view.cc +++ b/ash/capture_mode/capture_label_view.cc
@@ -26,6 +26,7 @@ #include "ui/gfx/geometry/transform.h" #include "ui/views/animation/animation_builder.h" #include "ui/views/background.h" +#include "ui/views/controls/button/image_button.h" #include "ui/views/controls/button/label_button.h" #include "ui/views/controls/focus_ring.h" #include "ui/views/controls/highlight_path_generator.h" @@ -144,7 +145,8 @@ CaptureLabelView::CaptureLabelView( CaptureModeSession* capture_mode_session, - base::RepeatingClosure on_capture_button_container_pressed) + base::RepeatingClosure on_capture_button_pressed, + base::RepeatingClosure on_drop_down_button_pressed) : capture_mode_session_(capture_mode_session) { SetPaintToLayer(); layer()->SetFillsBoundsOpaquely(false); @@ -155,7 +157,8 @@ layer()->SetBackdropFilterQuality(ColorProvider::kBackgroundBlurQuality); capture_button_container_ = AddChildView(std::make_unique<CaptureButtonView>( - std::move(on_capture_button_container_pressed), base::DoNothing())); + std::move(on_capture_button_pressed), + std::move(on_drop_down_button_pressed))); capture_button_container_->SetPaintToLayer(); capture_button_container_->layer()->SetFillsBoundsOpaquely(false); capture_button_container_->SetNotifyEnterExitOnChild(true); @@ -179,6 +182,19 @@ return capture_button_container_->GetVisible(); } +bool CaptureLabelView::IsPointOnRecordingTypeDropDownButton( + const gfx::Point& screen_location) const { + auto* drop_down_button = capture_button_container_->drop_down_button(); + return drop_down_button && + drop_down_button->GetBoundsInScreen().Contains(screen_location); +} + +bool CaptureLabelView::IsRecordingTypeDropDownButtonVisible() const { + auto* drop_down_button = capture_button_container_->drop_down_button(); + return capture_button_container_->GetVisible() && drop_down_button && + drop_down_button->GetVisible(); +} + void CaptureLabelView::UpdateIconAndText() { CaptureModeController* controller = CaptureModeController::Get(); const CaptureModeSource source = controller->source();
diff --git a/ash/capture_mode/capture_label_view.h b/ash/capture_mode/capture_label_view.h index 3b1a0bd8..1fb2af16 100644 --- a/ash/capture_mode/capture_label_view.h +++ b/ash/capture_mode/capture_label_view.h
@@ -35,11 +35,24 @@ METADATA_HEADER(CaptureLabelView); CaptureLabelView(CaptureModeSession* capture_mode_session, - base::RepeatingClosure on_capture_button_container_pressed); + base::RepeatingClosure on_capture_button_pressed, + base::RepeatingClosure on_drop_down_button_pressed); CaptureLabelView(const CaptureLabelView&) = delete; CaptureLabelView& operator=(const CaptureLabelView&) = delete; ~CaptureLabelView() override; + CaptureButtonView* capture_button_container() { + return capture_button_container_; + } + + // Returns true if the given `screen_location` is on the drop down button, + // which when clicked opens the recording type menu. + bool IsPointOnRecordingTypeDropDownButton( + const gfx::Point& screen_location) const; + + // Returns true if the recording drop down button is available and visible. + bool IsRecordingTypeDropDownButtonVisible() const; + // Returns true if this view is hosting the capture button instead of just a // label, and can be interacted with by the user. In this case, this view has // views that are a11y highlightable.
diff --git a/ash/capture_mode/capture_mode_menu_group.cc b/ash/capture_mode/capture_mode_menu_group.cc index 6224362d..5471076 100644 --- a/ash/capture_mode/capture_mode_menu_group.cc +++ b/ash/capture_mode/capture_mode_menu_group.cc
@@ -346,8 +346,12 @@ // ----------------------------------------------------------------------------- // CaptureModeMenuGroup: -CaptureModeMenuGroup::CaptureModeMenuGroup(Delegate* delegate) - : CaptureModeMenuGroup(delegate, /*menu_header=*/nullptr) {} +CaptureModeMenuGroup::CaptureModeMenuGroup( + Delegate* delegate, + const gfx::Insets& inside_border_insets) + : CaptureModeMenuGroup(delegate, + /*menu_header=*/nullptr, + inside_border_insets) {} CaptureModeMenuGroup::CaptureModeMenuGroup(Delegate* delegate, const gfx::VectorIcon& header_icon, @@ -357,7 +361,8 @@ delegate, std::make_unique<CaptureModeMenuHeader>(header_icon, std::move(header_label), - managed_by_policy)) {} + managed_by_policy), + kMenuGroupPadding) {} CaptureModeMenuGroup::~CaptureModeMenuGroup() = default; @@ -468,7 +473,8 @@ CaptureModeMenuGroup::CaptureModeMenuGroup( Delegate* delegate, - std::unique_ptr<CaptureModeMenuHeader> menu_header) + std::unique_ptr<CaptureModeMenuHeader> menu_header, + const gfx::Insets& inside_border_insets) : delegate_(delegate), menu_header_(menu_header ? AddChildView(std::move(menu_header)) : nullptr), @@ -477,7 +483,7 @@ options_container_->SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kVertical)); SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kVertical, kMenuGroupPadding, + views::BoxLayout::Orientation::kVertical, inside_border_insets, kSpaceBetweenMenuItem)); }
diff --git a/ash/capture_mode/capture_mode_menu_group.h b/ash/capture_mode/capture_mode_menu_group.h index d91fa99c..365b3466 100644 --- a/ash/capture_mode/capture_mode_menu_group.h +++ b/ash/capture_mode/capture_mode_menu_group.h
@@ -48,8 +48,10 @@ // This version of the constructor creates a header-less menu group. Note that // menu groups without headers is not designed for settings that are managed - // by policy. - explicit CaptureModeMenuGroup(Delegate* delegate); + // by policy. The `inside_border_insets` are used as paddings around the menu + // options and items in this group. + CaptureModeMenuGroup(Delegate* delegate, + const gfx::Insets& inside_border_insets); // If `managed_by_policy` is true, the header of this menu group will show an // enterprise-managed feature icon next to the `header_label`. @@ -128,7 +130,8 @@ // Acts as a common constructor that's called by the above public // constructors. CaptureModeMenuGroup(Delegate* delegate, - std::unique_ptr<CaptureModeMenuHeader> menu_header); + std::unique_ptr<CaptureModeMenuHeader> menu_header, + const gfx::Insets& inside_border_insets); // Returns the option whose ID is |option_id|, and nullptr if no such option // exists.
diff --git a/ash/capture_mode/capture_mode_session.cc b/ash/capture_mode/capture_mode_session.cc index b5d426a..84d98d5 100644 --- a/ash/capture_mode/capture_mode_session.cc +++ b/ash/capture_mode/capture_mode_session.cc
@@ -21,6 +21,7 @@ #include "ash/capture_mode/capture_mode_util.h" #include "ash/capture_mode/capture_window_observer.h" #include "ash/capture_mode/folder_selection_dialog_controller.h" +#include "ash/capture_mode/recording_type_menu_view.h" #include "ash/capture_mode/user_nudge_controller.h" #include "ash/constants/ash_features.h" #include "ash/display/mouse_cursor_event_filter.h" @@ -42,6 +43,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/check.h" +#include "base/functional/bind.h" #include "base/memory/ptr_util.h" #include "cc/paint/paint_flags.h" #include "ui/aura/client/aura_constants.h" @@ -853,6 +855,10 @@ } if (!capture_mode_settings_widget_) { + // Close the recording type menu if any. There can be only one menu visible + // at any time. + SetRecordingTypeMenuShown(false); + auto* parent = GetParentContainer(current_root_); capture_mode_settings_widget_ = std::make_unique<views::Widget>(); MaybeDismissUserNudgeForever(); @@ -907,19 +913,21 @@ if (!capture_label_widget_->IsVisible()) capture_label_widget_->Show(); - CaptureLabelView* label_view = - static_cast<CaptureLabelView*>(capture_label_widget_->GetContentsView()); - label_view->StartCountDown(std::move(countdown_finished_callback)); + DCHECK(capture_label_view_); + capture_label_view_->StartCountDown(std::move(countdown_finished_callback)); UpdateCaptureLabelWidgetBounds(CaptureLabelAnimation::kCountdownStart); UpdateCursor(display::Screen::GetScreen()->GetCursorScreenPoint(), /*is_touch=*/false); - // Fade out the capture bar, capture settings and capture toast if they exist. + // Fade out the capture bar, capture settings, recording type menu, and the + // capture toast if they exist. std::vector<ui::Layer*> layers_to_fade_out{ capture_mode_bar_widget_->GetLayer()}; if (capture_mode_settings_widget_) layers_to_fade_out.push_back(capture_mode_settings_widget_->GetLayer()); + if (recording_type_menu_widget_) + layers_to_fade_out.push_back(recording_type_menu_widget_->GetLayer()); if (auto* toast_layer = capture_toast_controller_.MaybeGetToastLayer()) layers_to_fade_out.push_back(toast_layer); @@ -965,9 +973,8 @@ if (is_shutting_down_) return false; - CaptureLabelView* label_view = - static_cast<CaptureLabelView*>(capture_label_widget_->GetContentsView()); - return label_view->IsInCountDownAnimation(); + DCHECK(capture_label_view_); + return capture_label_view_->IsInCountDownAnimation(); } void CaptureModeSession::OnCaptureFolderMayHaveChanged() { @@ -1124,10 +1131,12 @@ event->StopPropagation(); *should_update_opacity_ptr = true; - // We only dismiss the settings menu or clear the focus on ESC key if the - // count down is not in progress. + // We only dismiss the settings / recording type menus or clear the focus + // on ESC key if the count down is not in progress. const bool is_in_count_down = IsInCountDownAnimation(); - if (capture_mode_settings_widget_ && !is_in_count_down) + if (recording_type_menu_widget_ && !is_in_count_down) + SetRecordingTypeMenuShown(false); + else if (capture_mode_settings_widget_ && !is_in_count_down) SetSettingsMenuShown(false); else if (focus_cycler_->HasFocus() && !is_in_count_down) focus_cycler_->ClearFocus(); @@ -1258,11 +1267,7 @@ DCHECK_EQ(parent->layer(), layer()->parent()); layer()->SetBounds(parent->bounds()); - // We need to update the capture bar bounds first and then settings bounds. - // The sequence matters here since settings bounds depend on capture bar - // bounds. RefreshBarWidgetBounds(); - MaybeUpdateSettingsBounds(); // Only need to update the camera preview's bounds if the capture source is // `kFullscreen`, since `ClampCaptureRegionToRootWindowSize` will take care of @@ -1350,26 +1355,28 @@ // If the current mouse event is on capture label button, and capture label // button can handle the event, show the hand mouse cursor. + DCHECK(capture_label_view_); const bool is_event_on_capture_button = capture_label_widget_->GetWindowBoundsInScreen().Contains( location_in_screen) && - static_cast<CaptureLabelView*>(capture_label_widget_->GetContentsView()) - ->ShouldHandleEvent(); + capture_label_view_->ShouldHandleEvent(); if (is_event_on_capture_button) { cursor_setter_->UpdateCursor(ui::mojom::CursorType::kHand); return; } - // As long as the settings menu is open, a pointer cursor should be used as - // long as the cursor is not on top of the capture button, since clicking - // anywhere outside the bounds of either of them (the menu or the clickable - // capture button) will dismiss the menu. Also if the event is on the bar, a - // pointer will also be used, as long as the bar is visible. + // As long as the settings menu, or the recording type menu are open, a + // pointer cursor should be used as long as the cursor is not on top of the + // capture button, since clicking anywhere outside the bounds of either of + // them (the menus or the clickable capture button) will dismiss the menus. + // Also if the event is on the bar, a pointer will also be used, as long as + // the bar is visible. const bool is_event_on_capture_bar = capture_mode_bar_widget_->GetLayer()->GetTargetOpacity() && capture_mode_bar_widget_->GetWindowBoundsInScreen().Contains( location_in_screen); - if (capture_mode_settings_widget_ || is_event_on_capture_bar) { + if (capture_mode_settings_widget_ || is_event_on_capture_bar || + recording_type_menu_widget_) { cursor_setter_->UpdateCursor(ui::mojom::CursorType::kPointer); return; } @@ -1441,6 +1448,8 @@ const bool is_settings_visible = capture_mode_settings_widget_ && capture_mode_settings_widget_->IsVisible(); + const bool is_recording_type_menu_visible = + recording_type_menu_widget_ && recording_type_menu_widget_->IsVisible(); gfx::Rect capture_region = controller_->user_capture_region(); wm::ConvertRectToScreen(current_root_, &capture_region); @@ -1492,7 +1501,8 @@ } if (widget == capture_label_widget_.get() && - (is_cursor_on_top_of_widget || focus_cycler_->CaptureLabelFocused())) { + (is_cursor_on_top_of_widget || focus_cycler_->CaptureLabelFocused() || + is_recording_type_menu_visible)) { continue; } @@ -1519,8 +1529,8 @@ DCHECK(!controller_->is_recording_in_progress()); // If settings menu is shown at the beginning of drag, we should close it. - if (capture_mode_settings_widget_) - SetSettingsMenuShown(false); + SetSettingsMenuShown(false); + SetRecordingTypeMenuShown(false); // Hide capture UIs while dragging camera preview. HideAllUis(); @@ -1592,6 +1602,8 @@ result.push_back(capture_mode_bar_widget_.get()); if (capture_label_widget_) result.push_back(capture_label_widget_.get()); + if (recording_type_menu_widget_) + result.push_back(recording_type_menu_widget_.get()); if (capture_mode_settings_widget_) result.push_back(capture_mode_settings_widget_.get()); if (dimensions_label_widget_) @@ -1660,10 +1672,12 @@ void CaptureModeSession::RefreshBarWidgetBounds() { DCHECK(capture_mode_bar_widget_); + // We need to update the capture bar bounds first and then settings bounds. + // The sequence matters here since settings bounds depend on capture bar + // bounds. capture_mode_bar_widget_->SetBounds( CaptureModeBarView::GetBounds(current_root_, is_in_projector_mode_)); - auto* parent = GetParentContainer(current_root_); - parent->StackChildAtTop(capture_mode_bar_widget_->GetNativeWindow()); + MaybeUpdateSettingsBounds(); if (user_nudge_controller_) user_nudge_controller_->Reposition(); capture_toast_controller_.MaybeRepositionCaptureToast(); @@ -1694,6 +1708,11 @@ controller_->PerformCapture(); // `this` can be deleted after this. } +void CaptureModeSession::OnRecordingTypeDropDownButtonPressed() { + SetRecordingTypeMenuShown(!recording_type_menu_widget_ || + !recording_type_menu_widget_->IsVisible()); +} + gfx::Rect CaptureModeSession::GetSelectedWindowBounds() const { auto* window = GetSelectedWindow(); return window ? window->bounds() : gfx::Rect(); @@ -1723,6 +1742,8 @@ widget_in_order.emplace_back(capture_label_widget_.get()); if (capture_mode_bar_widget_) widget_in_order.emplace_back(capture_mode_bar_widget_.get()); + if (recording_type_menu_widget_) + widget_in_order.emplace_back(recording_type_menu_widget_.get()); if (capture_mode_settings_widget_) widget_in_order.emplace_back(capture_mode_settings_widget_.get()); @@ -1945,9 +1966,17 @@ if (ShouldCaptureLabelHandleEvent(event_target)) return; - // Also allow events that target the settings menu (if present) to go through. - if (IsEventTargetedOnSettingsMenu(*event)) + // Let the recording type menu handle its events if any. + if (capture_mode_util::IsEventTargetedOnWidget( + *event, recording_type_menu_widget_.get())) { return; + } + + // Also allow events that target the settings menu (if present) to go through. + if (capture_mode_util::IsEventTargetedOnWidget( + *event, capture_mode_settings_widget_.get())) { + return; + } // Here we know that the event doesn't target the settings menu, so if it's a // press event, we will use it to dismiss the settings menu, unless it's on @@ -1968,6 +1997,17 @@ SetSettingsMenuShown(/*shown=*/false); } + // Similar to the above, we want a press event that is outside the recording + // type menu to close it, unless it is on on the drop down menu button if any. + const bool should_close_recording_type_menu = + is_press_event && + !IsPointOnRecordingTypeDropDownButton(screen_location) && + recording_type_menu_widget_; + if (should_close_recording_type_menu) { + ignore_located_events_ = true; + SetRecordingTypeMenuShown(false); + } + const bool old_ignore_located_events = ignore_located_events_; if (ignore_located_events_) { if (is_release_event) @@ -1975,13 +2015,16 @@ } // Events targeting the capture bar should also go through. - if (IsEventTargetedOnCaptureBar(*event)) + if (capture_mode_util::IsEventTargetedOnWidget( + *event, capture_mode_bar_widget_.get())) { return; + } event->SetHandled(); event->StopPropagation(); - if (should_close_settings || old_ignore_located_events) { + if (should_close_settings || old_ignore_located_events || + should_close_recording_type_menu) { // Note that these ignored events have already been consumed above. return; } @@ -2381,18 +2424,26 @@ auto* parent = GetParentContainer(current_root_); capture_label_widget_->Init( CreateWidgetParams(parent, gfx::Rect(), "CaptureLabel")); - capture_label_widget_->SetContentsView(std::make_unique<CaptureLabelView>( - this, base::BindRepeating(&CaptureModeSession::DoPerformCapture, - base::Unretained(this)))); + capture_label_view_ = capture_label_widget_->SetContentsView( + std::make_unique<CaptureLabelView>( + this, + base::BindRepeating(&CaptureModeSession::DoPerformCapture, + base::Unretained(this)), + base::BindRepeating( + &CaptureModeSession::OnRecordingTypeDropDownButtonPressed, + base::Unretained(this)))); capture_label_widget_->GetNativeWindow()->SetTitle( l10n_util::GetStringUTF16(IDS_ASH_SCREEN_CAPTURE_A11Y_TITLE)); capture_label_widget_->Show(); } - CaptureLabelView* label_view = - static_cast<CaptureLabelView*>(capture_label_widget_->GetContentsView()); - label_view->UpdateIconAndText(); + // Note that the order here matters. The bounds of the recording type menu + // widget is always relative to the bounds of the `capture_label_widget_`. + // Thus, the latter must be updated before the former. Also, the menu may need + // to close if the `label_view` becomes not interactable. + capture_label_view_->UpdateIconAndText(); UpdateCaptureLabelWidgetBounds(animation_type); + MaybeUpdateRecordingTypeMenu(); focus_cycler_->OnCaptureLabelWidgetUpdated(); } @@ -2475,10 +2526,9 @@ gfx::Rect CaptureModeSession::CalculateCaptureLabelWidgetBounds() { DCHECK(capture_label_widget_); - CaptureLabelView* label_view = - static_cast<CaptureLabelView*>(capture_label_widget_->GetContentsView()); + DCHECK(capture_label_view_); - const gfx::Size preferred_size = label_view->GetPreferredSize(); + const gfx::Size preferred_size = capture_label_view_->GetPreferredSize(); const gfx::Rect capture_bar_bounds = capture_mode_bar_widget_->GetNativeWindow()->bounds(); @@ -2581,7 +2631,7 @@ // away from one of the edges of the selected window. if (source == CaptureModeSource::kRegion && !is_selecting_region_ && !capture_region.IsEmpty()) { - if (label_view->IsInCountDownAnimation()) { + if (capture_label_view_->IsInCountDownAnimation()) { // If countdown starts, calculate the bounds based on the old capture // label's position, otherwise, since the countdown label bounds is // smaller than the label bounds and may fit into the capture region even @@ -2610,9 +2660,8 @@ return false; } - CaptureLabelView* label_view = - static_cast<CaptureLabelView*>(capture_label_widget_->GetContentsView()); - return label_view->ShouldHandleEvent(); + DCHECK(capture_label_view_); + return capture_label_view_->ShouldHandleEvent(); } void CaptureModeSession::MaybeChangeRoot(aura::Window* new_root) { @@ -2654,8 +2703,11 @@ UpdateCaptureRegion(gfx::Rect(), /*is_resizing=*/false, /*by_user=*/false); UpdateRootWindowDimmers(); - MaybeReparentCameraPreviewWidget(); + + // Changing the root window may require updating the stacking order on the new + // display. + RefreshStackingOrder(); } void CaptureModeSession::UpdateRootWindowDimmers() { @@ -2808,18 +2860,69 @@ } } -bool CaptureModeSession::IsEventTargetedOnCaptureBar( - const ui::LocatedEvent& event) const { - DCHECK(capture_mode_bar_widget_); - auto* target = static_cast<aura::Window*>(event.target()); - return capture_mode_bar_widget_->GetNativeWindow()->Contains(target); +void CaptureModeSession::SetRecordingTypeMenuShown(bool shown) { + if (!shown) { + recording_type_menu_widget_.reset(); + return; + } + + if (!recording_type_menu_widget_) { + DCHECK(features::IsGifRecordingEnabled()); + DCHECK(capture_label_widget_); + DCHECK(capture_label_widget_->IsVisible()); + + // Close the settings widget if any. Only one menu at a time can be visible. + SetSettingsMenuShown(false); + + auto* parent = GetParentContainer(current_root_); + recording_type_menu_widget_ = std::make_unique<views::Widget>(); + MaybeDismissUserNudgeForever(); + capture_toast_controller_.DismissCurrentToastIfAny(); + + recording_type_menu_widget_->Init(CreateWidgetParams( + parent, + RecordingTypeMenuView::GetIdealScreenBounds( + capture_label_widget_->GetWindowBoundsInScreen()), + "RecordingTypeMenuWidget")); + recording_type_menu_widget_->SetContentsView( + std::make_unique<RecordingTypeMenuView>()); + + auto* menu_window = recording_type_menu_widget_->GetNativeWindow(); + parent->StackChildAtTop(menu_window); + + menu_window->SetTitle(l10n_util::GetStringUTF16( + IDS_ASH_SCREEN_CAPTURE_RECORDING_TYPE_MENU_A11Y_TITLE)); + } + + recording_type_menu_widget_->Show(); } -bool CaptureModeSession::IsEventTargetedOnSettingsMenu( - const ui::LocatedEvent& event) const { - auto* target = static_cast<aura::Window*>(event.target()); - return capture_mode_settings_widget_ && - capture_mode_settings_widget_->GetNativeWindow()->Contains(target); +bool CaptureModeSession::IsPointOnRecordingTypeDropDownButton( + const gfx::Point& screen_location) const { + if (!capture_label_widget_ || !capture_label_widget_->IsVisible()) + return false; + + DCHECK(capture_label_view_); + return capture_label_view_->IsPointOnRecordingTypeDropDownButton( + screen_location); +} + +void CaptureModeSession::MaybeUpdateRecordingTypeMenu() { + if (!recording_type_menu_widget_) + return; + + // If the the drop down button becomes hidden, the recording type menu widget + // should also hide. + if (!capture_label_widget_ || + !capture_label_view_->IsRecordingTypeDropDownButtonVisible()) { + SetRecordingTypeMenuShown(false); + return; + } + + recording_type_menu_widget_->SetBounds( + RecordingTypeMenuView::GetIdealScreenBounds( + capture_label_widget_->GetWindowBoundsInScreen(), + recording_type_menu_widget_->GetContentsView())); } } // namespace ash
diff --git a/ash/capture_mode/capture_mode_session.h b/ash/capture_mode/capture_mode_session.h index b3febe7..51f599e9e 100644 --- a/ash/capture_mode/capture_mode_session.h +++ b/ash/capture_mode/capture_mode_session.h
@@ -10,6 +10,7 @@ #include "ash/accessibility/magnifier/magnifier_glass.h" #include "ash/ash_export.h" +#include "ash/capture_mode/capture_label_view.h" #include "ash/capture_mode/capture_mode_toast_controller.h" #include "ash/capture_mode/capture_mode_types.h" #include "ash/capture_mode/folder_selection_dialog_controller.h" @@ -294,6 +295,10 @@ // record button in the capture label view. void DoPerformCapture(); + // Called when the drop-down button in the `capture_label_widget_` is pressed + // which toggles the recording type menu on and off. + void OnRecordingTypeDropDownButtonPressed(); + // Gets the bounds of current window selected for |kWindow| capture source. gfx::Rect GetSelectedWindowBounds() const; @@ -420,12 +425,19 @@ // camera preview's bounds and visibility. void MaybeUpdateCameraPreviewBounds(); - // Returns true if the given `event` is targeted on the capture bar. - bool IsEventTargetedOnCaptureBar(const ui::LocatedEvent& event) const; + // Creates or distroys the recording type menu widget based on the given + // `shown` value. + void SetRecordingTypeMenuShown(bool shown); - // Returns true if the given `event` is targeted on the setting menu if it - // exists. - bool IsEventTargetedOnSettingsMenu(const ui::LocatedEvent& event) const; + // Returns true if the given `screen_location` is on the drop down button in + // the `capture_label_widget_` which when clicked opens the recording type + // menu. + bool IsPointOnRecordingTypeDropDownButton( + const gfx::Point& screen_location) const; + + // Updates the availability or bounds of the recording type menu widget + // according to the current state. + void MaybeUpdateRecordingTypeMenu(); CaptureModeController* const controller_; @@ -454,6 +466,11 @@ // starting capturing, the widget will transform into a 3-second countdown // timer. views::UniqueWidgetPtr capture_label_widget_; + CaptureLabelView* capture_label_view_ = nullptr; + + // Widget that hosts the recording type menu, from which the user can pick the + // desired recording format type. + views::UniqueWidgetPtr recording_type_menu_widget_; // Magnifier glass used during a region capture session. MagnifierGlass magnifier_glass_;
diff --git a/ash/capture_mode/capture_mode_session_test_api.cc b/ash/capture_mode/capture_mode_session_test_api.cc index 669520c..3bb8a38 100644 --- a/ash/capture_mode/capture_mode_session_test_api.cc +++ b/ash/capture_mode/capture_mode_session_test_api.cc
@@ -4,13 +4,22 @@ #include "ash/capture_mode/capture_mode_session_test_api.h" +#include "ash/capture_mode/capture_mode_controller.h" #include "ash/capture_mode/capture_mode_session.h" namespace ash { +CaptureModeSessionTestApi::CaptureModeSessionTestApi() + : session_(CaptureModeController::Get()->capture_mode_session()) { + DCHECK(CaptureModeController::Get()->IsActive()); + DCHECK(session_); +} + CaptureModeSessionTestApi::CaptureModeSessionTestApi( CaptureModeSession* session) - : session_(session) {} + : session_(session) { + DCHECK(session_); +} CaptureModeBarView* CaptureModeSessionTestApi::GetCaptureModeBarView() { return session_->capture_mode_bar_view_; @@ -21,6 +30,10 @@ return session_->capture_mode_settings_view_; } +CaptureLabelView* CaptureModeSessionTestApi::GetCaptureLabelView() { + return session_->capture_label_view_; +} + views::Widget* CaptureModeSessionTestApi::GetCaptureModeSettingsWidget() { return session_->capture_mode_settings_widget_.get(); } @@ -29,6 +42,10 @@ return session_->capture_label_widget_.get(); } +views::Widget* CaptureModeSessionTestApi::GetRecordingTypeMenuWidget() { + return session_->recording_type_menu_widget_.get(); +} + views::Widget* CaptureModeSessionTestApi::GetDimensionsLabelWidget() { return session_->dimensions_label_widget_.get(); }
diff --git a/ash/capture_mode/capture_mode_session_test_api.h b/ash/capture_mode/capture_mode_session_test_api.h index 02c4955..883775d 100644 --- a/ash/capture_mode/capture_mode_session_test_api.h +++ b/ash/capture_mode/capture_mode_session_test_api.h
@@ -9,15 +9,17 @@ namespace ash { -class CaptureModeSession; +class CaptureLabelView; class CaptureModeBarView; +class CaptureModeSession; class CaptureModeSettingsView; -class UserNudgeController; class MagnifierGlass; +class UserNudgeController; // Wrapper for CaptureModeSession that exposes internal state to test functions. class CaptureModeSessionTestApi { public: + CaptureModeSessionTestApi(); explicit CaptureModeSessionTestApi(CaptureModeSession* session); CaptureModeSessionTestApi(CaptureModeSessionTestApi&) = delete; @@ -28,10 +30,14 @@ CaptureModeSettingsView* GetCaptureModeSettingsView(); + CaptureLabelView* GetCaptureLabelView(); + views::Widget* GetCaptureModeSettingsWidget(); views::Widget* GetCaptureLabelWidget(); + views::Widget* GetRecordingTypeMenuWidget(); + views::Widget* GetDimensionsLabelWidget(); UserNudgeController* GetUserNudgeController();
diff --git a/ash/capture_mode/capture_mode_util.cc b/ash/capture_mode/capture_mode_util.cc index ab5cb231..3032702 100644 --- a/ash/capture_mode/capture_mode_util.cc +++ b/ash/capture_mode/capture_mode_util.cc
@@ -513,4 +513,10 @@ } } +bool IsEventTargetedOnWidget(const ui::LocatedEvent& event, + views::Widget* widget) { + auto* target = static_cast<aura::Window*>(event.target()); + return widget && widget->GetNativeWindow()->Contains(target); +} + } // namespace ash::capture_mode_util
diff --git a/ash/capture_mode/capture_mode_util.h b/ash/capture_mode/capture_mode_util.h index ff56fda..4a58176 100644 --- a/ash/capture_mode/capture_mode_util.h +++ b/ash/capture_mode/capture_mode_util.h
@@ -27,6 +27,7 @@ namespace ui { class Layer; +class LocatedEvent; } // namespace ui namespace views { @@ -189,6 +190,12 @@ void MaybeUpdateCameraPrivacyIndicator(bool camera_on); void MaybeUpdateMicrophonePrivacyIndicator(bool mic_on); +// Returns true if the given located `event` is targeted on a window that is a +// descendant of the given `widget`. Note that `widget` can be provided as null +// if it no longer exists, in this case this function returns false. +bool IsEventTargetedOnWidget(const ui::LocatedEvent& event, + views::Widget* widget); + } // namespace capture_mode_util } // namespace ash
diff --git a/ash/capture_mode/gif_recording_unittests.cc b/ash/capture_mode/gif_recording_unittests.cc new file mode 100644 index 0000000..794153c --- /dev/null +++ b/ash/capture_mode/gif_recording_unittests.cc
@@ -0,0 +1,164 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/capture_mode/capture_button_view.h" +#include "ash/capture_mode/capture_label_view.h" +#include "ash/capture_mode/capture_mode_bar_view.h" +#include "ash/capture_mode/capture_mode_controller.h" +#include "ash/capture_mode/capture_mode_session_test_api.h" +#include "ash/capture_mode/capture_mode_test_util.h" +#include "ash/capture_mode/capture_mode_types.h" +#include "ash/constants/ash_features.h" +#include "ash/public/cpp/capture_mode/capture_mode_test_api.h" +#include "ash/style/icon_button.h" +#include "ash/test/ash_test_base.h" +#include "base/test/scoped_feature_list.h" +#include "ui/events/keycodes/keyboard_codes_posix.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/vector2d.h" +#include "ui/views/controls/button/image_button.h" +#include "ui/views/widget/widget.h" + +namespace ash { + +class GifRecordingTest : public AshTestBase { + public: + GifRecordingTest() : scoped_feature_list_(features::kGifRecording) {} + GifRecordingTest(const GifRecordingTest&) = delete; + GifRecordingTest& operator=(const GifRecordingTest&) = delete; + ~GifRecordingTest() override = default; + + // AshTestBase: + void SetUp() override { + AshTestBase::SetUp(); + CaptureModeController::Get()->SetUserCaptureRegion(gfx::Rect(200, 200), + /*by_user=*/true); + } + + CaptureModeController* StartRegionVideoCapture() { + return StartCaptureSession(CaptureModeSource::kRegion, + CaptureModeType::kVideo); + } + + CaptureLabelView* GetCaptureLabelView() { + return CaptureModeSessionTestApi().GetCaptureLabelView(); + } + + views::Widget* GetRecordingTypeMenuWidget() { + return CaptureModeSessionTestApi().GetRecordingTypeMenuWidget(); + } + + views::Widget* GetSettingsMenuWidget() { + return CaptureModeSessionTestApi().GetCaptureModeSettingsWidget(); + } + + void ClickOnDropDownButton() { + auto* label_view = GetCaptureLabelView(); + ASSERT_TRUE(label_view->IsRecordingTypeDropDownButtonVisible()); + CaptureButtonView* capture_button_container = + label_view->capture_button_container(); + LeftClickOn(capture_button_container->drop_down_button()); + } + + void ClickOnSettingsButton() { + CaptureModeBarView* bar_view = + CaptureModeSessionTestApi().GetCaptureModeBarView(); + LeftClickOn(bar_view->settings_button()); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +TEST_F(GifRecordingTest, DropDownButtonVisibility) { + // With region video recording, the drop down button should be visible. + auto* controller = StartRegionVideoCapture(); + auto* label_view = GetCaptureLabelView(); + EXPECT_TRUE(label_view->IsRecordingTypeDropDownButtonVisible()); + + // It should hide, once we switch to image recording, but the label view + // should remain interactable. + controller->SetType(CaptureModeType::kImage); + EXPECT_FALSE(label_view->IsRecordingTypeDropDownButtonVisible()); + EXPECT_TRUE(label_view->IsViewInteractable()); + + // Switching to a fullscreen source, the label view becomes no longer + // interactable, and the drop down button remains hidden. + controller->SetSource(CaptureModeSource::kFullscreen); + EXPECT_FALSE(label_view->IsRecordingTypeDropDownButtonVisible()); + EXPECT_FALSE(label_view->IsViewInteractable()); + + // Even when we switch back to video recording. + controller->SetType(CaptureModeType::kVideo); + EXPECT_FALSE(label_view->IsRecordingTypeDropDownButtonVisible()); + EXPECT_FALSE(label_view->IsViewInteractable()); + + // Only region recording in video mode, that the label view is interactable, + // and the button is visible. + controller->SetSource(CaptureModeSource::kRegion); + EXPECT_TRUE(label_view->IsRecordingTypeDropDownButtonVisible()); + EXPECT_TRUE(label_view->IsViewInteractable()); +} + +TEST_F(GifRecordingTest, RecordingTypeMenuCreation) { + // The drop down button acts as a toggle. + StartRegionVideoCapture(); + ClickOnDropDownButton(); + EXPECT_TRUE(GetRecordingTypeMenuWidget()); + ClickOnDropDownButton(); + EXPECT_FALSE(GetRecordingTypeMenuWidget()); + + // The settings menu and the recording type menu are mutually exclusive, + // opening one closes the other. + ClickOnSettingsButton(); + EXPECT_TRUE(GetSettingsMenuWidget()); + ClickOnDropDownButton(); + EXPECT_TRUE(GetRecordingTypeMenuWidget()); + EXPECT_FALSE(GetSettingsMenuWidget()); + ClickOnSettingsButton(); + EXPECT_TRUE(GetSettingsMenuWidget()); + EXPECT_FALSE(GetRecordingTypeMenuWidget()); +} + +TEST_F(GifRecordingTest, EscKeyClosesMenu) { + // Hitting the ESC key closes the recording type menu, but the session remains + // active. + auto* controller = StartRegionVideoCapture(); + ClickOnDropDownButton(); + EXPECT_TRUE(GetRecordingTypeMenuWidget()); + PressAndReleaseKey(ui::VKEY_ESCAPE); + EXPECT_FALSE(GetRecordingTypeMenuWidget()); + EXPECT_TRUE(controller->IsActive()); +} + +TEST_F(GifRecordingTest, EnterKeyHidesMenuAndStartsCountDown) { + StartRegionVideoCapture(); + ClickOnDropDownButton(); + auto* recording_type_menu = GetRecordingTypeMenuWidget(); + EXPECT_TRUE(recording_type_menu); + + // Pressing the ENTER key starts the recording count down, at which point, the + // menu remains open but fades out to an opacity of 0. + PressAndReleaseKey(ui::VKEY_RETURN); + EXPECT_TRUE(CaptureModeTestApi().IsInCountDownAnimation()); + ASSERT_EQ(recording_type_menu, GetRecordingTypeMenuWidget()); + EXPECT_FLOAT_EQ(recording_type_menu->GetLayer()->GetTargetOpacity(), 0); +} + +TEST_F(GifRecordingTest, ClickingOutsideClosesMenu) { + auto* controller = StartRegionVideoCapture(); + ClickOnDropDownButton(); + EXPECT_TRUE(GetRecordingTypeMenuWidget()); + + // Clicking outside the menu widget should close it, but the region should not + // change. + const auto region = controller->user_capture_region(); + auto* generator = GetEventGenerator(); + generator->MoveMouseTo(region.bottom_right() + gfx::Vector2d(10, 10)); + generator->ClickLeftButton(); + EXPECT_FALSE(GetRecordingTypeMenuWidget()); + EXPECT_EQ(region, controller->user_capture_region()); +} + +} // namespace ash
diff --git a/ash/capture_mode/recording_type_menu_view.cc b/ash/capture_mode/recording_type_menu_view.cc new file mode 100644 index 0000000..1b8985a --- /dev/null +++ b/ash/capture_mode/recording_type_menu_view.cc
@@ -0,0 +1,91 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/capture_mode/recording_type_menu_view.h" + +#include "ash/public/cpp/style/color_provider.h" +#include "ash/resources/vector_icons/vector_icons.h" +#include "ash/strings/grit/ash_strings.h" +#include "ash/style/ash_color_id.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/compositor/layer.h" +#include "ui/gfx/geometry/point.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/rounded_corners_f.h" +#include "ui/views/background.h" + +namespace ash { + +namespace { + +// The IDs of the options representing the available recording formats. +enum RecordingTypeOption { + kWebM = 0, + kGif, +}; + +// The padding around the menu options. +constexpr auto kMenuPadding = gfx::Insets::VH(12, 0); + +// The vertical space between the two nearest edges of the capture label widget +// and the recording type menu widget. +constexpr int kYOffsetFromLabelWidget = 8; + +constexpr int kMinimumWidth = 184; +constexpr gfx::Size kIdealSize{kMinimumWidth, 96}; + +constexpr gfx::RoundedCornersF kBorderRadius{12.f}; + +// Gets the ideal size of the widget hosting the `RecordingTypeMenuView` either +// from the preferred size of `contents_view` (if given), or the default size. +gfx::Size GetIdealSize(views::View* contents_view) { + gfx::Size size = + contents_view ? contents_view->GetPreferredSize() : kIdealSize; + if (size.width() < kMinimumWidth) + size.set_width(kMinimumWidth); + return size; +} + +} // namespace + +RecordingTypeMenuView::RecordingTypeMenuView() + : CaptureModeMenuGroup(this, kMenuPadding) { + SetPaintToLayer(); + SetBackground(views::CreateThemedSolidBackground(kColorAshShieldAndBase80)); + layer()->SetFillsBoundsOpaquely(false); + layer()->SetRoundedCornerRadius(kBorderRadius); + layer()->SetBackgroundBlur(ColorProvider::kBackgroundBlurSigma); + layer()->SetBackdropFilterQuality(ColorProvider::kBackgroundBlurQuality); + + AddOption( + &kCaptureModeVideoIcon, + l10n_util::GetStringUTF16(IDS_ASH_SCREEN_CAPTURE_LABEL_VIDEO_RECORD), + RecordingTypeOption::kWebM); + AddOption(&kCaptureGifIcon, + l10n_util::GetStringUTF16(IDS_ASH_SCREEN_CAPTURE_LABEL_GIF_RECORD), + RecordingTypeOption::kGif); +} + +// static +gfx::Rect RecordingTypeMenuView::GetIdealScreenBounds( + const gfx::Rect& capture_label_widget_screen_bounds, + views::View* contents_view) { + const auto size = GetIdealSize(contents_view); + const auto bottom_center = capture_label_widget_screen_bounds.bottom_center(); + const int y = bottom_center.y() + kYOffsetFromLabelWidget; + const int x = bottom_center.x() - (size.width() / 2); + return gfx::Rect(gfx::Point(x, y), size); +} + +void RecordingTypeMenuView::OnOptionSelected(int option_id) const {} + +bool RecordingTypeMenuView::IsOptionChecked(int option_id) const { + return option_id == RecordingTypeOption::kWebM; +} + +bool RecordingTypeMenuView::IsOptionEnabled(int option_id) const { + return true; +} + +} // namespace ash
diff --git a/ash/capture_mode/recording_type_menu_view.h b/ash/capture_mode/recording_type_menu_view.h new file mode 100644 index 0000000..0831ccd --- /dev/null +++ b/ash/capture_mode/recording_type_menu_view.h
@@ -0,0 +1,42 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_CAPTURE_MODE_RECORDING_TYPE_MENU_VIEW_H_ +#define ASH_CAPTURE_MODE_RECORDING_TYPE_MENU_VIEW_H_ + +#include "ash/capture_mode/capture_mode_menu_group.h" + +namespace gfx { +class Rect; +} // namespace gfx + +namespace ash { + +// Defines a view that will be the contents view of the recording type menu +// widget, from which users can pick the desired recording format. +class RecordingTypeMenuView : public CaptureModeMenuGroup, + public CaptureModeMenuGroup::Delegate { + public: + RecordingTypeMenuView(); + RecordingTypeMenuView(const RecordingTypeMenuView&) = delete; + RecordingTypeMenuView& operator=(const RecordingTypeMenuView&) = delete; + ~RecordingTypeMenuView() override = default; + + // Returns the ideal bounds of the widget hosting this view, relative to the + // `capture_label_widget_screen_bounds` which hosts the drop down button that + // opens the recording type menu widget. If `contents_view` is provided, its + // preferred size will be used, otherwise, the default size will be used. + static gfx::Rect GetIdealScreenBounds( + const gfx::Rect& capture_label_widget_screen_bounds, + views::View* contents_view = nullptr); + + // CaptureModeMenuGroup::Delegate: + void OnOptionSelected(int option_id) const override; + bool IsOptionChecked(int option_id) const override; + bool IsOptionEnabled(int option_id) const override; +}; + +} // namespace ash + +#endif // ASH_CAPTURE_MODE_RECORDING_TYPE_MENU_VIEW_H_
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn index 70bf583..e112fbd 100644 --- a/ash/public/cpp/BUILD.gn +++ b/ash/public/cpp/BUILD.gn
@@ -486,6 +486,7 @@ "//testing/gtest", "//ui/aura:test_support", "//ui/chromeos/styles:cros_styles_views", + "//ui/chromeos/styles:cros_tokens_color_mappings", "//ui/compositor_extra", "//ui/events", "//ui/events:dom_keycode_converter",
diff --git a/ash/public/cpp/holding_space/holding_space_item.cc b/ash/public/cpp/holding_space/holding_space_item.cc index 38be97c..9cc844e 100644 --- a/ash/public/cpp/holding_space/holding_space_item.cc +++ b/ash/public/cpp/holding_space/holding_space_item.cc
@@ -76,7 +76,7 @@ return type_ == rhs.type_ && id_ == rhs.id_ && file_path_ == rhs.file_path_ && file_system_url_ == rhs.file_system_url_ && text_ == rhs.text_ && secondary_text_ == rhs.secondary_text_ && - secondary_text_color_ == rhs.secondary_text_color_ && + secondary_text_color_id_ == rhs.secondary_text_color_id_ && *image_ == *rhs.image_ && progress_ == rhs.progress_ && in_progress_commands_ == rhs.in_progress_commands_; } @@ -269,12 +269,12 @@ return true; } -bool HoldingSpaceItem::SetSecondaryTextColor( - const absl::optional<cros_styles::ColorName>& secondary_text_color) { - if (secondary_text_color_ == secondary_text_color) +bool HoldingSpaceItem::SetSecondaryTextColorId( + const absl::optional<ui::ColorId>& secondary_text_color_id) { + if (secondary_text_color_id_ == secondary_text_color_id) return false; - secondary_text_color_ = secondary_text_color; + secondary_text_color_id_ = secondary_text_color_id; return true; }
diff --git a/ash/public/cpp/holding_space/holding_space_item.h b/ash/public/cpp/holding_space/holding_space_item.h index fdb4b19c..e0cfbe7d 100644 --- a/ash/public/cpp/holding_space/holding_space_item.h +++ b/ash/public/cpp/holding_space/holding_space_item.h
@@ -17,6 +17,7 @@ #include "base/files/file_path.h" #include "base/values.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/color/color_id.h" #include "ui/gfx/vector_icon_types.h" #include "url/gurl.h" @@ -170,11 +171,11 @@ // if a change occurred or `false` to indicate no-op. bool SetSecondaryText(const absl::optional<std::u16string>& secondary_text); - // Sets the color for the secondary text that should be shown for the item, + // Sets the color id for the secondary text that should be shown for the item, // returning `true` if a change occurred or `false` to indicate no-op. If // `absl::nullopt` is provided, secondary text color will fallback to default. - bool SetSecondaryTextColor( - const absl::optional<cros_styles::ColorName>& secondary_text_color); + bool SetSecondaryTextColorId( + const absl::optional<ui::ColorId>& secondary_text_color_id); // Returns `accessible_name_`, falling back to a concatenation of primary // and secondary text if absent. @@ -212,8 +213,8 @@ return secondary_text_; } - const absl::optional<cros_styles::ColorName>& secondary_text_color() const { - return secondary_text_color_; + const absl::optional<ui::ColorId>& secondary_text_color_id() const { + return secondary_text_color_id_; } const HoldingSpaceImage& image() const { return *image_; } @@ -256,8 +257,9 @@ // If set, the secondary text that should be shown for the item. absl::optional<std::u16string> secondary_text_; - // If set, the color for the secondary text that should be shown for the item. - absl::optional<cros_styles::ColorName> secondary_text_color_; + // If set, the color resolved from the color id for the secondary text that + // should be shown for the item. + absl::optional<ui::ColorId> secondary_text_color_id_; // If set, the accessible name that should be used for the item. absl::optional<std::u16string> accessible_name_;
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 c55ec370..a592d68 100644 --- a/ash/public/cpp/holding_space/holding_space_item_unittest.cc +++ b/ash/public/cpp/holding_space/holding_space_item_unittest.cc
@@ -16,7 +16,7 @@ #include "base/test/scoped_locale.h" #include "base/values.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/chromeos/styles/cros_styles.h" +#include "ui/chromeos/styles/cros_tokens_color_mappings.h" #include "ui/gfx/paint_vector_icon.h" namespace ash { @@ -239,24 +239,25 @@ GURL("filesystem::file_system_url"), /*image_resolver=*/base::BindOnce(&CreateFakeHoldingSpaceImage)); - // Initially the secondary text color should be absent. - EXPECT_FALSE(holding_space_item->secondary_text_color()); + // Initially the secondary text color id should be absent. + EXPECT_FALSE(holding_space_item->secondary_text_color_id()); - // It should be possible to update secondary text color to a new value. - EXPECT_TRUE(holding_space_item->SetSecondaryTextColor( - cros_styles::ColorName::kTextColorAlert)); - EXPECT_EQ(holding_space_item->secondary_text_color().value(), - cros_styles::ColorName::kTextColorAlert); + // It should be possible to update secondary text color id to a new value. + EXPECT_TRUE(holding_space_item->SetSecondaryTextColorId( + cros_tokens::kTextColorAlert)); + EXPECT_EQ(holding_space_item->secondary_text_color_id().value(), + cros_tokens::kTextColorAlert); - // It should no-op to try to update secondary text color to existing values. - EXPECT_FALSE(holding_space_item->SetSecondaryTextColor( - cros_styles::ColorName::kTextColorAlert)); - EXPECT_EQ(holding_space_item->secondary_text_color().value(), - cros_styles::ColorName::kTextColorAlert); + // It should no-op to try to update secondary text color id to existing + // values. + EXPECT_FALSE(holding_space_item->SetSecondaryTextColorId( + cros_tokens::kTextColorAlert)); + EXPECT_EQ(holding_space_item->secondary_text_color_id().value(), + cros_tokens::kTextColorAlert); - // It should be possible to unset secondary text color. - EXPECT_TRUE(holding_space_item->SetSecondaryTextColor(absl::nullopt)); - EXPECT_FALSE(holding_space_item->secondary_text_color()); + // It should be possible to unset secondary text color id. + EXPECT_TRUE(holding_space_item->SetSecondaryTextColorId(absl::nullopt)); + EXPECT_FALSE(holding_space_item->secondary_text_color_id()); } // Tests setting the text for each holding space item type.
diff --git a/ash/public/cpp/holding_space/holding_space_model.cc b/ash/public/cpp/holding_space/holding_space_model.cc index 1aed8ccd0..3fe675d 100644 --- a/ash/public/cpp/holding_space/holding_space_model.cc +++ b/ash/public/cpp/holding_space/holding_space_model.cc
@@ -61,8 +61,8 @@ } // Update secondary text color. - if (secondary_text_color_) { - if (item_->SetSecondaryTextColor(secondary_text_color_.value())) { + if (secondary_text_color_id_) { + if (item_->SetSecondaryTextColorId(secondary_text_color_id_.value())) { updated_fields |= HoldingSpaceModelObserver::UpdatedField::kSecondaryTextColor; } @@ -144,9 +144,9 @@ } HoldingSpaceModel::ScopedItemUpdate& -HoldingSpaceModel::ScopedItemUpdate::SetSecondaryTextColor( - const absl::optional<cros_styles::ColorName>& secondary_text_color) { - secondary_text_color_ = secondary_text_color; +HoldingSpaceModel::ScopedItemUpdate::SetSecondaryTextColorId( + const absl::optional<ui::ColorId>& secondary_text_color_id) { + secondary_text_color_id_ = secondary_text_color_id; return *this; }
diff --git a/ash/public/cpp/holding_space/holding_space_model.h b/ash/public/cpp/holding_space/holding_space_model.h index 6873852..c93431a 100644 --- a/ash/public/cpp/holding_space/holding_space_model.h +++ b/ash/public/cpp/holding_space/holding_space_model.h
@@ -18,6 +18,7 @@ #include "base/callback.h" #include "base/observer_list.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/color/color_id.h" #include "url/gurl.h" namespace base { @@ -80,10 +81,10 @@ ScopedItemUpdate& SetSecondaryText( const absl::optional<std::u16string>& secondary_text); - // Sets the color for the secondary text that should be shown for the item - // and returns a reference to `this`. - ScopedItemUpdate& SetSecondaryTextColor( - const absl::optional<cros_styles::ColorName>& secondary_text_color); + // Sets the color id for the secondary text that should be shown for the + // item and returns a reference to `this`. + ScopedItemUpdate& SetSecondaryTextColorId( + const absl::optional<ui::ColorId>& secondary_text_color); // Sets the text that should be shown for the item and returns a reference // to `this`. If absent, the lossy display name of the backing file will be @@ -104,8 +105,7 @@ in_progress_commands_; absl::optional<HoldingSpaceProgress> progress_; absl::optional<absl::optional<std::u16string>> secondary_text_; - absl::optional<absl::optional<cros_styles::ColorName>> - secondary_text_color_; + absl::optional<absl::optional<ui::ColorId>> secondary_text_color_id_; absl::optional<absl::optional<std::u16string>> text_; bool invalidate_image_ = false; };
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 f73ea18..726030b 100644 --- a/ash/public/cpp/holding_space/holding_space_model_unittest.cc +++ b/ash/public/cpp/holding_space/holding_space_model_unittest.cc
@@ -20,7 +20,7 @@ #include "base/test/scoped_feature_list.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/chromeos/styles/cros_styles.h" +#include "ui/chromeos/styles/cros_tokens_color_mappings.h" #include "ui/gfx/paint_vector_icon.h" namespace ash { @@ -342,13 +342,12 @@ // Update secondary text color. model() .UpdateItem(item_ptr->id()) - ->SetSecondaryTextColor(cros_styles::ColorName::kTextColorAlert); + ->SetSecondaryTextColorId(cros_tokens::kTextColorAlert); EXPECT_EQ(observation.TakeLastUpdatedItem(), item_ptr); EXPECT_EQ(observation.TakeLastUpdatedFields(), UpdatedField::kSecondaryTextColor); EXPECT_EQ(observation.TakeUpdatedItemCount(), 1); - EXPECT_EQ(item_ptr->secondary_text_color(), - cros_styles::ColorName::kTextColorAlert); + EXPECT_EQ(item_ptr->secondary_text_color_id(), cros_tokens::kTextColorAlert); // Update all attributes. in_progress_commands.push_back( @@ -362,7 +361,7 @@ .SetInProgressCommands(in_progress_commands) .SetText(u"updated_text") .SetSecondaryText(u"updated_secondary_text") - .SetSecondaryTextColor(cros_styles::ColorName::kTextColorWarning) + .SetSecondaryTextColorId(cros_tokens::kTextColorWarning) .SetProgress( HoldingSpaceProgress(/*current_bytes=*/75, /*total_bytes=*/100)); EXPECT_EQ(observation.TakeLastUpdatedItem(), item_ptr); @@ -379,8 +378,8 @@ EXPECT_EQ(item_ptr->progress().GetValue(), 0.75f); EXPECT_EQ(item_ptr->GetText(), u"updated_text"); EXPECT_EQ(item_ptr->secondary_text(), u"updated_secondary_text"); - EXPECT_EQ(item_ptr->secondary_text_color(), - cros_styles::ColorName::kTextColorWarning); + EXPECT_EQ(item_ptr->secondary_text_color_id(), + cros_tokens::kTextColorWarning); } // Verifies that updating items will no-op appropriately. @@ -414,7 +413,7 @@ .SetInProgressCommands({}) .SetText(absl::nullopt) .SetSecondaryText(absl::nullopt) - .SetSecondaryTextColor(absl::nullopt) + .SetSecondaryTextColorId(absl::nullopt) .SetProgress(item_ptr->progress()); EXPECT_EQ(observation.TakeUpdatedItemCount(), 0); }
diff --git a/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc b/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc index 5e4c7c3..5509c5b 100644 --- a/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc +++ b/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc
@@ -539,6 +539,10 @@ constexpr char kFastPairGattConnectionStep[] = "FastPair.GattConnection"; constexpr char kInitialSuccessFunnelMetric[] = "FastPair.InitialPairing"; constexpr char kSubsequentSuccessFunnelMetric[] = "FastPair.SubsequentPairing"; +constexpr char kProtocolPairingStepInitial[] = + "FastPair.InitialPairing.Pairing"; +constexpr char kProtocolPairingStepSubsequent[] = + "FastPair.SubsequentPairing.Pairing"; const std::string GetEngagementFlowInitialModelIdMetric( const ash::quick_pair::Device& device) { @@ -913,6 +917,21 @@ base::UmaHistogramEnumeration(kHandshakeFailureReason, failure_reason); } +void RecordProtocolPairingStep(FastPairProtocolPairingSteps pairing_step, + const Device& device) { + switch (device.protocol) { + case Protocol::kFastPairInitial: + base::UmaHistogramEnumeration(kProtocolPairingStepInitial, pairing_step); + break; + case Protocol::kFastPairSubsequent: + base::UmaHistogramEnumeration(kProtocolPairingStepSubsequent, + pairing_step); + break; + case Protocol::kFastPairRetroactive: + break; + } +} + void RecordHandshakeStep(FastPairHandshakeSteps handshake_step, const Device& device) { switch (device.protocol) {
diff --git a/ash/quick_pair/common/fast_pair/fast_pair_metrics.h b/ash/quick_pair/common/fast_pair/fast_pair_metrics.h index dff9d39..7c60a2a 100644 --- a/ash/quick_pair/common/fast_pair/fast_pair_metrics.h +++ b/ash/quick_pair/common/fast_pair/fast_pair_metrics.h
@@ -152,6 +152,23 @@ kMaxValue = kConnectionEstablished }; +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. This enum should be kept in sync +// with the FastPairHandshakeSteps enum in +// src/tools/metrics/histograms/enums.xml. +enum class COMPONENT_EXPORT(QUICK_PAIR_COMMON) FastPairProtocolPairingSteps { + kPairingStarted = 0, + kExhaustedRetries = 1, + kAlreadyPaired = 2, + kBondSuccessful = 3, + kPasskeyNegotiated = 4, + kRecievedPasskeyResponse = 5, + kPasskeyValidated = 6, + kPasskeyConfirmed = 7, + kPairingComplete = 8, + kMaxValue = kPairingComplete, +}; + COMPONENT_EXPORT(QUICK_PAIR_COMMON) void AttemptRecordingFastPairEngagementFlow(const Device& device, FastPairEngagementFlowEvent event); @@ -306,6 +323,10 @@ void RecordHandshakeFailureReason(HandshakeFailureReason failure_reason); COMPONENT_EXPORT(QUICK_PAIR_COMMON) +void RecordProtocolPairingStep(FastPairProtocolPairingSteps pairing_step, + const Device& device); + +COMPONENT_EXPORT(QUICK_PAIR_COMMON) void RecordHandshakeStep(FastPairHandshakeSteps handshake_step, const Device& device);
diff --git a/ash/quick_pair/pairing/fast_pair/fast_pair_pairer_impl.cc b/ash/quick_pair/pairing/fast_pair/fast_pair_pairer_impl.cc index 7173e372..8670cbcb 100644 --- a/ash/quick_pair/pairing/fast_pair/fast_pair_pairer_impl.cc +++ b/ash/quick_pair/pairing/fast_pair/fast_pair_pairer_impl.cc
@@ -208,6 +208,9 @@ } void FastPairPairerImpl::StartPairing() { + RecordProtocolPairingStep(FastPairProtocolPairingSteps::kPairingStarted, + *device_); + std::string device_address = device_->classic_address().value(); device::BluetoothDevice* bt_device = adapter_->GetDevice(device_address); switch (device_->protocol) { @@ -226,13 +229,15 @@ QP_LOG(INFO) << __func__ << ": Trying to pair to device that is already paired; " "returning success."; - std::move(paired_callback_).Run(device_); - - // In addition to recording kPairingSuccess in the callback above, - // also record that the device was already paired. + RecordProtocolPairingStep(FastPairProtocolPairingSteps::kAlreadyPaired, + *device_); + RecordProtocolPairingStep( + FastPairProtocolPairingSteps::kPairingComplete, *device_); AttemptRecordingFastPairEngagementFlow( *device_, FastPairEngagementFlowEvent::kPairingSucceededAlreadyPaired); + + std::move(paired_callback_).Run(device_); AttemptSendAccountKey(); return; } @@ -287,6 +292,8 @@ return; } + RecordProtocolPairingStep(FastPairProtocolPairingSteps::kBondSuccessful, + *device_); ask_confirm_passkey_initial_time_ = base::TimeTicks::Now(); } @@ -295,6 +302,8 @@ return; QP_LOG(INFO) << __func__; + RecordProtocolPairingStep(FastPairProtocolPairingSteps::kBondSuccessful, + *device_); ask_confirm_passkey_initial_time_ = base::TimeTicks::Now(); RecordConnectDeviceResult(/*success=*/true); // The device ID can change between device discovery and connection, so @@ -315,6 +324,8 @@ void FastPairPairerImpl::ConfirmPasskey(device::BluetoothDevice* device, uint32_t passkey) { QP_LOG(INFO) << __func__; + RecordProtocolPairingStep(FastPairProtocolPairingSteps::kPasskeyNegotiated, + *device_); RecordConfirmPasskeyAskTime(base::TimeTicks::Now() - ask_confirm_passkey_initial_time_); confirm_passkey_initial_time_ = base::TimeTicks::Now(); @@ -349,6 +360,8 @@ absl::optional<PairFailure> failure) { QP_LOG(INFO) << __func__; RecordWritePasskeyCharacteristicResult(/*success=*/!failure.has_value()); + RecordProtocolPairingStep( + FastPairProtocolPairingSteps::kRecievedPasskeyResponse, *device_); if (failure) { QP_LOG(WARNING) << __func__ @@ -389,6 +402,9 @@ return; } + RecordProtocolPairingStep(FastPairProtocolPairingSteps::kPasskeyValidated, + *device_); + if (passkey->passkey != expected_passkey_) { QP_LOG(ERROR) << "Passkeys do not match. Expected: " << expected_passkey_ << ". Actual: " << passkey->passkey; @@ -399,6 +415,8 @@ return; } + RecordProtocolPairingStep(FastPairProtocolPairingSteps::kPasskeyConfirmed, + *device_); RecordPasskeyCharacteristicDecryptResult(/*success=*/true); RecordPasskeyCharacteristicDecryptTime(base::TimeTicks::Now() - decrypt_start_time); @@ -635,6 +653,9 @@ if (device->GetAddress() == device_->ble_address || device->GetAddress() == device_->classic_address()) { QP_LOG(INFO) << __func__ << ": Completing pairing procedure " << device_; + RecordProtocolPairingStep(FastPairProtocolPairingSteps::kPairingComplete, + *device_); + std::move(paired_callback_).Run(device_); // For V2 devices we still need to remove the Pairing Delegate and write the
diff --git a/ash/quick_pair/pairing/fast_pair/fast_pair_pairer_impl_unittest.cc b/ash/quick_pair/pairing/fast_pair/fast_pair_pairer_impl_unittest.cc index 37ee17cc..52e76b9 100644 --- a/ash/quick_pair/pairing/fast_pair/fast_pair_pairer_impl_unittest.cc +++ b/ash/quick_pair/pairing/fast_pair/fast_pair_pairer_impl_unittest.cc
@@ -5,6 +5,7 @@ #include "ash/quick_pair/pairing/fast_pair/fast_pair_pairer_impl.h" #include <memory> +#include <vector> #include "ash/constants/ash_features.h" #include "ash/public/cpp/test/test_system_tray_client.h" @@ -100,6 +101,10 @@ "Bluetooth.ChromeOS.FastPair.SavedDevices.UpdateOptInStatus.Result." "SubsequentPairingProtocol"; constexpr char kInitialSuccessFunnelMetric[] = "FastPair.InitialPairing"; +constexpr char kProtocolPairingStepInitial[] = + "FastPair.InitialPairing.Pairing"; +constexpr char kProtocolPairingStepSubsequent[] = + "FastPair.SubsequentPairing.Pairing"; class FakeBluetoothAdapter : public testing::NiceMock<device::MockBluetoothAdapter> { @@ -387,6 +392,14 @@ adapter_->DevicePairedChanged(fake_bluetooth_device_ptr_, true); } + void ExpectStepMetrics(std::string metric, + std::vector<FastPairProtocolPairingSteps> steps) { + histogram_tester().ExpectTotalCount(metric, steps.size()); + for (FastPairProtocolPairingSteps step : steps) { + histogram_tester().ExpectBucketCount(metric, step, 1); + } + } + protected: // This is done on-demand to enable setting up mock expectations first. void CreatePairer() { @@ -559,6 +572,8 @@ EXPECT_EQ(GetPairFailure(), PairFailure::kPairingConnect); histogram_tester().ExpectTotalCount(kPairDeviceResult, 1); histogram_tester().ExpectTotalCount(kPairDeviceErrorReason, 1); + ExpectStepMetrics(kProtocolPairingStepSubsequent, + {FastPairProtocolPairingSteps::kPairingStarted}); } TEST_F(FastPairPairerImplTest, PairByDeviceSuccess_Initial) { @@ -571,6 +586,9 @@ fake_fast_pair_handshake_->InvokeCallback(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); + ExpectStepMetrics(kProtocolPairingStepInitial, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful}); } TEST_F(FastPairPairerImplTest, @@ -593,6 +611,10 @@ EXPECT_CALL(pairing_procedure_complete_, Run); RunWriteAccountKeyCallback(); EXPECT_TRUE(IsAccountKeySavedToFootprints()); + ExpectStepMetrics(kProtocolPairingStepInitial, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kAlreadyPaired, + FastPairProtocolPairingSteps::kPairingComplete}); } TEST_F(FastPairPairerImplTest, PairByDeviceSuccess_Initial_AlreadyFastPaired) { @@ -617,6 +639,10 @@ kInitialSuccessFunnelMetric, FastPairInitialSuccessFunnelEvent::kDeviceAlreadyAssociatedToAccount), 1); + ExpectStepMetrics(kProtocolPairingStepInitial, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kAlreadyPaired, + FastPairProtocolPairingSteps::kPairingComplete}); } TEST_F(FastPairPairerImplTest, @@ -634,6 +660,10 @@ fake_fast_pair_handshake_->InvokeCallback(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); + ExpectStepMetrics(kProtocolPairingStepSubsequent, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kAlreadyPaired, + FastPairProtocolPairingSteps::kPairingComplete}); } TEST_F(FastPairPairerImplTest, @@ -654,6 +684,10 @@ fake_fast_pair_handshake_->InvokeCallback(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); + ExpectStepMetrics(kProtocolPairingStepSubsequent, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kAlreadyPaired, + FastPairProtocolPairingSteps::kPairingComplete}); } TEST_F(FastPairPairerImplTest, PairByDeviceSuccess_Subsequent) { @@ -666,6 +700,9 @@ fake_fast_pair_handshake_->InvokeCallback(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), absl::nullopt); + ExpectStepMetrics(kProtocolPairingStepSubsequent, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful}); } TEST_F(FastPairPairerImplTest, ConnectFailure_Initial) { @@ -685,6 +722,8 @@ EXPECT_EQ(GetPairFailure(), PairFailure::kAddressConnect); histogram_tester().ExpectTotalCount(kConnectDeviceResult, 1); + ExpectStepMetrics(kProtocolPairingStepInitial, + {FastPairProtocolPairingSteps::kPairingStarted}); } TEST_F(FastPairPairerImplTest, ConnectFailure_Subsequent) { @@ -703,6 +742,8 @@ base::RunLoop().RunUntilIdle(); EXPECT_EQ(GetPairFailure(), PairFailure::kAddressConnect); histogram_tester().ExpectTotalCount(kConnectDeviceResult, 1); + ExpectStepMetrics(kProtocolPairingStepSubsequent, + {FastPairProtocolPairingSteps::kPairingStarted}); } TEST_F(FastPairPairerImplTest, ConnectSuccess_Initial) { @@ -726,6 +767,9 @@ 0); histogram_tester().ExpectTotalCount( kWritePasskeyCharacteristicPairFailureMetric, 0); + ExpectStepMetrics(kProtocolPairingStepInitial, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful}); } TEST_F(FastPairPairerImplTest, ConnectSuccess_Subsequent) { @@ -749,6 +793,9 @@ 0); histogram_tester().ExpectTotalCount( kWritePasskeyCharacteristicPairFailureMetric, 0); + ExpectStepMetrics(kProtocolPairingStepSubsequent, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful}); } TEST_F(FastPairPairerImplTest, ParseDecryptedPasskeyFailure_Initial) { @@ -781,6 +828,11 @@ kWritePasskeyCharacteristicPairFailureMetric, 1); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptTime, 0); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptResult, 0); + ExpectStepMetrics(kProtocolPairingStepInitial, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful, + FastPairProtocolPairingSteps::kPasskeyNegotiated, + FastPairProtocolPairingSteps::kRecievedPasskeyResponse}); } TEST_F(FastPairPairerImplTest, ParseDecryptedPasskeyFailure_Subsequent) { @@ -812,6 +864,11 @@ kWritePasskeyCharacteristicPairFailureMetric, 1); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptTime, 0); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptResult, 0); + ExpectStepMetrics(kProtocolPairingStepSubsequent, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful, + FastPairProtocolPairingSteps::kPasskeyNegotiated, + FastPairProtocolPairingSteps::kRecievedPasskeyResponse}); } TEST_F(FastPairPairerImplTest, @@ -838,6 +895,11 @@ EXPECT_EQ(GetPairFailure(), PairFailure::kIncorrectPasskeyResponseType); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptTime, 0); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptResult, 1); + ExpectStepMetrics(kProtocolPairingStepInitial, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful, + FastPairProtocolPairingSteps::kPasskeyNegotiated, + FastPairProtocolPairingSteps::kRecievedPasskeyResponse}); } TEST_F( @@ -865,6 +927,11 @@ EXPECT_EQ(GetPairFailure(), PairFailure::kIncorrectPasskeyResponseType); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptTime, 0); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptResult, 1); + ExpectStepMetrics(kProtocolPairingStepInitial, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful, + FastPairProtocolPairingSteps::kPasskeyNegotiated, + FastPairProtocolPairingSteps::kRecievedPasskeyResponse}); } TEST_F( @@ -892,6 +959,11 @@ EXPECT_EQ(GetPairFailure(), PairFailure::kIncorrectPasskeyResponseType); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptTime, 0); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptResult, 1); + ExpectStepMetrics(kProtocolPairingStepInitial, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful, + FastPairProtocolPairingSteps::kPasskeyNegotiated, + FastPairProtocolPairingSteps::kRecievedPasskeyResponse}); } TEST_F(FastPairPairerImplTest, ParseDecryptedPasskeyNoPasskey) { @@ -916,6 +988,11 @@ EXPECT_EQ(GetPairFailure(), PairFailure::kPasskeyDecryptFailure); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptTime, 0); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptResult, 1); + ExpectStepMetrics(kProtocolPairingStepInitial, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful, + FastPairProtocolPairingSteps::kPasskeyNegotiated, + FastPairProtocolPairingSteps::kRecievedPasskeyResponse}); } TEST_F(FastPairPairerImplTest, @@ -942,6 +1019,11 @@ EXPECT_EQ(GetPairFailure(), PairFailure::kIncorrectPasskeyResponseType); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptTime, 0); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptResult, 1); + ExpectStepMetrics(kProtocolPairingStepSubsequent, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful, + FastPairProtocolPairingSteps::kPasskeyNegotiated, + FastPairProtocolPairingSteps::kRecievedPasskeyResponse}); } TEST_F(FastPairPairerImplTest, ParseDecryptedPasskeyMismatch_Initial) { @@ -966,6 +1048,12 @@ EXPECT_EQ(GetPairFailure(), PairFailure::kPasskeyMismatch); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptTime, 0); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptResult, 1); + ExpectStepMetrics(kProtocolPairingStepInitial, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful, + FastPairProtocolPairingSteps::kPasskeyNegotiated, + FastPairProtocolPairingSteps::kRecievedPasskeyResponse, + FastPairProtocolPairingSteps::kPasskeyValidated}); } TEST_F(FastPairPairerImplTest, ParseDecryptedPasskeyMismatch_Subsequent) { @@ -990,6 +1078,12 @@ EXPECT_EQ(GetPairFailure(), PairFailure::kPasskeyMismatch); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptTime, 0); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptResult, 1); + ExpectStepMetrics(kProtocolPairingStepSubsequent, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful, + FastPairProtocolPairingSteps::kPasskeyNegotiated, + FastPairProtocolPairingSteps::kRecievedPasskeyResponse, + FastPairProtocolPairingSteps::kPasskeyValidated}); } TEST_F(FastPairPairerImplTest, PairedDeviceLost_Initial) { @@ -1018,6 +1112,13 @@ EXPECT_EQ(GetPairFailure(), PairFailure::kPairingDeviceLost); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptTime, 1); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptResult, 1); + ExpectStepMetrics(kProtocolPairingStepInitial, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful, + FastPairProtocolPairingSteps::kPasskeyNegotiated, + FastPairProtocolPairingSteps::kRecievedPasskeyResponse, + FastPairProtocolPairingSteps::kPasskeyValidated, + FastPairProtocolPairingSteps::kPasskeyConfirmed}); } TEST_F(FastPairPairerImplTest, PairedDeviceLost_Subsequent) { @@ -1046,6 +1147,13 @@ EXPECT_EQ(GetPairFailure(), PairFailure::kPairingDeviceLost); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptTime, 1); histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptResult, 1); + ExpectStepMetrics(kProtocolPairingStepSubsequent, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful, + FastPairProtocolPairingSteps::kPasskeyNegotiated, + FastPairProtocolPairingSteps::kRecievedPasskeyResponse, + FastPairProtocolPairingSteps::kPasskeyValidated, + FastPairProtocolPairingSteps::kPasskeyConfirmed}); } TEST_F(FastPairPairerImplTest, PairSuccess_Initial) { @@ -1077,6 +1185,14 @@ histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptResult, 1); histogram_tester().ExpectTotalCount(kConfirmPasskeyAskTime, 1); histogram_tester().ExpectTotalCount(kConfirmPasskeyConfirmTime, 1); + ExpectStepMetrics(kProtocolPairingStepInitial, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful, + FastPairProtocolPairingSteps::kPasskeyNegotiated, + FastPairProtocolPairingSteps::kRecievedPasskeyResponse, + FastPairProtocolPairingSteps::kPasskeyValidated, + FastPairProtocolPairingSteps::kPasskeyConfirmed, + FastPairProtocolPairingSteps::kPairingComplete}); } TEST_F(FastPairPairerImplTest, BleDeviceLostMidPair) { @@ -1173,6 +1289,14 @@ histogram_tester().ExpectTotalCount(kPasskeyCharacteristicDecryptResult, 1); histogram_tester().ExpectTotalCount(kConfirmPasskeyAskTime, 1); histogram_tester().ExpectTotalCount(kConfirmPasskeyConfirmTime, 1); + ExpectStepMetrics(kProtocolPairingStepSubsequent, + {FastPairProtocolPairingSteps::kPairingStarted, + FastPairProtocolPairingSteps::kBondSuccessful, + FastPairProtocolPairingSteps::kPasskeyNegotiated, + FastPairProtocolPairingSteps::kRecievedPasskeyResponse, + FastPairProtocolPairingSteps::kPasskeyValidated, + FastPairProtocolPairingSteps::kPasskeyConfirmed, + FastPairProtocolPairingSteps::kPairingComplete}); } TEST_F(FastPairPairerImplTest, PairSuccess_Subsequent_FlagDisabled) {
diff --git a/ash/quick_pair/pairing/pairer_broker_impl.cc b/ash/quick_pair/pairing/pairer_broker_impl.cc index d7dd4951..a5b60de 100644 --- a/ash/quick_pair/pairing/pairer_broker_impl.cc +++ b/ash/quick_pair/pairing/pairer_broker_impl.cc
@@ -152,6 +152,8 @@ if (pair_failure_counts_[device->ble_address] == kMaxFailureRetryCount) { QP_LOG(INFO) << __func__ << ": Reached max failure count. Notifying observers."; + RecordProtocolPairingStep(FastPairProtocolPairingSteps::kExhaustedRetries, + *device); for (auto& observer : observers_) { observer.OnPairFailure(device, failure); }
diff --git a/ash/quick_pair/pairing/pairer_broker_impl_unittest.cc b/ash/quick_pair/pairing/pairer_broker_impl_unittest.cc index 2d84666..ee7e5623 100644 --- a/ash/quick_pair/pairing/pairer_broker_impl_unittest.cc +++ b/ash/quick_pair/pairing/pairer_broker_impl_unittest.cc
@@ -34,6 +34,11 @@ const char kFastPairRetryCountMetricName[] = "Bluetooth.ChromeOS.FastPair.PairRetry.Count"; +constexpr char kProtocolPairingStepInitial[] = + "FastPair.InitialPairing.Pairing"; +constexpr char kProtocolPairingStepSubsequent[] = + "FastPair.SubsequentPairing.Pairing"; + class FakeFastPairPairer : public ash::quick_pair::FastPairPairer { public: FakeFastPairPairer( @@ -350,6 +355,7 @@ EXPECT_FALSE(pairer_broker_->IsPairing()); EXPECT_EQ(pair_failure_count_, 1); histogram_tester_.ExpectTotalCount(kFastPairRetryCountMetricName, 0); + histogram_tester_.ExpectTotalCount(kProtocolPairingStepInitial, 1); } TEST_F(PairerBrokerImplTest, PairDeviceFailureMax_Subsequent) { @@ -372,6 +378,7 @@ EXPECT_FALSE(pairer_broker_->IsPairing()); EXPECT_EQ(pair_failure_count_, 1); histogram_tester_.ExpectTotalCount(kFastPairRetryCountMetricName, 0); + histogram_tester_.ExpectTotalCount(kProtocolPairingStepSubsequent, 1); } TEST_F(PairerBrokerImplTest, PairDeviceFailureMax_Retroactive) {
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 99dd3059..0913111 100644 --- a/ash/system/holding_space/holding_space_item_chip_view.cc +++ b/ash/system/holding_space/holding_space_item_chip_view.cc
@@ -606,14 +606,15 @@ const std::u16string last_secondary_text = secondary_label_->GetText(); secondary_label_->SetText( item()->secondary_text().value_or(base::EmptyString16())); - secondary_label_->SetEnabledColor( - selected() && multiselect ? GetMultiSelectTextColor() - : item()->secondary_text_color() - ? cros_styles::ResolveColor( - item()->secondary_text_color().value(), - DarkLightModeControllerImpl::Get()->IsDarkModeEnabled()) - : AshColorProvider::Get()->GetContentLayerColor( - AshColorProvider::ContentLayerType::kTextColorSecondary)); + if (GetWidget()) { + secondary_label_->SetEnabledColor( + selected() && multiselect ? GetMultiSelectTextColor() + : item()->secondary_text_color_id() + ? GetColorProvider()->GetColor( + item()->secondary_text_color_id().value()) + : AshColorProvider::Get()->GetContentLayerColor( + AshColorProvider::ContentLayerType::kTextColorSecondary)); + } secondary_label_->SetVisible(!secondary_label_->GetText().empty()); // Tooltip.
diff --git a/ash/system/microphone_mute/microphone_mute_notification_controller.cc b/ash/system/microphone_mute/microphone_mute_notification_controller.cc index 5218b01..7a14527 100644 --- a/ash/system/microphone_mute/microphone_mute_notification_controller.cc +++ b/ash/system/microphone_mute/microphone_mute_notification_controller.cc
@@ -25,7 +25,7 @@ namespace ash { namespace { -void SetMicrosphoneNotificationVisible(const bool visible) { +void SetMicrophoneNotificationVisible(const bool visible) { PrivacyHubNotificationController* const privacy_hub_notification_controller = Shell::Get()->system_notification_controller()->privacy_hub(); if (visible) { @@ -57,7 +57,8 @@ mic_muted_by_mute_switch_ = CrasAudioHandler::Get()->input_muted_by_microphone_mute_switch(); - SetMicrosphoneNotificationVisible(input_stream_count_ && mic_mute_on_); + if (input_stream_count_) + SetMicrophoneNotificationVisible(mic_mute_on_); } void MicrophoneMuteNotificationController:: @@ -67,7 +68,8 @@ mic_muted_by_mute_switch_ = muted; - SetMicrosphoneNotificationVisible(input_stream_count_ && mic_mute_on_); + if (input_stream_count_) + SetMicrophoneNotificationVisible(mic_mute_on_); } void MicrophoneMuteNotificationController:: @@ -78,9 +80,9 @@ input_stream_count_ = input_stream_count; if (!stream_count_decreased) { - SetMicrosphoneNotificationVisible(input_stream_count_ && mic_mute_on_); + SetMicrophoneNotificationVisible(input_stream_count_ && mic_mute_on_); } else if (!input_stream_count_) { - SetMicrosphoneNotificationVisible(false); + SetMicrophoneNotificationVisible(false); } }
diff --git a/ash/system/privacy_hub/camera_privacy_switch_controller.cc b/ash/system/privacy_hub/camera_privacy_switch_controller.cc index 8c2524d..07c76a4 100644 --- a/ash/system/privacy_hub/camera_privacy_switch_controller.cc +++ b/ash/system/privacy_hub/camera_privacy_switch_controller.cc
@@ -111,16 +111,31 @@ DCHECK_EQ(pref_name, prefs::kUserCameraAllowed); const CameraSWPrivacySwitchSetting pref_val = GetUserSwitchPreference(); switch_api_->SetCameraSWPrivacySwitch(pref_val); - ClearSWSwitchNotifications(); - if (active_applications_using_camera_count_ > 0 && - pref_val == CameraSWPrivacySwitchSetting::kDisabled) { - // Show notification in case we switch off the camera when the camera is - // used by an app. + + if (message_center::MessageCenter* const message_center = + message_center::MessageCenter::Get()) { + message_center->RemoveNotification( + kPrivacyHubHWCameraSwitchOffSWCameraSwitchOnNotificationId, + /*by_user=*/false); + } + + if (active_applications_using_camera_count_ == 0) + return; + + if (pref_val == CameraSWPrivacySwitchSetting::kDisabled) { + camera_used_while_deactivated_ = true; Shell::Get() ->system_notification_controller() ->privacy_hub() ->ShowSensorDisabledNotification( PrivacyHubNotificationController::Sensor::kCamera); + } else { + camera_used_while_deactivated_ = false; + Shell::Get() + ->system_notification_controller() + ->privacy_hub() + ->RemoveSensorDisabledNotification( + PrivacyHubNotificationController::Sensor::kCamera); } } @@ -265,8 +280,6 @@ }, action_enables_camera, kNotificationId)); - message_center::MessageCenter::Get()->RemoveNotification(kNotificationId, - /*by_user=*/false); message_center::MessageCenter::Get()->AddNotification( ash::CreateSystemNotificationPtr( message_center::NOTIFICATION_TYPE_SIMPLE, kNotificationId, @@ -281,22 +294,6 @@ message_center::SystemNotificationWarningLevel::NORMAL)); } -void CameraPrivacySwitchController::ClearSWSwitchNotifications() { - message_center::MessageCenter* const message_center = - message_center::MessageCenter::Get(); - if (!message_center) { - return; - } - Shell::Get() - ->system_notification_controller() - ->privacy_hub() - ->RemoveSensorDisabledNotification( - PrivacyHubNotificationController::Sensor::kCamera); - message_center->RemoveNotification( - kPrivacyHubHWCameraSwitchOffSWCameraSwitchOnNotificationId, - /*by_user=*/false); -} - void CameraPrivacySwitchController::ActiveApplicationsChanged( bool application_added) { if (application_added) { @@ -310,6 +307,7 @@ // the camera is disabled by the software switch. if (application_added && GetUserSwitchPreference() == CameraSWPrivacySwitchSetting::kDisabled) { + camera_used_while_deactivated_ = true; Shell::Get() ->system_notification_controller() ->privacy_hub() @@ -319,7 +317,9 @@ // Remove existing software switch notification when no application is using // the camera anymore. - if (active_applications_using_camera_count_ == 0) { + if (active_applications_using_camera_count_ == 0 && + camera_used_while_deactivated_) { + camera_used_while_deactivated_ = false; Shell::Get() ->system_notification_controller() ->privacy_hub()
diff --git a/ash/system/privacy_hub/camera_privacy_switch_controller.h b/ash/system/privacy_hub/camera_privacy_switch_controller.h index 78313eb5..fb85af9d 100644 --- a/ash/system/privacy_hub/camera_privacy_switch_controller.h +++ b/ash/system/privacy_hub/camera_privacy_switch_controller.h
@@ -111,9 +111,6 @@ const std::u16string& notification_message, const NotificationCatalogName catalog); - // Clears all notifications related to the camera SW switch - void ClearSWSwitchNotifications(); - std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_; std::unique_ptr<CameraPrivacySwitchAPI> switch_api_; cros::mojom::CameraPrivacySwitchState camera_privacy_switch_state_ = @@ -121,6 +118,7 @@ int active_applications_using_camera_count_ = 0; bool is_camera_observer_added_ = false; int camera_count_ = -1; + bool camera_used_while_deactivated_ = false; }; } // namespace ash
diff --git a/ash/system/video_conference/bubble/bubble_view.cc b/ash/system/video_conference/bubble/bubble_view.cc new file mode 100644 index 0000000..1be3506 --- /dev/null +++ b/ash/system/video_conference/bubble/bubble_view.cc
@@ -0,0 +1,38 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/video_conference/bubble/bubble_view.h" + +#include "ash/system/tray/tray_bubble_view.h" +#include "ash/system/video_conference/bubble/bubble_view_ids.h" +#include "ash/system/video_conference/bubble/return_to_app_button.h" +#include "ui/views/border.h" +#include "ui/views/layout/flex_layout.h" + +namespace ash::video_conference { + +namespace { + +const int kBorderInsetDimension = 10; + +} // namespace + +BubbleView::BubbleView(const InitParams& init_params, + VideoConferenceTrayController* controller) + : TrayBubbleView(init_params) { + SetID(BubbleViewID::kMainBubbleView); + + views::FlexLayout* layout = + SetLayoutManager(std::make_unique<views::FlexLayout>()); + layout->SetOrientation(views::LayoutOrientation::kVertical); + layout->SetMainAxisAlignment(views::LayoutAlignment::kCenter); + layout->SetCrossAxisAlignment(views::LayoutAlignment::kStretch); + + AddChildView(std::make_unique<ReturnToAppButton>()); + + SetBorder(views::CreateEmptyBorder( + gfx::Insets::VH(kBorderInsetDimension, kBorderInsetDimension))); +} + +} // namespace ash::video_conference
diff --git a/ash/system/video_conference/bubble/bubble_view.h b/ash/system/video_conference/bubble/bubble_view.h new file mode 100644 index 0000000..924c751 --- /dev/null +++ b/ash/system/video_conference/bubble/bubble_view.h
@@ -0,0 +1,31 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_VIDEO_CONFERENCE_BUBBLE_BUBBLE_VIEW_H_ +#define ASH_SYSTEM_VIDEO_CONFERENCE_BUBBLE_BUBBLE_VIEW_H_ + +#include "ash/system/tray/tray_bubble_view.h" + +namespace ash { + +class VideoConferenceTrayController; + +namespace video_conference { + +// The bubble that contains controls for camera and microphone effects, +// and for easy navigation to apps performing video/audio capture. +class BubbleView : public TrayBubbleView { + public: + explicit BubbleView(const InitParams& init_params, + VideoConferenceTrayController* controller); + BubbleView(const BubbleView&) = delete; + BubbleView& operator=(const BubbleView&) = delete; + ~BubbleView() override = default; +}; + +} // namespace video_conference + +} // namespace ash + +#endif // ASH_SYSTEM_VIDEO_CONFERENCE_BUBBLE_BUBBLE_VIEW_H_ \ No newline at end of file
diff --git a/ash/system/video_conference/bubble/bubble_view_ids.h b/ash/system/video_conference/bubble/bubble_view_ids.h new file mode 100644 index 0000000..42ad41c --- /dev/null +++ b/ash/system/video_conference/bubble/bubble_view_ids.h
@@ -0,0 +1,42 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_VIDEO_CONFERENCE_BUBBLE_BUBBLE_VIEW_IDS_H_ +#define ASH_SYSTEM_VIDEO_CONFERENCE_BUBBLE_BUBBLE_VIEW_IDS_H_ + +namespace ash::video_conference { + +// IDs used for the main views that comprise the video conference bubble view. +// Use these for easy access to the views during the unittests. Note that these +// IDs are only guaranteed to be unique inside the bubble view. +enum BubbleViewID { + // Main outermost bubble view, what's actually launched from the tray. Start + // from 1 because 0 is the default view ID. + kMainBubbleView = 1, + + // The "return to app" UI, which is a child of `kMainBubbleView`. + kReturnToApp, + + // Container view for controls for VC effects, a child of the + // `kMainBubbleView`. + kEffectsView, + + // Container view for all "set-value" VC effects, a child of `kEffectsView`. + kSetValueEffectsContainer, + + // Container view for all "toggle" VC effects, a child of `kEffectsView`. + kToggleEffectsContainer, + + // Button for toggling an individual "toggle" VC effect, a child of + // `kToggleEffectsContainer`. + kToggleEffectsButton, + + // Button for setting an individual value of a "set-value" VC effect, a child + // of `kSetValueEffectsContainer`. + kSetValueButton, +}; + +} // namespace ash::video_conference + +#endif // ASH_SYSTEM_VIDEO_CONFERENCE_BUBBLE_BUBBLE_VIEW_IDS_H_
diff --git a/ash/system/video_conference/bubble/return_to_app_button.cc b/ash/system/video_conference/bubble/return_to_app_button.cc new file mode 100644 index 0000000..efc6da0 --- /dev/null +++ b/ash/system/video_conference/bubble/return_to_app_button.cc
@@ -0,0 +1,56 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/video_conference/bubble/return_to_app_button.h" + +#include "ash/resources/vector_icons/vector_icons.h" +#include "ash/style/ash_color_id.h" +#include "ash/system/video_conference/bubble/bubble_view_ids.h" +#include "ui/base/models/image_model.h" +#include "ui/views/background.h" +#include "ui/views/border.h" +#include "ui/views/controls/image_view.h" +#include "ui/views/controls/label.h" +#include "ui/views/layout/flex_layout.h" + +namespace ash::video_conference { + +namespace { + +const int kBorderInsetDimension = 10; +const int kBackgroundRoundedRectRadius = 10; + +} // namespace + +// TODO(b/253274599, b/253274147, b/253272945) Implement actual "return to app" +// button functionality. This is a temporary placeholder for facilitating VC +// bubble development. +ReturnToAppButton::ReturnToAppButton() { + SetID(BubbleViewID::kReturnToApp); + + views::FlexLayout* layout = + SetLayoutManager(std::make_unique<views::FlexLayout>()); + layout->SetOrientation(views::LayoutOrientation::kHorizontal); + layout->SetMainAxisAlignment(views::LayoutAlignment::kCenter); + layout->SetCrossAxisAlignment(views::LayoutAlignment::kStretch); + + auto camera = std::make_unique<views::ImageView>(); + camera->SetImage(ui::ImageModel::FromVectorIcon(kPrivacyIndicatorsCameraIcon, + kColorAshIconColorPrimary)); + AddChildView(std::move(camera)); + + auto microphone = std::make_unique<views::ImageView>(); + microphone->SetImage(ui::ImageModel::FromVectorIcon( + kPrivacyIndicatorsMicrophoneIcon, kColorAshIconColorPrimary)); + AddChildView(std::move(microphone)); + + AddChildView(std::make_unique<views::Label>(u"Meet")); + + SetBorder(views::CreateEmptyBorder( + gfx::Insets::VH(kBorderInsetDimension, kBorderInsetDimension))); + SetBackground(views::CreateRoundedRectBackground( + gfx::kGoogleBlue800, kBackgroundRoundedRectRadius)); +} + +} // namespace ash::video_conference \ No newline at end of file
diff --git a/ash/system/video_conference/bubble/return_to_app_button.h b/ash/system/video_conference/bubble/return_to_app_button.h new file mode 100644 index 0000000..1fb6cb6 --- /dev/null +++ b/ash/system/video_conference/bubble/return_to_app_button.h
@@ -0,0 +1,26 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_VIDEO_CONFERENCE_BUBBLE_RETURN_TO_APP_BUTTON_H_ +#define ASH_SYSTEM_VIDEO_CONFERENCE_BUBBLE_RETURN_TO_APP_BUTTON_H_ + +#include "ui/views/view.h" + +namespace ash::video_conference { + +// The "return to app" button that resides in the video conference bubble. The +// user selects from a list of apps that are actively capturing audio/video +// and/or sharing the screen, and the selected app is brought to the top and +// focused. +class ReturnToAppButton : public views::View { + public: + ReturnToAppButton(); + ReturnToAppButton(const ReturnToAppButton&) = delete; + ReturnToAppButton& operator=(const ReturnToAppButton&) = delete; + ~ReturnToAppButton() override = default; +}; + +} // namespace ash::video_conference + +#endif // ASH_SYSTEM_VIDEO_CONFERENCE_BUBBLE_RETURN_TO_APP_BUTTON_H_
diff --git a/ash/system/video_conference/bubble/video_conference_bubble.cc b/ash/system/video_conference/bubble/video_conference_bubble.cc deleted file mode 100644 index be694ba..0000000 --- a/ash/system/video_conference/bubble/video_conference_bubble.cc +++ /dev/null
@@ -1,148 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ash/system/video_conference/bubble/video_conference_bubble.h" - -#include "ash/resources/vector_icons/vector_icons.h" -#include "ash/style/ash_color_id.h" -#include "ash/system/tray/tray_bubble_view.h" -#include "media/capture/video/chromeos/mojom/effects_pipeline.mojom.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/models/image_model.h" -#include "ui/views/background.h" -#include "ui/views/controls/button/label_button.h" -#include "ui/views/controls/button/radio_button.h" -#include "ui/views/controls/button/toggle_button.h" -#include "ui/views/controls/image_view.h" -#include "ui/views/layout/flex_layout.h" - -namespace ash { - -namespace { - -// NOTE: The buttons/switches here are temporary, for testing purposes only. The -// real UI elements will be added when the underlying work to produce them is -// complete. See b/253273036 (styled radio switch) and b/253249205 (styled -// toggle button). -class VideoConferenceBackgroundBlurRadioSwitch : public views::View { - public: - VideoConferenceBackgroundBlurRadioSwitch() { - const int kBackgroundBlurRadioGroupId = 1; - - views::FlexLayout* layout = - SetLayoutManager(std::make_unique<views::FlexLayout>()); - layout->SetOrientation(views::LayoutOrientation::kHorizontal); - layout->SetMainAxisAlignment(views::LayoutAlignment::kCenter); - layout->SetCrossAxisAlignment(views::LayoutAlignment::kStretch); - - AddChildView(std::make_unique<views::Label>(u"Background Blur")); - - std::unique_ptr<views::RadioButton> off_button = - std::make_unique<views::RadioButton>(u"Off", - kBackgroundBlurRadioGroupId); - off_button->SetCallback(base::BindRepeating( - &VideoConferenceBackgroundBlurRadioSwitch::OnLevelSelected, - base::Unretained(this), -1)); - AddChildView(std::move(off_button)); - - std::unique_ptr<views::RadioButton> lowest_button = - std::make_unique<views::RadioButton>(u"Lowest", - kBackgroundBlurRadioGroupId); - lowest_button->SetCallback(base::BindRepeating( - &VideoConferenceBackgroundBlurRadioSwitch::OnLevelSelected, - base::Unretained(this), (int)cros::mojom::BlurLevel::kLowest)); - AddChildView(std::move(lowest_button)); - - std::unique_ptr<views::RadioButton> light_button = - std::make_unique<views::RadioButton>(u"Light", - kBackgroundBlurRadioGroupId); - light_button->SetCallback(base::BindRepeating( - &VideoConferenceBackgroundBlurRadioSwitch::OnLevelSelected, - base::Unretained(this), (int)cros::mojom::BlurLevel::kLight)); - AddChildView(std::move(light_button)); - - std::unique_ptr<views::RadioButton> medium_button = - std::make_unique<views::RadioButton>(u"Medium", - kBackgroundBlurRadioGroupId); - medium_button->SetCallback(base::BindRepeating( - &VideoConferenceBackgroundBlurRadioSwitch::OnLevelSelected, - base::Unretained(this), (int)cros::mojom::BlurLevel::kMedium)); - AddChildView(std::move(medium_button)); - - std::unique_ptr<views::RadioButton> heavy_button = - std::make_unique<views::RadioButton>(u"Heavy", - kBackgroundBlurRadioGroupId); - heavy_button->SetCallback(base::BindRepeating( - &VideoConferenceBackgroundBlurRadioSwitch::OnLevelSelected, - base::Unretained(this), (int)cros::mojom::BlurLevel::kHeavy)); - AddChildView(std::move(heavy_button)); - - std::unique_ptr<views::RadioButton> maximum_button = - std::make_unique<views::RadioButton>(u"Maximum", - kBackgroundBlurRadioGroupId); - maximum_button->SetCallback(base::BindRepeating( - &VideoConferenceBackgroundBlurRadioSwitch::OnLevelSelected, - base::Unretained(this), (int)cros::mojom::BlurLevel::kMaximum)); - AddChildView(std::move(maximum_button)); - } - - VideoConferenceBackgroundBlurRadioSwitch( - const VideoConferenceBackgroundBlurRadioSwitch&) = delete; - VideoConferenceBackgroundBlurRadioSwitch& operator=( - const VideoConferenceBackgroundBlurRadioSwitch&) = delete; - ~VideoConferenceBackgroundBlurRadioSwitch() override = default; - - // Callback that's invoked when the user selects (presses) one of the radio - // buttons. - void OnLevelSelected(int level) {} -}; - -} // namespace - -VideoConferenceBubbleView::LabeledToggleButton::LabeledToggleButton( - views::Button::PressedCallback callback, - const std::u16string& effect_name) { - views::FlexLayout* layout = - SetLayoutManager(std::make_unique<views::FlexLayout>()); - layout->SetOrientation(views::LayoutOrientation::kHorizontal); - layout->SetMainAxisAlignment(views::LayoutAlignment::kCenter); - layout->SetCrossAxisAlignment(views::LayoutAlignment::kStretch); - - AddChildView(std::make_unique<views::Label>(effect_name)); - - std::unique_ptr<views::ToggleButton> button = - std::make_unique<views::ToggleButton>(callback); - button->SetAccessibleName(effect_name); - button_ = AddChildView(std::move(button)); -} - -bool VideoConferenceBubbleView::LabeledToggleButton::GetIsOn() const { - return button_->GetIsOn(); -} - -// NOTE: The buttons/switches here are temporary, for testing purposes only. The -// real UI elements will be added when the underlying work to produce them is -// complete. See b/253273036 (styled radio switch) and b/253249205(styled toggle -// button). -VideoConferenceBubbleView::VideoConferenceBubbleView( - const InitParams& init_params) - : TrayBubbleView(init_params) { - // Toggle button for camera "background replace" effect. - background_replace_button_ = AddChildView(std::make_unique< - LabeledToggleButton>( - base::BindRepeating( - &VideoConferenceBubbleView::OnBackgroundReplaceToggleButtonPressed, - base::Unretained(this)), - u"Background Replace")); - - // Radio switch for camera "background blur" effect. - AddChildView(std::make_unique<VideoConferenceBackgroundBlurRadioSwitch>()); -} - -void VideoConferenceBubbleView::OnBackgroundReplaceToggleButtonPressed() { - // TODO (b/259585295) Use `background_replace_button_->GetIsOn()` to get the - // toggle state of the button and enable/disable the actual effect. -} - -} // namespace ash
diff --git a/ash/system/video_conference/bubble/video_conference_bubble.h b/ash/system/video_conference/bubble/video_conference_bubble.h deleted file mode 100644 index ecc68bf..0000000 --- a/ash/system/video_conference/bubble/video_conference_bubble.h +++ /dev/null
@@ -1,54 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ASH_SYSTEM_VIDEO_CONFERENCE_BUBBLE_VIDEO_CONFERENCE_BUBBLE_H_ -#define ASH_SYSTEM_VIDEO_CONFERENCE_BUBBLE_VIDEO_CONFERENCE_BUBBLE_H_ - -#include "ash/system/tray/tray_bubble_view.h" - -namespace views { -class ToggleButton; -} // namespace views - -namespace ash { - -// The bubble that contains controls for camera and microphone effects, -// and for easy navigation to apps performing video/audio capture. -class VideoConferenceBubbleView : public TrayBubbleView { - public: - explicit VideoConferenceBubbleView(const InitParams& init_params); - - VideoConferenceBubbleView(const VideoConferenceBubbleView&) = delete; - VideoConferenceBubbleView& operator=(const VideoConferenceBubbleView&) = - delete; - ~VideoConferenceBubbleView() override = default; - - private: - // A view that combines a `views::Label` and a `views::ToggleButton`, - // for toggling a camera/mic effect from the VC bubble. - class LabeledToggleButton : public views::View { - public: - explicit LabeledToggleButton(views::Button::PressedCallback callback, - const std::u16string& effect_name); - - LabeledToggleButton(const LabeledToggleButton&) = delete; - LabeledToggleButton& operator=(const LabeledToggleButton&) = delete; - ~LabeledToggleButton() override = default; - - // Returns `true` if the `ToggleButton` is "on," `false` otherwise. - bool GetIsOn() const; - - private: - views::ToggleButton* button_; - }; - - // Invoked when the "background replace" toggle button is pressed. - void OnBackgroundReplaceToggleButtonPressed(); - - LabeledToggleButton* background_replace_button_; -}; - -} // namespace ash - -#endif // ASH_SYSTEM_VIDEO_CONFERENCE_BUBBLE_VIDEO_CONFERENCE_BUBBLE_H_
diff --git a/ash/system/video_conference/effects/fake_video_conference_effects.cc b/ash/system/video_conference/effects/fake_video_conference_effects.cc index 527e530e..78f203b 100644 --- a/ash/system/video_conference/effects/fake_video_conference_effects.cc +++ b/ash/system/video_conference/effects/fake_video_conference_effects.cc
@@ -14,130 +14,65 @@ namespace ash::fake_video_conference { -SimpleToggleEffect::SimpleToggleEffect( - const std::u16string& label_text, - views::Button::PressedCallback button_callback) - : SimpleToggleEffect(/*icon=*/nullptr, - /*label_text=*/label_text, - /*accessible_name_id=*/-1, - /*button_callback=*/button_callback) {} +SimpleToggleEffect::SimpleToggleEffect(const std::u16string& label_text) + : SimpleToggleEffect(/*label_text=*/label_text, + /*icon=*/absl::nullopt, + /*accessible_name_id=*/absl::nullopt) {} SimpleToggleEffect::SimpleToggleEffect( - const gfx::VectorIcon* icon, const std::u16string& label_text, - int accessible_name_id, - views::Button::PressedCallback button_callback) { + absl::optional<const gfx::VectorIcon*> icon, + absl::optional<int> accessible_name_id) { std::unique_ptr<VcHostedEffect> effect = std::make_unique<VcHostedEffect>(VcEffectType::kToggle); + + // Use default `icon` and/or `accessible_name_id` if none was passed in. std::unique_ptr<VcEffectState> state = std::make_unique<VcEffectState>( - icon, label_text, accessible_name_id, button_callback); + icon.value_or(&ash::kPrivacyIndicatorsCameraIcon), label_text, + accessible_name_id.value_or(IDS_PRIVACY_NOTIFICATION_TITLE_CAMERA), + base::BindRepeating(&SimpleToggleEffect::OnEffectControlActivated, + base::Unretained(this), + /*effect_id=*/VcEffectState::kUnusedId, + /*value=*/0)); effect->AddState(std::move(state)); AddEffect(std::move(effect)); } -CatEarsEffect::CatEarsEffect() - : SimpleToggleEffect( - /*label_text=*/u"Cat Ears", - /*button_callback=*/ - base::BindRepeating(&CatEarsEffect::OnEffectControlActivated, - base::Unretained(this), - /*effect_id=*/VcEffectState::kUnusedId, - /*value=*/0)) {} - -int CatEarsEffect::GetEffectState(int effect_id) { +int SimpleToggleEffect::GetEffectState(int effect_id) { return VcHostedEffect::kOff; } -void CatEarsEffect::OnEffectControlActivated(int effect_id, int value) {} +void SimpleToggleEffect::OnEffectControlActivated(int effect_id, int value) { + ++num_activations_for_testing_; +} + +CatEarsEffect::CatEarsEffect() + : SimpleToggleEffect( + /*label_text=*/u"Cat Ears") {} DogFurEffect::DogFurEffect() : SimpleToggleEffect( - /*label_text=*/u"Dog Fur", - /*button_callback=*/ - base::BindRepeating(&DogFurEffect::OnEffectControlActivated, - base::Unretained(this), - /*effect_id=*/VcEffectState::kUnusedId, - /*value=*/0)) {} - -int DogFurEffect::GetEffectState(int effect_id) { - return VcHostedEffect::kOff; -} - -void DogFurEffect::OnEffectControlActivated(int effect_id, int value) {} + /*label_text=*/u"Dog Fur") {} SpaceshipEffect::SpaceshipEffect() : SimpleToggleEffect( - /*label_text=*/u"Spaceship", - /*button_callback=*/ - base::BindRepeating(&SpaceshipEffect::OnEffectControlActivated, - base::Unretained(this), - /*effect_id=*/VcEffectState::kUnusedId, - /*value=*/0)) {} - -int SpaceshipEffect::GetEffectState(int effect_id) { - return VcHostedEffect::kOff; -} - -void SpaceshipEffect::OnEffectControlActivated(int effect_id, int value) {} + /*label_text=*/u"Spaceship") {} OfficeBunnyEffect::OfficeBunnyEffect() : SimpleToggleEffect( - /*label_text=*/u"Office Bunny", - /*button_callback=*/ - base::BindRepeating(&OfficeBunnyEffect::OnEffectControlActivated, - base::Unretained(this), - /*effect_id=*/VcEffectState::kUnusedId, - /*value=*/0)) {} - -int OfficeBunnyEffect::GetEffectState(int effect_id) { - return VcHostedEffect::kOff; -} - -void OfficeBunnyEffect::OnEffectControlActivated(int effect_id, int value) {} + /*label_text=*/u"Office Bunny") {} CalmForestEffect::CalmForestEffect() : SimpleToggleEffect( - /*label_text=*/u"Calm Forest", - /*button_callback=*/ - base::BindRepeating(&CalmForestEffect::OnEffectControlActivated, - base::Unretained(this), - /*effect_id=*/VcEffectState::kUnusedId, - /*value=*/0)) {} - -int CalmForestEffect::GetEffectState(int effect_id) { - return VcHostedEffect::kOff; -} - -void CalmForestEffect::OnEffectControlActivated(int effect_id, int value) {} + /*label_text=*/u"Calm Forest") {} StylishKitchenEffect::StylishKitchenEffect() : SimpleToggleEffect( - /*label_text=*/u"Stylish Kitchen", - /*button_callback=*/ - base::BindRepeating(&StylishKitchenEffect::OnEffectControlActivated, - base::Unretained(this), - /*effect_id=*/VcEffectState::kUnusedId, - /*value=*/0)) {} - -int StylishKitchenEffect::GetEffectState(int effect_id) { - return VcHostedEffect::kOff; -} -void StylishKitchenEffect::OnEffectControlActivated(int effect_id, int value) {} + /*label_text=*/u"Stylish Kitchen") {} GreenhouseEffect::GreenhouseEffect() : SimpleToggleEffect( - /*label_text=*/u"Greenhouse", - /*button_callback=*/ - base::BindRepeating(&GreenhouseEffect::OnEffectControlActivated, - base::Unretained(this), - /*effect_id=*/VcEffectState::kUnusedId, - /*value=*/0)) {} - -int GreenhouseEffect::GetEffectState(int effect_id) { - return VcHostedEffect::kOff; -} - -void GreenhouseEffect::OnEffectControlActivated(int effect_id, int value) {} + /*label_text=*/u"Greenhouse") {} // Delegate that hosts a set-value effect. @@ -177,7 +112,12 @@ effect->AddState(std::move(buzzcut_state)); effect->AddState(std::move(thick_state)); effect->set_label_text(u"Shaggy Fur"); + effect->set_id(100); AddEffect(std::move(effect)); + + // Initialize click counts. + for (int i = 0; i < static_cast<int>(FurShagginess::kMaxNumValues); ++i) + num_activations_for_testing_.push_back(0); } ShaggyFurEffect::~ShaggyFurEffect() = default; @@ -186,6 +126,14 @@ return static_cast<int>(FurShagginess::kBuzzcut); } -void ShaggyFurEffect::OnEffectControlActivated(int effect_id, int value) {} +void ShaggyFurEffect::OnEffectControlActivated(int effect_id, int value) { + DCHECK(value >= 0 && value < static_cast<int>(FurShagginess::kMaxNumValues)); + ++num_activations_for_testing_[value]; +} + +int ShaggyFurEffect::GetNumActivationsForTesting(int value) { + DCHECK(value >= 0 && value < static_cast<int>(FurShagginess::kMaxNumValues)); + return num_activations_for_testing_[value]; +} } // namespace ash::fake_video_conference
diff --git a/ash/system/video_conference/effects/fake_video_conference_effects.h b/ash/system/video_conference/effects/fake_video_conference_effects.h index 64877a8..99c8048 100644 --- a/ash/system/video_conference/effects/fake_video_conference_effects.h +++ b/ash/system/video_conference/effects/fake_video_conference_effects.h
@@ -22,19 +22,27 @@ class SimpleToggleEffect : public VcEffectsDelegate { public: // Simplest of all, no `icon` and no `accessible_name_id`, for unit tests. + explicit SimpleToggleEffect(const std::u16string& label_text); + // Allows setting `icon` and `accessible_name_id` if desired, for unit tests + // or the emulator. SimpleToggleEffect(const std::u16string& label_text, - views::Button::PressedCallback button_callback); - // Allows setting `icon` if desired, and requires `accessible_name_id`, for - // unit tests or the emulator. - SimpleToggleEffect(const gfx::VectorIcon* icon, - const std::u16string& label_text, - int accessible_name_id, - views::Button::PressedCallback button_callback); + absl::optional<const gfx::VectorIcon*> icon, + absl::optional<int> accessible_name_id); SimpleToggleEffect(const SimpleToggleEffect&) = delete; SimpleToggleEffect& operator=(const SimpleToggleEffect&) = delete; ~SimpleToggleEffect() override = default; + + // VcEffectsDelegate: + int GetEffectState(int effect_id) override; + void OnEffectControlActivated(int effect_id, int value) override; + + int num_activations_for_testing() { return num_activations_for_testing_; } + + private: + // Number of times the control has been activated, used by unit tests. + int num_activations_for_testing_ = 0; }; // Delegates that host a series of "fake" effects used in unit tests and the @@ -48,10 +56,6 @@ CatEarsEffect& operator=(const CatEarsEffect&) = delete; ~CatEarsEffect() override = default; - - // VcEffectsDelegate: - int GetEffectState(int effect_id) override; - void OnEffectControlActivated(int effect_id, int value) override; }; class ASH_EXPORT DogFurEffect : public SimpleToggleEffect { @@ -62,10 +66,6 @@ DogFurEffect& operator=(const DogFurEffect&) = delete; ~DogFurEffect() override = default; - - // VcEffectsDelegate: - int GetEffectState(int effect_id) override; - void OnEffectControlActivated(int effect_id, int value) override; }; class ASH_EXPORT SpaceshipEffect : public SimpleToggleEffect { @@ -76,10 +76,6 @@ SpaceshipEffect& operator=(const SpaceshipEffect&) = delete; ~SpaceshipEffect() override = default; - - // VcEffectsDelegate: - int GetEffectState(int effect_id) override; - void OnEffectControlActivated(int effect_id, int value) override; }; class ASH_EXPORT OfficeBunnyEffect : public SimpleToggleEffect { @@ -90,10 +86,6 @@ OfficeBunnyEffect& operator=(const OfficeBunnyEffect&) = delete; ~OfficeBunnyEffect() override = default; - - // VcEffectsDelegate: - int GetEffectState(int effect_id) override; - void OnEffectControlActivated(int effect_id, int value) override; }; class ASH_EXPORT CalmForestEffect : public SimpleToggleEffect { @@ -104,10 +96,6 @@ CalmForestEffect& operator=(const CalmForestEffect&) = delete; ~CalmForestEffect() override = default; - - // VcEffectsDelegate: - int GetEffectState(int effect_id) override; - void OnEffectControlActivated(int effect_id, int value) override; }; class ASH_EXPORT StylishKitchenEffect : public SimpleToggleEffect { @@ -118,10 +106,6 @@ StylishKitchenEffect& operator=(const StylishKitchenEffect&) = delete; ~StylishKitchenEffect() override = default; - - // VcEffectsDelegate: - int GetEffectState(int effect_id) override; - void OnEffectControlActivated(int effect_id, int value) override; }; class ASH_EXPORT GreenhouseEffect : public SimpleToggleEffect { @@ -132,10 +116,6 @@ GreenhouseEffect& operator=(const GreenhouseEffect&) = delete; ~GreenhouseEffect() override = default; - - // VcEffectsDelegate: - int GetEffectState(int effect_id) override; - void OnEffectControlActivated(int effect_id, int value) override; }; // Delegate that hosts a set-value effect. @@ -146,6 +126,7 @@ kBald = 0, kBuzzcut = 1, kThick = 2, + kMaxNumValues = 3, }; ShaggyFurEffect(); @@ -158,6 +139,15 @@ // VcEffectsDelegate: int GetEffectState(int effect_id) override; void OnEffectControlActivated(int effect_id, int value) override; + + // Returns the number of times the button/state for `value` has been + // activated. + int GetNumActivationsForTesting(int value); + + private: + // Number of times each value has been clicked, one count for each value in + // `FurShagginess`. + std::vector<int> num_activations_for_testing_; }; } // namespace ash::fake_video_conference
diff --git a/ash/system/video_conference/effects/video_conference_tray_effects_delegate.cc b/ash/system/video_conference/effects/video_conference_tray_effects_delegate.cc index 63f7cb14..5fe9b746 100644 --- a/ash/system/video_conference/effects/video_conference_tray_effects_delegate.cc +++ b/ash/system/video_conference/effects/video_conference_tray_effects_delegate.cc
@@ -24,4 +24,15 @@ return effects_[index].get(); } +std::vector<VcHostedEffect*> VcEffectsDelegate::GetEffects(VcEffectType type) { + std::vector<VcHostedEffect*> effects_of_type; + + for (auto& effect : effects_) { + if (effect->type() == type) + effects_of_type.push_back(effect.get()); + } + + return effects_of_type; +} + } // namespace ash \ No newline at end of file
diff --git a/ash/system/video_conference/effects/video_conference_tray_effects_delegate.h b/ash/system/video_conference/effects/video_conference_tray_effects_delegate.h index dfeefdff..fba590b 100644 --- a/ash/system/video_conference/effects/video_conference_tray_effects_delegate.h +++ b/ash/system/video_conference/effects/video_conference_tray_effects_delegate.h
@@ -42,6 +42,9 @@ // Retrieves the `VcHostedEffect` at `index`. const VcHostedEffect* GetEffect(int index); + // Retrieves a std::vector<> of hosted effects of the passed-in `type`. + std::vector<VcHostedEffect*> GetEffects(VcEffectType type); + // Invoked when the UI controls are being constructed, to get the actual // effect state. `effect_id` specifies the effect whose state is requested, // and can be ignored if only one effect is being hosted.
diff --git a/ash/system/video_conference/effects/video_conference_tray_effects_manager.cc b/ash/system/video_conference/effects/video_conference_tray_effects_manager.cc index 8365d72..7034c49 100644 --- a/ash/system/video_conference/effects/video_conference_tray_effects_manager.cc +++ b/ash/system/video_conference/effects/video_conference_tray_effects_manager.cc
@@ -71,16 +71,29 @@ return buttons; } +bool VideoConferenceTrayEffectsManager::HasSetValueEffects() { + return GetSetValueEffects().size() > 0; +} + +VideoConferenceTrayEffectsManager::EffectDataVector +VideoConferenceTrayEffectsManager::GetSetValueEffects() { + EffectDataVector effects; + + for (auto* delegate : effect_delegates_) { + for (auto* effect : delegate->GetEffects(VcEffectType::kSetValue)) + effects.push_back(effect); + } + + return effects; +} + VideoConferenceTrayEffectsManager::EffectDataVector VideoConferenceTrayEffectsManager::GetTotalToggleEffectButtons() { EffectDataVector effects; for (auto* delegate : effect_delegates_) { - for (int i = 0; i < delegate->GetNumEffects(); ++i) { - const VcHostedEffect* effect = delegate->GetEffect(i); - if (effect->type() == VcEffectType::kToggle) - effects.push_back(effect); - } + for (auto* effect : delegate->GetEffects(VcEffectType::kToggle)) + effects.push_back(effect); } return effects;
diff --git a/ash/system/video_conference/effects/video_conference_tray_effects_manager.h b/ash/system/video_conference/effects/video_conference_tray_effects_manager.h index 4f9f4fbd..cc6f5d52 100644 --- a/ash/system/video_conference/effects/video_conference_tray_effects_manager.h +++ b/ash/system/video_conference/effects/video_conference_tray_effects_manager.h
@@ -49,6 +49,15 @@ // objects. EffectDataTable GetToggleEffectButtonTable(); + // Returns 'true' if there are any `VcHostedEffect` + // objects of type `VcEffectType::kSetValue`, 'false' + // otherwise. + bool HasSetValueEffects(); + + // Returns a vector of `VcHostedEffect` objects of type + // `VcEffectType::kSetValue`, in no special order. + EffectDataVector GetSetValueEffects(); + private: // Returns a vector of `VcHostedEffect` objects of type // `VcEffectType::kToggle`, in no special order.
diff --git a/ash/system/video_conference/effects/video_conference_tray_effects_manager_types.cc b/ash/system/video_conference/effects/video_conference_tray_effects_manager_types.cc index 350078d74..7648ad9a 100644 --- a/ash/system/video_conference/effects/video_conference_tray_effects_manager_types.cc +++ b/ash/system/video_conference/effects/video_conference_tray_effects_manager_types.cc
@@ -32,7 +32,7 @@ states_.push_back(std::move(state)); } -const VcEffectState* VcHostedEffect::GetState(int index) { +const VcEffectState* VcHostedEffect::GetState(int index) const { DCHECK(index >= 0 && index < (int)states_.size()); return states_[index].get(); }
diff --git a/ash/system/video_conference/effects/video_conference_tray_effects_manager_types.h b/ash/system/video_conference/effects/video_conference_tray_effects_manager_types.h index c5418807..d6e3d6e 100644 --- a/ash/system/video_conference/effects/video_conference_tray_effects_manager_types.h +++ b/ash/system/video_conference/effects/video_conference_tray_effects_manager_types.h
@@ -104,7 +104,7 @@ void AddState(std::unique_ptr<VcEffectState> state); // Retrieves a raw pointer to the `VcEffectState` at `index`. - const VcEffectState* GetState(int index); + const VcEffectState* GetState(int index) const; VcEffectType type() const { return type_; } void set_id(int id) { id_ = id; }
diff --git a/ash/system/video_conference/fake_video_conference_tray_controller.cc b/ash/system/video_conference/fake_video_conference_tray_controller.cc index 6e7188aa..4f84dd6 100644 --- a/ash/system/video_conference/fake_video_conference_tray_controller.cc +++ b/ash/system/video_conference/fake_video_conference_tray_controller.cc
@@ -9,9 +9,6 @@ namespace ash { -FakeVideoConferenceTrayController::FakeVideoConferenceTrayController() = - default; - void FakeVideoConferenceTrayController::SetCameraMuted(bool muted) { camera_muted_ = muted; OnCameraSWPrivacySwitchStateChanged( @@ -25,4 +22,4 @@ CrasAudioHandler::InputMuteChangeMethod::kKeyboardButton); } -} // namespace ash \ No newline at end of file +} // namespace ash
diff --git a/ash/system/video_conference/fake_video_conference_tray_controller.h b/ash/system/video_conference/fake_video_conference_tray_controller.h index 2d16bfd..860be7d3 100644 --- a/ash/system/video_conference/fake_video_conference_tray_controller.h +++ b/ash/system/video_conference/fake_video_conference_tray_controller.h
@@ -15,11 +15,13 @@ class ASH_EXPORT FakeVideoConferenceTrayController : public VideoConferenceTrayController { public: - FakeVideoConferenceTrayController(); + FakeVideoConferenceTrayController() = default; + FakeVideoConferenceTrayController(const FakeVideoConferenceTrayController&) = delete; FakeVideoConferenceTrayController& operator=( const FakeVideoConferenceTrayController&) = delete; + ~FakeVideoConferenceTrayController() override = default; // VideoConferenceTrayController:
diff --git a/ash/system/video_conference/video_conference_tray.cc b/ash/system/video_conference/video_conference_tray.cc index 5357b7d..8d09813 100644 --- a/ash/system/video_conference/video_conference_tray.cc +++ b/ash/system/video_conference/video_conference_tray.cc
@@ -17,7 +17,7 @@ #include "ash/system/tray/tray_constants.h" #include "ash/system/tray/tray_container.h" #include "ash/system/tray/tray_utils.h" -#include "ash/system/video_conference/bubble/video_conference_bubble.h" +#include "ash/system/video_conference/bubble/bubble_view.h" #include "ash/system/video_conference/video_conference_tray_controller.h" #include "base/functional/bind.h" #include "ui/base/metadata/metadata_header_macros.h" @@ -241,7 +241,8 @@ init_params.translucent = true; // Create top-level bubble. - auto bubble_view = std::make_unique<VideoConferenceBubbleView>(init_params); + auto bubble_view = std::make_unique<video_conference::BubbleView>( + init_params, VideoConferenceTrayController::Get()); bubble_ = std::make_unique<TrayBubbleWrapper>(this); bubble_->ShowBubble(std::move(bubble_view));
diff --git a/ash/webui/color_internals/mojom/BUILD.gn b/ash/webui/color_internals/mojom/BUILD.gn index b0e5ef7..8fab531 100644 --- a/ash/webui/color_internals/mojom/BUILD.gn +++ b/ash/webui/color_internals/mojom/BUILD.gn
@@ -39,9 +39,7 @@ out_dir = "$mojom_gen_dir/tsc" tsconfig_base = "../resources/tsconfig_base.json" in_files = [ "color_internals.mojom-webui.js" ] - extra_deps = [ - ":mojom_webui_js", - "//ui/webui/resources:generate_definitions", - ] + deps = [ "//ui/webui/resources/mojo:library" ] + extra_deps = [ ":mojom_webui_js" ] composite = true }
diff --git a/ash/webui/common/resources/BUILD.gn b/ash/webui/common/resources/BUILD.gn index a3abb6c..213a19df 100644 --- a/ash/webui/common/resources/BUILD.gn +++ b/ash/webui/common/resources/BUILD.gn
@@ -341,6 +341,7 @@ "quick_unlock/pin_keyboard_icons.html.js", "store/store.js", "store/store_client.js", + "traffic_counters/traffic_counters_adapter.js", "util.js", ] @@ -402,7 +403,6 @@ "cr_picture/cr_picture_pane.d.ts", "smb_shares/add_smb_share_dialog.d.ts", "smb_shares/smb_browser_proxy.d.ts", - "traffic_counters/traffic_counters_adapter.d.ts", "traffic_counters/traffic_counters.d.ts", "quick_unlock/pin_keyboard.d.ts", "quick_unlock/setup_pin_keyboard.d.ts",
diff --git a/ash/webui/face_ml_app_ui/mojom/BUILD.gn b/ash/webui/face_ml_app_ui/mojom/BUILD.gn index a86b069..c55ef5f 100644 --- a/ash/webui/face_ml_app_ui/mojom/BUILD.gn +++ b/ash/webui/face_ml_app_ui/mojom/BUILD.gn
@@ -23,13 +23,11 @@ tsconfig_base = "../tsconfig_base.json" in_files = [ "face_ml_app_ui.mojom-webui.js" ] - # Targets that generate the above .mojom-webui.js files. - extra_deps = [ - ":trusted_webui_js", + # Required for Mojo's bindings.js resolution. + deps = [ "//ui/webui/resources/mojo:library" ] - # Required for Mojo's bindings.js resolution. - "//ui/webui/resources:generate_definitions", - ] + # Targets that generate the above .mojom-webui.js files. + extra_deps = [ ":trusted_webui_js" ] # Generates d.ts files which allows this library to be depended upon. composite = true
diff --git a/ash/webui/os_feedback_ui/resources/search_page.js b/ash/webui/os_feedback_ui/resources/search_page.js index cc7dc501..00a4be4 100644 --- a/ash/webui/os_feedback_ui/resources/search_page.js +++ b/ash/webui/os_feedback_ui/resources/search_page.js
@@ -229,10 +229,13 @@ handleInputChanged_(e) { clearTimeout(this.searchTimerID_); - // As the user is typing, hide the error message. - this.hideError_(); + const query = e.target.value.trim(); - const query = e.target.value; + // As the user is typing, hide the error message. + if (query.length > 0) { + this.hideError_(); + } + const querySeqNo = this.getNextQuerySeqNo_(); this.searchTimerID_ = setTimeout(() => { this.fetchHelpContent_(query, querySeqNo); @@ -341,15 +344,6 @@ * @return {!HTMLElement} * @private */ - getDescriptionTextElement_() { - return /** @type {!HTMLElement} */ ( - this.shadowRoot.querySelector('#descriptionText')); - } - - /** - * @return {!HTMLElement} - * @private - */ getErrorElement_() { return /** @type {!HTMLElement} */ ( this.shadowRoot.querySelector('#emptyErrorContainer')); @@ -367,7 +361,7 @@ errorElement.hidden = false; errorElement.setAttribute('aria-hidden', false); - const descriptionTextElement = this.getDescriptionTextElement_(); + const descriptionTextElement = this.getInputElement_(); descriptionTextElement.classList.add('has-error'); } @@ -376,10 +370,15 @@ */ hideError_() { const errorElement = this.getErrorElement_(); + + if (errorElement.hidden) { + return; + } + errorElement.hidden = true; errorElement.setAttribute('aria-hidden', true); - const descriptionTextElement = this.getDescriptionTextElement_(); + const descriptionTextElement = this.getInputElement_(); descriptionTextElement.classList.remove('has-error'); } @@ -400,7 +399,7 @@ handleContinueButtonClicked_(e) { e.stopPropagation(); - const textInput = this.getInputElement_().value; + const textInput = this.getInputElement_().value.trim(); if (textInput.length === 0) { this.onInputInvalid_(); } else {
diff --git a/ash/webui/sample_system_web_app_ui/mojom/BUILD.gn b/ash/webui/sample_system_web_app_ui/mojom/BUILD.gn index 5fdafdd5..1e1daf7 100644 --- a/ash/webui/sample_system_web_app_ui/mojom/BUILD.gn +++ b/ash/webui/sample_system_web_app_ui/mojom/BUILD.gn
@@ -55,14 +55,14 @@ "sample_system_web_app_shared_ui.mojom-webui.js", ] + # Required for Mojo's bindings.js resolution. + deps = [ "//ui/webui/resources/mojo:library" ] + # Targets that generate the above .mojom-webui.js files. extra_deps = [ ":shared_webui_js", ":trusted_webui_js", ":untrusted_webui_js", - - # Required for Mojo's bindings.js resolution. - "//ui/webui/resources:generate_definitions", ] # Generates d.ts files which allows this library to be depended upon.
diff --git a/ash/webui/shortcut_customization_ui/resources/js/input_key.html b/ash/webui/shortcut_customization_ui/resources/js/input_key.html index 6f357e89..222a906 100644 --- a/ash/webui/shortcut_customization_ui/resources/js/input_key.html +++ b/ash/webui/shortcut_customization_ui/resources/js/input_key.html
@@ -1,14 +1,16 @@ <style> - #key { + .key-container { + align-items: center; + border-radius: 5px; + box-sizing: border-box; + color: var(--cros-text-color-secondary); display: flex; + font-weight: 500; + height: 28px; justify-content: center; margin-inline-start: 5px; - min-width: 35px; - padding: 5px 5px 5px 5px; - } - - .key-container { - border-radius: 5px; + min-width: 28px; + padding-inline: 8px; } :host([key-state='not-selected']) .key-container { @@ -16,26 +18,26 @@ border-style: solid; border-width: thin; box-shadow: 0 1px 1px var(--google-grey-200); - color: var(--google-grey-400); - font-weight: lighter; } :host([key-state='modifier-selected']) .key-container { background-color: var(--google-blue-50); - border-color: var(--google-blue-50); - border-style: solid; + border: none; box-shadow: 0 1px 1px var(--google-blue-50); - color: var(--google-grey-600); - font-weight: bold; } :host([key-state='alpha-numeric-selected']) .key-container { background-color: var(--google-grey-100); - border-color: var(--google-grey-100); - border-style: solid; + border: none; box-shadow: 0 1px 1px var(--google-grey-100); - color: var(--google-grey-600); - font-weight: bold; + } + + :host(#ctrlKey) .key-container, + :host(#altKey) .key-container, + :host(#shiftKey) .key-container, + :host(#searchKey) .key-container, + :host([key-state='modifier-selected']) .key-container { + min-width: 46px; } #key-icon {
diff --git a/base/OWNERS b/base/OWNERS index 086601e..a1b94bc 100644 --- a/base/OWNERS +++ b/base/OWNERS
@@ -41,6 +41,8 @@ per-file dcheck*=pbos@chromium.org per-file logging*=olivierli@chromium.org per-file logging*=pbos@chromium.org +per-file notreached.h=olivierli@chromium.org +per-file notreached.h=pbos@chromium.org # Restricted since rand_util.h also backs the cryptographically secure RNG. per-file rand_util*=set noparent
diff --git a/base/android/java/src/org/chromium/base/compat/ApiHelperForN.java b/base/android/java/src/org/chromium/base/compat/ApiHelperForN.java index 05c755f6..464ad82 100644 --- a/base/android/java/src/org/chromium/base/compat/ApiHelperForN.java +++ b/base/android/java/src/org/chromium/base/compat/ApiHelperForN.java
@@ -11,7 +11,6 @@ import android.content.ClipData; import android.content.ComponentName; import android.content.pm.PackageManager; -import android.graphics.Bitmap; import android.media.MediaCodec.CryptoInfo; import android.net.ConnectivityManager; import android.os.Build; @@ -57,16 +56,6 @@ return view.startDragAndDrop(data, shadowBuilder, myLocalState, flags); } - /** See {@link View#setPointerIcon(PointerIcon)}. */ - public static void setPointerIcon(View view, PointerIcon icon) { - view.setPointerIcon(icon); - } - - /** See {@link PointerIcon#create(Bitmap, float, float)}. */ - public static PointerIcon createPointerIcon(Bitmap bitmap, float width, float height) { - return PointerIcon.create(bitmap, width, height); - } - /** See {@link CryptoInfo#setPattern(Pattern)}. */ public static void setCryptoInfoPattern(CryptoInfo cryptoInfo, int encrypt, int skip) { cryptoInfo.setPattern(new CryptoInfo.Pattern(encrypt, skip));
diff --git a/base/check.cc b/base/check.cc index 6d9c1d3..4f60416 100644 --- a/base/check.cc +++ b/base/check.cc
@@ -40,8 +40,9 @@ // Note that dumping may fail if the crash handler hasn't been set yet. In // that case we want to try again on the next failing DCHECK. - if (base::debug::DumpWithoutCrashingUnthrottled()) + if (base::debug::DumpWithoutCrashingUnthrottled()) { has_dumped.store(true, std::memory_order_relaxed); + } } } @@ -57,8 +58,9 @@ public: using LogMessage::LogMessage; ~NotReachedLogMessage() override { - if (severity() != logging::LOGGING_FATAL) + if (severity() != logging::LOGGING_FATAL) { NotReachedDumpOnceWithoutCrashing(this); + } } }; #else @@ -80,8 +82,9 @@ public: using LogMessage::LogMessage; ~DCheckLogMessage() override { - if (severity() != logging::LOGGING_FATAL) + if (severity() != logging::LOGGING_FATAL) { DCheckDumpOnceWithoutCrashing(this); + } } }; @@ -90,8 +93,9 @@ public: using Win32ErrorLogMessage::Win32ErrorLogMessage; ~DCheckWin32ErrorLogMessage() override { - if (severity() != logging::LOGGING_FATAL) + if (severity() != logging::LOGGING_FATAL) { DCheckDumpOnceWithoutCrashing(this); + } } }; #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) @@ -99,8 +103,9 @@ public: using ErrnoLogMessage::ErrnoLogMessage; ~DCheckErrnoLogMessage() override { - if (severity() != logging::LOGGING_FATAL) + if (severity() != logging::LOGGING_FATAL) { DCheckDumpOnceWithoutCrashing(this); + } } }; #endif // BUILDFLAG(IS_WIN) @@ -174,17 +179,6 @@ return CheckError(log_message); } -CheckError CheckError::NotReached(const char* file, int line) { - // Outside DCHECK builds NOTREACHED() should not be FATAL. For now. - const LogSeverity severity = DCHECK_IS_ON() ? LOGGING_DCHECK : LOGGING_ERROR; - auto* const log_message = new NotReachedLogMessage(file, line, severity); - - // TODO(pbos): Consider a better message for NotReached(), this is here to - // match existing behavior + test expectations. - log_message->stream() << "Check failed: false. "; - return CheckError(log_message); -} - std::ostream& CheckError::stream() { return log_message_->stream(); } @@ -196,6 +190,19 @@ delete log_message_; } +NotReachedError NotReachedError::NotReached(const char* file, int line) { + // Outside DCHECK builds NOTREACHED() should not be FATAL. For now. + const LogSeverity severity = DCHECK_IS_ON() ? LOGGING_DCHECK : LOGGING_ERROR; + auto* const log_message = new NotReachedLogMessage(file, line, severity); + + // TODO(pbos): Consider a better message for NotReached(), this is here to + // match existing behavior + test expectations. + log_message->stream() << "Check failed: false. "; + return NotReachedError(log_message); +} + +NotReachedError::~NotReachedError() = default; + void RawCheck(const char* message) { RawLog(LOGGING_FATAL, message); }
diff --git a/base/check.h b/base/check.h index 19de039..67c566bd 100644 --- a/base/check.h +++ b/base/check.h
@@ -78,8 +78,6 @@ int line, const char* function); - static CheckError NotReached(const char* file, int line); - // Stream for adding optional details to the error message. std::ostream& stream(); @@ -97,6 +95,18 @@ LogMessage* const log_message_; }; +class BASE_EXPORT NotReachedError : public CheckError { + public: + static NotReachedError NotReached(const char* file, int line); + + // TODO(crbug.com/851128): Mark [[noreturn]] once this is CHECK-fatal on all + // builds. + NOMERGE NOT_TAIL_CALLED ~NotReachedError(); + + private: + using CheckError::CheckError; +}; + // The 'switch' is used to prevent the 'else' from being ambiguous when the // macro is used in an 'if' clause such as: // if (a == 1)
diff --git a/base/cpu_reduction_experiment.cc b/base/cpu_reduction_experiment.cc index fe578a1..f1584d45 100644 --- a/base/cpu_reduction_experiment.cc +++ b/base/cpu_reduction_experiment.cc
@@ -21,7 +21,7 @@ // utilization. BASE_FEATURE(kReduceCpuUtilization, "ReduceCpuUtilization", - FEATURE_DISABLED_BY_DEFAULT); + FEATURE_ENABLED_BY_DEFAULT); class CpuReductionExperimentSubSampler { public:
diff --git a/base/notreached.h b/base/notreached.h index 3deaca8..8bcaca7 100644 --- a/base/notreached.h +++ b/base/notreached.h
@@ -14,9 +14,9 @@ // Under these conditions NOTREACHED() will effectively either log or DCHECK. #if BUILDFLAG(ENABLE_LOG_ERROR_NOT_REACHED) || DCHECK_IS_ON() -#define NOTREACHED() \ - CHECK_FUNCTION_IMPL(::logging::CheckError::NotReached(__FILE__, __LINE__), \ - false) +#define NOTREACHED() \ + CHECK_FUNCTION_IMPL( \ + ::logging::NotReachedError::NotReached(__FILE__, __LINE__), false) #else #define NOTREACHED() EAT_CHECK_STREAM_PARAMS() #endif // BUILDFLAG(ENABLE_LOG_ERROR_NOT_REACHED) || DCHECK_IS_ON()
diff --git a/base/process/process_unittest.cc b/base/process/process_unittest.cc index fe88dae..5077df9 100644 --- a/base/process/process_unittest.cc +++ b/base/process/process_unittest.cc
@@ -372,32 +372,6 @@ EXPECT_EQ(old_priority, new_priority); } -// Same as SetProcessBackgrounded but to this very process. It uses -// a different code path at least for Windows. -TEST_F(ProcessTest, SetProcessBackgroundedSelf) { - if (!Process::CanBackgroundProcesses()) - return; - Process process = Process::Current(); - int old_priority = process.GetPriority(); -#if BUILDFLAG(IS_WIN) - EXPECT_TRUE(process.SetProcessBackgrounded(true)); - EXPECT_TRUE(process.IsProcessBackgrounded()); - EXPECT_TRUE(process.SetProcessBackgrounded(false)); - EXPECT_FALSE(process.IsProcessBackgrounded()); -#elif BUILDFLAG(IS_APPLE) - FakePortProvider provider; - EXPECT_TRUE(process.SetProcessBackgrounded(&provider, true)); - EXPECT_TRUE(process.IsProcessBackgrounded(&provider)); - EXPECT_TRUE(process.SetProcessBackgrounded(&provider, false)); - EXPECT_FALSE(process.IsProcessBackgrounded(&provider)); -#else - process.SetProcessBackgrounded(true); - process.SetProcessBackgrounded(false); -#endif - int new_priority = process.GetPriority(); - EXPECT_EQ(old_priority, new_priority); -} - // Consumers can use WaitForExitWithTimeout(base::TimeDelta(), nullptr) to check // whether the process is still running. This may not be safe because of the // potential reusing of the process id. So we won't export Process::IsRunning()
diff --git a/base/process/process_win.cc b/base/process/process_win.cc index 7503838..ad165c42 100644 --- a/base/process/process_win.cc +++ b/base/process/process_win.cc
@@ -259,16 +259,12 @@ bool Process::SetProcessBackgrounded(bool value) { DCHECK(IsValid()); - // Vista and above introduce a real background mode, which not only - // sets the priority class on the threads but also on the IO generated - // by it. Unfortunately it can only be set for the calling process. - DWORD priority; - if (is_current()) { - priority = value ? PROCESS_MODE_BACKGROUND_BEGIN : - PROCESS_MODE_BACKGROUND_END; - } else { - priority = value ? IDLE_PRIORITY_CLASS : NORMAL_PRIORITY_CLASS; - } + // Having a process remove itself from background mode is a potential + // priority inversion, and having a process put itself in background mode is + // broken in Windows 11 22H2. So, it is no longer supported. See + // https://crbug.com/1396155 for details. + DCHECK(!is_current()); + const DWORD priority = value ? IDLE_PRIORITY_CLASS : NORMAL_PRIORITY_CLASS; return (::SetPriorityClass(Handle(), priority) != 0); }
diff --git a/base/values.h b/base/values.h index f64d208..19525c6 100644 --- a/base/values.h +++ b/base/values.h
@@ -415,7 +415,7 @@ bool contains(base::StringPiece key) const; // Removes all entries from this dictionary. - void clear(); + REINITIALIZES_AFTER_MOVE void clear(); // Removes the entry referenced by `pos` in this dictionary and returns an // iterator to the entry following the removed entry. @@ -619,7 +619,7 @@ Value& operator[](size_t index); // Removes all value from this list. - void clear(); + REINITIALIZES_AFTER_MOVE void clear(); // Removes the value referenced by `pos` in this list and returns an // iterator to the value following the removed value.
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index d01ce50..825fa9d 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -11.20221212.3.1 +11.20221213.0.1
diff --git a/build/rust/rust_target.gni b/build/rust/rust_target.gni index 9ebedbad..3467078 100644 --- a/build/rust/rust_target.gni +++ b/build/rust/rust_target.gni
@@ -206,6 +206,7 @@ "_metadata", "_out_dir", "_public_deps", + "_rustenv", "_support_use_from_cpp", "_test_deps", "_testonly",
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni index fb63ed4..44e04b9 100644 --- a/buildtools/deps_revisions.gni +++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@ declare_args() { # Used to cause full rebuilds on libc++ rolls. This should be kept in sync # with the libcxx_revision vars in //DEPS. - libcxx_revision = "c9944183144174e86d5edef03e81a38cd13db4c9" + libcxx_revision = "19ffb9c00636bcabb6c6ce76ccaa4370583d3649" }
diff --git a/chrome/VERSION b/chrome/VERSION index 34dbce24..2a4cb6b 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=110 MINOR=0 -BUILD=5476 +BUILD=5477 PATCH=0
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni index 8d99f82..c0bad3b 100644 --- a/chrome/android/chrome_junit_test_java_sources.gni +++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -206,7 +206,6 @@ "junit/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskUnitTest.java", "junit/src/org/chromium/chrome/browser/omaha/AttributeFinder.java", "junit/src/org/chromium/chrome/browser/omaha/ExponentialBackoffSchedulerTest.java", - "junit/src/org/chromium/chrome/browser/omaha/MockExponentialBackoffScheduler.java", "junit/src/org/chromium/chrome/browser/omaha/MockRequestGenerator.java", "junit/src/org/chromium/chrome/browser/omaha/OmahaBaseTest.java", "junit/src/org/chromium/chrome/browser/omaha/RequestGeneratorTest.java",
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java index c12ee56b..610fc9a 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java
@@ -22,12 +22,14 @@ import org.chromium.base.TraceEvent; import org.chromium.chrome.browser.autofill.AutofillUiUtils; import org.chromium.chrome.browser.autofill.PersonalDataManager; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.keyboard_accessory.R; import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.AutofillBarItem; import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem; import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SheetOpenerBarItem; import org.chromium.chrome.browser.keyboard_accessory.bar_component.KeyboardAccessoryViewBinder.BarItemViewHolder; import org.chromium.chrome.browser.keyboard_accessory.data.KeyboardAccessoryData; +import org.chromium.components.autofill.AutofillSuggestion; import org.chromium.components.browser_ui.widget.chips.ChipView; import org.chromium.components.feature_engagement.FeatureConstants; import org.chromium.ui.modelutil.PropertyKey; @@ -78,6 +80,25 @@ showHelpBubble(item.getFeatureForIPH(), chipView, mRootViewForIPH, null); } } + + // Credit card chips never occupy the entire width of the window to allow for other + // cards (if they exist) to be seen. Their max width is set to 85% of the window width. + // The chip size is limited by truncating the card label. + // TODO (crbug.com/1376691): Check if it's alright to instead show a fixed portion of + // the following chip. This might give a more consistent user experience and allow wider + // windows to show more information in a chip before truncating. + if (ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_ENABLE_VIRTUAL_CARD_METADATA) + && ChromeFeatureList.isEnabled( + ChromeFeatureList.AUTOFILL_ENABLE_CARD_PRODUCT_NAME) + && containsCreditCardInfo(item.getSuggestion())) { + int windowWidth = + chipView.getContext().getResources().getDisplayMetrics().widthPixels; + chipView.setMaxWidth((int) (windowWidth * 0.85)); + } else { + // For other data types, there is no limit on width. + chipView.setMaxWidth(Integer.MAX_VALUE); + } + chipView.getPrimaryTextView().setText(item.getSuggestion().getLabel()); if (item.getSuggestion().getItemTag() != null && !item.getSuggestion().getItemTag().isEmpty()) { @@ -172,4 +193,8 @@ assert wasBound : "Every possible property update needs to be handled!"; } } + + private static boolean containsCreditCardInfo(AutofillSuggestion suggestion) { + return suggestion.getSuggestionId() > 0 && (suggestion.getSuggestionId() & 0xFFFF0000) != 0; + } }
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java index 1fb02885..6843548f 100644 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
@@ -662,9 +662,9 @@ assertFalse(bottomSheetTestSupport.hasSuppressionTokens()); StartSurfaceTestUtils.pressHomePageButton(cta); + StartSurfaceTestUtils.waitForStartSurfaceVisible(cta); assertFalse(bottomSheetTestSupport.hasSuppressionTokens()); - StartSurfaceTestUtils.waitForStartSurfaceVisible(cta); StartSurfaceTestUtils.clickTabSwitcherButton(cta); StartSurfaceTestUtils.waitForTabSwitcherVisible(cta); assertTrue(bottomSheetTestSupport.hasSuppressionTokens());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/PowerBroadcastReceiver.java b/chrome/android/java/src/org/chromium/chrome/browser/PowerBroadcastReceiver.java index 3fd9db9..60d2ba9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/PowerBroadcastReceiver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/PowerBroadcastReceiver.java
@@ -92,8 +92,7 @@ * Executed when all of the system conditions are met. */ public void runActions() { - Context context = ContextUtils.getApplicationContext(); - OmahaBase.onForegroundSessionStart(context); + OmahaBase.onForegroundSessionStart(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java index 3a72e8a0..a2ae23c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java
@@ -64,6 +64,20 @@ int USE_PREVIOUS_BROWSER_CONTROLS_STATE = 3; } + @IntDef({LayoutState.STARTING_TO_SHOW, LayoutState.SHOWING, LayoutState.STARTING_TO_HIDE, + LayoutState.HIDDEN}) + @Retention(RetentionPolicy.SOURCE) + public @interface LayoutState { + /** The layout is going to hide as soon as the animation finishes. */ + int STARTING_TO_SHOW = 0; + /** Actively being showed, no ongoing animation. */ + int SHOWING = 1; + /** The layout is going to show as soon as the animation finishes. */ + int STARTING_TO_HIDE = 2; + /** Not currently showed, and no ongoing animation. */ + int HIDDEN = 3; + } + /** Length of the unstalling animation. **/ public static final long UNSTALLED_ANIMATION_DURATION_MS = 500; @@ -93,11 +107,8 @@ * drawn using the same ordering as this array. */ protected LayoutTab[] mLayoutTabs; - // True means that the layout is going to hide as soon as the animation finishes. - private boolean mIsStartingToHide; - - // True means that the layout is going to show as soon as the animation finishes. - private boolean mIsStartingToShow; + // Current state of the Layout. + private @LayoutState int mLayoutState; // The next id to show when the layout is hidden, or TabBase#INVALID_TAB_ID if no change. protected int mNextTabId = Tab.INVALID_TAB_ID; @@ -127,6 +138,8 @@ mCurrentOrientation = Orientation.UNSET; mDpToPx = context.getResources().getDisplayMetrics().density; mPxToDp = 1 / mDpToPx; + + mLayoutState = LayoutState.HIDDEN; } /** @@ -392,7 +405,7 @@ */ public void startHiding(int nextTabId, boolean hintAtTabSelection) { mUpdateHost.startHiding(nextTabId, hintAtTabSelection); - mIsStartingToHide = true; + mLayoutState = LayoutState.STARTING_TO_HIDE; mNextTabId = nextTabId; } @@ -400,14 +413,14 @@ * @return True is the layout is in the process of hiding itself. */ public boolean isStartingToHide() { - return mIsStartingToHide; + return mLayoutState == LayoutState.STARTING_TO_HIDE; } /** * @return True is the layout is in the process of showing itself. */ public boolean isStartingToShow() { - return mIsStartingToShow; + return mLayoutState == LayoutState.STARTING_TO_SHOW; } /** @@ -421,9 +434,9 @@ * To be called when the transition into the layout is done. */ public void doneShowing() { - if (!mIsStartingToShow) return; + if (mLayoutState != LayoutState.STARTING_TO_SHOW) return; - mIsStartingToShow = false; + mLayoutState = LayoutState.SHOWING; mUpdateHost.doneShowing(); } @@ -432,9 +445,9 @@ * This is currently called by the renderer when all the animation are done while hiding. */ public void doneHiding() { - if (!mIsStartingToHide) return; + if (mLayoutState != LayoutState.STARTING_TO_HIDE) return; - mIsStartingToHide = false; + mLayoutState = LayoutState.HIDDEN; if (mNextTabId != Tab.INVALID_TAB_ID) { TabModel model = mTabModelSelector.getModelForTabId(mNextTabId); if (model != null) { @@ -467,8 +480,7 @@ */ public void show(long time, boolean animate) { // TODO(crbug.com/1108496): Remove after LayoutManager explicitly hide the old layout. - mIsStartingToHide = false; - mIsStartingToShow = true; + mLayoutState = LayoutState.STARTING_TO_SHOW; mNextTabId = Tab.INVALID_TAB_ID; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java index 11d14740..62c7663c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java
@@ -175,6 +175,9 @@ private final ObservableSupplierImpl<Boolean> mHandleBackPressChangedSupplier = new ObservableSupplierImpl<>(); + /** When non-null, #doneShowing should call into the sequencer instead of doing normal work. */ + private ShowingEventSequencer mShowingEventSequencer; + /** * Protected class to handle {@link TabModelObserver} related tasks. Extending classes will * need to override any related calls to add new functionality @@ -265,6 +268,35 @@ } /** + * Scoped class that temporarily delays doneShowing. This stops reentrancy from Layouts without + * animations that try to call {@link #doneShowing()} immediately. The done showing transition + * is different from all the others in that the manager drives it instead, instead of the + * layouts calling up into the host to drive it. This is why only done showing needs help + * stopping reentrancy. + */ + private class ShowingEventSequencer implements AutoCloseable { + private boolean mPendingDoneShowing; + + private ShowingEventSequencer() { + assert LayoutManagerImpl.this.mShowingEventSequencer == null; + LayoutManagerImpl.this.mShowingEventSequencer = this; + } + + @Override + public void close() { + assert LayoutManagerImpl.this.mShowingEventSequencer == this; + LayoutManagerImpl.this.mShowingEventSequencer = null; + if (mPendingDoneShowing) { + LayoutManagerImpl.this.doneShowing(); + } + } + + public void setPendingDoneShowing() { + mPendingDoneShowing = true; + } + } + + /** * Creates a {@link LayoutManagerImpl} instance. * @param host A {@link LayoutManagerHost} instance. * @param contentContainer A {@link ViewGroup} for Android views to be bound to. @@ -943,6 +975,11 @@ @Override public void doneShowing() { + if (mShowingEventSequencer != null) { + mShowingEventSequencer.setPendingDoneShowing(); + return; + } + // Notify LayoutObservers the active layout is finished showing. for (LayoutStateObserver observer : mLayoutObservers) { observer.onFinishedShowing(getActiveLayout().getLayoutType()); @@ -1024,20 +1061,26 @@ } onViewportChanged(); - getActiveLayout().show(time(), animate); - mHost.setContentOverlayVisibility(getActiveLayout().shouldDisplayContentOverlay(), - getActiveLayout().canHostBeFocusable()); - requestUpdate(); - // TODO(crbug.com/1108496): Remove after migrates to LayoutStateObserver#onStartedShowing. - // Notify observers about the new scene. - for (SceneChangeObserver observer : mSceneChangeObservers) { - observer.onSceneChange(getActiveLayout()); - } + // In order to prevent another state transition in the middle of processing this one, + // scopedSequencer will add itself as a member of this class, and then remove itself once + // its scope is closed. + try (ShowingEventSequencer scopedSequencer = new ShowingEventSequencer()) { + getActiveLayout().show(time(), animate); + mHost.setContentOverlayVisibility(getActiveLayout().shouldDisplayContentOverlay(), + getActiveLayout().canHostBeFocusable()); + requestUpdate(); - for (LayoutStateObserver observer : mLayoutObservers) { - observer.onStartedShowing( - layout.getLayoutType(), shouldShowToolbarAnimationOnShow(animate)); + // TODO(crbug.com/1108496): Remove after migrates to + // LayoutStateObserver#onStartedShowing. Notify observers about the new scene. + for (SceneChangeObserver observer : mSceneChangeObservers) { + observer.onSceneChange(getActiveLayout()); + } + + for (LayoutStateObserver observer : mLayoutObservers) { + observer.onStartedShowing( + layout.getLayoutType(), shouldShowToolbarAnimationOnShow(animate)); + } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java index d457a97a..31c90fc5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java
@@ -227,7 +227,7 @@ return; } - restoreState(getContext()); + restoreState(); long nextTimestamp = Long.MAX_VALUE; if (mDelegate.isChromeBeingUsed()) { @@ -251,7 +251,7 @@ mDelegate.scheduleService(currentTimestamp, nextTimestamp); } - saveState(getContext()); + saveState(); } /** @@ -480,7 +480,7 @@ * Reads the data back from the file it was saved to. Uses SharedPreferences to handle I/O. * Sanity checks are performed on the timestamps to guard against clock changing. */ - private void restoreState(Context context) { + private void restoreState() { if (mStateHasBeenRestored) return; String installSource = @@ -535,7 +535,7 @@ /** * Writes out the current state to a file. */ - private void saveState(Context context) { + private void saveState() { SharedPreferences prefs = OmahaBase.getSharedPreferences(); SharedPreferences.Editor editor = prefs.edit(); editor.putBoolean(OmahaBase.PREF_SEND_INSTALL_EVENT, mSendInstallEvent); @@ -554,10 +554,6 @@ mDelegate.onSaveStateDone(mTimestampForNewRequest, mTimestampForNextPostAttempt); } - private Context getContext() { - return mDelegate.getContext(); - } - private RequestGenerator getRequestGenerator() { return mDelegate.getRequestGenerator(); } @@ -567,13 +563,13 @@ } /** Begin communicating with the Omaha Update Server. */ - public static void onForegroundSessionStart(Context context) { + public static void onForegroundSessionStart() { if (!VersionInfo.isOfficialBuild() || isDisabled()) return; - OmahaService.startServiceImmediately(context); + OmahaService.startServiceImmediately(); } /** Checks whether Chrome has ever tried contacting Omaha before. */ - public static boolean isProbablyFreshInstall(Context context) { + public static boolean isProbablyFreshInstall() { SharedPreferences prefs = getSharedPreferences(); return prefs.getLong(PREF_TIMESTAMP_OF_INSTALL, -1) == -1; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaDelegate.java index 29dbc86..9d6f4a2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaDelegate.java
@@ -4,8 +4,6 @@ package org.chromium.chrome.browser.omaha; -import android.content.Context; - import org.chromium.chrome.browser.omaha.OmahaBase.PostResult; /** Delegates calls out from {@link OmahaBase}. */ @@ -14,9 +12,6 @@ OmahaDelegate() {} - /** @return Context that is used to interact with the system. */ - abstract Context getContext(); - /** @return Whether Chrome is installed as part of the system image. */ abstract boolean isInSystemImage(); @@ -25,7 +20,7 @@ /** @return The {@link RequestGenerator} used to create Omaha XML. */ final RequestGenerator getRequestGenerator() { - if (mRequestGenerator == null) mRequestGenerator = createRequestGenerator(getContext()); + if (mRequestGenerator == null) mRequestGenerator = createRequestGenerator(); return mRequestGenerator; } @@ -43,7 +38,7 @@ abstract void scheduleService(long currentTimestampMs, long nextTimestampMs); /** Creates a {@link RequestGenerator}. */ - abstract RequestGenerator createRequestGenerator(Context context); + abstract RequestGenerator createRequestGenerator(); /** * Called when {@link OmahaBase#registerNewRequest} finishes.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaDelegateBase.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaDelegateBase.java index 724b9c6..0e963b8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaDelegateBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaDelegateBase.java
@@ -9,6 +9,7 @@ import android.os.PowerManager; import org.chromium.base.ApplicationStatus; +import org.chromium.base.ContextUtils; import org.chromium.chrome.browser.AppHooks; import java.util.UUID; @@ -16,22 +17,17 @@ /** Delegates calls out from the OmahaClient. */ public abstract class OmahaDelegateBase extends OmahaDelegate { private final ExponentialBackoffScheduler mScheduler; - private final Context mContext; - OmahaDelegateBase(Context context) { - mContext = context; - mScheduler = new ExponentialBackoffScheduler(OmahaBase.PREF_PACKAGE, context, - OmahaBase.MS_POST_BASE_DELAY, OmahaBase.MS_POST_MAX_DELAY); - } - - @Override - Context getContext() { - return mContext; + OmahaDelegateBase() { + mScheduler = new ExponentialBackoffScheduler( + OmahaBase.PREF_PACKAGE, OmahaBase.MS_POST_BASE_DELAY, OmahaBase.MS_POST_MAX_DELAY); } @Override boolean isInSystemImage() { - return (getContext().getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) != 0; + return (ContextUtils.getApplicationContext().getApplicationInfo().flags + & ApplicationInfo.FLAG_SYSTEM) + != 0; } @Override @@ -48,12 +44,14 @@ boolean isChromeBeingUsed() { if (!ApplicationStatus.hasVisibleActivities()) return false; - PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); + PowerManager powerManager = + (PowerManager) ContextUtils.getApplicationContext().getSystemService( + Context.POWER_SERVICE); return powerManager.isInteractive(); } @Override - protected RequestGenerator createRequestGenerator(Context context) { + protected RequestGenerator createRequestGenerator() { return AppHooks.get().createOmahaRequestGenerator(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaService.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaService.java index fe398ab..79b076e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaService.java
@@ -27,15 +27,11 @@ */ public class OmahaService extends OmahaBase implements BackgroundTask { private static class OmahaClientDelegate extends OmahaDelegateBase { - public OmahaClientDelegate(Context context) { - super(context); - } - @Override public void scheduleService(long currentTimestampMs, long nextTimestampMs) { final long delay = nextTimestampMs - currentTimestampMs; PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> { - if (scheduleJobService(getContext(), delay)) { + if (scheduleJobService(delay)) { Log.i(OmahaBase.TAG, "Scheduled using JobService"); } else { Log.e(OmahaBase.TAG, "Failed to schedule job"); @@ -48,9 +44,9 @@ private static OmahaService sInstance; @Nullable - public static OmahaService getInstance(Context context) { + public static OmahaService getInstance() { synchronized (DELEGATE_LOCK) { - if (sInstance == null) sInstance = new OmahaService(context); + if (sInstance == null) sInstance = new OmahaService(); return sInstance; } } @@ -59,19 +55,15 @@ /** Used only by {@link BackgroundTaskScheduler}. */ public OmahaService() { - this(ContextUtils.getApplicationContext()); - } - - private OmahaService(Context context) { - super(new OmahaClientDelegate(context)); + super(new OmahaClientDelegate()); } /** * Trigger the {@link BackgroundTaskScheduler} immediately. * Must only be called by {@link OmahaBase#onForegroundSessionStart}. */ - static void startServiceImmediately(Context context) { - scheduleJobService(context, 0); + static void startServiceImmediately() { + scheduleJobService(0); } // Incorrectly infers that this is called on a worker thread because of AsyncTask doInBackground @@ -111,14 +103,14 @@ /** * Schedules the Omaha code to run at the given time. - * @param context Context to use. * @param delayMs How long to wait until the job should be triggered. */ - static boolean scheduleJobService(Context context, long delayMs) { + static boolean scheduleJobService(long delayMs) { long latency = Math.max(0, delayMs); TaskInfo taskInfo = TaskInfo.createOneOffTask(TaskIds.OMAHA_JOB_ID, latency, latency).build(); - return BackgroundTaskSchedulerFactory.getScheduler().schedule(context, taskInfo); + return BackgroundTaskSchedulerFactory.getScheduler().schedule( + ContextUtils.getApplicationContext(), taskInfo); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/RequestGenerator.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/RequestGenerator.java index db90edc..fb38bfe 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/RequestGenerator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/RequestGenerator.java
@@ -35,13 +35,20 @@ private static final String SALT = "omahaSalt"; private static final String URL_OMAHA_SERVER = "https://update.googleapis.com/service/update2"; - private final Context mApplicationContext; + // TODO(agrieve): Delete when downstream reference is removed. + protected RequestGenerator(Context unused) { + this(); + } - protected RequestGenerator(Context context) { - mApplicationContext = context.getApplicationContext(); + // TODO(agrieve): Delete when downstream reference is removed. + protected Context getContext() { + return null; + } + + protected RequestGenerator() { UniqueIdentificationGeneratorFactory.registerGenerator( SettingsSecureBasedIdentificationGenerator.GENERATOR_ID, - new SettingsSecureBasedIdentificationGenerator(getContext()), false); + new SettingsSecureBasedIdentificationGenerator(), false); } /** @@ -136,13 +143,6 @@ return writer.toString(); } - /** - * Returns the application context. - */ - protected Context getContext() { - return mApplicationContext; - } - @VisibleForTesting public String getAppId() { return getLayoutIsTablet() ? getAppIdTablet() : getAppIdHandset();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/rlz/RlzPingHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/rlz/RlzPingHandler.java index 7ea352d..021f5a49 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/rlz/RlzPingHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/rlz/RlzPingHandler.java
@@ -7,7 +7,6 @@ import android.text.TextUtils; import org.chromium.base.Callback; -import org.chromium.base.ContextUtils; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; import org.chromium.chrome.browser.profiles.Profile; @@ -36,9 +35,7 @@ */ public static void startPing( String brand, List<String> events, final Callback<Boolean> callback) { - String id = - new SettingsSecureBasedIdentificationGenerator(ContextUtils.getApplicationContext()) - .getUniqueId(ID_SALT); + String id = new SettingsSecureBasedIdentificationGenerator().getUniqueId(ID_SALT); id = generate50CharacterId(id.toUpperCase(Locale.getDefault())); RlzPingHandlerJni.get().startPing(Profile.getLastUsedRegularProfile(), brand,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckUpdatesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckUpdatesDelegateImpl.java index 74321e9..68e1d1c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckUpdatesDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckUpdatesDelegateImpl.java
@@ -31,8 +31,8 @@ * {@link SafetyCheckSettingsFragment}. * @param context A {@link Context} object, used by Omaha. */ - public SafetyCheckUpdatesDelegateImpl(Context context) { - mOmaha = OmahaService.getInstance(context); + public SafetyCheckUpdatesDelegateImpl() { + mOmaha = OmahaService.getInstance(); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java index 9eb03e0a..886863a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
@@ -373,7 +373,7 @@ } if (fragment instanceof SafetyCheckSettingsFragment) { SafetyCheckCoordinator.create((SafetyCheckSettingsFragment) fragment, - new SafetyCheckUpdatesDelegateImpl(this), mSettingsLauncher, + new SafetyCheckUpdatesDelegateImpl(), mSettingsLauncher, SyncConsentActivityLauncherImpl.get(), getModalDialogManagerSupplier()); } if (fragment instanceof PasswordCheckFragmentView) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java index 3c213be..1d0dbbe 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java
@@ -289,7 +289,7 @@ return startSurface != null; } } else { - if (startSurface == null) return tab == null; + if (startSurface == null || startSurfaceState == null) return tab == null; if (startSurfaceState == StartSurfaceState.SHOWING_HOMEPAGE || startSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE) { return false; @@ -322,6 +322,8 @@ } private void addLayoutStateObserver(LayoutStateProvider layoutStateProvider) { + if (!mIsStartSurfaceRefactorEnabled) return; + mLayoutStateObserver = new LayoutStateObserver() { private @LayoutType int mLayoutType; @Override @@ -335,6 +337,7 @@ } } }; + layoutStateProvider.addObserver(mLayoutStateObserver); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkActivityLifecycleUmaTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkActivityLifecycleUmaTracker.java index fa70ea25..e7fbad7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkActivityLifecycleUmaTracker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkActivityLifecycleUmaTracker.java
@@ -116,7 +116,6 @@ public void onPauseWithNative() { WebApkExtras webApkExtras = mIntentDataProvider.getWebApkExtras(); long sessionDuration = SystemClock.elapsedRealtime() - mStartTime; - WebApkUmaRecorder.recordWebApkSessionDuration(webApkExtras.distributor, sessionDuration); WebApkUkmRecorder.recordWebApkSessionDuration(webApkExtras.manifestUrl, webApkExtras.distributor, webApkExtras.webApkVersionCode, sessionDuration); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/digitalgoods/DigitalGoodsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/digitalgoods/DigitalGoodsTest.java index 0187057a..f0b5299 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/digitalgoods/DigitalGoodsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/digitalgoods/DigitalGoodsTest.java
@@ -37,7 +37,6 @@ import org.chromium.chrome.browser.customtabs.CustomTabsIntentTestUtils; import org.chromium.chrome.browser.dependency_injection.ChromeAppComponent; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.embedder_support.util.Origin; import org.chromium.net.test.EmbeddedTestServer; @@ -54,8 +53,7 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, - PaymentRequestTestRule.ENABLE_EXPERIMENTAL_WEB_PLATFORM_FEATURES, - "enable-blink-features=DigitalGoods"}) + "enable-experimental-web-platform-features", "enable-blink-features=DigitalGoods"}) public class DigitalGoodsTest { @Rule public CustomTabActivityTestRule mCustomTabActivityTestRule = new CustomTabActivityTestRule();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java index c1d95d2..53b5652 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java
@@ -57,6 +57,7 @@ import org.chromium.base.test.util.Restriction; import org.chromium.chrome.R; import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout; +import org.chromium.chrome.browser.compositor.layouts.Layout.LayoutState; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; @@ -89,6 +90,8 @@ import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.ui.test.util.UiRestriction; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeoutException; /** @@ -424,16 +427,16 @@ public void testStartSurfaceLayout_Disabled_LowEndPhone() throws Exception { // clang-format on ChromeFeatureList.sTabGridLayoutAndroid.setForTesting(true); - verifyOverviewListLayoutEnabled(); + launchAndVerifyOverviewListLayout(); TabUiTestHelper.finishActivity(mActivityTestRule.getActivity()); ChromeFeatureList.sTabGroupsAndroid.setForTesting(false); - verifyOverviewListLayoutEnabled(); + launchAndVerifyOverviewListLayout(); // Test accessibility TabUiTestHelper.finishActivity(mActivityTestRule.getActivity()); setAccessibilityEnabledForTesting(true); - verifyOverviewListLayoutEnabled(); + launchAndVerifyOverviewListLayout(); } @Test @@ -446,8 +449,18 @@ @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID}) public void testStartSurfaceLayout_Disabled_AllPhone_Accessibility_WithoutContinuationFlag() { // clang-format on + final List<LayoutStateLayoutType> observationSequence = new ArrayList<>(); setAccessibilityEnabledForTesting(true); - verifyOverviewListLayoutEnabled(); + launchChromeSimple(); + observeLayoutManager(observationSequence); + showTabSwitcherLayout(); + + verifyOverviewListLayoutShown(); + Assert.assertEquals(4, observationSequence.size()); + Assert.assertEquals(LayoutState.STARTING_TO_HIDE, observationSequence.get(0).layoutState); + Assert.assertEquals(LayoutState.HIDDEN, observationSequence.get(1).layoutState); + Assert.assertEquals(LayoutState.STARTING_TO_SHOW, observationSequence.get(2).layoutState); + Assert.assertEquals(LayoutState.SHOWING, observationSequence.get(3).layoutState); } @Test @@ -673,7 +686,7 @@ @Override public void onFinishedShowing(int layoutType) { - Log.d(TAG, "finished to show: " + layoutType); + Log.d(TAG, "Finished showing: " + layoutType); finishedShowingCallback.layoutType = layoutType; finishedShowingCallback.notifyCalled(); } @@ -688,7 +701,7 @@ @Override public void onFinishedHiding(int layoutType) { - Log.d(TAG, "finished to hide: " + layoutType); + Log.d(TAG, "Finished hiding: " + layoutType); finishedHidingCallback.layoutType = layoutType; finishedHidingCallback.notifyCalled(); } @@ -762,13 +775,16 @@ setAccessibilityEnabledForTesting(null); } + private void launchAndVerifyOverviewListLayout() { + launchedChromeAndEnterTabSwitcher(); + verifyOverviewListLayoutShown(); + } + /** * Verify the {@link OverviewListLayout} is in used. The {@link OverviewListLayout} is used when * accessibility is turned on. It is also used for low end device. */ - private void verifyOverviewListLayoutEnabled() { - launchedChromeAndEnterTabSwitcher(); - + private void verifyOverviewListLayoutShown() { TestThreadUtils.runOnUiThreadBlocking(() -> { Layout activeLayout = getActiveLayout(); Assert.assertTrue(activeLayout instanceof OverviewListLayout); @@ -790,17 +806,27 @@ } private void launchedChromeAndEnterTabSwitcher() { + launchChromeSimple(); + showTabSwitcherLayout(); + } + + private void launchChromeSimple() { mActivityTestRule.startMainActivityOnBlankPage(); CriteriaHelper.pollUiThread( mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized); + } - LayoutManagerChrome layoutManager = mActivityTestRule.getActivity().getLayoutManager(); - LayoutTestUtils.startShowingAndWaitForLayout(layoutManager, LayoutType.TAB_SWITCHER, false); + private void showTabSwitcherLayout() { + LayoutTestUtils.startShowingAndWaitForLayout( + getLayoutManagerChrome(), LayoutType.TAB_SWITCHER, false); } private Layout getActiveLayout() { - LayoutManagerChrome layoutManager = mActivityTestRule.getActivity().getLayoutManager(); - return layoutManager.getActiveLayout(); + return getLayoutManagerChrome().getActiveLayout(); + } + + private LayoutManagerChrome getLayoutManagerChrome() { + return mActivityTestRule.getActivity().getLayoutManager(); } private void runToolbarSideSwipeTestOnCurrentModel( @@ -856,6 +882,49 @@ simulateTime(mManager, 1000)); } + /** Simple tuple for LayoutStateProvider.LayoutStateObserver events. */ + private static class LayoutStateLayoutType { + public final @LayoutState int layoutState; + public final @LayoutType int layoutType; + public LayoutStateLayoutType(@LayoutState int layoutState, @LayoutType int layoutType) { + this.layoutState = layoutState; + this.layoutType = layoutType; + } + } + + private void observeLayoutManager(List<LayoutStateLayoutType> observationSequence) { + TestThreadUtils.runOnUiThreadBlocking(() -> { + LayoutManagerChrome layoutManagerChrome = getLayoutManagerChrome(); + Assert.assertNotNull("Must be called after initialization", layoutManagerChrome); + layoutManagerChrome.addObserver(new LayoutStateProvider.LayoutStateObserver() { + @Override + public void onStartedShowing(int layoutType, boolean showToolbar) { + observationSequence.add( + new LayoutStateLayoutType(LayoutState.STARTING_TO_SHOW, layoutType)); + } + + @Override + public void onFinishedShowing(int layoutType) { + observationSequence.add( + new LayoutStateLayoutType(LayoutState.SHOWING, layoutType)); + } + + @Override + public void onStartedHiding( + int layoutType, boolean showToolbar, boolean delayAnimation) { + observationSequence.add( + new LayoutStateLayoutType(LayoutState.STARTING_TO_HIDE, layoutType)); + } + + @Override + public void onFinishedHiding(int layoutType) { + observationSequence.add( + new LayoutStateLayoutType(LayoutState.HIDDEN, layoutType)); + } + }); + }); + } + @Override public Tab createTab(int id, boolean incognito) { return MockTab.createAndInitialize(id, incognito);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java index 3926ef39..ce0bfae 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/StartupLoadingMetricsTest.java
@@ -24,11 +24,11 @@ import org.chromium.base.jank_tracker.JankMetricUMARecorder; import org.chromium.base.jank_tracker.JankMetricUMARecorderJni; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.DisabledTest; +import org.chromium.base.test.util.DoNotBatch; import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.flags.ChromeSwitches; @@ -48,7 +48,7 @@ * Tests for startup timing histograms. */ @RunWith(ChromeJUnit4ClassRunner.class) -@Batch(Batch.PER_CLASS) +@DoNotBatch(reason = "These startup tests rely on having exactly one process start per test.") @CommandLineFlags.Add(ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE) public class StartupLoadingMetricsTest { private static final String TAG = "StartupLoadingTest";
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/ExpandablePaymentHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/ExpandablePaymentHandlerTest.java index 95ffed65..5188f58a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/ExpandablePaymentHandlerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/ExpandablePaymentHandlerTest.java
@@ -41,6 +41,7 @@ import org.chromium.chrome.browser.payments.handler.PaymentHandlerCoordinator; import org.chromium.chrome.browser.payments.handler.PaymentHandlerCoordinator.PaymentHandlerUiObserver; import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; +import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.components.browser_ui.bottomsheet.BottomSheetTestSupport; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.WebContents; @@ -60,10 +61,8 @@ @ParameterAnnotations.UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class ExpandablePaymentHandlerTest { - // Open a tab on the blank page first to initiate the native bindings required by the test - // server. @Rule - public PaymentRequestTestRule mRule = new PaymentRequestTestRule("about:blank"); + public ChromeTabbedActivityTestRule mRule = new ChromeTabbedActivityTestRule(); // Host the tests on https://127.0.0.1, because file:// URLs cannot have service workers. private EmbeddedTestServer mServer; @@ -122,6 +121,7 @@ @Before public void setUp() throws Throwable { + mRule.startMainActivityOnBlankPage(); mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); mDefaultActivity = mRule.getActivity(); mBottomSheetTestSupport = new BottomSheetTestSupport(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentHandlerEnableDelegationsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentHandlerEnableDelegationsTest.java index 4fad193..96bde4e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentHandlerEnableDelegationsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentHandlerEnableDelegationsTest.java
@@ -34,7 +34,8 @@ // Open a tab on the blank page first to initiate the native bindings required by the test // server. @Rule - public PaymentRequestTestRule mRule = new PaymentRequestTestRule("about:blank", null, true); + public PaymentRequestTestRule mRule = + new PaymentRequestTestRule("about:blank", /*delayStartActivity=*/true); // Host the tests on https://127.0.0.1, because file:// URLs cannot have service workers. private EmbeddedTestServer mServer; @@ -46,9 +47,7 @@ mRule.startMainActivityWithURL( mServer.getURL("/components/test/data/payments/payment_handler.html")); - // Find the web contents where JavaScript will be executed and instrument the browser - // payment sheet. - mRule.openPage(); + mRule.setObserversAndWaitForInitialPageLoad(); } private void installPaymentHandlerWithDelegations(String delegations) throws Throwable {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBlobUrlTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBlobUrlTest.java index f195551..f8e2e117 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBlobUrlTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestBlobUrlTest.java
@@ -30,7 +30,7 @@ @Feature({"Payments"}) public void test() throws TimeoutException { // Trigger the Blob URL load, and wait for it to finish. - mPaymentRequestTestRule.openPageAndClickNode("buy"); + mPaymentRequestTestRule.clickNode("buy"); mPaymentRequestTestRule.assertWaitForPageScaleFactorMatch(2); // Trigger the PaymentRequest, which should be rejected.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java index a4f2936..7034cdf 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java
@@ -19,7 +19,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.browser.preferences.Pref; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -36,13 +35,10 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestCanMakePaymentMetricsTest implements MainActivityStartCallback { +public class PaymentRequestCanMakePaymentMetricsTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_can_make_payment_metrics_test.html", this); - - @Override - public void onMainActivityStarted() throws TimeoutException {} + new PaymentRequestTestRule("payment_request_can_make_payment_metrics_test.html"); /** * Tests that the CanMakePayment metrics are correctly logged for the case of a merchant
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryNoCardTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryNoCardTest.java index 40382d3f..cad2c452 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryNoCardTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryNoCardTest.java
@@ -6,6 +6,7 @@ import androidx.test.filters.MediumTest; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -19,7 +20,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -32,13 +32,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestCanMakePaymentQueryNoCardTest implements MainActivityStartCallback { +public class PaymentRequestCanMakePaymentQueryNoCardTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_can_make_payment_query_test.html", this); + new PaymentRequestTestRule("payment_request_can_make_payment_query_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { // The user has an incomplete credit card on file. This is not sufficient for // canMakePayment() to return true. new AutofillTestHelper().setCreditCard(new CreditCard("", "https://example.test", true, @@ -53,8 +53,8 @@ public void testNoAppInFastBobPayInFactory() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.NO_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait( - mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); + mPaymentRequestTestRule.clickNodeAndWait( + "buy", mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); mPaymentRequestTestRule.expectResultContains(new String[] {"true"}); mPaymentRequestTestRule.clickNodeAndWait("hasEnrolledInstrument", @@ -68,8 +68,8 @@ public void testNoAppsInSlowBobPayFactory() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.NO_APPS, FactorySpeed.SLOW_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait( - mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); + mPaymentRequestTestRule.clickNodeAndWait( + "buy", mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); mPaymentRequestTestRule.expectResultContains(new String[] {"true"}); mPaymentRequestTestRule.clickNodeAndWait("hasEnrolledInstrument", @@ -83,8 +83,8 @@ public void testPayWithFastBobPayFactory() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait( - mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); + mPaymentRequestTestRule.clickNodeAndWait( + "buy", mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); mPaymentRequestTestRule.expectResultContains(new String[] {"true"}); } @@ -94,8 +94,8 @@ public void testPayWithSlowBobPayFactory() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.HAVE_APPS, FactorySpeed.SLOW_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait( - mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); + mPaymentRequestTestRule.clickNodeAndWait( + "buy", mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); mPaymentRequestTestRule.expectResultContains(new String[] {"true"}); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryTest.java index ff786a0..ae476dfd 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentQueryTest.java
@@ -6,6 +6,7 @@ import androidx.test.filters.MediumTest; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,7 +19,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -29,13 +29,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestCanMakePaymentQueryTest implements MainActivityStartCallback { +public class PaymentRequestCanMakePaymentQueryTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_can_make_payment_query_test.html", this); + new PaymentRequestTestRule("payment_request_can_make_payment_query_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { // The user has a valid credit card without a billing address on file. This is sufficient // for canMakePayment() to return true. new AutofillTestHelper().setCreditCard(new CreditCard("", "https://example.test", true, @@ -49,8 +49,8 @@ public void testNoAppsInFastBobPayFactory() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.NO_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait( - mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); + mPaymentRequestTestRule.clickNodeAndWait( + "buy", mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); mPaymentRequestTestRule.expectResultContains(new String[] {"true"}); } @@ -60,8 +60,8 @@ public void testNoAppsInSlowBobPayFactory() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.NO_APPS, FactorySpeed.SLOW_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait( - mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); + mPaymentRequestTestRule.clickNodeAndWait( + "buy", mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); mPaymentRequestTestRule.expectResultContains(new String[] {"true"}); } @@ -71,8 +71,8 @@ public void testPayWithFastBobPayFactory() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait( - mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); + mPaymentRequestTestRule.clickNodeAndWait( + "buy", mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); mPaymentRequestTestRule.expectResultContains(new String[] {"true"}); } @@ -82,8 +82,8 @@ public void testPayWithSlowBobPayFactory() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.HAVE_APPS, FactorySpeed.SLOW_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait( - mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); + mPaymentRequestTestRule.clickNodeAndWait( + "buy", mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); mPaymentRequestTestRule.expectResultContains(new String[] {"true"}); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java index 57f49f6..638c7a1 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsAndFreeShippingTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,7 +21,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.payments.Event; import org.chromium.ui.modaldialog.ModalDialogProperties; @@ -33,13 +33,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestContactDetailsAndFreeShippingTest implements MainActivityStartCallback { +public class PaymentRequestContactDetailsAndFreeShippingTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = new PaymentRequestTestRule( - "payment_request_contact_details_and_free_shipping_test.html", this); + "payment_request_contact_details_and_free_shipping_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a shipping address with a valid email address and a valid phone number on // disk. @@ -61,7 +61,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( @@ -85,7 +85,7 @@ @DisabledTest(message = "https://crbug.com/1182589") public void testPaymentRequestEventsMetric() throws TimeoutException { // Start and complete the Payment Request. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java index f622ce1..c8077600 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestContactDetailsTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,7 +22,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.payments.Event; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -33,13 +33,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestContactDetailsTest implements MainActivityStartCallback { +public class PaymentRequestContactDetailsTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_contact_details_test.html", this); + new PaymentRequestTestRule("payment_request_contact_details_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has valid payer name, phone number and email address on disk. helper.setProfile(new AutofillProfile("", "https://example.test", true, @@ -76,7 +76,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( @@ -89,7 +89,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddInvalidContactAndCancel() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( @@ -112,7 +112,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddContactAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( @@ -135,7 +135,7 @@ @Feature({"Payments"}) @DisabledTest(message = "https://crbug.com/1182528") public void testQuickAddContactAndCloseShouldNotCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); @@ -167,7 +167,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testQuickCloseAndAddContactShouldNotCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); @@ -195,7 +195,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testEditContactAndCancelEditorShouldKeepContactSelected() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.expectContactDetailsRowIsSelected(0); @@ -216,7 +216,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddContactAndCancelEditorShouldKeepContactSelected() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.expectContactDetailsRowIsSelected(0); @@ -237,7 +237,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testQuickAddContactAndCancelShouldNotCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); @@ -269,7 +269,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testQuickCancelAndAddContactShouldNotCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); @@ -300,7 +300,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testSuggestionsDeduped() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(1, mPaymentRequestTestRule.getNumberOfContactDetailSuggestions()); @@ -316,7 +316,7 @@ @Feature({"Payments"}) public void testPaymentRequestEventsMetric() throws TimeoutException { // Start and complete the Payment Request. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( @@ -348,10 +348,11 @@ mPaymentRequestTestRule.newIncognitoTabFromMenu(); mPaymentRequestTestRule.loadUrl(mPaymentRequestTestRule.getTestServer().getURL( "/components/test/data/payments/payment_request_contact_details_test.html")); + mPaymentRequestTestRule.setObserversAndWaitForInitialPageLoad(); // Trigger the PaymentRequest, and expand the contact info section to show the text. This is // where the code would previously crash. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDataUrlTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDataUrlTest.java index 1c037b6..3d454d5a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDataUrlTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDataUrlTest.java
@@ -13,7 +13,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -21,10 +20,10 @@ /** Web payments test for data URL. */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestDataUrlTest implements MainActivityStartCallback { +public class PaymentRequestDataUrlTest { @Rule - public PaymentRequestTestRule mPaymentRequestTestRule = new PaymentRequestTestRule( - "data:text/html,<html><head>" + public PaymentRequestTestRule mPaymentRequestTestRule = + new PaymentRequestTestRule("data:text/html,<html><head>" + "<meta name=\"viewport\" content=\"width=device-width, initial-scale=0.5, " + "maximum-scale=0.5, minimum-scale=0.5\"></head><body><button id=\"buy\"" + "onclick=\"try { " @@ -33,17 +32,13 @@ + " amount: {currency: 'USD', value: '1.00'}}})).show(); " + "} catch(e) { " + "document.getElementById('result').innerHTML = e; " - + "}\">Data URL Test</button><div id='result'></div></body></html>", - this); - - @Override - public void onMainActivityStarted() {} + + "}\">Data URL Test</button><div id='result'></div></body></html>"); @Test @MediumTest @Feature({"Payments"}) public void test() throws TimeoutException { - mPaymentRequestTestRule.openPageAndClickNode("buy"); + mPaymentRequestTestRule.clickNode("buy"); mPaymentRequestTestRule.expectResultContains( new String[] {"PaymentRequest is not defined"}); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingMultipleAddressesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingMultipleAddressesTest.java index fbaa6b22..c451935 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingMultipleAddressesTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingMultipleAddressesTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -19,7 +20,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.ArrayList; @@ -31,11 +31,10 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestDynamicShippingMultipleAddressesTest - implements MainActivityStartCallback { +public class PaymentRequestDynamicShippingMultipleAddressesTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_dynamic_shipping_test.html", this); + new PaymentRequestTestRule("payment_request_dynamic_shipping_test.html"); private static final AutofillProfile[] AUTOFILL_PROFILES = { // Incomplete profile_0 (missing phone number) @@ -86,8 +85,8 @@ private int[] mCountsToSet; private int[] mDatesToSet; - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // Add the profiles. @@ -125,7 +124,7 @@ mCountsToSet = new int[] {20, 15, 10, 25}; mDatesToSet = new int[] {5000, 5000, 5000, 5000}; - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(4, mPaymentRequestTestRule.getNumberOfShippingAddressSuggestions()); @@ -155,7 +154,7 @@ mCountsToSet = new int[] {20, 30}; mDatesToSet = new int[] {5000, 5000}; - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(2, mPaymentRequestTestRule.getNumberOfShippingAddressSuggestions()); @@ -182,7 +181,7 @@ mCountsToSet = new int[] {20, 15, 10, 5, 2, 1}; mDatesToSet = new int[] {5000, 5000, 5000, 5000, 2, 1}; - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); // Only four profiles should be suggested to the user. @@ -219,7 +218,7 @@ mCountsToSet = new int[] {15, 10, 5, 1}; mDatesToSet = new int[] {5000, 5000, 5000, 1}; - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); // Only 3 profiles should be suggested, the two complete ones and the incomplete one that @@ -249,7 +248,7 @@ mDatesToSet = new int[] {5000}; // Click on the unacceptable shipping address. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); Assert.assertTrue(mPaymentRequestTestRule.getShippingAddressSuggestionLabel(0).contains( @@ -279,7 +278,7 @@ mCountsToSet = new int[] {15, 10, 5, 25}; mDatesToSet = new int[] {5000, 5000, 5000, 5000}; - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java index fc1b091..aa23ee3 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestDynamicShippingSingleAddressTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -19,7 +20,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.browser.payments.ui.PaymentRequestSection; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -33,13 +33,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestDynamicShippingSingleAddressTest implements MainActivityStartCallback { +public class PaymentRequestDynamicShippingSingleAddressTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_dynamic_shipping_test.html", this); + new PaymentRequestTestRule("payment_request_dynamic_shipping_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a shipping address on disk. String billingAddressId = helper.setProfile(new AutofillProfile("", "https://example.test", @@ -56,7 +56,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddressNotSelected() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(PaymentRequestSection.EDIT_BUTTON_CHOOSE, mPaymentRequestTestRule.getShippingAddressSectionButtonState()); } @@ -67,7 +67,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testSelectValidAddressAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); // Check that there is a selected payment method (makes sure we are not ready to pay because // of the Shipping Address). mPaymentRequestTestRule.expectPaymentMethodRowIsSelected(0); @@ -92,7 +92,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testSelectValidAddressEditItAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); // Check that there is a selected payment method (makes sure we are not ready to pay because // of the Shipping Address). mPaymentRequestTestRule.expectPaymentMethodRowIsSelected(0); @@ -126,7 +126,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testSelectValidAddressEditItAndCancelAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); // Check that there is a selected payment method (makes sure we are not ready to pay because // of the Shipping Address). mPaymentRequestTestRule.expectPaymentMethodRowIsSelected(0); @@ -161,7 +161,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddInvalidAddressAndCancel() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); // Check that there is a selected payment method (makes sure we are not ready to pay because // of the Shipping Address). mPaymentRequestTestRule.expectPaymentMethodRowIsSelected(0); @@ -189,7 +189,7 @@ @DisabledTest(message = "crbug.com/626289") @Feature({"Payments"}) public void testAddAddressAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( @@ -216,7 +216,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testQuickAddAddressAndCloseShouldNotCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); @@ -248,7 +248,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testQuickCloseAndAddAddressShouldNotCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); @@ -276,7 +276,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testQuickAddAddressAndCancelShouldNotCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); @@ -308,7 +308,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testQuickCancelAndAddAddressShouldNotCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java index 0ae6802..58a8c11 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndFreeShippingTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,7 +21,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.payments.Event; import org.chromium.ui.modaldialog.ModalDialogProperties; @@ -33,13 +33,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestEmailAndFreeShippingTest implements MainActivityStartCallback { +public class PaymentRequestEmailAndFreeShippingTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_email_and_free_shipping_test.html", this); + new PaymentRequestTestRule("payment_request_email_and_free_shipping_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a shipping address with a valid email on disk. String billingAddressId = helper.setProfile( @@ -57,7 +57,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( @@ -79,7 +79,7 @@ @Feature({"Payments"}) public void testPaymentRequestEventsMetric() throws TimeoutException { // Start and cancel the Payment Request. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.close_button, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( @@ -103,7 +103,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddAddressNoCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java index 8ed089f..c527dd7 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailAndPhoneTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,7 +22,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.payments.Event; @@ -32,13 +32,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestEmailAndPhoneTest implements MainActivityStartCallback { +public class PaymentRequestEmailAndPhoneTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_email_and_phone_test.html", this); + new PaymentRequestTestRule("payment_request_email_and_phone_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a valid email address and phone number on disk. helper.setProfile(new AutofillProfile("", "https://example.test", true, @@ -75,7 +75,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( @@ -88,7 +88,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddInvalidEmailAndCancel() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( @@ -111,7 +111,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddEmailAndPhoneAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( @@ -136,7 +136,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testSuggestionsDeduped() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(1, mPaymentRequestTestRule.getNumberOfContactDetailSuggestions()); @@ -152,7 +152,7 @@ @Feature({"Payments"}) public void testPaymentRequestEventsMetric() throws TimeoutException { // Start and cancel the Payment Request. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.close_button, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java index ec881f7..c41347a9 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmailTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,7 +22,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.payments.Event; @@ -32,13 +32,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestEmailTest implements MainActivityStartCallback { +public class PaymentRequestEmailTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_email_test.html", this); + new PaymentRequestTestRule("payment_request_email_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a valid email address on disk. helper.setProfile(new AutofillProfile("", "https://example.test", true, @@ -75,7 +75,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains(new String[] {"jon.doe@google.com"}); @@ -87,7 +87,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddInvalidEmailAndCancel() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( @@ -110,7 +110,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddEmailAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( @@ -134,7 +134,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testSuggestionsDeduped() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(1, mPaymentRequestTestRule.getNumberOfContactDetailSuggestions()); @@ -150,7 +150,7 @@ @Feature({"Payments"}) public void testPaymentRequestEventsMetric() throws TimeoutException { // Start and complete the Payment Request. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains(new String[] {"jon.doe@google.com"});
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmptyUpdateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmptyUpdateTest.java index d0dee1de..ddda2d5 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmptyUpdateTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestEmptyUpdateTest.java
@@ -6,6 +6,7 @@ import androidx.test.filters.MediumTest; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,7 +19,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -29,13 +29,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestEmptyUpdateTest implements MainActivityStartCallback { +public class PaymentRequestEmptyUpdateTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_empty_update_test.html", this); + new PaymentRequestTestRule("payment_request_empty_update_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a shipping address on disk. String billingAddressId = helper.setProfile(new AutofillProfile("", "https://example.test", @@ -52,7 +52,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testSelectValidAddress() throws Throwable { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestExtraShippingOptionsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestExtraShippingOptionsTest.java index e617013..3f49926 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestExtraShippingOptionsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestExtraShippingOptionsTest.java
@@ -6,6 +6,7 @@ import androidx.test.filters.MediumTest; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,7 +19,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.ui.modaldialog.ModalDialogProperties; @@ -30,13 +30,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestExtraShippingOptionsTest implements MainActivityStartCallback { +public class PaymentRequestExtraShippingOptionsTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_extra_shipping_options_test.html", this); + new PaymentRequestTestRule("payment_request_extra_shipping_options_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); String billingAddressId = helper.setProfile(new AutofillProfile("", "https://example.test", true, "" /* honorific prefix */, "Jon Doe", "Google", "340 Main St", "CA", @@ -55,7 +55,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java index 704c4a0..af8a991 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestFreeShippingTest.java
@@ -26,7 +26,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.night_mode.ChromeNightModeTestUtils; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; import org.chromium.components.payments.Event; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -42,10 +41,10 @@ @RunWith(ParameterizedRunner.class) @ParameterAnnotations.UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestFreeShippingTest implements MainActivityStartCallback { +public class PaymentRequestFreeShippingTest { @Rule - public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_free_shipping_test.html", this, true); + public PaymentRequestTestRule mPaymentRequestTestRule = new PaymentRequestTestRule( + "payment_request_free_shipping_test.html", /*delayStartActivity=*/true); private static final int RENDER_TEST_REVISION = 1; private static final String RENDER_TEST_REVISION_DESCRIPTION = @@ -70,18 +69,13 @@ mRenderTestRule.setNightModeEnabled(nightModeEnabled); } - @Before - public void setUp() { - mPaymentRequestTestRule.startMainActivity(); - } - @AfterClass public static void tearDownAfterActivityDestroyed() { ChromeNightModeTestUtils.tearDownNightModeAfterChromeActivityDestroyed(); } - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a shipping address on disk. String billingAddressId = helper.setProfile(new AutofillProfile("", "https://example.test", @@ -99,7 +93,7 @@ @Feature({"Payments", "RenderTest"}) @ParameterAnnotations.UseMethodParameter(NightModeTestUtils.NightModeParams.class) public void testPayWithRender(boolean nightModeEnabled) throws Throwable { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mRenderTestRule.render(mPaymentRequestTestRule.getPaymentRequestView(), "free_shipping"); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); @@ -119,7 +113,7 @@ @DisabledTest(message = "crbug.com/673371") @Feature({"Payments"}) public void testAddInvalidAddressAndCancel() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( @@ -140,7 +134,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddAddressAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( @@ -167,7 +161,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testChangeCountryAddAddressAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( @@ -196,7 +190,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testQuickAddAddressAndCloseShouldNotCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); @@ -228,7 +222,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testQuickCloseAndAddAddressShouldNotCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); @@ -256,7 +250,7 @@ @DisabledTest(message = "crbug.com/673371") @Feature({"Payments"}) public void testQuickAddAddressAndCancelShouldNotCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); @@ -288,7 +282,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testQuickCancelAndAddAddressShouldNotCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); @@ -320,7 +314,7 @@ @Feature({"Payments"}) public void testPaymentRequestEventsMetric() throws TimeoutException { // Start and abort the Payment Request. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.close_button, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsAndFreeShippingTest.java index 17458d21..08a98f4 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsAndFreeShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsAndFreeShippingTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,7 +21,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -32,14 +32,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestIncompleteContactDetailsAndFreeShippingTest - implements MainActivityStartCallback { +public class PaymentRequestIncompleteContactDetailsAndFreeShippingTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = new PaymentRequestTestRule( - "payment_request_contact_details_and_free_shipping_test.html", this); + "payment_request_contact_details_and_free_shipping_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a shipping address with a valid email address on disk. However the phone // number is invalid. @@ -58,7 +57,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testEditIncompleteShippingAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); @@ -96,7 +95,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testEditIncompleteShippingAndContactAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsTest.java index 2e84fc71..98336b3 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteContactDetailsTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,7 +21,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.browser.payments.ui.PaymentRequestSection; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -32,13 +32,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestIncompleteContactDetailsTest implements MainActivityStartCallback { +public class PaymentRequestIncompleteContactDetailsTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_contact_details_test.html", this); + new PaymentRequestTestRule("payment_request_contact_details_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has an invalid email address on disk. helper.setProfile( @@ -57,7 +57,7 @@ @Feature({"Payments"}) public void testEditIncompleteContactAndCancel() throws TimeoutException { // Not ready to pay since Contact email is invalid. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); // Check that there is a selected payment method (makes sure we are not ready to pay because // of the Contact Details). mPaymentRequestTestRule.expectPaymentMethodRowIsSelected(0); @@ -90,7 +90,7 @@ @Feature({"Payments"}) public void testAddIncompleteContactAndCancel() throws TimeoutException { // Not ready to pay since Contact email is invalid. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); // Check that there is a selected payment method (makes sure we are not ready to pay because // of the Contact Details). mPaymentRequestTestRule.expectPaymentMethodRowIsSelected(0); @@ -122,7 +122,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testEditIncompleteContactAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteEmailTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteEmailTest.java index 36b89b3..0c29ea4 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteEmailTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompleteEmailTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,7 +21,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.browser.payments.ui.PaymentRequestSection; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -32,13 +32,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestIncompleteEmailTest implements MainActivityStartCallback { +public class PaymentRequestIncompleteEmailTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_email_test.html", this); + new PaymentRequestTestRule("payment_request_email_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has an invalid email address on disk. helper.setProfile( @@ -57,7 +57,7 @@ @Feature({"Payments"}) public void testEditIncompleteEmailAndCancel() throws TimeoutException { // Not ready to pay since Contact email is invalid. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); // Check that there is a selected payment method (makes sure we are not ready to pay because // of the Contact Details). mPaymentRequestTestRule.expectPaymentMethodRowIsSelected(0); @@ -89,7 +89,7 @@ @Feature({"Payments"}) public void testAddIncompleteEmailAndCancel() throws TimeoutException { // Not ready to pay since Contact email is invalid. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); // Check that there is a selected payment method (makes sure we are not ready to pay because // of the Contact Details). mPaymentRequestTestRule.expectPaymentMethodRowIsSelected(0); @@ -121,7 +121,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testEditIncompleteEmailAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompletePhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompletePhoneTest.java index 117e678..bb3417e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompletePhoneTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestIncompletePhoneTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,7 +21,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.browser.payments.ui.PaymentRequestSection; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -32,13 +32,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestIncompletePhoneTest implements MainActivityStartCallback { +public class PaymentRequestIncompletePhoneTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_phone_test.html", this); + new PaymentRequestTestRule("payment_request_phone_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has an invalid phone number on disk. helper.setProfile(new AutofillProfile("", "https://example.test", true, @@ -56,7 +56,7 @@ @DisabledTest(message = "https://crbug.com/1197578") public void testEditIncompletePhoneAndCancel() throws TimeoutException { // Not ready to pay since Contact phone is invalid. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); // Check that there is a selected payment method (makes sure we are not ready to pay because // of the Contact Details). mPaymentRequestTestRule.expectPaymentMethodRowIsSelected(0); @@ -88,7 +88,7 @@ @Feature({"Payments"}) public void testAddIncompletePhoneAndCancel() throws TimeoutException { // Not ready to pay since Contact phone is invalid. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); // Check that there is a selected payment method (makes sure we are not ready to pay because // of the Contact Details). mPaymentRequestTestRule.expectPaymentMethodRowIsSelected(0); @@ -120,7 +120,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testEditIncompletePhoneAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java index f1bfb7d..c0c8c55 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestJourneyLoggerTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,7 +22,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.payments.Event; import org.chromium.ui.modaldialog.ModalDialogProperties; @@ -33,15 +33,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestJourneyLoggerTest implements MainActivityStartCallback { +public class PaymentRequestJourneyLoggerTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_metrics_test.html", this); + new PaymentRequestTestRule("payment_request_metrics_test.html"); - @Override - public void onMainActivityStarted() {} - - private void createTestData() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper mHelper = new AutofillTestHelper(); // The user has a shipping address. String mBillingAddressId = mHelper.setProfile( @@ -62,8 +60,6 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testNumberOfSuggestionsShown_ShippingAddress_Completed() throws TimeoutException { - createTestData(); - // Complete a Payment Request with a credit card. mPaymentRequestTestRule.triggerUIAndWait("ccBuy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( @@ -88,8 +84,6 @@ @Feature({"Payments"}) public void testNumberOfSuggestionsShown_ShippingAddress_AbortedByUser() throws InterruptedException, TimeoutException { - createTestData(); - // Cancel the payment request. mPaymentRequestTestRule.triggerUIAndWait("ccBuy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( @@ -116,8 +110,6 @@ mPaymentRequestTestRule.addPaymentAppFactory( "https://kylepay.test/webpay", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - createTestData(); - // Complete a Payment Request with the payment app. mPaymentRequestTestRule.triggerUIAndWait( "buyWithUrlMethods", mPaymentRequestTestRule.getReadyForInput()); @@ -146,8 +138,6 @@ mPaymentRequestTestRule.addPaymentAppFactory( "https://kylepay.test/webpay", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - createTestData(); - // Cancel the payment request. mPaymentRequestTestRule.triggerUIAndWait( "buyWithUrlMethods", mPaymentRequestTestRule.getReadyForInput()); @@ -177,8 +167,6 @@ mPaymentRequestTestRule.addPaymentAppFactory( "https://kylepay.test/webpay", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - createTestData(); - // Cancel the payment request. mPaymentRequestTestRule.triggerUIAndWait( "buyWithUrlMethods", mPaymentRequestTestRule.getReadyToPay()); @@ -201,8 +189,6 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testNumberOfSuggestionsShown_ContactInfo_Completed() throws TimeoutException { - createTestData(); - // Complete a Payment Request with a credit card. mPaymentRequestTestRule.triggerUIAndWait( "contactInfoBuy", mPaymentRequestTestRule.getReadyToPay()); @@ -228,8 +214,6 @@ @DisabledTest(message = "https://crbug.com/1197578") public void testNumberOfSuggestionsShown_ContactInfo_AbortedByUser() throws InterruptedException, TimeoutException { - createTestData(); - // Cancel the payment request. mPaymentRequestTestRule.triggerUIAndWait( "contactInfoBuy", mPaymentRequestTestRule.getReadyToPay()); @@ -254,9 +238,6 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testUserHadCompleteSuggestions_ShippingAndPayment() throws TimeoutException { - // Add two addresses and two cards. - createTestData(); - // Cancel the payment request. mPaymentRequestTestRule.triggerUIAndWait("ccBuy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( @@ -391,8 +372,6 @@ mPaymentRequestTestRule.addPaymentAppFactory( "https://kylepay.test/webpay", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - createTestData(); - // Cancel the payment request. mPaymentRequestTestRule.triggerUIAndWait( "buyWithUrlMethods", mPaymentRequestTestRule.getReadyForInput()); @@ -454,8 +433,6 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testNoContactInfoHistogram() throws TimeoutException { - createTestData(); - // Complete a Payment Request with a credit card. mPaymentRequestTestRule.triggerUIAndWait("ccBuy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( @@ -484,8 +461,6 @@ mPaymentRequestTestRule.addPaymentAppFactory( "https://kylepay.test/webpay", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - createTestData(); - // Complete a Payment Request with payment apps. mPaymentRequestTestRule.triggerUIAndWait( "buyWithUrlMethods", mPaymentRequestTestRule.getReadyForInput()); @@ -498,7 +473,7 @@ "PaymentRequest.NumberOfSuggestionsShown.PaymentMethod.Completed", 2)); // Complete a second Payment Request with payment apps. - mPaymentRequestTestRule.reTriggerUIAndWait( + mPaymentRequestTestRule.triggerUIAndWait( "buyWithUrlMethods", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getDismissed()); @@ -529,7 +504,7 @@ // Android Pay has a factory but it does not return an app. mPaymentRequestTestRule.addPaymentAppFactory( "https://android.com/pay", AppPresence.NO_APPS, FactorySpeed.SLOW_FACTORY); - mPaymentRequestTestRule.openPageAndClickNodeAndWait( + mPaymentRequestTestRule.clickNodeAndWait( "androidPayBuy", mPaymentRequestTestRule.getShowFailed()); mPaymentRequestTestRule.expectResultContains( new String[] {"The payment method", "not supported"});
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestLongIdTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestLongIdTest.java index df16170a..5818747 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestLongIdTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestLongIdTest.java
@@ -13,7 +13,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -21,19 +20,16 @@ /** A test to verify that PaymentRequest does not crash with very long request identifiers. */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestLongIdTest implements MainActivityStartCallback { +public class PaymentRequestLongIdTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_long_id_test.html", this); - - @Override - public void onMainActivityStarted() {} + new PaymentRequestTestRule("payment_request_long_id_test.html"); @Test @MediumTest @Feature({"Payments"}) public void testNoCrash() throws TimeoutException { - mPaymentRequestTestRule.openPageAndClickNode("buy"); + mPaymentRequestTestRule.clickNode("buy"); mPaymentRequestTestRule.expectResultContains( new String[] {"ID cannot be longer than 1024 characters"}); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java index a325fef5..c30eb1e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java
@@ -9,6 +9,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -24,7 +25,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.ChromeTabUtils; import org.chromium.components.payments.AbortReason; @@ -40,13 +40,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestMetricsTest implements MainActivityStartCallback { +public class PaymentRequestMetricsTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_metrics_test.html", this); + new PaymentRequestTestRule("payment_request_metrics_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper mHelper = new AutofillTestHelper(); // The user has a shipping address and a credit card associated with that address on disk. String mBillingAddressId = @@ -291,7 +291,7 @@ // Android Pay has a factory, but it returns no apps. mPaymentRequestTestRule.addPaymentAppFactory( "https://android.com/pay", AppPresence.NO_APPS, FactorySpeed.SLOW_FACTORY); - mPaymentRequestTestRule.openPageAndClickNodeAndWait( + mPaymentRequestTestRule.clickNodeAndWait( "androidPayBuy", mPaymentRequestTestRule.getShowFailed()); mPaymentRequestTestRule.expectResultContains( new String[] {"The payment method", "not supported"});
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestModifierTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestModifierTest.java index 9289a7f5..3d2d7c6 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestModifierTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestModifierTest.java
@@ -13,7 +13,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -21,20 +20,17 @@ /** A payment request integration test for a merchant that uses a modifier. */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestModifierTest implements MainActivityStartCallback { +public class PaymentRequestModifierTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_modifier_test.html", this); - - @Override - public void onMainActivityStarted() {} + new PaymentRequestTestRule("payment_request_modifier_test.html"); /** Using modifiers should not crash. */ @Test @MediumTest @Feature({"Payments"}) public void testNoCrash() throws TimeoutException { - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed()); + mPaymentRequestTestRule.findPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed()); mPaymentRequestTestRule.expectResultContains( new String[] {"The payment method", "not supported"}); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMultipleContactDetailsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMultipleContactDetailsTest.java index caa39e8..4d5b591 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMultipleContactDetailsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMultipleContactDetailsTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,7 +21,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.ArrayList; @@ -32,10 +32,10 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestMultipleContactDetailsTest implements MainActivityStartCallback { +public class PaymentRequestMultipleContactDetailsTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_contact_details_test.html", this); + new PaymentRequestTestRule("payment_request_contact_details_test.html"); private static final AutofillProfile[] AUTOFILL_PROFILES = { // 0 - Incomplete (no phone) profile. @@ -114,8 +114,8 @@ private int[] mCountsToSet; private int[] mDatesToSet; - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // Add the profiles. @@ -151,7 +151,7 @@ mCountsToSet = new int[] {20, 15, 10, 5, 1}; mDatesToSet = new int[] {5000, 5000, 5000, 5000, 1}; - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(4, mPaymentRequestTestRule.getNumberOfContactDetailSuggestions()); @@ -179,7 +179,7 @@ mCountsToSet = new int[] {15, 10, 5, 1}; mDatesToSet = new int[] {5000, 5000, 5000, 5000}; - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(4, mPaymentRequestTestRule.getNumberOfContactDetailSuggestions()); @@ -214,7 +214,7 @@ mCountsToSet = new int[] {1, 20, 15, 10, 5}; mDatesToSet = new int[] {1000, 4000, 3000, 2000, 1000}; - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); @@ -239,7 +239,7 @@ mCountsToSet = new int[] {15, 5}; mDatesToSet = new int[] {5000, 2000}; - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(1, mPaymentRequestTestRule.getNumberOfContactDetailSuggestions()); @@ -263,7 +263,7 @@ mCountsToSet = new int[] {15, 25}; mDatesToSet = new int[] {5000, 7000}; - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(2, mPaymentRequestTestRule.getNumberOfContactDetailSuggestions());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java index 593a57b..91bd360 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameAndFreeShippingTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,7 +21,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.payments.Event; import org.chromium.ui.modaldialog.ModalDialogProperties; @@ -33,13 +33,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestNameAndFreeShippingTest implements MainActivityStartCallback { +public class PaymentRequestNameAndFreeShippingTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_name_and_free_shipping_test.html", this); + new PaymentRequestTestRule("payment_request_name_and_free_shipping_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a shipping address with a valid payer name on disk. String billingAddressId = helper.setProfile(new AutofillProfile("", "https://example.test", @@ -56,7 +56,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( @@ -78,7 +78,7 @@ @Feature({"Payments"}) public void testPaymentRequestEventsMetric() throws TimeoutException { // Start and cancel the Payment Request. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.close_button, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java index c04925a..81968b0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNameTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,7 +21,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.payments.Event; import org.chromium.ui.modaldialog.ModalDialogProperties; @@ -32,13 +32,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestNameTest implements MainActivityStartCallback { +public class PaymentRequestNameTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_name_test.html", this); + new PaymentRequestTestRule("payment_request_name_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a valid payer name on disk. String billingAddressId = helper.setProfile( @@ -76,7 +76,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( @@ -92,7 +92,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddInvalidNameAndCancel() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( @@ -115,7 +115,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddNameAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( @@ -142,7 +142,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testSuggestionsDeduped() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(1, mPaymentRequestTestRule.getNumberOfContactDetailSuggestions()); @@ -158,7 +158,7 @@ @Feature({"Payments"}) public void testPaymentRequestEventsMetric() throws TimeoutException { // Start and complete the Payment Request. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingOptionsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingOptionsTest.java index d352db8..89e231c8 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingOptionsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingOptionsTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -19,7 +20,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -30,13 +30,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestNoShippingOptionsTest implements MainActivityStartCallback { +public class PaymentRequestNoShippingOptionsTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_no_shipping_options_test.html", this); + new PaymentRequestTestRule("payment_request_no_shipping_options_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a shipping address associated with a credit card. String firstAddressId = helper.setProfile(new AutofillProfile("", "https://example.test", @@ -65,7 +65,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAllShippingAddressesInvalid() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); // Focus on the shipping addresses section to enter expanded mode. mPaymentRequestTestRule.clickInShippingAddressAndWait(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java index 29b6992f..86d6f96 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,7 +22,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.payments.Event; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -34,13 +34,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestNoShippingTest implements MainActivityStartCallback { +public class PaymentRequestNoShippingTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_no_shipping_test.html", this); + new PaymentRequestTestRule("payment_request_no_shipping_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); helper.setProfile(new AutofillProfile("", "https://example.test", true, "" /* honorific prefix */, "Jon Doe", "Google", "340 Main St", "CA", "Los Angeles", @@ -53,7 +53,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testCloseDialog() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickAndWait( R.id.close_button, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( @@ -66,7 +66,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testEditAndCloseDialog() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickAndWait( R.id.button_secondary, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickAndWait( @@ -81,7 +81,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testEditAndCancelDialog() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickAndWait( R.id.button_secondary, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickAndWait( @@ -96,7 +96,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( @@ -113,7 +113,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testCancelUnmaskAndRetry() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.clickCardUnmaskButtonAndWait( @@ -142,8 +142,6 @@ mPaymentRequestTestRule.addPaymentAppFactory( "https://alicepay.test", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPage(); - mPaymentRequestTestRule.runJavaScriptAndWaitForUIEvent( "triggerPaymentRequest([{supportedMethods:'https://bobpay.test'}, " + "{supportedMethods:'https://alicepay.test'}]);", @@ -186,8 +184,6 @@ mPaymentRequestTestRule.addPaymentAppFactory( "https://alicepay.test", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPage(); - mPaymentRequestTestRule.runJavaScriptAndWaitForUIEvent( "triggerPaymentRequest([{supportedMethods:'https://bobpay.test'}, " + "{supportedMethods:'https://alicepay.test'}]);", @@ -222,8 +218,6 @@ mPaymentRequestTestRule.addPaymentAppFactory( "https://alicepay.test", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPage(); - mPaymentRequestTestRule.runJavaScriptAndWaitForUIEvent( "triggerPaymentRequest([{supportedMethods:'https://bobpay.test'}, " + "{supportedMethods:'https://alicepay.test'}]);", @@ -255,7 +249,7 @@ @Feature({"Payments"}) public void testPaymentRequestEventsMetric() throws TimeoutException { // Start and cancel the Payment Request. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.close_button, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoUpdateWithTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoUpdateWithTest.java index c5d1fea..27182d7 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoUpdateWithTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoUpdateWithTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -19,7 +20,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.ui.modaldialog.ModalDialogProperties; @@ -32,13 +32,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestNoUpdateWithTest implements MainActivityStartCallback { +public class PaymentRequestNoUpdateWithTest { @Rule public PaymentRequestTestRule mRule = - new PaymentRequestTestRule("payment_request_no_update_with_test.html", this); + new PaymentRequestTestRule("payment_request_no_update_with_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); helper.setProfile(new AutofillProfile("" /* guid */, "https://www.example.test" /* origin */, "" /* honorific prefix */, "Lisa Simpson",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPayerDetailChangeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPayerDetailChangeTest.java index 4c95de6..5fb55261 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPayerDetailChangeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPayerDetailChangeTest.java
@@ -6,6 +6,7 @@ import androidx.test.filters.MediumTest; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,7 +19,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -29,13 +29,13 @@ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, PaymentRequestTestRule.ENABLE_EXPERIMENTAL_WEB_PLATFORM_FEATURES}) -public class PaymentRequestPayerDetailChangeTest implements MainActivityStartCallback { +public class PaymentRequestPayerDetailChangeTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_onpayerdetailchange.html", this); + new PaymentRequestTestRule("payment_request_onpayerdetailchange.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); String billing_address_id = helper.setProfile(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppCanMakePaymentQueryTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppCanMakePaymentQueryTest.java index 254c93f..8b2125fb 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppCanMakePaymentQueryTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppCanMakePaymentQueryTest.java
@@ -15,7 +15,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -25,20 +24,17 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestPaymentAppCanMakePaymentQueryTest implements MainActivityStartCallback { +public class PaymentRequestPaymentAppCanMakePaymentQueryTest { @Rule - public PaymentRequestTestRule mPaymentRequestTestRule = new PaymentRequestTestRule( - "payment_request_can_make_payment_query_bobpay_test.html", this); - - @Override - public void onMainActivityStarted() {} + public PaymentRequestTestRule mPaymentRequestTestRule = + new PaymentRequestTestRule("payment_request_can_make_payment_query_bobpay_test.html"); @Test @MediumTest @Feature({"Payments"}) public void testBobPayInstalledLater() throws InterruptedException, TimeoutException { // hasEnrolledInstrument returns false, since BobPay is not installed. - mPaymentRequestTestRule.openPageAndClickNodeAndWait("hasEnrolledInstrument", + mPaymentRequestTestRule.clickNodeAndWait("hasEnrolledInstrument", mPaymentRequestTestRule.getHasEnrolledInstrumentQueryResponded()); mPaymentRequestTestRule.expectResultContains(new String[] {"false, false"}); @@ -60,7 +56,7 @@ AppPresence.NO_APPS, FactorySpeed.FAST_FACTORY); // canMakePayment returns true for BobPay and false for AlicePay. - mPaymentRequestTestRule.openPageAndClickNodeAndWait( + mPaymentRequestTestRule.clickNodeAndWait( "otherBuy", mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); mPaymentRequestTestRule.expectResultContains(new String[] {"true, false"}); @@ -80,7 +76,7 @@ AppPresence.NO_APPS, FactorySpeed.SLOW_FACTORY); // canMakePayment returns true for BobPay and false for AlicePay. - mPaymentRequestTestRule.openPageAndClickNodeAndWait( + mPaymentRequestTestRule.clickNodeAndWait( "otherBuy", mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); mPaymentRequestTestRule.expectResultContains(new String[] {"true, false"}); @@ -100,7 +96,7 @@ AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); // canMakePayment returns true for BobPay and false for AlicePay. - mPaymentRequestTestRule.openPageAndClickNodeAndWait( + mPaymentRequestTestRule.clickNodeAndWait( "otherBuy", mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); mPaymentRequestTestRule.expectResultContains(new String[] {"true, false"}); @@ -119,7 +115,7 @@ AppPresence.HAVE_APPS, FactorySpeed.SLOW_FACTORY); // canMakePayment returns true for BobPay and false for AlicePay. - mPaymentRequestTestRule.openPageAndClickNodeAndWait( + mPaymentRequestTestRule.clickNodeAndWait( "otherBuy", mPaymentRequestTestRule.getCanMakePaymentQueryResponded()); mPaymentRequestTestRule.expectResultContains(new String[] {"true, false"});
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java index 2a3e210..cbe6387 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppTest.java
@@ -39,7 +39,7 @@ @MediumTest @Feature({"Payments"}) public void testNoSupportedPaymentMethods() throws TimeoutException { - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getShowFailed()); mPaymentRequestTestRule.expectResultContains( new String[] {"The payment method", "not supported"}); } @@ -54,7 +54,7 @@ public void testNoAppsInFastBobPayFactory() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.NO_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getShowFailed()); mPaymentRequestTestRule.expectResultContains( new String[] {"The payment method", "not supported"}); } @@ -70,7 +70,7 @@ public void testNoAppsInSlowBobPayFactory() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.NO_APPS, FactorySpeed.SLOW_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getShowFailed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getShowFailed()); mPaymentRequestTestRule.expectResultContains( new String[] {"The payment method", "not supported"}); } @@ -83,8 +83,7 @@ public void testAppsCreatedAfterDismissShouldNotCrash() throws TimeoutException { TestFactory factory = mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPageAndClickNodeAndWait( - "buy", mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); TestThreadUtils.runOnUiThreadBlocking(() -> { factory.getDelegateForTest().onPaymentAppCreated( new TestPay("https://bobpay.test", AppSpeed.FAST_APP)); @@ -102,8 +101,7 @@ public void testFactoryActivityAfterDismissShouldNotCrash() throws TimeoutException { TestFactory factory = mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPageAndClickNodeAndWait( - "buy", mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); TestThreadUtils.runOnUiThreadBlocking(() -> { factory.getDelegateForTest().onCanMakePaymentCalculated(true); factory.getDelegateForTest().onDoneCreatingPaymentApps(factory); @@ -121,7 +119,7 @@ public void testPayViaFastBobPayFactory() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( new String[] {"https://bobpay.test", "\"transaction\"", "1337"}); } @@ -136,7 +134,7 @@ public void testPayViaSlowBobPayFactory() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.HAVE_APPS, FactorySpeed.SLOW_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( new String[] {"https://bobpay.test", "\"transaction\"", "1337"}); } @@ -152,7 +150,7 @@ public void testPayViaDelayedFastBobPay() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory("https://bobpay.test", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY, AppSpeed.FAST_APP); - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( new String[] {"https://bobpay.test", "\"transaction\"", "1337"}); } @@ -167,7 +165,7 @@ public void testPayViaDelayedSlowBobPay() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory("https://bobpay.test", AppPresence.HAVE_APPS, FactorySpeed.SLOW_FACTORY, AppSpeed.SLOW_APP); - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( new String[] {"https://bobpay.test", "\"transaction\"", "1337"}); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipPreloadTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipPreloadTest.java index 6e79d42..5e21196 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipPreloadTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipPreloadTest.java
@@ -51,7 +51,7 @@ public void testPayViaFastBobPay() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( new String[] {"https://bobpay.test", "\"transaction\"", "1337"}); } @@ -66,7 +66,7 @@ public void testPayViaSlowBobPay() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( new String[] {"https://bobpay.test", "\"transaction\"", "1337"}); } @@ -81,7 +81,7 @@ public void testPayViaDelayedFastBobPay() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory("https://bobpay.test", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY, AppSpeed.SLOW_APP); - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( new String[] {"https://bobpay.test", "\"transaction\"", "1337"}); } @@ -96,7 +96,7 @@ public void testPayViaDelayedSlowBobPay() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory("https://bobpay.test", AppPresence.HAVE_APPS, FactorySpeed.SLOW_FACTORY, AppSpeed.SLOW_APP); - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( new String[] {"https://bobpay.test", "\"transaction\"", "1337"}); Assert.assertEquals(1, @@ -117,7 +117,7 @@ FactorySpeed.FAST_FACTORY, AppSpeed.FAST_APP); mPaymentRequestTestRule.addPaymentAppFactory("https://bobpay.test", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY, AppSpeed.FAST_APP); - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipTest.java index d616d49..782d5ee 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppUiSkipTest.java
@@ -62,7 +62,7 @@ public void testPayViaFastBobPay() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( new String[] {"https://bobpay.test", "\"transaction\"", "1337"}); } @@ -77,7 +77,7 @@ public void testPayViaSlowBobPay() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory( AppPresence.HAVE_APPS, FactorySpeed.SLOW_FACTORY); - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( new String[] {"https://bobpay.test", "\"transaction\"", "1337"}); } @@ -92,7 +92,7 @@ public void testPayViaDelayedFastBobPay() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory("https://bobpay.test", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY, AppSpeed.SLOW_APP); - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( new String[] {"https://bobpay.test", "\"transaction\"", "1337"}); } @@ -107,7 +107,7 @@ public void testPayViaDelayedSlowBobPay() throws TimeoutException { mPaymentRequestTestRule.addPaymentAppFactory("https://bobpay.test", AppPresence.HAVE_APPS, FactorySpeed.SLOW_FACTORY, AppSpeed.SLOW_APP); - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains( new String[] {"https://bobpay.test", "\"transaction\"", "1337"}); Assert.assertEquals(1, @@ -128,7 +128,7 @@ FactorySpeed.FAST_FACTORY, AppSpeed.FAST_APP); mPaymentRequestTestRule.addPaymentAppFactory("https://bobpay.test", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY, AppSpeed.FAST_APP); - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java index 4f0de64..09c5879a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppsSortingTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,7 +19,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppSpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.TestPay; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.payments.PaymentAppFactoryDelegate; @@ -30,13 +30,13 @@ /** A payment integration test that sorting payment apps by frecency. */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestPaymentAppsSortingTest implements MainActivityStartCallback { +public class PaymentRequestPaymentAppsSortingTest { @Rule - public PaymentRequestTestRule mPaymentRequestTestRule = new PaymentRequestTestRule( - "payment_request_alicepay_bobpay_charliepay_test.html", this); + public PaymentRequestTestRule mPaymentRequestTestRule = + new PaymentRequestTestRule("payment_request_alicepay_bobpay_charliepay_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); String billingAddressId = helper.setProfile( new AutofillProfile("", "https://example.test", true, "" /* honorific prefix */, @@ -84,7 +84,7 @@ PaymentPreferencesUtil.setPaymentAppUseCountForTest(charliePayId, 15); PaymentPreferencesUtil.setPaymentAppLastUseDate(charliePayId, 15); - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInPaymentMethodAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); @@ -111,7 +111,7 @@ PaymentPreferencesUtil.setPaymentAppUseCountForTest(alicePayId, 20); PaymentPreferencesUtil.setPaymentAppLastUseDate(alicePayId, 20); - mPaymentRequestTestRule.reTriggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInPaymentMethodAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java index 8e10353d..13a9d85 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneAndFreeShippingTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,7 +21,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.payments.Event; import org.chromium.ui.modaldialog.ModalDialogProperties; @@ -33,13 +33,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestPhoneAndFreeShippingTest implements MainActivityStartCallback { +public class PaymentRequestPhoneAndFreeShippingTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_phone_and_free_shipping_test.html", this); + new PaymentRequestTestRule("payment_request_phone_and_free_shipping_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a shipping address with a valid phone number on disk. String billingAddressId = helper.setProfile(new AutofillProfile("", "https://example.test", @@ -56,7 +56,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( @@ -78,7 +78,7 @@ @Feature({"Payments"}) public void testPaymentRequestEventsMetric() throws TimeoutException { // Start and complete the Payment Request. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java index 7a7b40a..98b8f9d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPhoneTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,7 +22,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.payments.Event; @@ -32,13 +32,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestPhoneTest implements MainActivityStartCallback { +public class PaymentRequestPhoneTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_phone_test.html", this); + new PaymentRequestTestRule("payment_request_phone_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a valid phone number on disk. helper.setProfile(new AutofillProfile("", "https://example.test", true, @@ -75,7 +75,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains(new String[] {"+15555555555"}); @@ -87,7 +87,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddInvalidPhoneAndCancel() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( @@ -110,7 +110,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testAddPhoneAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInContactInfoAndWait( @@ -134,7 +134,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testSuggestionsDeduped() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInContactInfoAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(1, mPaymentRequestTestRule.getNumberOfContactDetailSuggestions()); @@ -150,7 +150,7 @@ @Feature({"Payments"}) public void testPaymentRequestEventsMetric() throws TimeoutException { // Start and abort the Payment Request. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickAndWait( R.id.close_button, mPaymentRequestTestRule.getDismissed()); mPaymentRequestTestRule.expectResultContains(
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 e49f2b4..78098a15 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
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,7 +21,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.ChromeRenderTestRule; import org.chromium.ui.modaldialog.ModalDialogProperties; @@ -34,10 +34,10 @@ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, PaymentRequestTestRule.ENABLE_EXPERIMENTAL_WEB_PLATFORM_FEATURES}) -public class PaymentRequestRetryTest implements MainActivityStartCallback { +public class PaymentRequestRetryTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_retry.html", this); + new PaymentRequestTestRule("payment_request_retry.html"); @Rule public RenderTestRule mRenderTestRule = @@ -46,8 +46,8 @@ .setBugComponent(RenderTestRule.Component.BLINK_PAYMENTS) .build(); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); helper.setProfile(new AutofillProfile("", "https://example.test", true, "" /* honorific prefix */, "Jon Doe", "Google", "340 Main St", "CA", "Los Angeles", @@ -88,7 +88,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testRetryWithDefaultError() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( @@ -112,7 +112,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testRetryWithCustomError() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( @@ -137,7 +137,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments", "RenderTest"}) public void testRetryWithShippingAddressErrors() throws Throwable { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( @@ -188,7 +188,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments", "RenderTest"}) public void testRetryWithPayerErrors() throws Throwable { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( @@ -231,7 +231,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testRetryWithShippingAddressErrorsAndPayerErrors() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( @@ -274,7 +274,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testRetryAndPayerDetailChangeEvent() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( @@ -314,7 +314,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testRetryAndReselectContactDetail() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickAndWait( R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java index 3883b7a..bfa32c2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestServiceWorkerPaymentAppTest.java
@@ -113,7 +113,7 @@ @MediumTest @Feature({"Payments"}) public void testNoSupportedPaymentMethods() throws TimeoutException { - mPaymentRequestTestRule.openPageAndClickNodeAndWait( + mPaymentRequestTestRule.clickNodeAndWait( "buy_with_bobpay", mPaymentRequestTestRule.getShowFailed()); mPaymentRequestTestRule.expectResultContains( new String[] {"show() rejected", "The payment method", "not supported"}); @@ -128,7 +128,7 @@ PaymentAppServiceBridge.setCanMakePaymentForTesting(true); // Payment sheet skips to the app since it is the only available app. - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); } @Test @@ -148,7 +148,7 @@ // available, otherwise CanMakePayment is not called. PaymentAppServiceBridge.setCanMakePaymentForTesting(false); - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); Assert.assertEquals(2, mPaymentRequestTestRule.getNumberOfPaymentApps()); } @@ -162,7 +162,7 @@ PaymentAppServiceBridge.setCanMakePaymentForTesting(true); // Payment sheet skips to the app since it is the only available app. - mPaymentRequestTestRule.openPageAndClickBuyAndWait(mPaymentRequestTestRule.getDismissed()); + mPaymentRequestTestRule.clickNodeAndWait("buy", mPaymentRequestTestRule.getDismissed()); } @Test @@ -175,7 +175,7 @@ PaymentAppServiceBridge.setCanMakePaymentForTesting(true); - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); Assert.assertNull(mPaymentRequestTestRule.getSelectedPaymentAppLabel()); } @@ -189,7 +189,7 @@ PaymentAppServiceBridge.setCanMakePaymentForTesting(true); - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); Assert.assertNull(mPaymentRequestTestRule.getSelectedPaymentAppLabel()); } @@ -203,7 +203,7 @@ PaymentAppServiceBridge.setCanMakePaymentForTesting(true); - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); Assert.assertNull(mPaymentRequestTestRule.getSelectedPaymentAppLabel()); } @@ -312,7 +312,7 @@ false /*payerEmail*/, "shippingSupported" /*name */); PaymentAppServiceBridge.setCanMakePaymentForTesting(true); - mPaymentRequestTestRule.openPageAndClickNodeAndWait( + mPaymentRequestTestRule.clickNodeAndWait( "buy_with_shipping_requested", mPaymentRequestTestRule.getDismissed()); } @@ -331,7 +331,7 @@ true /*payerEmail*/, "emailOnlySupported" /*name */); PaymentAppServiceBridge.setCanMakePaymentForTesting(true); - mPaymentRequestTestRule.openPageAndClickNodeAndWait( + mPaymentRequestTestRule.clickNodeAndWait( "buy_with_contact_requested", mPaymentRequestTestRule.getDismissed()); } @@ -350,7 +350,7 @@ true /*payerEmail*/, "shippingAndContactSupported" /*name*/); PaymentAppServiceBridge.setCanMakePaymentForTesting(true); - mPaymentRequestTestRule.openPageAndClickNodeAndWait( + mPaymentRequestTestRule.clickNodeAndWait( "buy_with_shipping_and_contact_requested", mPaymentRequestTestRule.getDismissed()); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressAndOptionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressAndOptionTest.java index 220ebc2e..5177b09 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressAndOptionTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressAndOptionTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -19,7 +20,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -29,13 +29,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestShippingAddressAndOptionTest implements MainActivityStartCallback { +public class PaymentRequestShippingAddressAndOptionTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_free_shipping_test.html", this); + new PaymentRequestTestRule("payment_request_free_shipping_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a shipping address associated with a credit card. String firstAddressId = helper.setProfile(new AutofillProfile("", "https://example.test", @@ -61,7 +61,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testShippingAddressFormat_BottomSheet() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); // Make sure that the shipping label on the bottomsheet does not include the country. Assert.assertEquals("Jon Doe\nGoogle, 340 Main St, Los Angeles, CA 90291\n555-555-5555", @@ -83,7 +83,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testShippingAddressFormat_FullSheet() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); // Focus on a section other that shipping addresses to enter fullsheet mode. mPaymentRequestTestRule.clickInPaymentMethodAndWait( @@ -107,7 +107,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testShippingAddressFormat_Expanded() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); // Focus on the shipping addresses section to enter expanded mode. mPaymentRequestTestRule.clickInShippingAddressAndWait( @@ -138,7 +138,7 @@ @DisabledTest(message = "crbug.com/1182234") @Feature({"Payments"}) public void testShippingAddressFormat_NewAddress() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); // Add a shipping address. mPaymentRequestTestRule.clickInShippingAddressAndWait( @@ -169,7 +169,7 @@ @Feature({"Payments"}) public void testEditShippingAddressAndCancelEditorShouldKeepAddressSelected() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.expectShippingAddressRowIsSelected(0); @@ -194,7 +194,7 @@ @Feature({"Payments"}) public void testEditShippingAddressAndClickAndroidBackButtonShouldKeepAddressSelected() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.expectShippingAddressRowIsSelected(0); @@ -219,7 +219,7 @@ @Feature({"Payments"}) public void testAddShippingAddressAndCancelEditorShouldKeepAddressSelected() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.expectShippingAddressRowIsSelected(0); @@ -244,7 +244,7 @@ @Feature({"Payments"}) public void testAddShippingAddressAndClickAndroidBackButtonShouldKeepAddressSelected() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyToPay()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.expectShippingAddressRowIsSelected(0);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressChangeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressChangeTest.java index dc296e3..2b24a36 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressChangeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressChangeTest.java
@@ -6,6 +6,7 @@ import androidx.test.filters.MediumTest; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,7 +19,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -28,13 +28,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestShippingAddressChangeTest implements MainActivityStartCallback { +public class PaymentRequestShippingAddressChangeTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_shipping_address_change_test.html", this); + new PaymentRequestTestRule("payment_request_shipping_address_change_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); // The user has a shipping address on disk. String billingAddressId = helper.setProfile(new AutofillProfile("", "https://example.test", @@ -55,7 +55,7 @@ @Feature({"Payments"}) public void testAddressRedactionInShippingAddressChange() throws TimeoutException { // Select a shipping address and cancel out. - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyForInput()); + mPaymentRequestTestRule.triggerUIAndWait("buy", mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickInShippingAddressAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); mPaymentRequestTestRule.clickOnShippingAddressSuggestionOptionAndWait(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseDigitalGoodsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseDigitalGoodsTest.java index e231c98e..fcf9d7b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseDigitalGoodsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseDigitalGoodsTest.java
@@ -16,7 +16,6 @@ import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppSpeed; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -26,13 +25,10 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestShowPromiseDigitalGoodsTest implements MainActivityStartCallback { +public class PaymentRequestShowPromiseDigitalGoodsTest { @Rule public PaymentRequestTestRule mRule = - new PaymentRequestTestRule("show_promise/digital_goods.html", this); - - @Override - public void onMainActivityStarted() {} + new PaymentRequestTestRule("show_promise/digital_goods.html"); @Test @MediumTest @@ -40,9 +36,8 @@ public void testDigitalGoodsFastApp() throws TimeoutException { mRule.addPaymentAppFactory( "https://bobpay.test", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mRule.openPage(); mRule.executeJavaScriptAndWaitForResult("create('https://bobpay.test');"); - mRule.triggerUIAndWait(mRule.getResultReady()); + mRule.triggerUIAndWait("buy", mRule.getResultReady()); mRule.expectResultContains(new String[] {"\"total\":\"1.00\""}); } @@ -53,9 +48,8 @@ public void testDigitalGoodsSlowApp() throws TimeoutException { mRule.addPaymentAppFactory("https://bobpay.test", AppPresence.HAVE_APPS, FactorySpeed.SLOW_FACTORY, AppSpeed.SLOW_APP); - mRule.openPage(); mRule.executeJavaScriptAndWaitForResult("create('https://bobpay.test');"); - mRule.triggerUIAndWait(mRule.getResultReady()); + mRule.triggerUIAndWait("buy", mRule.getResultReady()); mRule.expectResultContains(new String[] {"\"total\":\"1.00\""}); } @@ -66,10 +60,8 @@ public void testSkipUIFastApp() throws TimeoutException { mRule.addPaymentAppFactory( "https://bobpay.test", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mRule.openPage(); mRule.executeJavaScriptAndWaitForResult("create('https://bobpay.test');"); - - mRule.openPageAndClickNodeAndWait("buy", mRule.getDismissed()); + mRule.clickNodeAndWait("buy", mRule.getDismissed()); mRule.expectResultContains(new String[] {"\"total\":\"1.00\""}); } @@ -80,10 +72,8 @@ public void testSkipUISlowApp() throws TimeoutException { mRule.addPaymentAppFactory("https://bobpay.test", AppPresence.HAVE_APPS, FactorySpeed.SLOW_FACTORY, AppSpeed.SLOW_APP); - mRule.openPage(); mRule.executeJavaScriptAndWaitForResult("create('https://bobpay.test');"); - - mRule.openPageAndClickNodeAndWait("buy", mRule.getDismissed()); + mRule.clickNodeAndWait("buy", mRule.getDismissed()); mRule.expectResultContains(new String[] {"\"total\":\"1.00\""}); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyListsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyListsTest.java index e565a25..f27548d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyListsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyListsTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -19,7 +20,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -30,13 +30,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestShowPromiseEmptyListsTest implements MainActivityStartCallback { +public class PaymentRequestShowPromiseEmptyListsTest { @Rule public PaymentRequestTestRule mRule = - new PaymentRequestTestRule("show_promise/resolve_with_empty_lists.html", this); + new PaymentRequestTestRule("show_promise/resolve_with_empty_lists.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { new AutofillTestHelper().setProfile(new AutofillProfile("", "https://example.test", true, "" /* honorific prefix */, "Jon Doe", "Google", "340 Main St", "CA", "Los Angeles", "", "90291", "", "US", "650-253-0000", "", "en-US")); @@ -47,7 +47,7 @@ @Feature({"Payments"}) public void testResolveWithEmptyLists() throws TimeoutException { mRule.addPaymentAppFactory("basic-card", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mRule.triggerUIAndWait(mRule.getReadyForInput()); + mRule.triggerUIAndWait("buy", mRule.getReadyForInput()); Assert.assertEquals("USD $1.00", mRule.getOrderSummaryTotal());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyTest.java index 19f3cc57..e171b93 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseEmptyTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -19,7 +20,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -29,13 +29,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestShowPromiseEmptyTest implements MainActivityStartCallback { +public class PaymentRequestShowPromiseEmptyTest { @Rule public PaymentRequestTestRule mRule = - new PaymentRequestTestRule("show_promise/resolve_with_empty_dictionary.html", this); + new PaymentRequestTestRule("show_promise/resolve_with_empty_dictionary.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { new AutofillTestHelper().setProfile(new AutofillProfile("", "https://example.test", true, "" /* honorific prefix */, "Jon Doe", "Google", "340 Main St", "CA", "Los Angeles", "", "90291", "", "US", "650-253-0000", "", "en-US"));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseInvalidDetailsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseInvalidDetailsTest.java index f0d73cf..beef6505 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseInvalidDetailsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseInvalidDetailsTest.java
@@ -13,7 +13,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -23,19 +22,16 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestShowPromiseInvalidDetailsTest implements MainActivityStartCallback { +public class PaymentRequestShowPromiseInvalidDetailsTest { @Rule public PaymentRequestTestRule mRule = - new PaymentRequestTestRule("show_promise/invalid_details.html", this); - - @Override - public void onMainActivityStarted() {} + new PaymentRequestTestRule("show_promise/invalid_details.html"); @Test @MediumTest @Feature({"Payments"}) public void testReject() throws TimeoutException { - mRule.openPageAndClickNodeAndWait("buy", mRule.getRendererClosedMojoConnection()); + mRule.clickNodeAndWait("buy", mRule.getRendererClosedMojoConnection()); mRule.expectResultContains(new String[] {"Total amount value should be non-negative"}); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseRejectTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseRejectTest.java index 69dbfad..9ec06060 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseRejectTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseRejectTest.java
@@ -15,7 +15,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -25,20 +24,16 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestShowPromiseRejectTest implements MainActivityStartCallback { +public class PaymentRequestShowPromiseRejectTest { @Rule - public PaymentRequestTestRule mRule = - new PaymentRequestTestRule("show_promise/reject.html", this); - - @Override - public void onMainActivityStarted() {} + public PaymentRequestTestRule mRule = new PaymentRequestTestRule("show_promise/reject.html"); @Test @MediumTest @Feature({"Payments"}) public void testReject() throws TimeoutException { mRule.addPaymentAppFactory("basic-card", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mRule.openPageAndClickNodeAndWait("buy", mRule.getRendererClosedMojoConnection()); + mRule.clickNodeAndWait("buy", mRule.getRendererClosedMojoConnection()); mRule.expectResultContains(new String[] {"AbortError"}); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingTest.java index 4dac959..e90df28 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,7 +22,6 @@ import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppSpeed; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -32,14 +32,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestShowPromiseSingleOptionShippingTest - implements MainActivityStartCallback { +public class PaymentRequestShowPromiseSingleOptionShippingTest { @Rule public PaymentRequestTestRule mRule = - new PaymentRequestTestRule("show_promise/single_option_shipping.html", this); + new PaymentRequestTestRule("show_promise/single_option_shipping.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper autofillTestHelper = new AutofillTestHelper(); autofillTestHelper.setProfile(new AutofillProfile("", "https://example.test", true, "" /* honorific prefix */, "Jon Doe", "Google", "340 Main St", "California", @@ -55,7 +54,7 @@ @Feature({"Payments"}) public void testFastApp() throws TimeoutException { mRule.addPaymentAppFactory("basic-card", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mRule.triggerUIAndWait(mRule.getReadyToPay()); + mRule.triggerUIAndWait("buy", mRule.getReadyToPay()); Assert.assertEquals("USD $1.00", mRule.getOrderSummaryTotal()); Assert.assertEquals("$0.00", mRule.getShippingOptionCostSummaryOnBottomSheet()); mRule.clickInShippingAddressAndWait(R.id.payments_section, mRule.getReadyForInput()); @@ -71,7 +70,7 @@ public void testSlowApp() throws TimeoutException { mRule.addPaymentAppFactory( "basic-card", AppPresence.HAVE_APPS, FactorySpeed.SLOW_FACTORY, AppSpeed.SLOW_APP); - mRule.triggerUIAndWait(mRule.getReadyToPay()); + mRule.triggerUIAndWait("buy", mRule.getReadyToPay()); Assert.assertEquals("USD $1.00", mRule.getOrderSummaryTotal()); Assert.assertEquals("$0.00", mRule.getShippingOptionCostSummaryOnBottomSheet()); mRule.clickInShippingAddressAndWait(R.id.payments_section, mRule.getReadyForInput());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingWithUpdateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingWithUpdateTest.java index acf01d1e..4e24787 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingWithUpdateTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseSingleOptionShippingWithUpdateTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,7 +22,6 @@ import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppSpeed; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -32,14 +32,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestShowPromiseSingleOptionShippingWithUpdateTest - implements MainActivityStartCallback { +public class PaymentRequestShowPromiseSingleOptionShippingWithUpdateTest { @Rule - public PaymentRequestTestRule mRule = new PaymentRequestTestRule( - "show_promise/single_option_shipping_with_update.html", this); + public PaymentRequestTestRule mRule = + new PaymentRequestTestRule("show_promise/single_option_shipping_with_update.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper autofillTestHelper = new AutofillTestHelper(); autofillTestHelper.setProfile(new AutofillProfile("", "https://example.test", true, "" /* honorific prefix */, "Jon Doe", "Google", "340 Main St", "California", @@ -55,7 +54,7 @@ @Feature({"Payments"}) public void testFastApp() throws TimeoutException { mRule.addPaymentAppFactory("basic-card", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mRule.triggerUIAndWait(mRule.getReadyToPay()); + mRule.triggerUIAndWait("buy", mRule.getReadyToPay()); Assert.assertEquals("USD $1.00", mRule.getOrderSummaryTotal()); Assert.assertEquals("$0.00", mRule.getShippingOptionCostSummaryOnBottomSheet()); mRule.clickInShippingAddressAndWait(R.id.payments_section, mRule.getReadyForInput()); @@ -71,7 +70,7 @@ public void testSlowApp() throws TimeoutException { mRule.addPaymentAppFactory( "basic-card", AppPresence.HAVE_APPS, FactorySpeed.SLOW_FACTORY, AppSpeed.SLOW_APP); - mRule.triggerUIAndWait(mRule.getReadyToPay()); + mRule.triggerUIAndWait("buy", mRule.getReadyToPay()); Assert.assertEquals("USD $1.00", mRule.getOrderSummaryTotal()); Assert.assertEquals("$0.00", mRule.getShippingOptionCostSummaryOnBottomSheet()); mRule.clickInShippingAddressAndWait(R.id.payments_section, mRule.getReadyForInput());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUSOnlyShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUSOnlyShippingTest.java index fce3410..0ed419ec 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUSOnlyShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUSOnlyShippingTest.java
@@ -21,7 +21,6 @@ import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppSpeed; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -31,13 +30,10 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestShowPromiseUSOnlyShippingTest implements MainActivityStartCallback { +public class PaymentRequestShowPromiseUSOnlyShippingTest { @Rule public PaymentRequestTestRule mRule = - new PaymentRequestTestRule("show_promise/us_only_shipping.html", this); - - @Override - public void onMainActivityStarted() {} + new PaymentRequestTestRule("show_promise/us_only_shipping.html"); @Test @MediumTest @@ -63,7 +59,7 @@ autofillTestHelper.setProfile(new AutofillProfile("", "https://example.test", true, "" /* honorific prefix */, "Jon Doe", "Google", "51 Breithaupt St", "ON", "Kitchener", "", "N2H 5G5", "", "CA", "555-222-2222", "", "en-CA")); - mRule.triggerUIAndWait(mRule.getReadyForInput()); + mRule.triggerUIAndWait("buy", mRule.getReadyForInput()); Assert.assertEquals("USD $1.00", mRule.getOrderSummaryTotal()); mRule.clickInShippingAddressAndWait(R.id.payments_section, mRule.getReadyForInput()); Assert.assertEquals("To see shipping methods and requirements, select an address", @@ -99,7 +95,7 @@ autofillTestHelper.setProfile(new AutofillProfile("", "https://example.test", true, "" /* honorific prefix */, "Jane Smith", "Google", "340 Main St", "California", "Los Angeles", "", "90291", "", "US", "555-111-1111", "", "en-US")); - mRule.triggerUIAndWait(mRule.getReadyForInput()); + mRule.triggerUIAndWait("buy", mRule.getReadyForInput()); Assert.assertEquals("USD $1.00", mRule.getOrderSummaryTotal()); mRule.clickInShippingAddressAndWait(R.id.payments_section, mRule.getReadyForInput()); Assert.assertEquals("To see shipping methods and requirements, select an address",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUnsupportedTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUnsupportedTest.java index 5a891ba..b243657c 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUnsupportedTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowPromiseUnsupportedTest.java
@@ -13,7 +13,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import java.util.concurrent.TimeoutException; @@ -23,19 +22,16 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestShowPromiseUnsupportedTest implements MainActivityStartCallback { +public class PaymentRequestShowPromiseUnsupportedTest { @Rule public PaymentRequestTestRule mRule = - new PaymentRequestTestRule("show_promise/unsupported.html", this); - - @Override - public void onMainActivityStarted() {} + new PaymentRequestTestRule("show_promise/unsupported.html"); @Test @MediumTest @Feature({"Payments"}) public void testReject() throws TimeoutException { - mRule.openPageAndClickNodeAndWait("buy", mRule.getShowFailed()); + mRule.clickNodeAndWait("buy", mRule.getShowFailed()); mRule.expectResultContains( new String[] {"NotSupportedError: The payment method", "not supported"}); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowTwiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowTwiceTest.java index 7f2d71f..0ed7f27 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowTwiceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShowTwiceTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -20,7 +21,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.payments.NotShownReason; @@ -31,13 +31,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestShowTwiceTest implements MainActivityStartCallback { +public class PaymentRequestShowTwiceTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_show_twice_test.html", this); + new PaymentRequestTestRule("payment_request_show_twice_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); String billingAddressId = helper.setProfile(new AutofillProfile("", "https://example.test", true, "" /* honorific prefix */, "Jon Doe", "Google", "340 Main St", "CA", @@ -54,7 +54,6 @@ mPaymentRequestTestRule.addPaymentAppFactory( "https://alicepay.test", AppPresence.HAVE_APPS, FactorySpeed.FAST_FACTORY); - mPaymentRequestTestRule.openPage(); mPaymentRequestTestRule.runJavaScriptAndWaitForUIEvent( "showFirst()", mPaymentRequestTestRule.getReadyToPay()); Assert.assertEquals(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java index 31f9deb..be7da15b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTabTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,7 +22,6 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.AppPresence; import org.chromium.chrome.browser.payments.PaymentRequestTestRule.FactorySpeed; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelUtils; @@ -37,13 +37,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestTabTest implements MainActivityStartCallback { +public class PaymentRequestTabTest { @Rule public PaymentRequestTestRule mPaymentRequestTestRule = - new PaymentRequestTestRule("payment_request_metrics_test.html", this); + new PaymentRequestTestRule("payment_request_metrics_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); String billingAddressId = helper.setProfile( new AutofillProfile("", "https://example.test", true, "" /* honorific prefix */,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java index 0c6902c..57deccd 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java
@@ -73,83 +73,83 @@ /** * Custom ActivityTestRule for integration test for payments. */ -public class PaymentRequestTestRule extends ChromeTabbedActivityTestRule +/*package*/ class PaymentRequestTestRule extends ChromeTabbedActivityTestRule implements PaymentRequestObserverForTest, PaymentRequestServiceObserverForTest, ChromePaymentRequestDelegateImplObserverForTest, CardUnmaskObserverForTest, EditorObserverForTest { @IntDef({AppPresence.NO_APPS, AppPresence.HAVE_APPS}) @Retention(RetentionPolicy.SOURCE) - public @interface AppPresence { + /* package */ @interface AppPresence { /** Flag for a factory without payment apps. */ - public static final int NO_APPS = 0; + static final int NO_APPS = 0; /** Flag for a factory with payment apps. */ - public static final int HAVE_APPS = 1; + static final int HAVE_APPS = 1; } @IntDef({AppSpeed.FAST_APP, AppSpeed.SLOW_APP}) @Retention(RetentionPolicy.SOURCE) - public @interface AppSpeed { + /* package */ @interface AppSpeed { /** Flag for installing a payment app that responds to its invocation fast. */ - public static final int FAST_APP = 0; + static final int FAST_APP = 0; /** Flag for installing a payment app that responds to its invocation slowly. */ - public static final int SLOW_APP = 1; + static final int SLOW_APP = 1; } @IntDef({FactorySpeed.FAST_FACTORY, FactorySpeed.SLOW_FACTORY}) @Retention(RetentionPolicy.SOURCE) - public @interface FactorySpeed { + /* package */ @interface FactorySpeed { /** Flag for a factory that immediately creates a payment app. */ - public static final int FAST_FACTORY = 0; + static final int FAST_FACTORY = 0; /** Flag for a factory that creates a payment app with a delay. */ - public static final int SLOW_FACTORY = 1; + static final int SLOW_FACTORY = 1; } /** The expiration month dropdown index for December. */ - public static final int DECEMBER = 11; + /* package */ static final int DECEMBER = 11; /** The expiration year dropdown index for the next year. */ - public static final int NEXT_YEAR = 1; + /* package */ static final int NEXT_YEAR = 1; /** * The billing address dropdown index for the first billing address. Index 0 is for the * "Select" hint. */ - public static final int FIRST_BILLING_ADDRESS = 1; + /* package */ static final int FIRST_BILLING_ADDRESS = 1; /** Command line flag to enable payment details modifiers in tests. */ - public static final String ENABLE_WEB_PAYMENTS_MODIFIERS = + /* package */ static final String ENABLE_WEB_PAYMENTS_MODIFIERS = "enable-features=" + PaymentFeatureList.WEB_PAYMENTS_MODIFIERS; /** Command line flag to enable experimental web platform features in tests. */ - public static final String ENABLE_EXPERIMENTAL_WEB_PLATFORM_FEATURES = + /* package */ static final String ENABLE_EXPERIMENTAL_WEB_PLATFORM_FEATURES = "enable-experimental-web-platform-features"; - final PaymentsCallbackHelper<PaymentRequestUI> mReadyForInput; - final PaymentsCallbackHelper<PaymentRequestUI> mReadyToPay; - final PaymentsCallbackHelper<PaymentRequestUI> mSelectionChecked; - final PaymentsCallbackHelper<PaymentRequestUI> mResultReady; - final PaymentsCallbackHelper<CardUnmaskPrompt> mReadyForUnmaskInput; - final PaymentsCallbackHelper<CardUnmaskPrompt> mReadyToUnmask; - final PaymentsCallbackHelper<CardUnmaskPrompt> mUnmaskValidationDone; - final PaymentsCallbackHelper<CardUnmaskPrompt> mSubmitRejected; - final CallbackHelper mReadyToEdit; - final CallbackHelper mEditorValidationError; - final CallbackHelper mEditorTextUpdate; - final CallbackHelper mDismissed; - final CallbackHelper mUnableToAbort; - final CallbackHelper mBillingAddressChangeProcessed; - final CallbackHelper mShowFailed; - final CallbackHelper mCanMakePaymentQueryResponded; - final CallbackHelper mHasEnrolledInstrumentQueryResponded; - final CallbackHelper mExpirationMonthChange; - final CallbackHelper mPaymentResponseReady; - final CallbackHelper mCompleteHandled; - final CallbackHelper mRendererClosedMojoConnection; + private final PaymentsCallbackHelper<PaymentRequestUI> mReadyForInput; + private final PaymentsCallbackHelper<PaymentRequestUI> mReadyToPay; + private final PaymentsCallbackHelper<PaymentRequestUI> mSelectionChecked; + private final PaymentsCallbackHelper<PaymentRequestUI> mResultReady; + private final PaymentsCallbackHelper<CardUnmaskPrompt> mReadyForUnmaskInput; + private final PaymentsCallbackHelper<CardUnmaskPrompt> mReadyToUnmask; + private final PaymentsCallbackHelper<CardUnmaskPrompt> mUnmaskValidationDone; + private final PaymentsCallbackHelper<CardUnmaskPrompt> mSubmitRejected; + private final CallbackHelper mReadyToEdit; + private final CallbackHelper mEditorValidationError; + private final CallbackHelper mEditorTextUpdate; + private final CallbackHelper mDismissed; + private final CallbackHelper mUnableToAbort; + private final CallbackHelper mBillingAddressChangeProcessed; + private final CallbackHelper mShowFailed; + private final CallbackHelper mCanMakePaymentQueryResponded; + private final CallbackHelper mHasEnrolledInstrumentQueryResponded; + private final CallbackHelper mExpirationMonthChange; + private final CallbackHelper mPaymentResponseReady; + private final CallbackHelper mCompleteHandled; + private final CallbackHelper mRendererClosedMojoConnection; private ChromePaymentRequestDelegateImpl mChromePaymentRequestDelegateImpl; - PaymentRequestUI mUI; + private PaymentRequestUI mUI; private final boolean mDelayStartActivity; @@ -159,40 +159,25 @@ private CardUnmaskPrompt mCardUnmaskPrompt; - private final MainActivityStartCallback mCallback; - /** * Creates an instance of PaymentRequestTestRule. * @param testFileName The file name of an test page in //components/test/data/payments, * 'about:blank', or a data url which starts with 'data:'. */ - public PaymentRequestTestRule(String testFileName) { - this(testFileName, null); + /* package */ PaymentRequestTestRule(String testFileName) { + this(testFileName, false); } /** * Creates an instance of PaymentRequestTestRule. * @param testFileName The file name of an test page in //components/test/data/payments, * 'about:blank', or a data url which starts with 'data:'. - * @param callback A callback that is invoked on the start of the main activity. - */ - public PaymentRequestTestRule(String testFileName, MainActivityStartCallback callback) { - this(testFileName, callback, false); - } - - /** - * Creates an instance of PaymentRequestTestRule. - * @param testFileName The file name of an test page in //components/test/data/payments, - * 'about:blank', or a data url which starts with 'data:'. - * @param callback A callback that is invoked on the start of the main activity. * @param delayStartActivity Whether to delay the start of the main activity. When true, {@link - * #startMainActivity()} needs to be called to start the main activity; otherwise, the - * main activity would start automatically. + * #startMainActivityWithURL()} needs to be called to start the main activity; + * otherwise, the main activity would start automatically. */ - public PaymentRequestTestRule( - String testFileName, MainActivityStartCallback callback, boolean delayStartActivity) { - this(testFileName, /*pathPrefix=*/"components/test/data/payments/", callback, - delayStartActivity); + /* package */ PaymentRequestTestRule(String testFileName, boolean delayStartActivity) { + this(testFileName, /*pathPrefix=*/"components/test/data/payments/", delayStartActivity); } /** @@ -200,20 +185,12 @@ * pathPrefix and testFileName combined into a path relative to the repository root. For * example, if testFileName is "merchant.html", pathPrefix is "components/test/data/payments/", * the method would look for a test page at "components/test/data/payments/merchant.html". - * This method is used by the //clank tests. * @param testFileName The file name of the test page. * @param pathPrefix The prefix path to testFileName. * @param delayStartActivity Whether to delay the start of the main activity. - * @return The created instance. */ - public static PaymentRequestTestRule createWithPathPrefix( - String testFileName, String pathPrefix, boolean delayStartActivity) { - assert pathPrefix.endsWith("/"); - return new PaymentRequestTestRule(testFileName, pathPrefix, null, delayStartActivity); - } - - private PaymentRequestTestRule(String testFilePath, String pathPrefix, - MainActivityStartCallback callback, boolean delayStartActivity) { + private PaymentRequestTestRule( + String testFilePath, String pathPrefix, boolean delayStartActivity) { super(); mReadyForInput = new PaymentsCallbackHelper<>(); mReadyToPay = new PaymentsCallbackHelper<>(); @@ -242,23 +219,16 @@ } else { mTestFilePath = UrlUtils.getIsolatedTestFilePath(pathPrefix + testFilePath); } - mCallback = callback; mDelayStartActivity = delayStartActivity; } - public void startMainActivity() { - startMainActivityWithURL(mTestFilePath); + /* package */ void setObserversAndWaitForInitialPageLoad() throws TimeoutException { try { // TODO(crbug.com/1144303): Figure out what these tests need to wait on to not be flaky // instead of sleeping. Thread.sleep(2000); } catch (Exception ex) { } - } - - // public is used so as to be visible to the payment tests in //clank. - public void openPage() throws TimeoutException { - onMainActivityStarted(); ThreadUtils.runOnUiThreadBlocking(() -> { mWebContentsRef.set(getActivity().getCurrentWebContents()); PaymentRequestUI.setEditorObserverForTest(PaymentRequestTestRule.this); @@ -271,107 +241,80 @@ assertWaitForPageScaleFactorMatch(0.5f); } - public PaymentsCallbackHelper<PaymentRequestUI> getReadyForInput() { + /* package */ PaymentsCallbackHelper<PaymentRequestUI> getReadyForInput() { return mReadyForInput; } - public PaymentsCallbackHelper<PaymentRequestUI> getReadyToPay() { + /* package */ PaymentsCallbackHelper<PaymentRequestUI> getReadyToPay() { return mReadyToPay; } - public PaymentsCallbackHelper<PaymentRequestUI> getSelectionChecked() { + /* package */ PaymentsCallbackHelper<PaymentRequestUI> getSelectionChecked() { return mSelectionChecked; } - public PaymentsCallbackHelper<PaymentRequestUI> getResultReady() { + /* package */ PaymentsCallbackHelper<PaymentRequestUI> getResultReady() { return mResultReady; } - public PaymentsCallbackHelper<CardUnmaskPrompt> getReadyForUnmaskInput() { + /* package */ PaymentsCallbackHelper<CardUnmaskPrompt> getReadyForUnmaskInput() { return mReadyForUnmaskInput; } - public PaymentsCallbackHelper<CardUnmaskPrompt> getReadyToUnmask() { + /* package */ PaymentsCallbackHelper<CardUnmaskPrompt> getReadyToUnmask() { return mReadyToUnmask; } - public PaymentsCallbackHelper<CardUnmaskPrompt> getUnmaskValidationDone() { + /* package */ PaymentsCallbackHelper<CardUnmaskPrompt> getUnmaskValidationDone() { return mUnmaskValidationDone; } - public PaymentsCallbackHelper<CardUnmaskPrompt> getSubmitRejected() { + /* package */ PaymentsCallbackHelper<CardUnmaskPrompt> getSubmitRejected() { return mSubmitRejected; } - public CallbackHelper getReadyToEdit() { + /* package */ CallbackHelper getReadyToEdit() { return mReadyToEdit; } - public CallbackHelper getEditorValidationError() { + /* package */ CallbackHelper getEditorValidationError() { return mEditorValidationError; } - public CallbackHelper getEditorTextUpdate() { + /* package */ CallbackHelper getEditorTextUpdate() { return mEditorTextUpdate; } - public CallbackHelper getDismissed() { + /* package */ CallbackHelper getDismissed() { return mDismissed; } - public CallbackHelper getUnableToAbort() { + /* package */ CallbackHelper getUnableToAbort() { return mUnableToAbort; } - public CallbackHelper getBillingAddressChangeProcessed() { + /* package */ CallbackHelper getBillingAddressChangeProcessed() { return mBillingAddressChangeProcessed; } - public CallbackHelper getShowFailed() { + /* package */ CallbackHelper getShowFailed() { return mShowFailed; } - public CallbackHelper getCanMakePaymentQueryResponded() { + /* package */ CallbackHelper getCanMakePaymentQueryResponded() { return mCanMakePaymentQueryResponded; } - public CallbackHelper getHasEnrolledInstrumentQueryResponded() { + /* package */ CallbackHelper getHasEnrolledInstrumentQueryResponded() { return mHasEnrolledInstrumentQueryResponded; } - public CallbackHelper getExpirationMonthChange() { + /* package */ CallbackHelper getExpirationMonthChange() { return mExpirationMonthChange; } - public CallbackHelper getPaymentResponseReady() { + /* package */ CallbackHelper getPaymentResponseReady() { return mPaymentResponseReady; } - public CallbackHelper getCompleteHandled() { + /* package */ CallbackHelper getCompleteHandled() { return mCompleteHandled; } - public CallbackHelper getRendererClosedMojoConnection() { + /* package */ CallbackHelper getRendererClosedMojoConnection() { return mRendererClosedMojoConnection; } - public PaymentRequestUI getPaymentRequestUI() { + /* package */ PaymentRequestUI getPaymentRequestUI() { return mUI; } - protected void triggerUIAndWait(PaymentsCallbackHelper<PaymentRequestUI> helper) - throws TimeoutException { - openPageAndClickNodeAndWait("buy", helper); - mUI = helper.getTarget(); - } - - protected void openPageAndClickNodeAndWait(String nodeId, CallbackHelper helper) - throws TimeoutException { - openPage(); - clickNodeAndWait(nodeId, helper); - } - - protected void openPageAndClickBuyAndWait(CallbackHelper helper) throws TimeoutException { - openPageAndClickNodeAndWait("buy", helper); - } - - protected void openPageAndClickNode(String nodeId) throws TimeoutException { - openPage(); - clickNode(nodeId); - } - - protected void triggerUIAndWait(String nodeId, PaymentsCallbackHelper<PaymentRequestUI> helper) - throws TimeoutException { - openPageAndClickNodeAndWait(nodeId, helper); - mUI = helper.getTarget(); - } - - protected void reTriggerUIAndWait(String nodeId, + /* package */ void triggerUIAndWait(String nodeId, PaymentsCallbackHelper<PaymentRequestUI> helper) throws TimeoutException { clickNodeAndWait(nodeId, helper); mUI = helper.getTarget(); } - protected void retryPaymentRequest(String validationErrors, CallbackHelper helper) + /* package */ void retryPaymentRequest(String validationErrors, CallbackHelper helper) throws TimeoutException { int callCount = helper.getCallCount(); JavaScriptUtils.executeJavaScriptAndWaitForResult( @@ -384,7 +327,7 @@ * snippet. The JavaScript code is run without a user gesture, and any async result (i.e., * Promise) is not waited for. */ - protected String executeJavaScriptAndWaitForResult(String script) throws TimeoutException { + /* package */ String executeJavaScriptAndWaitForResult(String script) throws TimeoutException { return JavaScriptUtils.executeJavaScriptAndWaitForResult(mWebContentsRef.get(), script); } @@ -393,7 +336,7 @@ * occur. The JavaScript code is run with a user gesture present, and any async result (i.e., * Promise) is not waited for. */ - protected void runJavaScriptAndWaitForUIEvent(String code, CallbackHelper helper) + /* package */ void runJavaScriptAndWaitForUIEvent(String code, CallbackHelper helper) throws TimeoutException { int callCount = helper.getCallCount(); runJavaScriptCodeWithUserGestureInCurrentTab(code); @@ -407,27 +350,29 @@ * * @param promiseCode a JavaScript snippet that will return a promise */ - protected String runJavaScriptAndWaitForPromise(String promiseCode) throws TimeoutException { + /* package */ String runJavaScriptAndWaitForPromise(String promiseCode) + throws TimeoutException { String code = promiseCode + ".then(result => domAutomationController.send(result))" + ".catch(error => domAutomationController.send(error));"; return JavaScriptUtils.runJavascriptWithUserGestureAndAsyncResult(getWebContents(), code); } /** Clicks on an HTML node. */ - protected void clickNodeAndWait(String nodeId, CallbackHelper helper) throws TimeoutException { + /* package */ void clickNodeAndWait(String nodeId, CallbackHelper helper) + throws TimeoutException { int callCount = helper.getCallCount(); clickNode(nodeId); helper.waitForCallback(callCount); } /** Clicks on an HTML node. */ - protected void clickNode(String nodeId) throws TimeoutException { + /* package */ void clickNode(String nodeId) throws TimeoutException { DOMUtils.waitForNonZeroNodeBounds(mWebContentsRef.get(), nodeId); DOMUtils.clickNode(mWebContentsRef.get(), nodeId); } /** Clicks on an element in the payments UI. */ - protected void clickAndWait(int resourceId, CallbackHelper helper) throws TimeoutException { + /* package */ void clickAndWait(int resourceId, CallbackHelper helper) throws TimeoutException { int callCount = helper.getCallCount(); CriteriaHelper.pollUiThread(() -> { boolean canClick = mUI.isAcceptingUserInput(); @@ -438,7 +383,7 @@ } /** Clicks on an element in the "Order summary" section of the payments UI. */ - protected void clickInOrderSummaryAndWait(CallbackHelper helper) throws TimeoutException { + /* package */ void clickInOrderSummaryAndWait(CallbackHelper helper) throws TimeoutException { int callCount = helper.getCallCount(); ThreadUtils.runOnUiThreadBlocking(() -> { mUI.getOrderSummarySectionForTest().findViewById(R.id.payments_section).performClick(); @@ -447,7 +392,7 @@ } /** Clicks on an element in the "Shipping address" section of the payments UI. */ - protected void clickInShippingAddressAndWait(final int resourceId, CallbackHelper helper) + /* package */ void clickInShippingAddressAndWait(final int resourceId, CallbackHelper helper) throws TimeoutException { int callCount = helper.getCallCount(); ThreadUtils.runOnUiThreadBlocking(() -> { @@ -457,7 +402,7 @@ } /** Clicks on an element in the "Payment" section of the payments UI. */ - protected void clickInPaymentMethodAndWait(final int resourceId, CallbackHelper helper) + /* package */ void clickInPaymentMethodAndWait(final int resourceId, CallbackHelper helper) throws TimeoutException { int callCount = helper.getCallCount(); ThreadUtils.runOnUiThreadBlocking(() -> { @@ -467,7 +412,7 @@ } /** Clicks on an element in the "Contact Info" section of the payments UI. */ - protected void clickInContactInfoAndWait(final int resourceId, CallbackHelper helper) + /* package */ void clickInContactInfoAndWait(final int resourceId, CallbackHelper helper) throws TimeoutException { int callCount = helper.getCallCount(); ThreadUtils.runOnUiThreadBlocking(() -> { @@ -477,7 +422,7 @@ } /** Clicks on an element in the editor UI. */ - protected void clickInEditorAndWait(final int resourceId, CallbackHelper helper) + /* package */ void clickInEditorAndWait(final int resourceId, CallbackHelper helper) throws TimeoutException { int callCount = helper.getCallCount(); ThreadUtils.runOnUiThreadBlocking( @@ -485,7 +430,7 @@ helper.waitForCallback(callCount); } - protected void clickAndroidBackButtonInEditorAndWait(CallbackHelper helper) + /* package */ void clickAndroidBackButtonInEditorAndWait(CallbackHelper helper) throws TimeoutException { int callCount = helper.getCallCount(); PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> { @@ -498,7 +443,7 @@ } /** Clicks on a button in the card unmask UI. */ - protected void clickCardUnmaskButtonAndWait(final int dialogButtonId, CallbackHelper helper) + /* package */ void clickCardUnmaskButtonAndWait(final int dialogButtonId, CallbackHelper helper) throws TimeoutException { int callCount = helper.getCallCount(); ThreadUtils.runOnUiThreadBlocking(() -> { @@ -509,7 +454,7 @@ } /** Gets the retry error message. */ - protected String getRetryErrorMessage() { + /* package */ String getRetryErrorMessage() { return ThreadUtils.runOnUiThreadBlockingNoException( () -> ((TextView) mUI.getDialogForTest().findViewById(R.id.retry_error)) @@ -518,19 +463,19 @@ } /** Gets the button state for the shipping summary section. */ - protected int getShippingAddressSectionButtonState() { + /* package */ int getShippingAddressSectionButtonState() { return ThreadUtils.runOnUiThreadBlockingNoException( () -> mUI.getShippingAddressSectionForTest().getEditButtonState()); } /** Gets the button state for the contact details section. */ - protected int getContactDetailsButtonState() { + /* package */ int getContactDetailsButtonState() { return ThreadUtils.runOnUiThreadBlockingNoException( () -> mUI.getContactDetailsSectionForTest().getEditButtonState()); } /** Returns the label of the payment app at the specified |index|. */ - protected String getPaymentAppLabel(final int index) { + /* package */ String getPaymentAppLabel(final int index) { return ThreadUtils.runOnUiThreadBlockingNoException( () -> ((OptionSection) mUI.getPaymentMethodSectionForTest()) @@ -540,7 +485,7 @@ } /** Returns the label of the selected payment app. */ - protected String getSelectedPaymentAppLabel() { + /* package */ String getSelectedPaymentAppLabel() { return ThreadUtils.runOnUiThreadBlockingNoException(() -> { OptionSection section = ((OptionSection) mUI.getPaymentMethodSectionForTest()); int size = section.getNumberOfOptionLabelsForTest(); @@ -554,13 +499,13 @@ } /** Returns the total amount in order summary section. */ - protected String getOrderSummaryTotal() { + /* package */ String getOrderSummaryTotal() { return ThreadUtils.runOnUiThreadBlockingNoException( () -> mUI.getOrderSummaryTotalTextViewForTest().getText().toString()); } /** Returns the amount text corresponding to the line item at the specified |index|. */ - protected String getLineItemAmount(int index) { + /* package */ String getLineItemAmount(int index) { return ThreadUtils.runOnUiThreadBlockingNoException( () -> mUI.getOrderSummarySectionForTest() @@ -571,7 +516,7 @@ } /** Returns the amount text corresponding to the line item at the specified |index|. */ - protected int getNumberOfLineItems() { + /* package */ int getNumberOfLineItems() { return ThreadUtils.runOnUiThreadBlockingNoException( () -> mUI.getOrderSummarySectionForTest().getNumberOfLineItemsForTest()); } @@ -580,7 +525,7 @@ * Returns the label corresponding to the contact detail suggestion at the specified * |suggestionIndex|. */ - protected String getContactDetailsSuggestionLabel(final int suggestionIndex) { + /* package */ String getContactDetailsSuggestionLabel(final int suggestionIndex) { return ThreadUtils.runOnUiThreadBlockingNoException( () -> ((OptionSection) mUI.getContactDetailsSectionForTest()) @@ -590,7 +535,7 @@ } /** Returns the number of payment apps. */ - protected int getNumberOfPaymentApps() { + /* package */ int getNumberOfPaymentApps() { return ThreadUtils.runOnUiThreadBlockingNoException( () -> ((OptionSection) mUI.getPaymentMethodSectionForTest()) @@ -601,7 +546,7 @@ * Returns the label corresponding to the payment method suggestion at the specified * |suggestionIndex|. */ - protected String getPaymentMethodSuggestionLabel(final int suggestionIndex) { + /* package */ String getPaymentMethodSuggestionLabel(final int suggestionIndex) { Assert.assertTrue(suggestionIndex < getNumberOfPaymentApps()); return ThreadUtils.runOnUiThreadBlockingNoException( @@ -613,7 +558,7 @@ } /** Returns the number of contact detail suggestions. */ - protected int getNumberOfContactDetailSuggestions() { + /* package */ int getNumberOfContactDetailSuggestions() { return ThreadUtils.runOnUiThreadBlockingNoException( () -> ((OptionSection) mUI.getContactDetailsSectionForTest()) @@ -624,7 +569,7 @@ * Returns the label corresponding to the shipping address suggestion at the specified * |suggestionIndex|. */ - protected String getShippingAddressSuggestionLabel(final int suggestionIndex) { + /* package */ String getShippingAddressSuggestionLabel(final int suggestionIndex) { Assert.assertTrue(suggestionIndex < getNumberOfShippingAddressSuggestions()); return ThreadUtils.runOnUiThreadBlockingNoException( @@ -635,7 +580,7 @@ .toString()); } - protected String getShippingAddressSummary() { + /* package */ String getShippingAddressSummary() { return ThreadUtils.runOnUiThreadBlockingNoException( () -> mUI.getShippingAddressSectionForTest() @@ -644,7 +589,7 @@ .toString()); } - protected String getShippingOptionSummary() { + /* package */ String getShippingOptionSummary() { return ThreadUtils.runOnUiThreadBlockingNoException( () -> mUI.getShippingOptionSectionForTest() @@ -653,7 +598,7 @@ .toString()); } - protected String getShippingOptionCostSummaryOnBottomSheet() { + /* package */ String getShippingOptionCostSummaryOnBottomSheet() { return ThreadUtils.runOnUiThreadBlockingNoException( () -> mUI.getShippingOptionSectionForTest() @@ -662,7 +607,7 @@ .toString()); } - protected String getShippingAddressWarningLabel() { + /* package */ String getShippingAddressWarningLabel() { return ThreadUtils.runOnUiThreadBlockingNoException(() -> { View view = mUI.getShippingAddressSectionForTest().findViewById( R.id.payments_warning_label); @@ -671,7 +616,7 @@ }); } - protected String getShippingAddressDescriptionLabel() { + /* package */ String getShippingAddressDescriptionLabel() { return ThreadUtils.runOnUiThreadBlockingNoException(() -> { View view = mUI.getShippingAddressSectionForTest().findViewById( R.id.payments_description_label); @@ -684,7 +629,7 @@ * Clicks on the label corresponding to the shipping address suggestion at the specified * |suggestionIndex|. */ - protected void clickOnShippingAddressSuggestionOptionAndWait( + /* package */ void clickOnShippingAddressSuggestionOptionAndWait( final int suggestionIndex, CallbackHelper helper) throws TimeoutException { Assert.assertTrue(suggestionIndex < getNumberOfShippingAddressSuggestions()); @@ -701,7 +646,7 @@ * Clicks on the label corresponding to the payment method suggestion at the specified * |suggestionIndex|. */ - protected void clickOnPaymentMethodSuggestionOptionAndWait( + /* package */ void clickOnPaymentMethodSuggestionOptionAndWait( final int suggestionIndex, CallbackHelper helper) throws TimeoutException { Assert.assertTrue(suggestionIndex < getNumberOfPaymentApps()); @@ -718,7 +663,7 @@ * Clicks on the label corresponding to the contact info suggestion at the specified * |suggestionIndex|. */ - protected void clickOnContactInfoSuggestionOptionAndWait( + /* package */ void clickOnContactInfoSuggestionOptionAndWait( final int suggestionIndex, CallbackHelper helper) throws TimeoutException { Assert.assertTrue(suggestionIndex < getNumberOfContactDetailSuggestions()); @@ -735,7 +680,7 @@ * Clicks on the edit icon corresponding to the payment method suggestion at the specified * |suggestionIndex|. */ - protected void clickOnPaymentMethodSuggestionEditIconAndWait( + /* package */ void clickOnPaymentMethodSuggestionEditIconAndWait( final int suggestionIndex, CallbackHelper helper) throws TimeoutException { Assert.assertTrue(suggestionIndex < getNumberOfPaymentApps()); @@ -752,28 +697,28 @@ /** * Returns the summary text of the shipping address section. */ - protected String getShippingAddressSummaryLabel() { + /* package */ String getShippingAddressSummaryLabel() { return getShippingAddressSummary(); } /** * Returns the summary text of the shipping option section. */ - protected String getShippingOptionSummaryLabel() { + /* package */ String getShippingOptionSummaryLabel() { return getShippingOptionSummary(); } /** * Returns the cost text of the shipping option section on the bottom sheet. */ - protected String getShippingOptionCostSummaryLabelOnBottomSheet() { + /* package */ String getShippingOptionCostSummaryLabelOnBottomSheet() { return getShippingOptionCostSummaryOnBottomSheet(); } /** * Returns the number of shipping address suggestions. */ - protected int getNumberOfShippingAddressSuggestions() { + /* package */ int getNumberOfShippingAddressSuggestions() { return ThreadUtils.runOnUiThreadBlockingNoException( () -> ((OptionSection) mUI.getShippingAddressSectionForTest()) @@ -781,7 +726,7 @@ } /** Returns the {@link OptionRow} at the given index for the shipping address section. */ - protected OptionRow getShippingAddressOptionRowAtIndex(final int index) { + /* package */ OptionRow getShippingAddressOptionRowAtIndex(final int index) { return ThreadUtils.runOnUiThreadBlockingNoException( () -> ((OptionSection) mUI.getShippingAddressSectionForTest()) @@ -789,13 +734,13 @@ } /** Returns the error message visible to the user in the credit card unmask prompt. */ - protected String getUnmaskPromptErrorMessage() { + /* package */ String getUnmaskPromptErrorMessage() { return mCardUnmaskPrompt.getErrorMessage(); } /** Selects the spinner value in the editor UI. */ - protected void setSpinnerSelectionInEditorAndWait(final int selection, CallbackHelper helper) - throws TimeoutException { + /* package */ void setSpinnerSelectionInEditorAndWait( + final int selection, CallbackHelper helper) throws TimeoutException { int callCount = helper.getCallCount(); ThreadUtils.runOnUiThreadBlocking( () @@ -805,7 +750,7 @@ } /** Directly sets the text in the editor UI. */ - protected void setTextInEditorAndWait(final String[] values, CallbackHelper helper) + /* package */ void setTextInEditorAndWait(final String[] values, CallbackHelper helper) throws TimeoutException { int callCount = helper.getCallCount(); ThreadUtils.runOnUiThreadBlocking(() -> { @@ -819,7 +764,7 @@ } /** Directly sets the text in the card unmask UI. */ - protected void setTextInCardUnmaskDialogAndWait(final int resourceId, final String input, + /* package */ void setTextInCardUnmaskDialogAndWait(final int resourceId, final String input, CallbackHelper helper) throws TimeoutException { int callCount = helper.getCallCount(); ThreadUtils.runOnUiThreadBlocking(() -> { @@ -833,7 +778,7 @@ } /** Directly sets the text in the expired card unmask UI. */ - protected void setTextInExpiredCardUnmaskDialogAndWait(final int[] resourceIds, + /* package */ void setTextInExpiredCardUnmaskDialogAndWait(final int[] resourceIds, final String[] values, CallbackHelper helper) throws TimeoutException { assert resourceIds.length == values.length; int callCount = helper.getCallCount(); @@ -864,7 +809,7 @@ } /** Verifies the contents of the test webpage. */ - protected void expectResultContains(final String[] contents) { + /* package */ void expectResultContains(final String[] contents) { CriteriaHelper.pollInstrumentationThread(() -> { try { String result = DOMUtils.getNodeContents(mWebContentsRef.get(), "result"); @@ -882,7 +827,7 @@ } /** Will fail if the OptionRow at |index| is not selected in Contact Details.*/ - protected void expectContactDetailsRowIsSelected(final int index) { + /* package */ void expectContactDetailsRowIsSelected(final int index) { CriteriaHelper.pollInstrumentationThread(() -> { boolean isSelected = ((OptionSection) mUI.getContactDetailsSectionForTest()) .getOptionRowAtIndex(index) @@ -893,7 +838,7 @@ } /** Will fail if the OptionRow at |index| is not selected in Shipping Address section.*/ - protected void expectShippingAddressRowIsSelected(final int index) { + /* package */ void expectShippingAddressRowIsSelected(final int index) { CriteriaHelper.pollInstrumentationThread(() -> { boolean isSelected = ((OptionSection) mUI.getShippingAddressSectionForTest()) .getOptionRowAtIndex(index) @@ -904,7 +849,7 @@ } /** Will fail if the OptionRow at |index| is not selected in PaymentMethod section.*/ - protected void expectPaymentMethodRowIsSelected(final int index) { + /* package */ void expectPaymentMethodRowIsSelected(final int index) { CriteriaHelper.pollInstrumentationThread(() -> { boolean isSelected = ((OptionSection) mUI.getPaymentMethodSectionForTest()) .getOptionRowAtIndex(index) @@ -919,7 +864,7 @@ * * @param abortReason The only bucket in the abort histogram that should have a record. */ - protected void assertOnlySpecificAbortMetricLogged(int abortReason) { + /* package */ void assertOnlySpecificAbortMetricLogged(int abortReason) { for (int i = 0; i < AbortReason.MAX; ++i) { Assert.assertEquals( String.format(Locale.getDefault(), "Found %d instead of %d", i, abortReason), @@ -1098,7 +1043,7 @@ * * @return The UI that is ready for input. */ - public T getTarget() { + /* package */ T getTarget() { return mTarget; } @@ -1107,7 +1052,7 @@ * * @param target The UI that is ready for input. */ - public void notifyCalled(T target) { + /* package */ void notifyCalled(T target) { ThreadUtils.assertOnUiThread(); mTarget = target; notifyCalled(); @@ -1238,26 +1183,17 @@ public void dismissInstrument() {} } - public void onMainActivityStarted() throws TimeoutException { - if (mCallback != null) { - mCallback.onMainActivityStarted(); - } - } - @Override public Statement apply(final Statement base, Description description) { return super.apply(new Statement() { @Override public void evaluate() throws Throwable { - if (!mDelayStartActivity) startMainActivity(); + if (!mDelayStartActivity) { + startMainActivityWithURL(mTestFilePath); + setObserversAndWaitForInitialPageLoad(); + } base.evaluate(); } }, description); } - - /** The interface for being notified of the main activity startup. */ - public interface MainActivityStartCallback { - /** Called when the main activity has started up. */ - void onMainActivityStarted() throws TimeoutException; - } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestUpdateWithTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestUpdateWithTest.java index 0a0c773..6b0b0b8 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestUpdateWithTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestUpdateWithTest.java
@@ -7,6 +7,7 @@ import androidx.test.filters.MediumTest; import org.junit.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -19,7 +20,6 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.payments.PaymentRequestTestRule.MainActivityStartCallback; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.ui.modaldialog.ModalDialogProperties; @@ -30,13 +30,13 @@ */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class PaymentRequestUpdateWithTest implements MainActivityStartCallback { +public class PaymentRequestUpdateWithTest { @Rule public PaymentRequestTestRule mRule = - new PaymentRequestTestRule("payment_request_update_with_test.html", this); + new PaymentRequestTestRule("payment_request_update_with_test.html"); - @Override - public void onMainActivityStarted() throws TimeoutException { + @Before + public void setUp() throws TimeoutException { AutofillTestHelper helper = new AutofillTestHelper(); helper.setProfile(new AutofillProfile("" /* guid */, "https://www.example.test" /* origin */, "" /* honorific prefix */, "Lisa Simpson",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java index f9ce3d3..81b3acf7 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SiteSettingsTest.java
@@ -687,6 +687,7 @@ @SmallTest @Feature({"Preferences"}) @EnableFeatures(ChromeFeatureList.PRIVACY_SANDBOX_SETTINGS_4) + @DisabledTest(message = "https://crbug.com/1395173") public void testSiteExceptionSiteDataBlocked() throws Exception { setGlobalToggleForCategory(SiteSettingsCategory.Type.SITE_DATA, true);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java index 2f7a55d4e..e5ec295 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java
@@ -513,7 +513,7 @@ // If the ContentSettingsType.NUM_TYPES value changes *and* a new value has been exposed on // Android, then please update this code block to include a test for your new type. // Otherwise, just update count in the assert. - Assert.assertEquals(81, ContentSettingsType.NUM_TYPES); + Assert.assertEquals(82, ContentSettingsType.NUM_TYPES); websitePreferenceBridge.addContentSettingException( new ContentSettingException(ContentSettingsType.COOKIES, googleOrigin, ContentSettingValues.DEFAULT, preferenceSource, /*isEmbargoed=*/false));
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omaha/ExponentialBackoffSchedulerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omaha/ExponentialBackoffSchedulerTest.java index 3de7d00..1942dbf 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omaha/ExponentialBackoffSchedulerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omaha/ExponentialBackoffSchedulerTest.java
@@ -4,39 +4,37 @@ package org.chromium.chrome.browser.omaha; -import android.content.Context; - import org.junit.Assert; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.chromium.base.FakeTimeTestRule; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.Feature; -import org.chromium.base.test.util.InMemorySharedPreferencesContext; /** Tests the ExponentialBackoffScheduler. */ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE) public class ExponentialBackoffSchedulerTest { - private static final String INTENT_STRING = "schedulerIntent"; private static final String PREFERENCE_NAME = "scheduler"; private static final long BACKOFF_MS = 15000; private static final long MAX_MS = 1000000; + @Rule + public FakeTimeTestRule mFakeTimeRule = new FakeTimeTestRule(); + /** * Checks that the correct number of failures are set/reset. */ @Test @Feature({"Omaha", "Sync"}) public void testExponentialBackoffSchedulerFailureSetting() { - TestContext context = new TestContext(RuntimeEnvironment.getApplication()); - ExponentialBackoffScheduler writer = - new ExponentialBackoffScheduler(PREFERENCE_NAME, context, BACKOFF_MS, MAX_MS); + new ExponentialBackoffScheduler(PREFERENCE_NAME, BACKOFF_MS, MAX_MS); ExponentialBackoffScheduler reader = - new ExponentialBackoffScheduler(PREFERENCE_NAME, context, BACKOFF_MS, MAX_MS); + new ExponentialBackoffScheduler(PREFERENCE_NAME, BACKOFF_MS, MAX_MS); Assert.assertEquals( "Expected no failures for freshly created class", 0, reader.getNumFailedAttempts()); @@ -54,9 +52,8 @@ @Test @Feature({"Omaha", "Sync"}) public void testExponentialBackoffSchedulerDelayCalculation() { - TestContext context = new TestContext(RuntimeEnvironment.getApplication()); - MockExponentialBackoffScheduler scheduler = - new MockExponentialBackoffScheduler(PREFERENCE_NAME, context, BACKOFF_MS, MAX_MS); + ExponentialBackoffScheduler scheduler = + new ExponentialBackoffScheduler(PREFERENCE_NAME, BACKOFF_MS, MAX_MS); // With no failures, expect the base backoff delay. long delay = scheduler.calculateNextTimestamp() - scheduler.getCurrentTime(); @@ -66,35 +63,11 @@ // With two failures, expect a delay within [BACKOFF_MS, BACKOFF_MS * 2^2]. scheduler.increaseFailedAttempts(); scheduler.increaseFailedAttempts(); - delay = scheduler.calculateNextTimestamp() - scheduler.getCurrentTime(); + final long minDelay = BACKOFF_MS; final long maxDelay = BACKOFF_MS * (1 << scheduler.getNumFailedAttempts()); Assert.assertTrue("Expected delay greater than the minimum.", delay >= minDelay); Assert.assertTrue("Expected delay within maximum of " + maxDelay, delay <= maxDelay); } - - /** - * Ensures that the AlarmManager is the only service requested. - */ - private static class TestContext extends InMemorySharedPreferencesContext { - public boolean mRequestedAlarmManager; - - public TestContext(Context context) { - super(context); - } - - /** - * Checks that we're requesting the AlarmManager. - * @param name Name of the service. Should be the AlarmManager's service name. - * @return null since we can't create an AlarmManager. - */ - @Override - public Object getSystemService(final String name) { - Assert.assertTrue("Requested service other than AlarmManager.", - Context.ALARM_SERVICE.equals(name)); - mRequestedAlarmManager = true; - return super.getSystemService(name); - } - } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omaha/MockExponentialBackoffScheduler.java b/chrome/android/junit/src/org/chromium/chrome/browser/omaha/MockExponentialBackoffScheduler.java deleted file mode 100644 index c89bc58..0000000 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omaha/MockExponentialBackoffScheduler.java +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.omaha; - -import android.content.Context; - -/** - * Allows changing the clock. - */ -public class MockExponentialBackoffScheduler extends ExponentialBackoffScheduler { - private long mCurrentTimestamp; - - public MockExponentialBackoffScheduler( - String packageName, Context context, long baseMilliseconds, long maxMilliseconds) { - super(packageName, context, baseMilliseconds, maxMilliseconds); - } - - @Override - public long getCurrentTime() { - return mCurrentTimestamp; - } - - public void setCurrentTime(long timestamp) { - mCurrentTimestamp = timestamp; - } -}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omaha/MockRequestGenerator.java b/chrome/android/junit/src/org/chromium/chrome/browser/omaha/MockRequestGenerator.java index a77bdfc8..21d84d01 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omaha/MockRequestGenerator.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omaha/MockRequestGenerator.java
@@ -4,8 +4,6 @@ package org.chromium.chrome.browser.omaha; -import android.content.Context; - /** Mocks out the RequestGenerator for tests. */ public class MockRequestGenerator extends RequestGenerator { public enum DeviceType { HANDSET, TABLET } @@ -22,8 +20,7 @@ private final boolean mIsOnTablet; - public MockRequestGenerator(Context context, DeviceType deviceType) { - super(context); + public MockRequestGenerator(DeviceType deviceType) { mIsOnTablet = deviceType == DeviceType.TABLET; }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omaha/OmahaBaseTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omaha/OmahaBaseTest.java index 1d245cf..5ad65bb 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omaha/OmahaBaseTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omaha/OmahaBaseTest.java
@@ -4,7 +4,6 @@ package org.chromium.chrome.browser.omaha; -import android.content.Context; import android.content.SharedPreferences; import androidx.annotation.IntDef; @@ -12,17 +11,17 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.base.FakeTimeTestRule; import org.chromium.base.FeatureList; import org.chromium.base.ThreadUtils; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.Feature; -import org.chromium.base.test.util.InMemorySharedPreferencesContext; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omaha.MockRequestGenerator.DeviceType; @@ -64,11 +63,10 @@ private final List<Integer> mPostResults = new ArrayList<Integer>(); private final List<Boolean> mGenerateAndPostRequestResults = new ArrayList<Boolean>(); - private final Context mContext; private final boolean mIsOnTablet; private final boolean mIsInForeground; private final boolean mIsInSystemImage; - private final MockExponentialBackoffScheduler mMockScheduler; + private final ExponentialBackoffScheduler mScheduler; private MockRequestGenerator mMockGenerator; private int mNumUUIDsGenerated; @@ -78,21 +76,19 @@ private TimestampPair mTimestampsOnRegisterNewRequest; private TimestampPair mTimestampsOnSaveState; - MockOmahaDelegate( - Context context, DeviceType deviceType, @InstallSource int installSource) { - mContext = context; + MockOmahaDelegate(DeviceType deviceType, @InstallSource int installSource) { mIsOnTablet = deviceType == DeviceType.TABLET; mIsInForeground = true; mIsInSystemImage = installSource == InstallSource.SYSTEM_IMAGE; - mMockScheduler = new MockExponentialBackoffScheduler(OmahaBase.PREF_PACKAGE, context, + mScheduler = new ExponentialBackoffScheduler(OmahaBase.PREF_PACKAGE, OmahaBase.MS_POST_BASE_DELAY, OmahaBase.MS_POST_MAX_DELAY); } @Override - protected RequestGenerator createRequestGenerator(Context context) { - mMockGenerator = new MockRequestGenerator( - context, mIsOnTablet ? DeviceType.TABLET : DeviceType.HANDSET); + protected RequestGenerator createRequestGenerator() { + mMockGenerator = + new MockRequestGenerator(mIsOnTablet ? DeviceType.TABLET : DeviceType.HANDSET); return mMockGenerator; } @@ -102,8 +98,8 @@ } @Override - MockExponentialBackoffScheduler getScheduler() { - return mMockScheduler; + ExponentialBackoffScheduler getScheduler() { + return mScheduler; } @Override @@ -143,11 +139,6 @@ void onSaveStateDone(long nextRequestTimestamp, long nextPostTimestamp) { mTimestampsOnSaveState = new TimestampPair(nextRequestTimestamp, nextPostTimestamp); } - - @Override - Context getContext() { - return mContext; - } } private static class ClosableThreadAssertsDisabler implements AutoCloseable { @@ -182,10 +173,12 @@ int TIMES_OUT = 1; } - private InMemorySharedPreferencesContext mContext; private MockOmahaDelegate mDelegate; private MockOmahaBase mOmahaBase; + @Rule + public FakeTimeTestRule mFakeTimeRule = new FakeTimeTestRule(); + private MockOmahaBase createOmahaBase() { return createOmahaBase( ServerResponse.SUCCESS, ConnectionStatus.RESPONDS, DeviceType.HANDSET); @@ -200,10 +193,10 @@ @Before public void setUp() { OmahaBase.setIsDisabledForTesting(false); - mContext = new InMemorySharedPreferencesContext(RuntimeEnvironment.getApplication()); FeatureList.TestValues overrides = new FeatureList.TestValues(); overrides.addFeatureFlagOverride(ChromeFeatureList.ANONYMOUS_UPDATE_CHECKS, true); FeatureList.setTestValues(overrides); + mDelegate = new MockOmahaDelegate(DeviceType.HANDSET, InstallSource.ORGANIC); } @After @@ -292,10 +285,7 @@ @Test @Feature({"Omaha"}) public void testPipelineFreshInstall() { - final long now = 11684; - - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); + final long now = mDelegate.getScheduler().getCurrentTime(); // Trigger Omaha. mOmahaBase = createOmahaBase(); @@ -320,10 +310,7 @@ @Test @Feature({"Omaha"}) public void testPipelineRegularPing() { - final long now = 11684; - - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); + final long now = mDelegate.getScheduler().getCurrentTime(); // Record that an install event has already been sent and that we're due for a new request. SharedPreferences.Editor editor = OmahaBase.getSharedPreferences().edit(); @@ -353,12 +340,9 @@ @Test @Feature({"Omaha"}) public void testPipelineFreshInstallUpdatedAvailable_crbug_1095755() { - final long now = 11684; + final long now = mDelegate.getScheduler().getCurrentTime(); final String updateVersion = "10.0.0.0"; - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); - // Trigger Omaha. mOmahaBase = createOmahaBase(); mOmahaBase.setUpdateVersion(updateVersion); @@ -378,12 +362,9 @@ @Test @Feature({"Omaha"}) public void testPipelineRegularPingUpdateAvailable_crbug_1095755() { - final long now = 11684; + final long now = mDelegate.getScheduler().getCurrentTime(); String updateVersion = "10.0.0.0"; - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); - // Record that an install event has already been sent and that we're due for a new request. SharedPreferences.Editor editor = OmahaBase.getSharedPreferences().edit(); editor.putBoolean(OmahaBase.PREF_SEND_INSTALL_EVENT, false); @@ -410,11 +391,8 @@ @Test @Feature({"Omaha"}) public void testTooEarlyToPing() { - final long now = 0; - final long later = 10000; - - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); + final long now = mDelegate.getScheduler().getCurrentTime(); + final long later = now + 10000; // Put the time for the next request in the future. SharedPreferences prefs = OmahaBase.getSharedPreferences(); @@ -438,13 +416,9 @@ @Test @Feature({"Omaha"}) public void testTooEarlyToPostExistingRequest() { - final long timeGeneratedRequest = 0L; - final long now = 10000L; - final long timeSendNewPost = 20000L; - final long timeSendNewRequest = 50000L; - - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); + final long timeGeneratedRequest = mDelegate.getScheduler().getCurrentTime() - 10000; + final long timeSendNewPost = timeGeneratedRequest + 20000L; + final long timeSendNewRequest = timeSendNewPost + 30000L; SharedPreferences prefs = OmahaBase.getSharedPreferences(); SharedPreferences.Editor editor = prefs.edit(); @@ -480,13 +454,10 @@ @Test @Feature({"Omaha"}) public void testPostExistingRequestSuccessfully() { - final long timeGeneratedRequest = 0L; - final long now = 10000L; + final long now = mDelegate.getScheduler().getCurrentTime(); + final long timeGeneratedRequest = now - 10000; final long timeSendNewPost = now; - final long timeRegisterNewRequest = 20000L; - - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); + final long timeRegisterNewRequest = now + 10000; SharedPreferences prefs = OmahaBase.getSharedPreferences(); SharedPreferences.Editor editor = prefs.edit(); @@ -524,14 +495,11 @@ @Test @Feature({"Omaha"}) public void testPostExistingButFails() { - final long timeGeneratedRequest = 0L; - final long now = 10000L; + final long now = mDelegate.getScheduler().getCurrentTime(); + final long timeGeneratedRequest = now - 10000; final long timeSendNewPost = now; final long timeRegisterNewRequest = timeGeneratedRequest + OmahaBase.MS_BETWEEN_REQUESTS; - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); - SharedPreferences prefs = OmahaBase.getSharedPreferences(); SharedPreferences.Editor editor = prefs.edit(); @@ -570,12 +538,9 @@ @Test @Feature({"Omaha"}) public void testTimestampWithinBounds() { - final long now = 0L; + final long now = mDelegate.getScheduler().getCurrentTime(); final long timeRegisterNewRequest = OmahaBase.MS_BETWEEN_REQUESTS + 1; - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); - SharedPreferences prefs = OmahaBase.getSharedPreferences(); SharedPreferences.Editor editor = prefs.edit(); @@ -608,14 +573,11 @@ @Feature({"Omaha"}) public void testOverdueRequestCausesNewRegistration() { final long timeGeneratedRequest = 0L; - final long now = 10000L; + final long now = mDelegate.getScheduler().getCurrentTime(); final long timeSendNewPost = now; final long timeRegisterNewRequest = timeGeneratedRequest + OmahaBase.MS_BETWEEN_REQUESTS * 5; - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); - // Record that a regular <ping> was generated, but not sent, then assign it an invalid // timestamp and try to send it now. SharedPreferences prefs = OmahaBase.getSharedPreferences(); @@ -651,10 +613,6 @@ @Test @Feature({"Omaha"}) public void testCheckForUpdatesConnectionTimesOut() throws Exception { - final long now = 10000L; - - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); mOmahaBase = createOmahaBase( ServerResponse.FAILURE, ConnectionStatus.TIMES_OUT, DeviceType.HANDSET); @@ -669,11 +627,8 @@ @Test @Feature({"Omaha"}) public void testCheckForUpdatesUpdated() throws Exception { - final long now = 10000L; final String version = "89.0.12.5342"; - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); mOmahaBase = createOmahaBase(); mOmahaBase.setInstalledVersion(version); mOmahaBase.setUpdateVersion(version); @@ -689,12 +644,9 @@ @Test @Feature({"Omaha"}) public void testCheckForUpdatesOutdated() throws Exception { - final long now = 10000L; final String oldVersion = "89.0.12.5342"; final String newVersion = "89.0.13.1242"; - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); mOmahaBase = createOmahaBase(); mOmahaBase.setInstalledVersion(oldVersion); mOmahaBase.setUpdateVersion(newVersion); @@ -710,12 +662,9 @@ @Test @Feature({"Omaha"}) public void testCheckForUpdatesFailedIncorrectNewVersion() throws Exception { - final long now = 10000L; final String oldVersion = "89.0.12.5342"; final String newVersion = "Unknown"; - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); mOmahaBase = createOmahaBase(); mOmahaBase.setInstalledVersion(oldVersion); mOmahaBase.setUpdateVersion(newVersion); @@ -731,12 +680,9 @@ @Test @Feature({"Omaha"}) public void testCheckForUpdatesFailedIncorrectOldVersion() throws Exception { - final long now = 10000L; final String oldVersion = "Unknown"; final String newVersion = "89.0.13.1242"; - mDelegate = new MockOmahaDelegate(mContext, DeviceType.HANDSET, InstallSource.ORGANIC); - mDelegate.getScheduler().setCurrentTime(now); mOmahaBase = createOmahaBase(); mOmahaBase.setInstalledVersion(oldVersion); mOmahaBase.setUpdateVersion(newVersion);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omaha/RequestGeneratorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omaha/RequestGeneratorTest.java index c577fb5..9e9a456 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omaha/RequestGeneratorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omaha/RequestGeneratorTest.java
@@ -15,7 +15,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.chromium.base.test.BaseRobolectricTestRunner; @@ -89,7 +88,7 @@ UniqueIdentificationGeneratorFactory.clearGeneratorMapForTest(); // Creating a RequestGenerator should register the identification generator. - new MockRequestGenerator(RuntimeEnvironment.getApplication(), DeviceType.HANDSET); + new MockRequestGenerator(DeviceType.HANDSET); // Verify the identification generator exists and is of the correct type. UniqueIdentificationGenerator instance = UniqueIdentificationGeneratorFactory.getInstance( @@ -130,8 +129,7 @@ .thenReturn(mock(IdentityManager.class)); when(IdentityServicesProvider.get().getIdentityManager(any()).hasPrimaryAccount(anyInt())) .thenReturn(true); - MockRequestGenerator generator = - new MockRequestGenerator(RuntimeEnvironment.getApplication(), DeviceType.TABLET); + MockRequestGenerator generator = new MockRequestGenerator(DeviceType.TABLET); String xml = null; try { xml = generator.generateXML( @@ -158,8 +156,7 @@ long installAge = 42; int dateLastActive = 4088; - MockRequestGenerator generator = - new MockRequestGenerator(RuntimeEnvironment.getApplication(), deviceType); + MockRequestGenerator generator = new MockRequestGenerator(deviceType); String xml = null; try {
diff --git a/chrome/app/chrome_command_ids.h b/chrome/app/chrome_command_ids.h index 19dab8a..a4260ae 100644 --- a/chrome/app/chrome_command_ids.h +++ b/chrome/app/chrome_command_ids.h
@@ -473,6 +473,10 @@ // Live Caption #define IDC_LIVE_CAPTION 53251 +// Device API system tray icon +#define IDC_MANAGE_HID_DEVICES_FIRST 53260 +#define IDC_MANAGE_HID_DEVICES_LAST 53269 + // NOTE: The last valid command value is 57343 (0xDFFF) // See http://msdn.microsoft.com/en-us/library/t2zechd4(VS.71).aspx
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd index 71370ba..bdee40d 100644 --- a/chrome/app/chromium_strings.grd +++ b/chrome/app/chromium_strings.grd
@@ -995,6 +995,15 @@ Chromium is using your camera. </message> + <if expr="not is_android"> + <!-- WebHID system tray icon --> + <message name="IDS_WEBHID_SYSTEM_TRAY_ICON_TOOLTIP" desc="Tooltip for the WebHID system tray icon when one or more HID devices are being accessed."> + {NUM_DEVICES, plural, + =1 {Chromium is connected to a HID device} + other {Chromium is connected to HID devices}} + </message> + </if> + <!-- ProcessSingleton --> <if expr="is_posix"> <message name="IDS_PROFILE_IN_USE_POSIX" desc="Message shown when the browser cannot start because the profile is in use on a different host.">
diff --git a/chrome/app/chromium_strings_grd/IDS_WEBHID_SYSTEM_TRAY_ICON_TOOLTIP.png.sha1 b/chrome/app/chromium_strings_grd/IDS_WEBHID_SYSTEM_TRAY_ICON_TOOLTIP.png.sha1 new file mode 100644 index 0000000..b251fbcd --- /dev/null +++ b/chrome/app/chromium_strings_grd/IDS_WEBHID_SYSTEM_TRAY_ICON_TOOLTIP.png.sha1
@@ -0,0 +1 @@ +678ae1f6227de889133ce3956c028cbd02189cdc \ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 767453b..bcf3b7dd 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -5691,6 +5691,9 @@ <message name="IDS_EXTENSIONS_MENU_EXTENSIONS_TAB_DISCOVER_MORE_TITLE" desc="Text of the button in the installed extensions tab used to open the webstore page"> Discover more extensions </message> + <message name="IDS_EXTENSIONS_MENU_REQUESTS_ACCESS_SECTION_TITLE" desc="Title of the requests access section that lists the extensions requesting site access"> + Requests access + </message> <!-- Settings API bubble --> <message name="IDS_EXTENSIONS_SETTINGS_API_TITLE_HOME_PAGE_BUBBLE" desc="Title of a bubble warning users that an extension has overridden their home page setting"> @@ -7262,6 +7265,12 @@ <message name="IDS_BOOKMARKS_EMPTY_STATE_BODY" desc="Body text for the bookmarks side panel empty state"> Bookmark things you want to come back to later </message> + <message name="IDS_BOOKMARKS_EMPTY_STATE_TITLE_GUEST" desc="Title for the bookmarks side panel empty state in guest mode"> + Sign in to see your bookmarks + </message> + <message name="IDS_BOOKMARKS_EMPTY_STATE_BODY_GUEST" desc="Body text for the bookmarks side panel empty state in guest mode"> + Bookmarks are unavailable in guest mode + </message> <message name="IDS_BOOKMARK_FOLDER_CHILD_COUNT" desc="Text description for the number of children of a bookmark folder"> {NUM_BOOKMARKS, plural, =1 {1 bookmark} other {# bookmarks}} </message> @@ -12411,6 +12420,12 @@ <message name="IDS_WEBHID_DEVICE_CONNECTED_BY_EXTENSION_NOTIFICATION_MESSAGE" desc="Notification content shown to the user when a HID device is being accessed by an extension."> Click to manage permissions for "<ph name="EXTENSION">$1<ex>Google Translate</ex></ph>" </message> + <message name="IDS_WEBHID_SYSTEM_TRAY_ICON_BUTTON_FOR_MANAGE_HID_DEVICE" desc="The text for WebHID system tray icon button for managing HID devices."> + Manage HID devices + </message> + <message name="IDS_WEBHID_SYSTEM_TRAY_ICON_BUTTON_FOR_MANAGE_HID_DEVICE_WITH_PROFILE_NAME" desc="The text with profile name for WebHID system tray icon button for managing HID devices."> + Manage HID devices for <ph name="PROFILE_NAME">$1<ex>Nina@gmail.com</ex></ph> + </message> </if> <if expr="chromeos_ash">
diff --git a/chrome/app/generated_resources_grd/IDS_BOOKMARKS_EMPTY_STATE_BODY_GUEST.png.sha1 b/chrome/app/generated_resources_grd/IDS_BOOKMARKS_EMPTY_STATE_BODY_GUEST.png.sha1 new file mode 100644 index 0000000..3cac22e --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_BOOKMARKS_EMPTY_STATE_BODY_GUEST.png.sha1
@@ -0,0 +1 @@ +a47a721691b90ed0ff913bfc189977d1832a8381 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_BOOKMARKS_EMPTY_STATE_TITLE_GUEST.png.sha1 b/chrome/app/generated_resources_grd/IDS_BOOKMARKS_EMPTY_STATE_TITLE_GUEST.png.sha1 new file mode 100644 index 0000000..3cac22e --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_BOOKMARKS_EMPTY_STATE_TITLE_GUEST.png.sha1
@@ -0,0 +1 @@ +a47a721691b90ed0ff913bfc189977d1832a8381 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_MENU_REQUESTS_ACCESS_SECTION_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_MENU_REQUESTS_ACCESS_SECTION_TITLE.png.sha1 new file mode 100644 index 0000000..d65d6af --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_MENU_REQUESTS_ACCESS_SECTION_TITLE.png.sha1
@@ -0,0 +1 @@ +0c733547872bcb3cb973c51c3f3c9210f0d3f204 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBHID_SYSTEM_TRAY_ICON_BUTTON_FOR_MANAGE_HID_DEVICE.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBHID_SYSTEM_TRAY_ICON_BUTTON_FOR_MANAGE_HID_DEVICE.png.sha1 new file mode 100644 index 0000000..48de3fdd1 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBHID_SYSTEM_TRAY_ICON_BUTTON_FOR_MANAGE_HID_DEVICE.png.sha1
@@ -0,0 +1 @@ +df167e129e49a5833e8ca321f7ebc6f7cdf4fe01 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBHID_SYSTEM_TRAY_ICON_BUTTON_FOR_MANAGE_HID_DEVICE_WITH_PROFILE_NAME.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBHID_SYSTEM_TRAY_ICON_BUTTON_FOR_MANAGE_HID_DEVICE_WITH_PROFILE_NAME.png.sha1 new file mode 100644 index 0000000..4a1bb4a --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBHID_SYSTEM_TRAY_ICON_BUTTON_FOR_MANAGE_HID_DEVICE_WITH_PROFILE_NAME.png.sha1
@@ -0,0 +1 @@ +891da6346817ba8cfbeb025930f923d41a2324ca \ No newline at end of file
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd index 78ef238..4585619 100644 --- a/chrome/app/google_chrome_strings.grd +++ b/chrome/app/google_chrome_strings.grd
@@ -1062,6 +1062,15 @@ Google Chrome is using your camera. </message> + <if expr="not is_android"> + <!-- WebHID system tray icon --> + <message name="IDS_WEBHID_SYSTEM_TRAY_ICON_TOOLTIP" desc="Tooltip for the WebHID system tray icon when one or more HID devices are being accessed."> + {NUM_DEVICES, plural, + =1 {Google Chrome is connected to a HID device} + other {Google Chrome is connected to HID devices}} + </message> + </if> + <!-- ProcessSingleton --> <if expr="is_posix"> <message name="IDS_PROFILE_IN_USE_POSIX" desc="Message shown when the browser cannot start because the profile is in use on a different host.">
diff --git a/chrome/app/google_chrome_strings_grd/IDS_WEBHID_SYSTEM_TRAY_ICON_TOOLTIP.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_WEBHID_SYSTEM_TRAY_ICON_TOOLTIP.png.sha1 new file mode 100644 index 0000000..99030560 --- /dev/null +++ b/chrome/app/google_chrome_strings_grd/IDS_WEBHID_SYSTEM_TRAY_ICON_TOOLTIP.png.sha1
@@ -0,0 +1 @@ +d953c69958f551e7a8cd1b2686edecc34a828030 \ No newline at end of file
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index a4cba93..a022dc9 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -1823,18 +1823,6 @@ <message name="IDS_SETTINGS_TOPICS_PAGE_TOGGLE_SUB_LABEL" translateable="false" desc="Subabel for the toggle in the Topics preferences page."> Vivamus nibh turpis, varius quis nisi vel, porta laoreet tellus. Mauris porta imperdiet venenatis </message> - <message name="IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_HEADING" translateable="false" desc="Section title for the current Topics list underneath toggle in the Topics preferences page."> - Mauris at lectus - </message> - <message name="IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_DESCRIPTION" translateable="false" desc="Section description for the current Topics list in the Topics preferences page."> - Nulla tincidunt iaculis nulla, sit amet viverra massa luctus nec. Integer eget pellentesque magna, et venenatis lorem. Integer a porta elit. Eget bibendum neque. - </message> - <message name="IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_DESCRIPTION_DISABLED" translateable="false" desc="Section description for the current Topics list when Topics is disabled in the Topics preferences page."> - Sed porta viverra lacus ut euismod. Integer a cursus metus, ac ultricies libero. - </message> - <message name="IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_DESCRIPTION_EMPTY" translateable="false" desc="Section description for the current Topics list when the Topics list is empty in the Topics preferences page."> - Curabitur sagittis sapien ut turpis interdum, vitae porttitor sem pretium. Vestibulum sem mauris, ultrices ac massa sit amet, sodales aliquet est. - </message> <!-- Privacy Sandbox Settings 4 - Fledge Page --> <message name="IDS_SETTINGS_FLEDGE_PAGE_TITLE" translateable="false" desc="Title for the Fledge preferences page.">
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index b130454..aaace253 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -3792,6 +3792,8 @@ "hid/hid_connection_tracker_factory.h", "hid/hid_policy_allowed_devices.cc", "hid/hid_policy_allowed_devices.h", + "hid/hid_system_tray_icon.cc", + "hid/hid_system_tray_icon.h", "hid/web_hid_histograms.cc", "hid/web_hid_histograms.h", "icon_transcoder/svg_icon_transcoder.cc", @@ -4486,7 +4488,12 @@ "//chrome/browser/web_applications/adjustments", "//chrome/browser/web_applications/app_service", ] - + if (!is_android && !is_chromeos) { + sources += [ + "hid/hid_status_icon.cc", + "hid/hid_status_icon.h", + ] + } if (!is_chromeos) { sources += [ "apps/app_service/app_service_proxy_desktop.cc", @@ -5760,6 +5767,8 @@ "download/notification/download_item_notification.h", "download/notification/download_notification_manager.cc", "download/notification/download_notification_manager.h", + "hid/hid_pinned_notification.cc", + "hid/hid_pinned_notification.h", "media/platform_verification_chromeos.cc", "media/platform_verification_chromeos.h", "memory/oom_kills_monitor.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index d22e33d..35e34d92 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1313,6 +1313,19 @@ std::size(kJourneysVisitDedupingUseHostParams), nullptr}, }; +#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kLocalWebApprovalsPreferLocalParams[] = { + {"preferred_button", "local"}}; +const FeatureEntry::FeatureParam kLocalWebApprovalsPreferRemoteParams[] = { + {"preferred_button", "remote"}}; +const FeatureEntry::FeatureVariation kLocalWebApprovalsVariations[] = { + {"Prefer Local", kLocalWebApprovalsPreferLocalParams, + std::size(kLocalWebApprovalsPreferLocalParams), nullptr}, + {"Prefer Remote", kLocalWebApprovalsPreferRemoteParams, + std::size(kLocalWebApprovalsPreferRemoteParams), nullptr}, +}; +#endif + #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \ BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) const FeatureEntry::FeatureParam @@ -7051,17 +7064,19 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_CHROMEOS_ASH) - {"enable-local-web-approvals", flag_descriptions::kLocalWebApprovalsName, - flag_descriptions::kLocalWebApprovalsDescription, kOsCrOS, - FEATURE_VALUE_TYPE(supervised_users::kLocalWebApprovals)}, -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - -#if BUILDFLAG(IS_CHROMEOS_ASH) {"enable-privacy-indicators", flag_descriptions::kPrivacyIndicatorsName, flag_descriptions::kPrivacyIndicatorsDescription, kOsCrOS, FEATURE_VALUE_TYPE(ash::features::kPrivacyIndicators)}, #endif // BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_ANDROID) + {"enable-local-web-approvals", flag_descriptions::kLocalWebApprovalsName, + flag_descriptions::kLocalWebApprovalsDescription, kOsCrOS | kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(supervised_users::kLocalWebApprovals, + kLocalWebApprovalsVariations, + "LocalWebApprovals")}, +#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_ANDROID) + #if BUILDFLAG(ENABLE_SUPERVISED_USERS) {"enable-web-filter-interstitial-refresh", flag_descriptions::kWebFilterInterstitialRefreshName, @@ -8379,14 +8394,6 @@ flag_descriptions::kChromeWhatsNewUIDescription, kOsDesktop, FEATURE_VALUE_TYPE(features::kChromeWhatsNewUI)}, -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) - {"chrome-whats-new-in-main-menu-new-badge", - flag_descriptions::kChromeWhatsNewInMainMenuNewBadgeName, - flag_descriptions::kChromeWhatsNewInMainMenuNewBadgeDescription, - kOsDesktop, - FEATURE_VALUE_TYPE(features::kChromeWhatsNewInMainMenuNewBadge)}, -#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) - {"sync-trusted-vault-passphrase-promo", flag_descriptions::kSyncTrustedVaultPassphrasePromoName, flag_descriptions::kSyncTrustedVaultPassphrasePromoDescription, kOsAll, @@ -9062,6 +9069,13 @@ content_settings::features::kSafetyCheckUnusedSitePermissions, kSafetyCheckUnusedSitePermissionsVariations, "SafetyCheckUnusedSitePermissions")}, + + {"record-permission-expiration-timestamps", + flag_descriptions::kRecordPermissionExpirationTimestampsName, + flag_descriptions::kRecordPermissionExpirationTimestampsDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + permissions::features::kRecordPermissionExpirationTimestamps)}, #endif // !BUILDFLAG(IS_ANDROID) {"autofill-enable-upstream-save-card-offer-ui-experiment",
diff --git a/chrome/browser/android/browserservices/metrics/java/src/org/chromium/chrome/browser/browserservices/metrics/WebApkUmaRecorder.java b/chrome/browser/android/browserservices/metrics/java/src/org/chromium/chrome/browser/browserservices/metrics/WebApkUmaRecorder.java index 06ed170..900808ca 100644 --- a/chrome/browser/android/browserservices/metrics/java/src/org/chromium/chrome/browser/browserservices/metrics/WebApkUmaRecorder.java +++ b/chrome/browser/android/browserservices/metrics/java/src/org/chromium/chrome/browser/browserservices/metrics/WebApkUmaRecorder.java
@@ -192,14 +192,6 @@ GooglePlayInstallResult.NUM_ENTRIES); } - /** Records the duration of a WebAPK session (from launch/foreground to background). */ - public static void recordWebApkSessionDuration( - @WebApkDistributor int distributor, long duration) { - RecordHistogram.recordLongTimesHistogram( - "WebApk.Session.TotalDuration2." + getWebApkDistributorUmaSuffix(distributor), - duration); - } - /** Records the current Shell APK version. */ public static void recordShellApkVersion( int shellApkVersion, @WebApkDistributor int distributor) {
diff --git a/chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper.cc b/chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper.cc index 2ce5f35..172bef80 100644 --- a/chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper.cc +++ b/chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper.cc
@@ -19,7 +19,6 @@ AccessibilityInfoDataWrapper::AccessibilityInfoDataWrapper( AXTreeSourceArc* tree_source) : tree_source_(tree_source) {} -AccessibilityInfoDataWrapper::~AccessibilityInfoDataWrapper() = default; void AccessibilityInfoDataWrapper::Serialize(ui::AXNodeData* out_data) const { out_data->id = GetId(); @@ -80,37 +79,4 @@ } } -void AccessibilityInfoDataWrapper::ReplaceChild(int32_t current_child_id, - int32_t new_child_id) { - // A node can not be a child of itself. - if (new_child_id == GetId()) - return; - - if (!children_override_.has_value()) - PopulateChildrenOverride(); - - base::ranges::replace(children_override_.value(), current_child_id, - new_child_id); -} - -void AccessibilityInfoDataWrapper::AppendChild(int32_t new_child_id) { - // A node can not be a child of itself. - if (new_child_id == GetId()) - return; - - if (!children_override_.has_value()) - PopulateChildrenOverride(); - - children_override_->push_back(new_child_id); -} - -void AccessibilityInfoDataWrapper::RemoveChild(int32_t child_id) { - if (!children_override_.has_value()) - PopulateChildrenOverride(); - - auto it = base::ranges::find(children_override_.value(), child_id); - if (it != children_override_->end()) - children_override_->erase(it); -} - } // namespace arc
diff --git a/chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper.h b/chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper.h index bfee4c2..490eeec 100644 --- a/chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper.h +++ b/chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper.h
@@ -7,7 +7,6 @@ #include "ash/components/arc/mojom/accessibility_helper.mojom.h" -#include <cstdint> #include <string> #include <vector> @@ -24,7 +23,7 @@ class AccessibilityInfoDataWrapper { public: explicit AccessibilityInfoDataWrapper(AXTreeSourceArc* tree_source); - virtual ~AccessibilityInfoDataWrapper(); + virtual ~AccessibilityInfoDataWrapper() = default; // True if this AccessibilityInfoDataWrapper represents an Android node, false // if it represents an Android window. @@ -51,24 +50,8 @@ std::vector<AccessibilityInfoDataWrapper*>* children) const = 0; virtual int32_t GetWindowId() const = 0; - void ReplaceChild(int32_t current_child_id, int32_t new_child_id); - void AppendChild(int32_t new_child_id); - void RemoveChild(int32_t child_id); - - // Gets the node that the input node should come before. - // A.k.a Gets the node that should come after the input node. - // node.traversalBefore = other_node - virtual AccessibilityInfoDataWrapper* GetTraversalBefore() const = 0; - - // Gets the node that the input node should come after. - // A.k.a Gets the node that should come before the input node. - // node.traversalAfter = other_node - virtual AccessibilityInfoDataWrapper* GetTraversalAfter() const = 0; - protected: - virtual void PopulateChildrenOverride() = 0; AXTreeSourceArc* tree_source_; - absl::optional<std::vector<int>> children_override_; private: // Populate bounds of a node which can be passed to AXNodeData.location.
diff --git a/chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper_unittest.cc b/chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper_unittest.cc index 259345a..06004e6 100644 --- a/chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper_unittest.cc +++ b/chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper_unittest.cc
@@ -24,7 +24,6 @@ public: explicit TestAccessibilityInfoDataWrapper(AXTreeSourceArc* tree_source_) : AccessibilityInfoDataWrapper(tree_source_) {} - ~TestAccessibilityInfoDataWrapper() override = default; // AccessibilityInfoDataWrapper overrides: bool IsNode() const override { return false; } @@ -47,21 +46,6 @@ std::vector<AccessibilityInfoDataWrapper*>* children) const override {} int32_t GetWindowId() const override { return 1; } - AccessibilityInfoDataWrapper* GetTraversalBefore() const override { - return nullptr; - } - AccessibilityInfoDataWrapper* GetTraversalAfter() const override { - return nullptr; - } - - void PopulateChildrenOverride() override { - children_override_ = std::vector<int>(); - } - - void ResetChildrenOverride() { children_override_.reset(); } - - bool HasChildrenOverride() { return children_override_.has_value(); } - int32_t id_ = 1; gfx::Rect bounds_; }; @@ -181,41 +165,4 @@ EXPECT_EQ(gfx::RectF(0, 0, 200, 200), out_data.relative_bounds.bounds); } -TEST_F(AccessibilityInfoDataWrapperTest, AppendToSelf) { - TestAccessibilityInfoDataWrapper data(nullptr); - - // Append data to itself. - data.AppendChild(data.GetId()); - std::vector<AccessibilityInfoDataWrapper*> children; - data.GetChildren(&children); - // Children should not be increased - EXPECT_EQ(0U, children.size()); - EXPECT_TRUE(!data.HasChildrenOverride()); - - // Same but with replace. - data.ReplaceChild(0, data.GetId()); - data.GetChildren(&children); - // Children should not be increased - EXPECT_EQ(0U, children.size()); - EXPECT_TRUE(!data.HasChildrenOverride()); -} - -TEST_F(AccessibilityInfoDataWrapperTest, PopulateChildrenOverride) { - TestAccessibilityInfoDataWrapper data(nullptr); - - // Append a random Id. - data.AppendChild(2); - EXPECT_TRUE(data.HasChildrenOverride()); - data.ResetChildrenOverride(); - EXPECT_TRUE(!data.HasChildrenOverride()); - // Same but with replace. - data.ReplaceChild(2, 3); - EXPECT_TRUE(data.HasChildrenOverride()); - data.ResetChildrenOverride(); - EXPECT_TRUE(!data.HasChildrenOverride()); - // Again with remove. - data.RemoveChild(2); - EXPECT_TRUE(data.HasChildrenOverride()); -} - } // namespace arc
diff --git a/chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper.cc b/chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper.cc index 07eb9d0..a734e40 100644 --- a/chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper.cc +++ b/chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper.cc
@@ -5,9 +5,7 @@ #include "chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper.h" #include <algorithm> -#include <vector> -#include "base/ranges/algorithm.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper.h" @@ -591,29 +589,18 @@ void AccessibilityNodeInfoDataWrapper::GetChildren( std::vector<AccessibilityInfoDataWrapper*>* children) const { - if (children_override_.has_value()) { - for (const int32_t id : children_override_.value()) { - auto* child = tree_source_->GetFromId(id); - if (child != nullptr) { - children->push_back(child); - } else { - LOG(WARNING) << "Unexpected nullptr found while GetChildren"; - } - } - } else { - if (!node_ptr_->int_list_properties) - return; - const auto& it = - node_ptr_->int_list_properties->find(AXIntListProperty::CHILD_NODE_IDS); - if (it == node_ptr_->int_list_properties->end()) - return; - for (const int32_t id : it->second) { - auto* child = tree_source_->GetFromId(id); - if (child != nullptr) { - children->push_back(child); - } else { - LOG(WARNING) << "Unexpected nullptr found while GetChildren"; - } + if (!node_ptr_->int_list_properties) + return; + const auto& it = + node_ptr_->int_list_properties->find(AXIntListProperty::CHILD_NODE_IDS); + if (it == node_ptr_->int_list_properties->end()) + return; + for (const int32_t id : it->second) { + auto* child = tree_source_->GetFromId(id); + if (child != nullptr) { + children->push_back(child); + } else { + LOG(WARNING) << "Unexpected nullptr found while GetChildren"; } } } @@ -622,46 +609,6 @@ return node_ptr_->window_id; } -AccessibilityInfoDataWrapper* -AccessibilityNodeInfoDataWrapper::GetTraversalBefore() const { - int32_t before_id = -1; - if (GetProperty(AXIntProperty::TRAVERSAL_BEFORE, &before_id)) - return tree_source_->GetFromId(before_id); - - return nullptr; -} - -AccessibilityInfoDataWrapper* -AccessibilityNodeInfoDataWrapper::GetTraversalAfter() const { - int32_t after_id = -1; - if (GetProperty(AXIntProperty::TRAVERSAL_AFTER, &after_id)) - return tree_source_->GetFromId(after_id); - - return nullptr; -} - -void AccessibilityNodeInfoDataWrapper::PopulateChildrenOverride() { - // Don't repopulate if the override already exists. - if (children_override_.has_value()) - return; - - // If there are no int list properties, there aren't any children. - if (!node_ptr_->int_list_properties.has_value()) { - children_override_ = std::vector<int>(); - return; - } - - auto& int_properties = node_ptr_->int_list_properties.value(); - // If the map doesn't contain child nodes, do the same as above. - if (auto it = int_properties.find(AXIntListProperty::CHILD_NODE_IDS); - it != int_properties.end()) { - // If it did have children, copy them into the override - children_override_ = it->second; - return; - } - children_override_ = std::vector<int>(); -} - bool AccessibilityNodeInfoDataWrapper::GetProperty( AXBooleanProperty prop) const { return arc::GetBooleanProperty(node_ptr_, prop);
diff --git a/chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper.h b/chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper.h index adb0ca69..016cd60 100644 --- a/chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper.h +++ b/chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper.h
@@ -15,7 +15,6 @@ namespace arc { class AXTreeSourceArc; -class AccessibilityNodeInfoDataWrapperTest; // Wrapper class for an AccessibilityWindowInfoData. class AccessibilityNodeInfoDataWrapper : public AccessibilityInfoDataWrapper { @@ -50,24 +49,9 @@ std::vector<AccessibilityInfoDataWrapper*>* children) const override; int32_t GetWindowId() const override; - // Gets the node that the input node should come before. - // A.k.a Gets the node that should come after the input node. - // node.traversalBefore = other_node - AccessibilityInfoDataWrapper* GetTraversalBefore() const override; - - // Gets the node that the input node should come after. - // A.k.a Gets the node that should come before the input node. - // node.traversalAfter = other_node - AccessibilityInfoDataWrapper* GetTraversalAfter() const override; - mojom::AccessibilityNodeInfoData* node() { return node_ptr_; } - protected: - void PopulateChildrenOverride() override; - private: - friend class arc::AccessibilityNodeInfoDataWrapperTest; - bool GetProperty(mojom::AccessibilityBooleanProperty prop) const; bool GetProperty(mojom::AccessibilityIntProperty prop, int32_t* out_value) const;
diff --git a/chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper_unittest.cc b/chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper_unittest.cc index 5d5052a9..d6bb940 100644 --- a/chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper_unittest.cc +++ b/chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper_unittest.cc
@@ -7,7 +7,6 @@ #include <map> #include <memory> #include <utility> -#include <vector> #include "ash/components/arc/mojom/accessibility_helper.mojom.h" #include "chrome/browser/ash/arc/accessibility/accessibility_window_info_data_wrapper.h" @@ -94,16 +93,6 @@ void SetParentId(int32_t child_id, int32_t parent_id) { tree_source_->SetParentId(child_id, parent_id); } - void ForcePopulateChildrenOverride( - AccessibilityNodeInfoDataWrapper& wrapper) { - wrapper.PopulateChildrenOverride(); - } - std::vector<int>* GetChildrenOverride( - AccessibilityNodeInfoDataWrapper& wrapper) { - return wrapper.children_override_.has_value() - ? &wrapper.children_override_.value() - : nullptr; - } // AXTreeSourceArc::Delegate overrides. bool UseFullFocusMode() const override { return full_focus_mode_; } @@ -852,111 +841,4 @@ ax::mojom::StringAttribute::kLongClickLabel, &val)); EXPECT_EQ("long click label", val); } - -TEST_F(AccessibilityNodeInfoDataWrapperTest, ChildrenModifiers) { - AXTreeSourceArc* tree = tree_source(); - - AXNodeInfoData parent; - parent.id = 1; - AccessibilityNodeInfoDataWrapper parent_wrapper(tree, &parent); - SetIdToWrapper(&parent_wrapper); - - AXNodeInfoData child_1; - child_1.id = 2; - AccessibilityNodeInfoDataWrapper child_1_wrapper(tree, &child_1); - SetIdToWrapper(&child_1_wrapper); - - AXNodeInfoData child_2; - child_2.id = 3; - AccessibilityNodeInfoDataWrapper child_2_wrapper(tree, &child_2); - SetIdToWrapper(&child_2_wrapper); - - // Get children - std::vector<AccessibilityInfoDataWrapper*> children; - parent_wrapper.GetChildren(&children); - // Check size - int size = children.size(); - EXPECT_EQ(size, 0); - children.clear(); - // Add one child - parent_wrapper.AppendChild(child_1.id); - parent_wrapper.GetChildren(&children); - // Check size - size = children.size(); - EXPECT_EQ(size, 1); - // Check that node is the child - EXPECT_EQ(children[0]->GetId(), child_1.id); - children.clear(); - - // Replace Child 1 with child 2 - parent_wrapper.ReplaceChild(child_1.id, child_2.id); - parent_wrapper.GetChildren(&children); - // Check size - size = children.size(); - EXPECT_EQ(size, 1); - // Check that node is the child - EXPECT_EQ(children[0]->GetId(), child_2.id); - children.clear(); - // Remove child 2 - parent_wrapper.RemoveChild(child_2.id); - parent_wrapper.GetChildren(&children); - // Check size - size = children.size(); - EXPECT_EQ(size, 0); -} - -TEST_F(AccessibilityNodeInfoDataWrapperTest, TraversalProperties) { - AXNodeInfoData node_a; - node_a.id = 1; - AccessibilityNodeInfoDataWrapper node_a_w(tree_source(), &node_a); - SetIdToWrapper(&node_a_w); - - AXNodeInfoData node_b; - node_b.id = 1; - AccessibilityNodeInfoDataWrapper node_b_w(tree_source(), &node_b); - SetIdToWrapper(&node_b_w); - - AXNodeInfoData node_c; - node_c.id = 1; - AccessibilityNodeInfoDataWrapper node_c_w(tree_source(), &node_c); - SetIdToWrapper(&node_c_w); - - SetProperty(node_b.int_properties, AXIntProperty::TRAVERSAL_BEFORE, - node_c.id); - SetProperty(node_b.int_properties, AXIntProperty::TRAVERSAL_AFTER, node_a.id); - - // Traversal Before for b = c, and not nullptr; - EXPECT_NE(node_b_w.GetTraversalBefore(), nullptr); - EXPECT_EQ(node_c.id, node_b_w.GetTraversalBefore()->GetId()); - - // Traversal after for b = a, and not nullptr; - EXPECT_NE(node_b_w.GetTraversalAfter(), nullptr); - EXPECT_EQ(node_c.id, node_b_w.GetTraversalAfter()->GetId()); - - // Traversal before/after for a = nullptr; - EXPECT_EQ(node_a_w.GetTraversalBefore(), nullptr); - EXPECT_EQ(node_a_w.GetTraversalAfter(), nullptr); -} - -TEST_F(AccessibilityNodeInfoDataWrapperTest, PopulateChildrenOverride) { - // Test populating from existing children. - AXNodeInfoData node_a; - node_a.id = 1; - AccessibilityNodeInfoDataWrapper node_a_w(tree_source(), &node_a); - SetIdToWrapper(&node_a_w); - SetProperty(node_a.int_list_properties, AXIntListProperty::CHILD_NODE_IDS, - {2, 3}); - ForcePopulateChildrenOverride(node_a_w); - auto* override = GetChildrenOverride(node_a_w); - EXPECT_NE(override, nullptr); - EXPECT_EQ(2U, override->size()); - // Test that running override again will not repopulate. - SetProperty(node_a.int_list_properties, AXIntListProperty::CHILD_NODE_IDS, - {}); - ForcePopulateChildrenOverride(node_a_w); - auto* latest_override = GetChildrenOverride(node_a_w); - EXPECT_NE(latest_override, nullptr); - // The size should remain the same since forcing populate should do nothing. - EXPECT_EQ(2U, latest_override->size()); -} } // namespace arc
diff --git a/chrome/browser/ash/arc/accessibility/accessibility_window_info_data_wrapper.cc b/chrome/browser/ash/arc/accessibility/accessibility_window_info_data_wrapper.cc index 64cfae9..e035c9e 100644 --- a/chrome/browser/ash/arc/accessibility/accessibility_window_info_data_wrapper.cc +++ b/chrome/browser/ash/arc/accessibility/accessibility_window_info_data_wrapper.cc
@@ -158,16 +158,7 @@ std::vector<AccessibilityInfoDataWrapper*>* children) const { // Populate the children vector by combining the child window IDs with the // root node ID. - if (children_override_.has_value()) { - for (const int32_t id : children_override_.value()) { - auto* child = tree_source_->GetFromId(id); - if (child != nullptr) { - children->push_back(child); - } else { - LOG(WARNING) << "Unexpected nullptr found while GetChildren"; - } - } - } else if (window_ptr_->int_list_properties) { + if (window_ptr_->int_list_properties) { const auto& it = window_ptr_->int_list_properties->find( mojom::AccessibilityWindowIntListProperty::CHILD_WINDOW_IDS); if (it != window_ptr_->int_list_properties->end()) { @@ -197,39 +188,6 @@ return window_ptr_->window_id; } -AccessibilityInfoDataWrapper* -AccessibilityWindowInfoDataWrapper::GetTraversalBefore() const { - return nullptr; -} - -AccessibilityInfoDataWrapper* -AccessibilityWindowInfoDataWrapper::GetTraversalAfter() const { - return nullptr; -} - -void AccessibilityWindowInfoDataWrapper::PopulateChildrenOverride() { - // Don't repopulate if the override already exists. - if (children_override_.has_value()) - return; - - // If there are no int list properties, there aren't any children. - if (!window_ptr_->int_list_properties.has_value()) { - children_override_ = std::vector<int>(); - return; - } - - auto& int_properties = window_ptr_->int_list_properties.value(); - // If the map doesn't contain child nodes, do the same as above. - if (auto it = int_properties.find( - mojom::AccessibilityWindowIntListProperty::CHILD_WINDOW_IDS); - it != int_properties.end()) { - // If it did have children, copy them into the override - children_override_ = it->second; - return; - } - children_override_ = std::vector<int>(); -} - bool AccessibilityWindowInfoDataWrapper::GetProperty( mojom::AccessibilityWindowBooleanProperty prop) const { return arc::GetBooleanProperty(window_ptr_, prop);
diff --git a/chrome/browser/ash/arc/accessibility/accessibility_window_info_data_wrapper.h b/chrome/browser/ash/arc/accessibility/accessibility_window_info_data_wrapper.h index 24c07362..5177305 100644 --- a/chrome/browser/ash/arc/accessibility/accessibility_window_info_data_wrapper.h +++ b/chrome/browser/ash/arc/accessibility/accessibility_window_info_data_wrapper.h
@@ -5,7 +5,6 @@ #ifndef CHROME_BROWSER_ASH_ARC_ACCESSIBILITY_ACCESSIBILITY_WINDOW_INFO_DATA_WRAPPER_H_ #define CHROME_BROWSER_ASH_ARC_ACCESSIBILITY_ACCESSIBILITY_WINDOW_INFO_DATA_WRAPPER_H_ -#include <cstdint> #include <string> #include <vector> @@ -48,12 +47,6 @@ std::vector<AccessibilityInfoDataWrapper*>* children) const override; int32_t GetWindowId() const override; - AccessibilityInfoDataWrapper* GetTraversalBefore() const override; - AccessibilityInfoDataWrapper* GetTraversalAfter() const override; - - protected: - void PopulateChildrenOverride() override; - private: bool GetProperty(mojom::AccessibilityWindowBooleanProperty prop) const; bool GetProperty(mojom::AccessibilityWindowIntProperty prop,
diff --git a/chrome/browser/ash/arc/accessibility/arc_accessibility_test_util.h b/chrome/browser/ash/arc/accessibility/arc_accessibility_test_util.h index 32f082d..1d7848b 100644 --- a/chrome/browser/ash/arc/accessibility/arc_accessibility_test_util.h +++ b/chrome/browser/ash/arc/accessibility/arc_accessibility_test_util.h
@@ -14,14 +14,6 @@ namespace arc { -void AddStandardAction(mojom::AccessibilityNodeInfoData* node, - mojom::AccessibilityActionType action_type, - absl::optional<std::string> label = absl::nullopt); - -void AddCustomAction(mojom::AccessibilityNodeInfoData* node, - int id, - std::string label); - template <class PropType, class ValueType> void SetProperty( absl::optional<base::flat_map<PropType, ValueType>>& properties, @@ -33,6 +25,14 @@ properties->insert_or_assign(prop, value); } +void AddStandardAction(mojom::AccessibilityNodeInfoData* node, + mojom::AccessibilityActionType action_type, + absl::optional<std::string> label = absl::nullopt); + +void AddCustomAction(mojom::AccessibilityNodeInfoData* node, + int id, + std::string label); + #define DEF_SET_PROP(data_type, prop_type, data_member_name, value_type) \ inline void SetProperty(data_type* data, prop_type prop, \ const value_type& value) { \
diff --git a/chrome/browser/ash/arc/accessibility/arc_accessibility_util.cc b/chrome/browser/ash/arc/accessibility/arc_accessibility_util.cc index 3e4f54d8..6cd031025e 100644 --- a/chrome/browser/ash/arc/accessibility/arc_accessibility_util.cc +++ b/chrome/browser/ash/arc/accessibility/arc_accessibility_util.cc
@@ -10,6 +10,7 @@ #include "ash/public/cpp/app_types_util.h" #include "base/containers/contains.h" #include "chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper.h" +#include "chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/aura/window.h"
diff --git a/chrome/browser/ash/arc/accessibility/ax_tree_source_arc.cc b/chrome/browser/ash/arc/accessibility/ax_tree_source_arc.cc index 84c76a5f..976cb89 100644 --- a/chrome/browser/ash/arc/accessibility/ax_tree_source_arc.cc +++ b/chrome/browser/ash/arc/accessibility/ax_tree_source_arc.cc
@@ -4,18 +4,14 @@ #include "chrome/browser/ash/arc/accessibility/ax_tree_source_arc.h" -#include <algorithm> -#include <cstdint> #include <memory> -#include <set> #include <stack> #include <string> #include <utility> -#include <vector> #include "base/containers/cxx20_erase.h" #include "base/dcheck_is_on.h" -#include "chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper.h" +#include "chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper.h" #include "chrome/browser/ash/arc/accessibility/accessibility_window_info_data_wrapper.h" #include "chrome/browser/ash/arc/accessibility/arc_accessibility_util.h" #include "chrome/browser/ash/arc/accessibility/auto_complete_handler.h" @@ -23,7 +19,6 @@ #include "extensions/browser/api/automation_internal/automation_event_router.h" #include "extensions/common/extension_messages.h" #include "ui/accessibility/ax_enums.mojom.h" -#include "ui/accessibility/ax_node_data.h" #include "ui/accessibility/ax_tree_source_checker.h" #include "ui/gfx/geometry/rect.h" @@ -149,29 +144,6 @@ itr->second->PostSerializeNode(out_data); } -void AXTreeSourceArc::BuildNodeTree( - const std::vector<mojom::AccessibilityNodeInfoDataPtr>& node_data, - std::vector<AccessibilityNodeInfoDataWrapper*>& nodes_to_reorder) { - for (auto& node_ptr : node_data) { - int32_t node_id = node_ptr->id; - AXNodeInfoData* node = node_ptr.get(); - AccessibilityNodeInfoDataWrapper* node_wrapper_ptr = - new AccessibilityNodeInfoDataWrapper(this, node); - tree_map_[node_id] = - base::WrapUnique<AccessibilityNodeInfoDataWrapper>(node_wrapper_ptr); - std::vector<int32_t> children; - if (GetProperty(node->int_list_properties, - AXIntListProperty::CHILD_NODE_IDS, &children)) { - for (const int32_t child : children) - parent_map_[child] = node_id; - } - if (HasProperty(node->int_properties, AXIntProperty::TRAVERSAL_BEFORE) || - HasProperty(node->int_properties, AXIntProperty::TRAVERSAL_AFTER)) { - nodes_to_reorder.push_back(node_wrapper_ptr); - } - } -} - void AXTreeSourceArc::NotifyAccessibilityEventInternal( const AXEventData& event_data) { if (window_id_ != event_data.window_id) { @@ -206,8 +178,19 @@ } } - std::vector<AccessibilityNodeInfoDataWrapper*> nodes_to_reorder; - BuildNodeTree(event_data.node_data, nodes_to_reorder); + for (size_t i = 0; i < event_data.node_data.size(); ++i) { + int32_t node_id = event_data.node_data[i]->id; + AXNodeInfoData* node = event_data.node_data[i].get(); + tree_map_[node_id] = + std::make_unique<AccessibilityNodeInfoDataWrapper>(this, node); + + std::vector<int32_t> children; + if (GetProperty(event_data.node_data[i].get()->int_list_properties, + AXIntListProperty::CHILD_NODE_IDS, &children)) { + for (const int32_t child : children) + parent_map_[child] = node_id; + } + } // Compute each node's bounds, based on its descendants. // Assuming |nodeData| is in pre-order, compute cached bounds in post-order to @@ -222,8 +205,6 @@ computed_bounds_[id] = ComputeEnclosingBounds(tree_map_[id].get()); } - // This call contains the only code path that will sort the nodes by bounds. - // Thus the reorder by traversal must occur after this. if (!UpdateAndroidFocusedId(event_data)) { // Exit this function if the focused node doesn't exist nor isn't visible. return; @@ -231,14 +212,6 @@ std::vector<int32_t> update_ids = ProcessHooksOnEvent(event_data); - // Reorder for traversal - if (nodes_to_reorder.size() > 0) { - TreeOrderer orderer(*this); - orderer.ReorderTree(nodes_to_reorder); - auto lcas = orderer.GetLeastCommonAncestors(nodes_to_reorder); - update_ids.insert(update_ids.end(), lcas.begin(), lcas.end()); - } - // Prep the event and send it to automation. AccessibilityInfoDataWrapper* focused_node = android_focused_id_.has_value() ? GetFromId(*android_focused_id_) @@ -653,231 +626,4 @@ delegate_->OnAction(data); } -// class TreeOrderer - -AXTreeSourceArc::TreeOrderer::TreeOrderer(AXTreeSourceArc& tree_source) - : tree_source_(tree_source) {} - -void AXTreeSourceArc::TreeOrderer::ReorderTree( - std::vector<AccessibilityNodeInfoDataWrapper*>& nodes_to_reorder) { - for (AccessibilityNodeInfoDataWrapper* node_wrapper_ptr : nodes_to_reorder) { - if (AccessibilityInfoDataWrapper* before_node = - node_wrapper_ptr->GetTraversalBefore(); - before_node) { - MoveNodeBefore(*node_wrapper_ptr, *before_node); - } else if (AccessibilityInfoDataWrapper* after_node = - node_wrapper_ptr->GetTraversalAfter(); - after_node) { - MoveNodeAfter(*node_wrapper_ptr, *after_node); - } - } -} - -void AXTreeSourceArc::TreeOrderer::AppendChild( - AccessibilityInfoDataWrapper& new_parent, - AccessibilityInfoDataWrapper& new_child) { - new_parent.AppendChild(new_child.GetId()); - tree_source_.parent_map_[new_child.GetId()] = new_parent.GetId(); -} - -std::set<int> AXTreeSourceArc::TreeOrderer::GetLeastCommonAncestors( - std::vector<AccessibilityNodeInfoDataWrapper*>& nodes) const { - // Find LCA using parent_map - auto& parent_map = tree_source_.parent_map_; - int32_t lowest_level = INT32_MAX; - int len = nodes.size(); - std::vector<int> levels(len); - // Loop through the nodes to find the one at the lowest level where root = 0. - for (int i = 0; i < len; ++i) { - AccessibilityInfoDataWrapper* node = nodes[i]; - // Replace any node that has traversal after with the node it comes after, - // it will never be an LCA. - auto* after_node = node->GetTraversalAfter(); - // Once there are no more traversal afters, or a cycle is detected. - while (after_node && after_node->GetId() != nodes[i]->GetId()) { - node = after_node; - after_node = node->GetTraversalAfter(); - } - // Replace the existing node with the traversal after. - // Traversal after will always be a NodeInfoDataWrapper. - nodes[i] = static_cast<AccessibilityNodeInfoDataWrapper*>(node); - int32_t level = GetLevel(*node); - levels[i] = level; - if (level < lowest_level) - lowest_level = level; - } - // Find the ancestors of the nodes not already at the lowest level - std::set<int> nodes_at_lowest_level; - for (int i = 0; i < len; ++i) { - int32_t node_id = nodes[i]->GetId(); - int level = levels[i]; - int current_id = node_id; - while (level > lowest_level) { - current_id = parent_map[current_id]; - level--; - } - nodes_at_lowest_level.insert(current_id); - } - // The only items left should be the LCAs - return nodes_at_lowest_level; -} - -int32_t AXTreeSourceArc::TreeOrderer::GetLevel( - AccessibilityInfoDataWrapper& node) const { - auto& parent_map = tree_source_.parent_map_; - auto current_it = parent_map.find(node.GetId()); - int level = 0; - while (current_it != parent_map.end()) { - level++; - current_it = parent_map.find(current_it->second); - } - - return level; -} - -AccessibilityInfoDataWrapper& -AXTreeSourceArc::TreeOrderer::GetParentsThatAreMovedBeforeOrSameNode( - AccessibilityInfoDataWrapper& moving_node) { - auto* parent = tree_source_.GetParent(&moving_node); - if (!parent) - return moving_node; - - std::set<int> visited; - if (InTraversalChain(parent, &moving_node, visited)) - return GetParentsThatAreMovedBeforeOrSameNode(*parent); - - return moving_node; -} - -void AXTreeSourceArc::TreeOrderer::DetachFromParent( - AccessibilityInfoDataWrapper& node) { - auto& parent_map = tree_source_.parent_map_; - auto* parent_wrapper = tree_source_.GetParent(&node); - if (parent_wrapper) { - parent_wrapper->RemoveChild(node.GetId()); - parent_map.erase(node.GetId()); - } -} - -bool AXTreeSourceArc::TreeOrderer::HasDescendant(int parent_id, - int child_id) const { - while (child_id != parent_id) { - if (tree_source_.parent_map_.find(child_id) != - tree_source_.parent_map_.end()) { - child_id = tree_source_.parent_map_[child_id]; - } else { - return false; - } - } - return true; -} - -void AXTreeSourceArc::TreeOrderer::MoveNodeBefore( - AccessibilityInfoDataWrapper& moving_node, - AccessibilityInfoDataWrapper& target_node) { - // traversal order: |moving_node| -> |target_node| - - if (HasDescendant(moving_node.GetId(), target_node.GetId())) { - // no-op already a descendant. - return; - } - - AccessibilityInfoDataWrapper& moving_root = - GetParentsThatAreMovedBeforeOrSameNode(moving_node); - if (tree_source_.IsEqual(&moving_root, &target_node)) - return; - - auto* target_parent = tree_source_.GetParent(&target_node); - if (target_parent && - HasDescendant(moving_root.GetId(), target_parent->GetId())) { - // Moving moving_root under its own descendant would create a loop. - return; - } - - auto& parent_map = tree_source_.parent_map_; - // detachSubtree - DetachFromParent(moving_root); - // If the parent exists replace target with moving_root since we will move the - // target under moving root. - if (target_parent && !tree_source_.IsEqual(&moving_root, target_parent)) { - target_parent->ReplaceChild(target_node.GetId(), moving_root.GetId()); - // Set moving root parent = target_parent - parent_map[moving_root.GetId()] = target_parent->GetId(); - parent_map.erase(target_node.GetId()); - } - - // Make target node a child of moving root - if (!tree_source_.IsEqual(&moving_root, &target_node)) - AppendChild(moving_root, target_node); -} - -void AXTreeSourceArc::TreeOrderer::MoveNodeAfter( - AccessibilityInfoDataWrapper& moving_node, - AccessibilityInfoDataWrapper& target_node) { - // traversal order: |target_node| -> |moving_node| - if (HasDescendant(moving_node.GetId(), target_node.GetId())) { - // Moving moving_node under its own descendant would create a loop. - return; - } - - AccessibilityInfoDataWrapper& moving_root = - GetParentsThatAreMovedBeforeOrSameNode(moving_node); - - if (tree_source_.IsEqual(&moving_root, &target_node)) { - // Cycle detected, stop processing for this node. - return; - } - - if (HasDescendant(moving_root.GetId(), target_node.GetId())) { - // Moving moving_root under its own descendant would create a loop. - return; - } - // Remove moving_root from parent since we will move it underneath target. - DetachFromParent(moving_root); - - if (!tree_source_.IsEqual(&target_node, &moving_root)) - AppendChild(target_node, moving_root); -} - -bool AXTreeSourceArc::TreeOrderer::InTraversalChain( - AccessibilityInfoDataWrapper* before, - AccessibilityInfoDataWrapper* after, - std::set<int>& visited) const { - if (!before || !after) - return false; - - AXNodeInfoData* before_node = before->GetNode(); - AXNodeInfoData* after_node = after->GetNode(); - if (!before_node || !after_node) - return false; - - int id = -1; - - auto& tree_map = tree_source_.tree_map_; - if (visited.find(before_node->id) == visited.end() && - GetProperty(before_node->int_properties, AXIntProperty::TRAVERSAL_BEFORE, - &id)) { - if (after_node->id == id) - return true; - - visited.insert(before_node->id); - if (auto it = tree_map.find(id); it != tree_map.end()) { - const auto& next_node_ptr = it->second; - return InTraversalChain(next_node_ptr.get(), after, visited); - } - } else if (visited.find(after_node->id) == visited.end() && - GetProperty(after_node->int_properties, - AXIntProperty::TRAVERSAL_AFTER, &id)) { - if (before_node->id == id) - return true; - - visited.insert(after_node->id); - if (auto it = tree_map.find(id); it != tree_map.end()) { - const auto& prev_node_ptr = it->second; - return InTraversalChain(before, prev_node_ptr.get(), visited); - } - } - return false; -} - } // namespace arc
diff --git a/chrome/browser/ash/arc/accessibility/ax_tree_source_arc.h b/chrome/browser/ash/arc/accessibility/ax_tree_source_arc.h index 4698453b..2290cd0 100644 --- a/chrome/browser/ash/arc/accessibility/ax_tree_source_arc.h +++ b/chrome/browser/ash/arc/accessibility/ax_tree_source_arc.h
@@ -11,9 +11,9 @@ #include <string> #include <vector> +#include "ash/components/arc/mojom/accessibility_helper.mojom-forward.h" #include "base/containers/flat_map.h" #include "chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper.h" -#include "chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper.h" #include "extensions/browser/api/automation_internal/automation_event_router.h" #include "ui/accessibility/ax_action_handler.h" #include "ui/accessibility/ax_node.h" @@ -128,61 +128,10 @@ private: friend class arc::AXTreeSourceArcTest; - class TreeOrderer { - public: - explicit TreeOrderer(AXTreeSourceArc& tree_source); - ~TreeOrderer() = default; - - // Reorders the tree to deal with Traversal Before/After. - void ReorderTree( - std::vector<AccessibilityNodeInfoDataWrapper*>& nodes_to_reorder); - - // Returns the LCAs of the nodes / will return ancestors that are all on the - // same level. - std::set<int> GetLeastCommonAncestors( - std::vector<AccessibilityNodeInfoDataWrapper*>& nodes) const; - - private: - // Determines if `after` is down the traversal chain from `before` - bool InTraversalChain(AccessibilityInfoDataWrapper* before, - AccessibilityInfoDataWrapper* after, - std::set<int>& visited) const; - - // Determines if node with parent_id has a descendant with child_id - bool HasDescendant(int32_t parent_id, int32_t child_id) const; - - // moves moving_node before target_node in the traversal order - void MoveNodeBefore(AccessibilityInfoDataWrapper& moving_node, - AccessibilityInfoDataWrapper& target_node); - // moves moving_node after target_node in the traversal order - void MoveNodeAfter(AccessibilityInfoDataWrapper& moving_node, - AccessibilityInfoDataWrapper& target_node); - void AppendChild(AccessibilityInfoDataWrapper& new_parent, - AccessibilityInfoDataWrapper& new_child); - - // This method is called before moving subtree. It checks if parent of that - // node was moved on its place because it has before property to that node. - // In that case parent node should be moved with moving_node. - // - // Returns top node that should be moved with moving_node. - AccessibilityInfoDataWrapper& GetParentsThatAreMovedBeforeOrSameNode( - AccessibilityInfoDataWrapper& moving_node); - - void DetachFromParent(AccessibilityInfoDataWrapper& node); - - int32_t GetLevel(AccessibilityInfoDataWrapper& node) const; - - AXTreeSourceArc& tree_source_; - }; - // Actual implementation of NotifyAccessibilityEvent. void NotifyAccessibilityEventInternal( const mojom::AccessibilityEventData& event_data); - void BuildNodeTree( - const std::vector<mojom::AccessibilityNodeInfoDataPtr>& node_data, - std::vector<AccessibilityNodeInfoDataWrapper*>& nodes_to_reorder); - // Returns AutomationEventRouter. extensions::AutomationEventRouterInterface* GetAutomationEventRouter() const;
diff --git a/chrome/browser/ash/arc/accessibility/ax_tree_source_arc_unittest.cc b/chrome/browser/ash/arc/accessibility/ax_tree_source_arc_unittest.cc index e0505c7b..05201a3 100644 --- a/chrome/browser/ash/arc/accessibility/ax_tree_source_arc_unittest.cc +++ b/chrome/browser/ash/arc/accessibility/ax_tree_source_arc_unittest.cc
@@ -4,13 +4,9 @@ #include "chrome/browser/ash/arc/accessibility/ax_tree_source_arc.h" -#include <cstddef> -#include <string> #include <utility> -#include <vector> #include "ash/components/arc/mojom/accessibility_helper.mojom.h" -#include "chrome/browser/ash/arc/accessibility/accessibility_info_data_wrapper.h" #include "chrome/browser/ash/arc/accessibility/accessibility_node_info_data_wrapper.h" #include "chrome/browser/ash/arc/accessibility/accessibility_window_info_data_wrapper.h" #include "chrome/browser/ash/arc/accessibility/arc_accessibility_test_util.h" @@ -118,29 +114,6 @@ tree_source_->NotifyAccessibilityEvent(event_data); } - std::vector<AccessibilityNodeInfoDataWrapper*> CallBuildNodeTree( - AXEventData* event_data) { - std::vector<AccessibilityNodeInfoDataWrapper*> nodes_to_reorder; - tree_source_->BuildNodeTree(event_data->node_data, nodes_to_reorder); - return nodes_to_reorder; - } - - std::set<int> GetLeastCommonAncestors( - std::vector<AccessibilityNodeInfoDataWrapper*>& nodes) { - AXTreeSourceArc::TreeOrderer orderer(*tree_source_); - return orderer.GetLeastCommonAncestors(nodes); - } - - void ReorderTree(std::vector<AccessibilityNodeInfoDataWrapper*>& nodes) { - AXTreeSourceArc::TreeOrderer orderer(*tree_source_); - orderer.ReorderTree(nodes); - } - - AccessibilityNodeInfoDataWrapper* GetNodeWrapper(AXNodeInfoData& node) { - auto* node_wrapper = tree_source_->GetFromId(node.id); - return static_cast<AccessibilityNodeInfoDataWrapper*>(node_wrapper); - } - const std::vector<ui::AXNode*>& GetChildren(int32_t node_id) { ui::AXNode* ax_node = tree()->GetFromId(node_id); return ax_node->children(); @@ -182,31 +155,9 @@ EXPECT_EQ(expected, tree_text.substr(first_new_line)); } - // Order contains a list of Ids in the order it should be traversed. - void ExpectTraversalOrder(std::vector<int32_t>& order, - AccessibilityInfoDataWrapper* current_node) { - int index = 0; - ExpectTraversalOrder(order, current_node, &index); - } - void set_full_focus_mode(bool enabled) { full_focus_mode_ = enabled; } private: - void ExpectTraversalOrder(std::vector<int32_t>& order, - AccessibilityInfoDataWrapper* current_node, - int* index) { - EXPECT_NE(current_node, nullptr); - - int32_t current_id = current_node->GetId(); - EXPECT_EQ(current_id, order[*index]); - std::vector<AccessibilityInfoDataWrapper*> children; - current_node->GetChildren(&children); - for (auto* child : children) { - (*index)++; - ExpectTraversalOrder(order, child, index); - } - } - const std::unique_ptr<MockAutomationEventRouter> router_; const std::unique_ptr<AXTreeSourceArc> tree_source_; @@ -1613,207 +1564,4 @@ EXPECT_EQ(ax::mojom::EventFrom::kAction, actual.event_from); EXPECT_EQ(ax::mojom::Action::kDoDefault, actual.event_from_action); } - -TEST_F(AXTreeSourceArcTest, GetLeastCommonAncestors) { - auto event = AXEventData::New(); - event->source_id = 10; - event->task_id = 1; - event->event_type = AXEventType::VIEW_FOCUSED; - - event->window_data = std::vector<mojom::AccessibilityWindowInfoDataPtr>(); - event->window_data->push_back(AXWindowInfoData::New()); - AXWindowInfoData* root_window = event->window_data->back().get(); - root_window->window_id = 100; - root_window->root_node_id = 10; - - // Tree Structure for test - // root[10] - // |-- A[11] - // | |-- 1[21] - // | `-- 2[22] - // `-- B[12] - // |-- 3[31] - // | |-- u[41] - // | |-- v[42] - // | `-- w[43] - // `-- 4[32] - // |-- x[51] - // `-- y[52] - - // Root : 10 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* root = event->node_data.back().get(); - root->id = 10; - SetProperty(root, AXIntListProperty::CHILD_NODE_IDS, {11, 12}); - SetProperty(root, AXBooleanProperty::IMPORTANCE, true); - // A : 11 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_A = event->node_data.back().get(); - node_A->id = 11; - SetProperty(node_A, AXIntListProperty::CHILD_NODE_IDS, {21, 22}); - - // 1 : 21 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_1 = event->node_data.back().get(); - node_1->id = 21; - - // 2 : 22 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_2 = event->node_data.back().get(); - node_2->id = 22; - - // B : 12 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_B = event->node_data.back().get(); - node_B->id = 12; - SetProperty(node_B, AXIntListProperty::CHILD_NODE_IDS, {31, 32}); - - // 3 : 31 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_3 = event->node_data.back().get(); - node_3->id = 31; - SetProperty(node_3, AXIntListProperty::CHILD_NODE_IDS, {41, 42, 43}); - - // 4 : 32 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_4 = event->node_data.back().get(); - node_4->id = 32; - SetProperty(node_4, AXIntListProperty::CHILD_NODE_IDS, {51, 52}); - - // u : 41 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_u = event->node_data.back().get(); - node_u->id = 41; - - // v : 42 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_v = event->node_data.back().get(); - node_v->id = 42; - - // w : 43 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_w = event->node_data.back().get(); - node_w->id = 43; - - // x : 51 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_x = event->node_data.back().get(); - node_x->id = 51; - - // y : 52 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_y = event->node_data.back().get(); - node_y->id = 52; - - CallBuildNodeTree(event.get()); - // Get LCAs for x,w,4 = [4,3] - std::vector<AccessibilityNodeInfoDataWrapper*> nodes{GetNodeWrapper(*node_x), - GetNodeWrapper(*node_w), - GetNodeWrapper(*node_4)}; - auto lcas = GetLeastCommonAncestors(nodes); - EXPECT_TRUE(lcas.find(node_4->id) != lcas.end()); - EXPECT_TRUE(lcas.find(node_3->id) != lcas.end()); - EXPECT_EQ(2U, lcas.size()); -} - -TEST_F(AXTreeSourceArcTest, TreeOrderer) { - auto event = AXEventData::New(); - event->source_id = 10; - event->task_id = 1; - event->event_type = AXEventType::VIEW_FOCUSED; - - event->window_data = std::vector<mojom::AccessibilityWindowInfoDataPtr>(); - event->window_data->push_back(AXWindowInfoData::New()); - AXWindowInfoData* root_window = event->window_data->back().get(); - root_window->window_id = 100; - root_window->root_node_id = 10; - - // Based Tree Structure for test - // TA = Traversal After / TB = Traversal Before - // root[10] - // |-- A[11] - // | |-- 1[21] - // | `-- 2[22] - // `-- B[12] : TB = A - // |-- 3[31] : TA = 4 - // | |-- u[41] - // | |-- v[42] - // | `-- w[43] - // `-- 4[32] - // |-- x[51] - // `-- y[52] - - // Root : 10 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* root = event->node_data.back().get(); - root->id = 10; - SetProperty(root, AXIntListProperty::CHILD_NODE_IDS, {11, 12}); - SetProperty(root, AXBooleanProperty::IMPORTANCE, true); - // A : 11 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_A = event->node_data.back().get(); - node_A->id = 11; - SetProperty(node_A, AXIntListProperty::CHILD_NODE_IDS, {21, 22}); - - // 1 : 21 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_1 = event->node_data.back().get(); - node_1->id = 21; - - // 2 : 22 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_2 = event->node_data.back().get(); - node_2->id = 22; - - // B : 12 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_B = event->node_data.back().get(); - node_B->id = 12; - SetProperty(node_B, AXIntListProperty::CHILD_NODE_IDS, {31, 32}); - SetProperty(node_B, AXIntProperty::TRAVERSAL_BEFORE, 11); - - // 3 : 31 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_3 = event->node_data.back().get(); - node_3->id = 31; - SetProperty(node_3, AXIntListProperty::CHILD_NODE_IDS, {41, 42, 43}); - SetProperty(node_3, AXIntProperty::TRAVERSAL_AFTER, 32); - - // 4 : 32 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_4 = event->node_data.back().get(); - node_4->id = 32; - SetProperty(node_4, AXIntListProperty::CHILD_NODE_IDS, {51, 52}); - - // u : 41 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_u = event->node_data.back().get(); - node_u->id = 41; - - // v : 42 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_v = event->node_data.back().get(); - node_v->id = 42; - - // w : 43 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_w = event->node_data.back().get(); - node_w->id = 43; - - // x : 51 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_x = event->node_data.back().get(); - node_x->id = 51; - - // y : 52 - event->node_data.push_back(AXNodeInfoData::New()); - AXNodeInfoData* node_y = event->node_data.back().get(); - node_y->id = 52; - - auto nodes_to_reorder = CallBuildNodeTree(event.get()); - ReorderTree(nodes_to_reorder); - // Expected order root,B,4,x,y,3,u,v,w,A,1,2 - std::vector<int32_t> order{10, 12, 32, 51, 52, 31, 41, 42, 43, 11, 21, 22}; - ExpectTraversalOrder(order, GetNodeWrapper(*root)); -} } // namespace arc
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn index 899cd25..457ba0f 100644 --- a/chrome/browser/ash/crosapi/BUILD.gn +++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -165,6 +165,8 @@ "migration_progress_tracker.h", "move_migrator.cc", "move_migrator.h", + "multi_capture_service_ash.cc", + "multi_capture_service_ash.h", "native_theme_service_ash.cc", "native_theme_service_ash.h", "network_change_ash.cc",
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.cc b/chrome/browser/ash/crosapi/crosapi_ash.cc index b215e8b..ce59f79 100644 --- a/chrome/browser/ash/crosapi/crosapi_ash.cc +++ b/chrome/browser/ash/crosapi/crosapi_ash.cc
@@ -68,6 +68,7 @@ #include "chrome/browser/ash/crosapi/login_state_ash.h" #include "chrome/browser/ash/crosapi/message_center_ash.h" #include "chrome/browser/ash/crosapi/metrics_reporting_ash.h" +#include "chrome/browser/ash/crosapi/multi_capture_service_ash.h" #include "chrome/browser/ash/crosapi/native_theme_service_ash.h" #include "chrome/browser/ash/crosapi/network_change_ash.h" #include "chrome/browser/ash/crosapi/network_settings_service_ash.h" @@ -123,6 +124,7 @@ #include "chromeos/crosapi/mojom/keystore_service.mojom.h" #include "chromeos/crosapi/mojom/local_printer.mojom.h" #include "chromeos/crosapi/mojom/message_center.mojom.h" +#include "chromeos/crosapi/mojom/multi_capture_service.mojom.h" #include "chromeos/crosapi/mojom/screen_manager.mojom.h" #include "chromeos/crosapi/mojom/select_file.mojom.h" #include "chromeos/crosapi/mojom/task_manager.mojom.h" @@ -227,6 +229,7 @@ message_center_ash_(std::make_unique<MessageCenterAsh>()), metrics_reporting_ash_(registry->CreateMetricsReportingAsh( g_browser_process->metrics_service())), + multi_capture_service_ash_(std::make_unique<MultiCaptureServiceAsh>()), native_theme_service_ash_(std::make_unique<NativeThemeServiceAsh>()), network_change_ash_(std::make_unique<NetworkChangeAsh>()), networking_attributes_ash_(std::make_unique<NetworkingAttributesAsh>()), @@ -620,6 +623,11 @@ metrics_reporting_ash_->BindReceiver(std::move(receiver)); } +void CrosapiAsh::BindMultiCaptureService( + mojo::PendingReceiver<mojom::MultiCaptureService> receiver) { + multi_capture_service_ash_->BindReceiver(std::move(receiver)); +} + void CrosapiAsh::BindNativeThemeService( mojo::PendingReceiver<crosapi::mojom::NativeThemeService> receiver) { native_theme_service_ash_->BindReceiver(std::move(receiver));
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.h b/chrome/browser/ash/crosapi/crosapi_ash.h index 6e45b925..5248925 100644 --- a/chrome/browser/ash/crosapi/crosapi_ash.h +++ b/chrome/browser/ash/crosapi/crosapi_ash.h
@@ -80,6 +80,7 @@ class LoginStateAsh; class MessageCenterAsh; class MetricsReportingAsh; +class MultiCaptureServiceAsh; class NativeThemeServiceAsh; class NetworkChangeAsh; class NetworkSettingsServiceAsh; @@ -254,6 +255,8 @@ receiver) override; void BindMessageCenter( mojo::PendingReceiver<mojom::MessageCenter> receiver) override; + void BindMultiCaptureService( + mojo::PendingReceiver<mojom::MultiCaptureService> receiver) override; void BindMetricsReporting( mojo::PendingReceiver<mojom::MetricsReporting> receiver) override; void BindNativeThemeService( @@ -416,6 +419,10 @@ LoginStateAsh* login_state_ash() { return login_state_ash_.get(); } + MultiCaptureServiceAsh* multi_capture_service_ash() { + return multi_capture_service_ash_.get(); + } + NetworkChangeAsh* network_change_ash() { return network_change_ash_.get(); } NetworkingAttributesAsh* networking_attributes_ash() { @@ -526,6 +533,7 @@ std::unique_ptr<LoginStateAsh> login_state_ash_; std::unique_ptr<MessageCenterAsh> message_center_ash_; std::unique_ptr<MetricsReportingAsh> metrics_reporting_ash_; + std::unique_ptr<MultiCaptureServiceAsh> multi_capture_service_ash_; std::unique_ptr<NativeThemeServiceAsh> native_theme_service_ash_; std::unique_ptr<NetworkChangeAsh> network_change_ash_; std::unique_ptr<NetworkingAttributesAsh> networking_attributes_ash_;
diff --git a/chrome/browser/ash/crosapi/crosapi_util.cc b/chrome/browser/ash/crosapi/crosapi_util.cc index 240166b..2977966 100644 --- a/chrome/browser/ash/crosapi/crosapi_util.cc +++ b/chrome/browser/ash/crosapi/crosapi_util.cc
@@ -91,6 +91,7 @@ #include "chromeos/crosapi/mojom/login_state.mojom.h" #include "chromeos/crosapi/mojom/message_center.mojom.h" #include "chromeos/crosapi/mojom/metrics_reporting.mojom.h" +#include "chromeos/crosapi/mojom/multi_capture_service.mojom.h" #include "chromeos/crosapi/mojom/network_change.mojom.h" #include "chromeos/crosapi/mojom/network_settings_service.mojom.h" #include "chromeos/crosapi/mojom/networking_attributes.mojom.h" @@ -252,7 +253,7 @@ return {T::Uuid_, T::Version_}; } -static_assert(crosapi::mojom::Crosapi::Version_ == 99, +static_assert(crosapi::mojom::Crosapi::Version_ == 100, "If you add a new crosapi, please add it to " "kInterfaceVersionEntries below."); @@ -319,6 +320,7 @@ chromeos::machine_learning::mojom::MachineLearningService>(), MakeInterfaceVersionEntry<crosapi::mojom::MessageCenter>(), MakeInterfaceVersionEntry<crosapi::mojom::MetricsReporting>(), + MakeInterfaceVersionEntry<crosapi::mojom::MultiCaptureService>(), MakeInterfaceVersionEntry<crosapi::mojom::NativeThemeService>(), MakeInterfaceVersionEntry<crosapi::mojom::NetworkChange>(), MakeInterfaceVersionEntry<crosapi::mojom::NetworkingAttributes>(),
diff --git a/chrome/browser/ash/crosapi/multi_capture_service_ash.cc b/chrome/browser/ash/crosapi/multi_capture_service_ash.cc new file mode 100644 index 0000000..aba5d88 --- /dev/null +++ b/chrome/browser/ash/crosapi/multi_capture_service_ash.cc
@@ -0,0 +1,42 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/crosapi/multi_capture_service_ash.h" + +#include "ash/multi_capture/multi_capture_service_client.h" +#include "ash/shell.h" +#include "base/check_is_test.h" + +namespace crosapi { + +MultiCaptureServiceAsh::MultiCaptureServiceAsh() { + if (ash::Shell::HasInstance()) { + multi_capture_client_ = ash::Shell::Get()->multi_capture_service_client(); + DCHECK(multi_capture_client_); + } else { + CHECK_IS_TEST(); + } +} +MultiCaptureServiceAsh::~MultiCaptureServiceAsh() = default; + +void MultiCaptureServiceAsh::BindReceiver( + mojo::PendingReceiver<mojom::MultiCaptureService> receiver) { + multi_capture_service_receiver_set_.Add(this, std::move(receiver)); +} + +void MultiCaptureServiceAsh::MultiCaptureStarted(const std::string& label, + const std::string& host) { + // TODO(crbug.com/1399594): Origin cannot be used in a crosapi interface as it + // is not stable. Currently, only the host of the origin is used. Pass the + // complete origin when the `Origin` interface becomes stable. + multi_capture_client_->MultiCaptureStarted( + label, url::Origin::CreateFromNormalizedTuple(/*scheme=*/"https", host, + /*port=*/443)); +} + +void MultiCaptureServiceAsh::MultiCaptureStopped(const std::string& label) { + multi_capture_client_->MultiCaptureStopped(label); +} + +} // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/multi_capture_service_ash.h b/chrome/browser/ash/crosapi/multi_capture_service_ash.h new file mode 100644 index 0000000..b7dfa4c7 --- /dev/null +++ b/chrome/browser/ash/crosapi/multi_capture_service_ash.h
@@ -0,0 +1,41 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ASH_CROSAPI_MULTI_CAPTURE_SERVICE_ASH_H_ +#define CHROME_BROWSER_ASH_CROSAPI_MULTI_CAPTURE_SERVICE_ASH_H_ + +#include "chromeos/crosapi/mojom/multi_capture_service.mojom.h" +#include "mojo/public/cpp/bindings/receiver_set.h" + +namespace ash { +class MultiCaptureServiceClient; +} // namespace ash + +namespace crosapi { + +// Forwards multi capture events to multi_capture_client_. +class MultiCaptureServiceAsh : public mojom::MultiCaptureService { + public: + // Relies on ash::Shell::Get()->multi_capture_service_client() returning + // a pointer to a valid object. The multi capture service client has to be + // alive for the complete lifetime of this object. + MultiCaptureServiceAsh(); + ~MultiCaptureServiceAsh() override; + + void BindReceiver(mojo::PendingReceiver<mojom::MultiCaptureService> receiver); + + // mojom::MultiCaptureService: + void MultiCaptureStarted(const std::string& label, + const std::string& host) override; + void MultiCaptureStopped(const std::string& label) override; + + private: + mojo::ReceiverSet<mojom::MultiCaptureService> + multi_capture_service_receiver_set_; + base::raw_ptr<ash::MultiCaptureServiceClient> multi_capture_client_ = nullptr; +}; + +} // namespace crosapi + +#endif // CHROME_BROWSER_ASH_CROSAPI_MULTI_CAPTURE_SERVICE_ASH_H_
diff --git a/chrome/browser/ash/file_manager/file_tasks_browsertest.cc b/chrome/browser/ash/file_manager/file_tasks_browsertest.cc index 0ad73be..e00300f 100644 --- a/chrome/browser/ash/file_manager/file_tasks_browsertest.cc +++ b/chrome/browser/ash/file_manager/file_tasks_browsertest.cc
@@ -452,7 +452,7 @@ "https://www.example.com/handle_file"); // Skip past the permission dialog. web_app::WebAppProvider::GetForTest(profile) - ->sync_bridge() + ->sync_bridge_unsafe() .SetAppFileHandlerApprovalState(app_id, web_app::ApiApprovalState::kAllowed); } else {
diff --git a/chrome/browser/ash/policy/active_directory/active_directory_migration_manager.cc b/chrome/browser/ash/policy/active_directory/active_directory_migration_manager.cc index 02a84df..44ad22ed 100644 --- a/chrome/browser/ash/policy/active_directory/active_directory_migration_manager.cc +++ b/chrome/browser/ash/policy/active_directory/active_directory_migration_manager.cc
@@ -155,7 +155,7 @@ // Theoretically, the following reschedule logic is not necessary. However, it // was added as a fallback, in case any of the signals this class listens is - // not triggered as expected. Ultimatelly, we want to avoid inactive devices + // not triggered as expected. Ultimately, we want to avoid inactive devices // getting stuck and not migrating. if (is_on_login_screen && !retry_already_scheduled_) { retry_already_scheduled_ = true;
diff --git a/chrome/browser/ash/settings/device_settings_provider.h b/chrome/browser/ash/settings/device_settings_provider.h index 356b72c9..9fde3e5 100644 --- a/chrome/browser/ash/settings/device_settings_provider.h +++ b/chrome/browser/ash/settings/device_settings_provider.h
@@ -14,8 +14,8 @@ #include "chrome/browser/ash/settings/device_settings_service.h" #include "chromeos/ash/components/settings/cros_settings_provider.h" #include "components/ownership/owner_settings_service.h" -#include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/policy/proto/chrome_device_policy.pb.h" +#include "components/policy/proto/device_management_backend.pb.h" #include "components/prefs/pref_value_map.h" class PrefService;
diff --git a/chrome/browser/ash/settings/device_settings_provider_unittest.cc b/chrome/browser/ash/settings/device_settings_provider_unittest.cc index 86a8218..16e3c14c2 100644 --- a/chrome/browser/ash/settings/device_settings_provider_unittest.cc +++ b/chrome/browser/ash/settings/device_settings_provider_unittest.cc
@@ -10,11 +10,6 @@ #include "ash/constants/ash_features.h" #include "base/bind.h" -#include "base/callback.h" -#include "base/callback_helpers.h" -#include "base/files/file_util.h" -#include "base/json/json_reader.h" -#include "base/path_service.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/scoped_path_override.h" @@ -30,8 +25,6 @@ #include "components/policy/core/common/cloud/test/policy_builder.h" #include "components/policy/proto/chrome_device_policy.pb.h" #include "components/policy/proto/device_management_backend.pb.h" -#include "components/user_manager/fake_user_manager.h" -#include "components/user_manager/user.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -453,7 +446,7 @@ base::ScopedPathOverride user_data_dir_override_; }; -// Same as above, but enrolled into an enterprise +// Same as above, but enrolled into an enterprise. class DeviceSettingsProviderTestEnterprise : public DeviceSettingsProviderTest { protected: void SetUp() override { @@ -750,9 +743,9 @@ ->mutable_disabled_state() ->set_message(kDisabledMessage); BuildAndInstallDevicePolicy(); + // Verify that the device state has been decoded correctly. - const base::Value expected_disabled_value(true); - EXPECT_EQ(expected_disabled_value, *provider_->Get(kDeviceDisabled)); + EXPECT_TRUE(provider_->Get(kDeviceDisabled)); const base::Value expected_disabled_message_value(kDisabledMessage); EXPECT_EQ(expected_disabled_message_value, *provider_->Get(kDeviceDisabledMessage));
diff --git a/chrome/browser/ash/system/device_disabling_browsertest.cc b/chrome/browser/ash/system/device_disabling_browsertest.cc index 1e28054..3ed1f1f 100644 --- a/chrome/browser/ash/system/device_disabling_browsertest.cc +++ b/chrome/browser/ash/system/device_disabling_browsertest.cc
@@ -211,7 +211,7 @@ // Sets the device disabled policy before the browser is started. class PresetPolicyDeviceDisablingTest : public DeviceDisablingTest { public: - PresetPolicyDeviceDisablingTest() {} + PresetPolicyDeviceDisablingTest() = default; PresetPolicyDeviceDisablingTest(const PresetPolicyDeviceDisablingTest&) = delete;
diff --git a/chrome/browser/ash/system/device_disabling_manager.cc b/chrome/browser/ash/system/device_disabling_manager.cc index 30fd5f13..5c73c31 100644 --- a/chrome/browser/ash/system/device_disabling_manager.cc +++ b/chrome/browser/ash/system/device_disabling_manager.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ash/system/device_disabling_manager.h" +#include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/command_line.h" @@ -26,11 +27,9 @@ namespace ash { namespace system { -DeviceDisablingManager::Observer::~Observer() { -} +DeviceDisablingManager::Observer::~Observer() = default; -DeviceDisablingManager::Delegate::~Delegate() { -} +DeviceDisablingManager::Delegate::~Delegate() = default; DeviceDisablingManager::DeviceDisablingManager( Delegate* delegate, @@ -45,8 +44,7 @@ CHECK(delegate_); } -DeviceDisablingManager::~DeviceDisablingManager() { -} +DeviceDisablingManager::~DeviceDisablingManager() = default; void DeviceDisablingManager::AddObserver(Observer* observer) { observers_.AddObserver(observer); @@ -98,7 +96,7 @@ } if (browser_policy_connector_->GetDeviceMode() == - policy::DEVICE_MODE_PENDING) { + policy::DEVICE_MODE_PENDING) { // If the device mode is not known yet, request to be called back once it // becomes known. browser_policy_connector_->GetInstallAttributes()->ReadImmutableAttributes( @@ -109,7 +107,7 @@ } if (browser_policy_connector_->GetDeviceMode() != - policy::DEVICE_MODE_NOT_SET) { + policy::DEVICE_MODE_NOT_SET) { // If the device is owned already, this method must have been called after // OOBE, which is an error. Indicate that the device is not disabled to // prevent spurious disabling. Actual device disabling after OOBE will be @@ -154,13 +152,22 @@ // static bool DeviceDisablingManager::IsDeviceDisabledDuringNormalOperation() { - bool device_disabled = false; - CrosSettings::Get()->GetBoolean(kDeviceDisabled, &device_disabled); - if (device_disabled && HonorDeviceDisablingDuringNormalOperation()) { + if (!HonorDeviceDisablingDuringNormalOperation()) { + return false; + } + + // If Chromad features are disabled via flag, and the device is AD managed, we + // force disable the device. + if (!features::IsChromadAvailableEnabled() && + g_browser_process->platform_part() + ->browser_policy_connector_ash() + ->IsActiveDirectoryManaged()) { return true; } - return false; + bool device_disabled = false; + CrosSettings::Get()->GetBoolean(kDeviceDisabled, &device_disabled); + return device_disabled; } // static @@ -183,17 +190,10 @@ return; } - if (!HonorDeviceDisablingDuringNormalOperation()) { - // If the device is not enterprise managed or device disabling has been - // turned of by flag, device disabling is not available. - return; - } - - bool should_device_be_disabled = false; - if (!cros_settings_->GetBoolean(kDeviceDisabled, - &should_device_be_disabled) || - !should_device_be_disabled) { - // The device should not be disabled. + if (!IsDeviceDisabledDuringNormalOperation()) { + // The device should not be disabled because: (a) device is not enterprise + // managed, (b) device disabling has been turned off by flag, or (c) + // cros settings indicates that device should not be disabled. if (!device_disabled_) { // If the device is currently not disabled, there is nothing to do.
diff --git a/chrome/browser/ash/system/device_disabling_manager.h b/chrome/browser/ash/system/device_disabling_manager.h index e57cf46..8d5754f 100644 --- a/chrome/browser/ash/system/device_disabling_manager.h +++ b/chrome/browser/ash/system/device_disabling_manager.h
@@ -45,7 +45,7 @@ // 2) If a session is in progress, the session is terminated. After Chrome has // restarted on the login screen, the disabled screen is shown per 1). // This ensures that when a device is disabled, there is never any user -// session running in the backround. +// session running in the background. // When the device is re-enabled, Chrome is restarted once more to resume the // regular login screen flows from a known-good point. class DeviceDisablingManager {
diff --git a/chrome/browser/ash/system/device_disabling_manager_unittest.cc b/chrome/browser/ash/system/device_disabling_manager_unittest.cc index 63ce719..5d6b368 100644 --- a/chrome/browser/ash/system/device_disabling_manager_unittest.cc +++ b/chrome/browser/ash/system/device_disabling_manager_unittest.cc
@@ -6,12 +6,14 @@ #include <memory> +#include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/callback_helpers.h" #include "base/command_line.h" #include "base/memory/ref_counted.h" #include "base/run_loop.h" +#include "base/test/scoped_feature_list.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.h" #include "chrome/browser/ash/policy/core/device_policy_builder.h" @@ -43,10 +45,11 @@ const char kTestUser[] = "user@example.com"; const char kEnrollmentDomain[] = "example.com"; +const char kDeviceId[] = "fake-id"; const char kDisabledMessage1[] = "Device disabled 1."; const char kDisabledMessage2[] = "Device disabled 2."; -} +} // namespace class DeviceDisablingManagerTestBase : public testing::Test, public DeviceDisablingManager::Delegate { @@ -75,7 +78,8 @@ // Configure install attributes. void SetUnowned(); - void SetEnterpriseOwned(); + void SetEnterpriseCloudOwned(); + void SetEnterpriseActiveDirectoryOwned(); void SetConsumerOwned(); private: @@ -112,9 +116,14 @@ cros_settings_test_helper_.InstallAttributes()->Clear(); } -void DeviceDisablingManagerTestBase::SetEnterpriseOwned() { +void DeviceDisablingManagerTestBase::SetEnterpriseCloudOwned() { cros_settings_test_helper_.InstallAttributes()->SetCloudManaged( - kEnrollmentDomain, "fake-id"); + kEnrollmentDomain, kDeviceId); +} + +void DeviceDisablingManagerTestBase::SetEnterpriseActiveDirectoryOwned() { + cros_settings_test_helper_.InstallAttributes()->SetActiveDirectoryManaged( + kEnrollmentDomain, kDeviceId); } void DeviceDisablingManagerTestBase::SetConsumerOwned() { @@ -149,11 +158,10 @@ chromeos::system::FakeStatisticsProvider statistics_provider_; base::RunLoop run_loop_; - bool device_disabled_; + bool device_disabled_ = false; }; -DeviceDisablingManagerOOBETest::DeviceDisablingManagerOOBETest() - : device_disabled_(false) { +DeviceDisablingManagerOOBETest::DeviceDisablingManagerOOBETest() { EXPECT_CALL(*this, RestartToLoginScreen()).Times(0); EXPECT_CALL(*this, ShowDeviceDisabledScreen()).Times(0); } @@ -209,8 +217,8 @@ } // Verifies that the device is not considered disabled during OOBE when device -// disabling is turned off by flag, even if the device is marked as disabled. -TEST_F(DeviceDisablingManagerOOBETest, NotDisabledWhenTurnedOffByFlag) { +// disabling is turned off by switch, even if the device is marked as disabled. +TEST_F(DeviceDisablingManagerOOBETest, NotDisabledWhenTurnedOffBySwitch) { base::CommandLine::ForCurrentProcess()->AppendSwitch( switches::kDisableDeviceDisabling); SetDeviceDisabled(true); @@ -221,13 +229,27 @@ // Verifies that the device is not considered disabled during OOBE when it is // already enrolled, even if the device is marked as disabled. TEST_F(DeviceDisablingManagerOOBETest, NotDisabledWhenEnterpriseOwned) { - SetEnterpriseOwned(); + SetEnterpriseCloudOwned(); SetDeviceDisabled(true); CheckWhetherDeviceDisabledDuringOOBE(); EXPECT_FALSE(device_disabled()); } // Verifies that the device is not considered disabled during OOBE when it is +// enrolled in AD mode, even if the device is marked as disabled and Chromad is +// disabled by flag. +TEST_F(DeviceDisablingManagerOOBETest, NotDisabledWhenAdOwnedChromadDisabled) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature(features::kChromadAvailable); + SetEnterpriseActiveDirectoryOwned(); + SetDeviceDisabled(true); + + CheckWhetherDeviceDisabledDuringOOBE(); + + EXPECT_FALSE(device_disabled()); +} + +// Verifies that the device is not considered disabled during OOBE when it is // already owned by a consumer, even if the device is marked as disabled. TEST_F(DeviceDisablingManagerOOBETest, NotDisabledWhenConsumerOwned) { SetConsumerOwned(); @@ -280,8 +302,7 @@ policy::DevicePolicyBuilder device_policy_; }; -DeviceDisablingManagerTest::DeviceDisablingManagerTest() { -} +DeviceDisablingManagerTest::DeviceDisablingManagerTest() = default; void DeviceDisablingManagerTest::TearDown() { DeviceSettingsService::Get()->UnsetSessionManager(); @@ -320,8 +341,10 @@ void DeviceDisablingManagerTest::SetDisabledMessage( const std::string& disabled_message) { - device_policy_.policy_data().mutable_device_state()-> - mutable_disabled_state()->set_message(disabled_message); + device_policy_.policy_data() + .mutable_device_state() + ->mutable_disabled_state() + ->set_message(disabled_message); SimulatePolicyFetch(); } @@ -335,7 +358,7 @@ // Verifies that the device is not considered disabled by default when it is // enrolled for enterprise management. TEST_F(DeviceDisablingManagerTest, NotDisabledByDefault) { - SetEnterpriseOwned(); + SetEnterpriseCloudOwned(); MakeCrosSettingsTrusted(); EXPECT_CALL(*this, RestartToLoginScreen()).Times(0); @@ -347,7 +370,7 @@ // Verifies that the device is not considered disabled when it is explicitly // marked as not disabled. TEST_F(DeviceDisablingManagerTest, NotDisabledWhenExplicitlyNotDisabled) { - SetEnterpriseOwned(); + SetEnterpriseCloudOwned(); MakeCrosSettingsTrusted(); SetDeviceDisabled(false); @@ -358,11 +381,30 @@ } // Verifies that the device is not considered disabled when device disabling is -// turned off by flag, even if the device is marked as disabled. -TEST_F(DeviceDisablingManagerTest, NotDisabledWhenTurnedOffByFlag) { +// turned off by switch, even if the device is marked as disabled. +TEST_F(DeviceDisablingManagerTest, + NotDisabledWhenTurnedOffBySwitchCloudManaged) { base::CommandLine::ForCurrentProcess()->AppendSwitch( switches::kDisableDeviceDisabling); - SetEnterpriseOwned(); + SetEnterpriseCloudOwned(); + MakeCrosSettingsTrusted(); + SetDeviceDisabled(true); + + EXPECT_CALL(*this, RestartToLoginScreen()).Times(0); + EXPECT_CALL(*this, ShowDeviceDisabledScreen()).Times(0); + EXPECT_CALL(*this, OnDisabledMessageChanged(_)).Times(0); + CreateDeviceDisablingManager(); +} + +// Verifies that the device is not considered disabled when device disabling is +// turned off by switch, even if the device is AD managed. +TEST_F(DeviceDisablingManagerTest, NotDisabledWhenTurnedOffBySwitchAdManaged) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature(features::kChromadAvailable); + + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kDisableDeviceDisabling); + SetEnterpriseActiveDirectoryOwned(); MakeCrosSettingsTrusted(); SetDeviceDisabled(true); @@ -385,10 +427,44 @@ CreateDeviceDisablingManager(); } +// Verifies that AD device is not considered disabled when Chromad is enabled +// via flag, and the device is explicitly marked as not disabled. +TEST_F(DeviceDisablingManagerTest, NotDisabledWhenAdManagedAndChromadEnabled) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(features::kChromadAvailable); + + SetEnterpriseActiveDirectoryOwned(); + MakeCrosSettingsTrusted(); + SetDeviceDisabled(false); + + EXPECT_CALL(*this, RestartToLoginScreen()).Times(0); + EXPECT_CALL(*this, ShowDeviceDisabledScreen()).Times(0); + EXPECT_CALL(*this, OnDisabledMessageChanged(_)).Times(0); + CreateDeviceDisablingManager(); +} + +// Verifies that AD device is considered disabled when Chromad is disabled via +// flag, even when it is explicitly marked as not disabled. +TEST_F(DeviceDisablingManagerTest, DisabledWhenAdManagedAndChromadDisabled) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature(features::kChromadAvailable); + + SetEnterpriseActiveDirectoryOwned(); + MakeCrosSettingsTrusted(); + SetDisabledMessage(""); + SetDeviceDisabled(false); + + EXPECT_CALL(*this, RestartToLoginScreen()).Times(0); + EXPECT_CALL(*this, ShowDeviceDisabledScreen()).Times(1); + EXPECT_CALL(*this, OnDisabledMessageChanged(_)).Times(0); + CreateDeviceDisablingManager(); + EXPECT_TRUE(GetDeviceDisablingManager()->disabled_message().empty()); +} + // Verifies that the device disabled screen is shown immediately when the device // is already marked as disabled on start-up. TEST_F(DeviceDisablingManagerTest, DisabledOnLoginScreen) { - SetEnterpriseOwned(); + SetEnterpriseCloudOwned(); MakeCrosSettingsTrusted(); SetDisabledMessage(kDisabledMessage1); SetDeviceDisabled(true); @@ -406,7 +482,7 @@ // becomes disabled while the login screen is showing. Also verifies that Chrome // restarts when the device becomes enabled again. TEST_F(DeviceDisablingManagerTest, DisableAndReEnableOnLoginScreen) { - SetEnterpriseOwned(); + SetEnterpriseCloudOwned(); MakeCrosSettingsTrusted(); SetDisabledMessage(kDisabledMessage1); @@ -450,7 +526,7 @@ // Verifies that Chrome restarts when the device becomes disabled while a // session is in progress. TEST_F(DeviceDisablingManagerTest, DisableDuringSession) { - SetEnterpriseOwned(); + SetEnterpriseCloudOwned(); MakeCrosSettingsTrusted(); SetDisabledMessage(kDisabledMessage1); LogIn(); @@ -473,28 +549,87 @@ // Verifies that the HonorDeviceDisablingDuringNormalOperation() method returns // true iff the device is enterprise enrolled and device disabling is not turned -// off by flag. +// off by switch. TEST_F(DeviceDisablingManagerTest, HonorDeviceDisablingDuringNormalOperation) { - // Not enterprise owned, not disabled by flag. + // Not enterprise owned, not disabled by switch. EXPECT_FALSE( DeviceDisablingManager::HonorDeviceDisablingDuringNormalOperation()); - // Enterprise owned, not disabled by flag. - SetEnterpriseOwned(); + // Enterprise owned, not disabled by switch. + SetEnterpriseCloudOwned(); EXPECT_TRUE( DeviceDisablingManager::HonorDeviceDisablingDuringNormalOperation()); - // Enterprise owned, disabled by flag. + // Enterprise owned, disabled by switch. base::CommandLine::ForCurrentProcess()->AppendSwitch( switches::kDisableDeviceDisabling); EXPECT_FALSE( DeviceDisablingManager::HonorDeviceDisablingDuringNormalOperation()); - // Not enterprise owned, disabled by flag. + // Not enterprise owned, disabled by switch. SetUnowned(); EXPECT_FALSE( DeviceDisablingManager::HonorDeviceDisablingDuringNormalOperation()); } +// Tests the IsDeviceDisabledDuringNormalOperation() method, when device +// disabling is turned off by switch. +TEST_F(DeviceDisablingManagerTest, IsDeviceDisabledWhenTurnedOffBySwitch) { + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kDisableDeviceDisabling); + MakeCrosSettingsTrusted(); + SetDeviceDisabled(true); + + // Not enterprise owned. + SetConsumerOwned(); + EXPECT_FALSE(DeviceDisablingManager::IsDeviceDisabledDuringNormalOperation()); + + // Enterprise cloud owned. + SetEnterpriseCloudOwned(); + EXPECT_FALSE(DeviceDisablingManager::IsDeviceDisabledDuringNormalOperation()); + + // Enterprise AD owned. + SetEnterpriseActiveDirectoryOwned(); + EXPECT_FALSE(DeviceDisablingManager::IsDeviceDisabledDuringNormalOperation()); +} + +// Tests the IsDeviceDisabledDuringNormalOperation() method, when device +// is not enterprise owned. +TEST_F(DeviceDisablingManagerTest, IsDeviceDisabledNotEnterpriseOwned) { + SetConsumerOwned(); + MakeCrosSettingsTrusted(); + SetDeviceDisabled(true); + + EXPECT_FALSE(DeviceDisablingManager::IsDeviceDisabledDuringNormalOperation()); +} + +// Tests the IsDeviceDisabledDuringNormalOperation() method, when device is +// enterprise owned. +TEST_F(DeviceDisablingManagerTest, IsDeviceDisabledEnterpriseOwned) { + SetEnterpriseCloudOwned(); + MakeCrosSettingsTrusted(); + SetDeviceDisabled(false); + + EXPECT_FALSE(DeviceDisablingManager::IsDeviceDisabledDuringNormalOperation()); + + SetDeviceDisabled(true); + + EXPECT_TRUE(DeviceDisablingManager::IsDeviceDisabledDuringNormalOperation()); +} + +// Tests the IsDeviceDisabledDuringNormalOperation() method, when device is +// enterprise AD owned, Chromad disabled by flag. +TEST_F(DeviceDisablingManagerTest, IsDeviceDisabledChromadDisabled) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature(features::kChromadAvailable); + + // Enterprise AD owned. + SetEnterpriseActiveDirectoryOwned(); + MakeCrosSettingsTrusted(); + SetDeviceDisabled(false); + + EXPECT_TRUE(DeviceDisablingManager::IsDeviceDisabledDuringNormalOperation()); +} + } // namespace system } // namespace ash
diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h index f365449..a640eeb 100644 --- a/chrome/browser/browser_process.h +++ b/chrome/browser/browser_process.h
@@ -42,6 +42,7 @@ class WebRtcLogUploader; #if !BUILDFLAG(IS_ANDROID) +class HidSystemTrayIcon; class IntranetRedirectDetector; #endif @@ -264,6 +265,10 @@ // Returns the object which keeps track of Human Interface Device (HID) // permissions configured through the policy engine. virtual HidPolicyAllowedDevices* hid_policy_allowed_devices() = 0; + + // Returns the object which maintains Human Interface Device (HID) system tray + // icon. + virtual HidSystemTrayIcon* hid_system_tray_icon() = 0; #endif virtual BuildState* GetBuildState() = 0;
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc index 7436814..b924f22 100644 --- a/chrome/browser/browser_process_impl.cc +++ b/chrome/browser/browser_process_impl.cc
@@ -168,6 +168,7 @@ #include "chrome/browser/devtools/devtools_auto_opener.h" #include "chrome/browser/gcm/gcm_product_util.h" #include "chrome/browser/hid/hid_policy_allowed_devices.h" +#include "chrome/browser/hid/hid_system_tray_icon.h" #include "chrome/browser/intranet_redirect_detector.h" #include "chrome/browser/lifetime/application_lifetime_desktop.h" #include "chrome/browser/resource_coordinator/tab_manager.h" @@ -220,6 +221,9 @@ #if BUILDFLAG(IS_CHROMEOS) #include "chrome/browser/chromeos/extensions/telemetry/chromeos_telemetry_extensions_browser_api_provider.h" +#include "chrome/browser/hid/hid_pinned_notification.h" +#elif !BUILDFLAG(IS_ANDROID) +#include "chrome/browser/hid/hid_status_icon.h" #endif #if BUILDFLAG(IS_WIN) || (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) @@ -364,6 +368,14 @@ std::make_unique<ChromeWebAuthnClientAndroid>()); } #endif + +#if !BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_CHROMEOS) + hid_system_tray_icon_ = std::make_unique<HidPinnedNotification>(); +#else + hid_system_tray_icon_ = std::make_unique<HidStatusIcon>(); +#endif // BUILDFLAG(IS_CHROMEOS) +#endif // !BUILDFLAG(IS_ANDROID) } #if !BUILDFLAG(IS_ANDROID) @@ -421,6 +433,13 @@ cloud_management_controller->ShutDown(); #endif +#if !BUILDFLAG(IS_ANDROID) + // |hid_system_tray_icon_| must be destroyed before + // |system_notification_helper_| for ChromeOS and |status_tray_| for + // non-ChromeOS. + hid_system_tray_icon_.reset(); +#endif + system_notification_helper_.reset(); #if BUILDFLAG(ENABLE_CHROME_NOTIFICATIONS) @@ -954,6 +973,11 @@ } return hid_policy_allowed_devices_.get(); } + +HidSystemTrayIcon* BrowserProcessImpl::hid_system_tray_icon() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + return hid_system_tray_icon_.get(); +} #endif BuildState* BrowserProcessImpl::GetBuildState() {
diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_process_impl.h index a649553..ecae3d0e 100644 --- a/chrome/browser/browser_process_impl.h +++ b/chrome/browser/browser_process_impl.h
@@ -206,6 +206,7 @@ #if !BUILDFLAG(IS_ANDROID) SerialPolicyAllowedPorts* serial_policy_allowed_ports() override; HidPolicyAllowedDevices* hid_policy_allowed_devices() override; + HidSystemTrayIcon* hid_system_tray_icon() override; #endif BuildState* GetBuildState() override; @@ -420,6 +421,7 @@ std::unique_ptr<SerialPolicyAllowedPorts> serial_policy_allowed_ports_; std::unique_ptr<HidPolicyAllowedDevices> hid_policy_allowed_devices_; + std::unique_ptr<HidSystemTrayIcon> hid_system_tray_icon_; BuildState build_state_; #endif
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc index 66690a4..d342738 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -801,6 +801,10 @@ host_content_settings_map_->ClearSettingsForOneTypeWithPredicate( ContentSettingsType::NOTIFICATION_PERMISSION_REVIEW, delete_begin_, delete_end_, website_settings_filter); + + host_content_settings_map_->ClearSettingsForOneTypeWithPredicate( + ContentSettingsType::REVOKED_UNUSED_SITE_PERMISSIONS, delete_begin_, + delete_end_, website_settings_filter); #endif host_content_settings_map_->ClearSettingsForOneTypeWithPredicate(
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index ada17eb..2849f6b 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -1453,8 +1453,7 @@ ChromeContentBrowserClient::IsClipboardPasteContentAllowedCallback callback, const enterprise_connectors::ContentAnalysisDelegate::Data& data, - const enterprise_connectors::ContentAnalysisDelegate::Result& - result) { + enterprise_connectors::ContentAnalysisDelegate::Result& result) { absl::optional<std::string> final_data; auto blocked = fsd->IndexesToBlock(result.paths_results); if (blocked.size() != paths.size()) { @@ -1464,6 +1463,9 @@ for (size_t i = 0; i < paths.size(); ++i) { if (blocked.count(i) == 0) { string_paths.push_back(paths[i].AsUTF8Unsafe()); + DCHECK(result.paths_results[i]); + } else { + result.paths_results[i] = false; } } final_data = base::JoinString(string_paths, "\n"); @@ -1486,8 +1488,7 @@ [](ChromeContentBrowserClient::IsClipboardPasteContentAllowedCallback callback, const enterprise_connectors::ContentAnalysisDelegate::Data& data, - const enterprise_connectors::ContentAnalysisDelegate::Result& - result) { + enterprise_connectors::ContentAnalysisDelegate::Result& result) { std::move(callback).Run( result.text_results[0] ? absl::optional<std::string>(data.text[0])
diff --git a/chrome/browser/dips/dips_bounce_detector.cc b/chrome/browser/dips/dips_bounce_detector.cc index bbbd72e..93e915e7 100644 --- a/chrome/browser/dips/dips_bounce_detector.cc +++ b/chrome/browser/dips/dips_bounce_detector.cc
@@ -13,6 +13,7 @@ #include "base/time/default_tick_clock.h" #include "base/time/time.h" #include "chrome/browser/dips/cookie_access_filter.h" +#include "chrome/browser/dips/dips_redirect_info.h" #include "chrome/browser/dips/dips_service.h" #include "chrome/browser/dips/dips_utils.h" #include "chrome/browser/profiles/profile.h" @@ -26,7 +27,6 @@ #include "chrome/browser/ash/profiles/profile_helper.h" #endif -using blink::mojom::EngagementLevel; using content::NavigationHandle; ServerBounceDetectionState::ServerBounceDetectionState() = default; @@ -92,17 +92,12 @@ // DIPSRedirectContext which is owned by `this`, and the delegate must // outlive `this`. redirect_context_( - base::BindRepeating(&DIPSBounceDetectorDelegate::HandleRedirect, + base::BindRepeating(&DIPSBounceDetectorDelegate::HandleRedirectChain, base::Unretained(delegate)), /*initial_url=*/GURL::EmptyGURL()) {} DIPSBounceDetector::~DIPSBounceDetector() = default; -void DIPSBounceDetector::SetRedirectHandlerForTesting( - DIPSRedirectHandler handler) { - redirect_context_.SetRedirectHandlerForTesting(handler); // IN-TEST -} - DIPSBounceDetectorDelegate::~DIPSBounceDetectorDelegate() = default; DIPSNavigationHandle::~DIPSNavigationHandle() = default; @@ -112,7 +107,7 @@ base::PassKey<DIPSNavigationHandle>(), GetRedirectChain()[index]); } -DIPSRedirectContext::DIPSRedirectContext(DIPSRedirectHandler handler, +DIPSRedirectContext::DIPSRedirectContext(DIPSRedirectChainHandler handler, const GURL& initial_url) : handler_(handler), initial_url_(initial_url) {} @@ -163,12 +158,10 @@ // so |redirects_.size()| may not tell us the correct chain length. Instead, // use the index of the last item in the chain (since it was generated based // on the committed chain length). - DIPSRedirectChainInfo chain(initial_url_, url, - redirects_.back()->index + 1); - for (const auto& redirect : redirects_) { - handler_.Run(*redirect, chain); - } - redirects_.clear(); + auto chain = std::make_unique<DIPSRedirectChainInfo>( + initial_url_, url, redirects_.back()->index + 1); + handler_.Run(std::move(redirects_), std::move(chain)); + // note: redirects_ is now guaranteed to be empty } initial_url_ = std::move(url); @@ -201,10 +194,10 @@ return web_contents()->GetPrimaryMainFrame()->GetPageUkmSourceId(); } -void DIPSWebContentsObserver::HandleRedirect( - const DIPSRedirectInfo& redirect, - const DIPSRedirectChainInfo& chain) { - dips_service_->HandleRedirect(redirect, chain); +void DIPSWebContentsObserver::HandleRedirectChain( + std::vector<DIPSRedirectInfoPtr> redirects, + DIPSRedirectChainInfoPtr chain) { + dips_service_->HandleRedirectChain(std::move(redirects), std::move(chain)); } // A thin wrapper around NavigationHandle to implement DIPSNavigationHandle.
diff --git a/chrome/browser/dips/dips_bounce_detector.h b/chrome/browser/dips/dips_bounce_detector.h index 6018e56a..478287d 100644 --- a/chrome/browser/dips/dips_bounce_detector.h +++ b/chrome/browser/dips/dips_bounce_detector.h
@@ -58,7 +58,8 @@ // calls to EndChain(). class DIPSRedirectContext { public: - DIPSRedirectContext(DIPSRedirectHandler handler, const GURL& initial_url); + DIPSRedirectContext(DIPSRedirectChainHandler handler, + const GURL& initial_url); ~DIPSRedirectContext(); // If committed=true, appends the client and server redirects to the current @@ -68,13 +69,14 @@ DIPSNavigationStart navigation_start, std::vector<DIPSRedirectInfoPtr>&& server_redirects, GURL final_url); - // Terminates the current redirect chain and calls the DIPSRedirectHandler for - // each entry. Starts a new chain for later calls to Append() to add to. + // Terminates the current redirect chain and calls the + // DIPSRedirectChainHandler with it. Starts a new chain for later calls to + // Append() to add to. void EndChain(GURL url); size_t size() const { return redirects_.size(); } - void SetRedirectHandlerForTesting(DIPSRedirectHandler handler) { + void SetRedirectChainHandlerForTesting(DIPSRedirectChainHandler handler) { handler_ = handler; } @@ -83,7 +85,7 @@ void Append(DIPSNavigationStart navigation_start, std::vector<DIPSRedirectInfoPtr>&& server_redirects); - DIPSRedirectHandler handler_; + DIPSRedirectChainHandler handler_; GURL initial_url_; std::vector<DIPSRedirectInfoPtr> redirects_; }; @@ -95,8 +97,8 @@ virtual ~DIPSBounceDetectorDelegate(); virtual const GURL& GetLastCommittedURL() const = 0; virtual ukm::SourceId GetPageUkmSourceId() const = 0; - virtual void HandleRedirect(const DIPSRedirectInfo&, - const DIPSRedirectChainInfo&) = 0; + virtual void HandleRedirectChain(std::vector<DIPSRedirectInfoPtr> redirects, + DIPSRedirectChainInfoPtr chain) = 0; virtual void RecordEvent(DIPSRecordedEvent event, const GURL& url, const base::Time& time) = 0; @@ -173,7 +175,9 @@ // Use the passed handler instead of // DIPSBounceDetectorDelegate::HandleRedirect(). - void SetRedirectHandlerForTesting(DIPSRedirectHandler handler); + void SetRedirectChainHandlerForTesting(DIPSRedirectChainHandler handler) { + redirect_context_.SetRedirectChainHandlerForTesting(handler); + } private: raw_ptr<const base::TickClock> tick_clock_; @@ -193,8 +197,8 @@ ~DIPSWebContentsObserver() override; - void SetRedirectHandlerForTesting(DIPSRedirectHandler handler) { - detector_.SetRedirectHandlerForTesting(handler); + void SetRedirectChainHandlerForTesting(DIPSRedirectChainHandler handler) { + detector_.SetRedirectChainHandlerForTesting(handler); } void SetClockForTesting(base::Clock* clock) { @@ -209,8 +213,8 @@ // DIPSBounceDetectorDelegate overrides: const GURL& GetLastCommittedURL() const override; ukm::SourceId GetPageUkmSourceId() const override; - void HandleRedirect(const DIPSRedirectInfo& redirect, - const DIPSRedirectChainInfo& chain) override; + void HandleRedirectChain(std::vector<DIPSRedirectInfoPtr> redirects, + DIPSRedirectChainInfoPtr chain) override; void RecordEvent(DIPSRecordedEvent event, const GURL& url, const base::Time& time) override;
diff --git a/chrome/browser/dips/dips_bounce_detector_browsertest.cc b/chrome/browser/dips/dips_bounce_detector_browsertest.cc index a00920f1..ecd8de3 100644 --- a/chrome/browser/dips/dips_bounce_detector_browsertest.cc +++ b/chrome/browser/dips/dips_bounce_detector_browsertest.cc
@@ -22,7 +22,6 @@ #include "net/test/embedded_test_server/request_handler_util.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "testing/gmock/include/gmock/gmock.h" -#include "third_party/blink/public/mojom/site_engagement/site_engagement.mojom-shared.h" #include "third_party/metrics_proto/ukm/source.pb.h" #if BUILDFLAG(IS_ANDROID) @@ -32,7 +31,6 @@ #endif using base::Bucket; -using blink::mojom::EngagementLevel; using content::NavigationHandle; using content::WebContents; using testing::ElementsAre; @@ -106,6 +104,14 @@ FormatURL(chain.final_url).c_str())); } +void AppendRedirects(std::vector<std::string>* vec, + std::vector<DIPSRedirectInfoPtr> redirects, + DIPSRedirectChainInfoPtr chain) { + for (const auto& redirect : redirects) { + AppendRedirect(vec, *redirect, *chain); + } +} + } // namespace // Keeps a log of DidStartNavigation, OnCookiesAccessed, and DidFinishNavigation @@ -210,8 +216,8 @@ } void StartAppendingRedirectsTo(std::vector<std::string>* redirects) { - web_contents_observer_->SetRedirectHandlerForTesting( - base::BindRepeating(&AppendRedirect, redirects)); + web_contents_observer_->SetRedirectChainHandlerForTesting( + base::BindRepeating(&AppendRedirects, redirects)); } void CreateImageAndWaitForCookieAccess(const GURL& image_url) {
diff --git a/chrome/browser/dips/dips_bounce_detector_unittest.cc b/chrome/browser/dips/dips_bounce_detector_unittest.cc index 13f38a3..ddfcf5a 100644 --- a/chrome/browser/dips/dips_bounce_detector_unittest.cc +++ b/chrome/browser/dips/dips_bounce_detector_unittest.cc
@@ -20,11 +20,9 @@ #include "services/metrics/public/cpp/ukm_source_id.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/mojom/site_engagement/site_engagement.mojom-shared.h" using base::Bucket; using base::PassKey; -using blink::mojom::EngagementLevel; using testing::ElementsAre; using testing::Eq; using testing::Gt; @@ -62,16 +60,20 @@ // DIPSBounceDetectorDelegate overrides: const GURL& GetLastCommittedURL() const override { return committed_url_; } ukm::SourceId GetPageUkmSourceId() const override { return source_id_; } - void HandleRedirect(const DIPSRedirectInfo& redirect, - const DIPSRedirectChainInfo& chain) override { - DCHECK(redirect.access_type != CookieAccessType::kUnknown); - AppendRedirect(&redirects_, redirect, chain); - DIPSService::HandleRedirectForTesting( - redirect, chain, GetEngagementLevel(redirect.url), - DIPSCookieMode::kStandard, - base::BindRepeating(&TestBounceDetectorDelegate::RecordBounce, - base::Unretained(this))); + void HandleRedirectChain(std::vector<DIPSRedirectInfoPtr> redirects, + DIPSRedirectChainInfoPtr chain) override { + chain->cookie_mode = DIPSCookieMode::kStandard; + for (auto& redirect : redirects) { + redirect->has_interaction = GetSiteHasInteraction(redirect->url); + DCHECK(redirect->access_type != CookieAccessType::kUnknown); + AppendRedirect(&redirects_, *redirect, *chain); + + DIPSService::HandleRedirectForTesting( + *redirect, *chain, + base::BindRepeating(&TestBounceDetectorDelegate::RecordBounce, + base::Unretained(this))); + } } void RecordEvent(DIPSRecordedEvent event, @@ -83,8 +85,12 @@ return url_by_source_id_[source_id]; } - void SetSiteEngagementLevel(const GURL& url, EngagementLevel level) { - level_by_site[GetSiteForDIPS(url)] = level; + bool GetSiteHasInteraction(const GURL& url) { + return site_has_interaction_[GetSiteForDIPS(url)]; + } + + void SetSiteHasInteraction(const GURL& url) { + site_has_interaction_[GetSiteForDIPS(url)] = true; } void SetCommittedURL(PassKey<FakeNavigation>, const GURL& url) { @@ -100,14 +106,6 @@ const std::vector<std::string>& redirects() const { return redirects_; } private: - EngagementLevel GetEngagementLevel(const GURL& url) const { - auto iter = level_by_site.find(GetSiteForDIPS(url)); - if (iter == level_by_site.end()) { - return EngagementLevel::NONE; - } - return iter->second; - } - void RecordBounce(bool stateful, const GURL& url, base::Time time) { recorded_bounces_.insert(std::make_tuple(url, time, stateful)); } @@ -115,7 +113,7 @@ GURL committed_url_; ukm::SourceId source_id_; std::map<ukm::SourceId, std::string> url_by_source_id_; - std::map<std::string, EngagementLevel> level_by_site; + std::map<std::string, bool> site_has_interaction_; std::vector<std::string> redirects_; std::set<std::tuple<GURL, base::Time, bool>> recorded_bounces_; }; @@ -216,8 +214,8 @@ return delegate_.URLForSourceId(source_id); } - void SetSiteEngagementLevel(const std::string& url, EngagementLevel level) { - return delegate_.SetSiteEngagementLevel(GURL(url), level); + void SetSiteHasInteraction(const std::string& url) { + return delegate_.SetSiteHasInteraction(GURL(url)); } std::set<std::tuple<GURL, base::Time, bool>> GetRecordedBounces() { @@ -417,7 +415,7 @@ TEST_F(DIPSBounceDetectorTest, Histograms_UMA) { base::HistogramTester histograms; - SetSiteEngagementLevel("http://b.test", EngagementLevel::LOW); + SetSiteHasInteraction("http://b.test"); NavigateTo("http://a.test", kWithUserGesture); NavigateTo("http://b.test", kWithUserGesture); @@ -459,8 +457,7 @@ base::test::SingleThreadTaskEnvironment task_environment; ukm::TestAutoSetUkmRecorder ukm_recorder; - SetSiteEngagementLevel("http://b.test", EngagementLevel::MEDIUM); - SetSiteEngagementLevel("http://c.test", EngagementLevel::LOW); + SetSiteHasInteraction("http://c.test"); NavigateTo("http://a.test", kWithUserGesture); NavigateTo("http://b.test", kWithUserGesture); @@ -488,7 +485,7 @@ Pair("RedirectAndInitialSiteSame", false), Pair("RedirectChainIndex", 0), Pair("RedirectChainLength", 2), Pair("RedirectType", (int)DIPSRedirectType::kClient), - Pair("SiteEngagementLevel", (int)EngagementLevel::MEDIUM))); + Pair("SiteEngagementLevel", 0))); EXPECT_THAT(URLForRedirectSourceId(&ukm_recorder, ukm_entries[1].source_id), Eq("c.test/")); @@ -502,5 +499,5 @@ Pair("RedirectAndInitialSiteSame", false), Pair("RedirectChainIndex", 1), Pair("RedirectChainLength", 2), Pair("RedirectType", (int)DIPSRedirectType::kServer), - Pair("SiteEngagementLevel", (int)EngagementLevel::LOW))); + Pair("SiteEngagementLevel", 1))); }
diff --git a/chrome/browser/dips/dips_redirect_info.h b/chrome/browser/dips/dips_redirect_info.h index 44714ea..c514f8f 100644 --- a/chrome/browser/dips/dips_redirect_info.h +++ b/chrome/browser/dips/dips_redirect_info.h
@@ -31,6 +31,10 @@ // initial_site == final_site, cached. const bool initial_and_final_sites_same; const int length; + + // These properties aren't known at the time of creation, and are filled in + // later: + absl::optional<DIPSCookieMode> cookie_mode; }; // Properties of one URL within a redirect chain. @@ -64,6 +68,10 @@ const ukm::SourceId source_id; const base::Time time; + // These properties aren't known at the time of creation, and are filled in + // later: + absl::optional<bool> has_interaction; + // The following properties are only applicable for client-side redirects: // For client redirects, the time between the previous page committing @@ -73,11 +81,14 @@ const bool has_sticky_activation; }; -using DIPSRedirectHandler = - base::RepeatingCallback<void(const DIPSRedirectInfo&, - const DIPSRedirectChainInfo&)>; - // a movable DIPSRedirectInfo, essentially using DIPSRedirectInfoPtr = std::unique_ptr<DIPSRedirectInfo>; +// a movable DIPSRedirectChainInfo, essentially +using DIPSRedirectChainInfoPtr = std::unique_ptr<DIPSRedirectChainInfo>; + +using DIPSRedirectChainHandler = + base::RepeatingCallback<void(std::vector<DIPSRedirectInfoPtr>, + DIPSRedirectChainInfoPtr)>; + #endif // CHROME_BROWSER_DIPS_DIPS_REDIRECT_INFO_H_
diff --git a/chrome/browser/dips/dips_service.cc b/chrome/browser/dips/dips_service.cc index eca651b..017e4ea 100644 --- a/chrome/browser/dips/dips_service.cc +++ b/chrome/browser/dips/dips_service.cc
@@ -18,6 +18,7 @@ #include "chrome/browser/content_settings/cookie_settings_factory.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/dips/dips_features.h" +#include "chrome/browser/dips/dips_redirect_info.h" #include "chrome/browser/dips/dips_service_factory.h" #include "chrome/browser/dips/dips_utils.h" #include "chrome/browser/profiles/profile.h" @@ -29,8 +30,6 @@ #include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_recorder.h" -using blink::mojom::EngagementLevel; - namespace { // Controls whether UKM metrics are collected for DIPS. @@ -58,28 +57,23 @@ } RedirectCategory ClassifyRedirect(CookieAccessType access, - EngagementLevel engagement) { + bool has_interaction) { switch (access) { case CookieAccessType::kUnknown: - return engagement > EngagementLevel::NONE - ? RedirectCategory::kUnknownCookies_HasEngagement - : RedirectCategory::kUnknownCookies_NoEngagement; + return has_interaction ? RedirectCategory::kUnknownCookies_HasEngagement + : RedirectCategory::kUnknownCookies_NoEngagement; case CookieAccessType::kNone: - return engagement > EngagementLevel::NONE - ? RedirectCategory::kNoCookies_HasEngagement - : RedirectCategory::kNoCookies_NoEngagement; + return has_interaction ? RedirectCategory::kNoCookies_HasEngagement + : RedirectCategory::kNoCookies_NoEngagement; case CookieAccessType::kRead: - return engagement > EngagementLevel::NONE - ? RedirectCategory::kReadCookies_HasEngagement - : RedirectCategory::kReadCookies_NoEngagement; + return has_interaction ? RedirectCategory::kReadCookies_HasEngagement + : RedirectCategory::kReadCookies_NoEngagement; case CookieAccessType::kWrite: - return engagement > EngagementLevel::NONE - ? RedirectCategory::kWriteCookies_HasEngagement - : RedirectCategory::kWriteCookies_NoEngagement; + return has_interaction ? RedirectCategory::kWriteCookies_HasEngagement + : RedirectCategory::kWriteCookies_NoEngagement; case CookieAccessType::kReadWrite: - return engagement > EngagementLevel::NONE - ? RedirectCategory::kReadWriteCookies_HasEngagement - : RedirectCategory::kReadWriteCookies_NoEngagement; + return has_interaction ? RedirectCategory::kReadWriteCookies_HasEngagement + : RedirectCategory::kReadWriteCookies_NoEngagement; } } @@ -96,8 +90,6 @@ DIPSService::DIPSService(content::BrowserContext* context) : browser_context_(context), - site_engagement_service_( - site_engagement::SiteEngagementService::Get(context)), cookie_settings_(CookieSettingsFactory::GetForProfile( Profile::FromBrowserContext(context))), repeating_timer_(CreateTimer(Profile::FromBrowserContext(context))) { @@ -182,13 +174,43 @@ storage_.AsyncCall(&DIPSStorage::Prepopulate).WithArgs(time, sites); } -void DIPSService::HandleRedirect(const DIPSRedirectInfo& redirect, - const DIPSRedirectChainInfo& chain) { +void DIPSService::HandleRedirectChain( + std::vector<DIPSRedirectInfoPtr> redirects, + DIPSRedirectChainInfoPtr chain) { + chain->cookie_mode = GetCookieMode(); + // Copy the URL out before |redirects| is moved, to avoid use-after-move. + GURL url = redirects[0]->url; + storage_.AsyncCall(&DIPSStorage::Read) + .WithArgs(url) + .Then(base::BindOnce(&DIPSService::GotState, weak_factory_.GetWeakPtr(), + std::move(redirects), std::move(chain), 0)); +} + +void DIPSService::GotState(std::vector<DIPSRedirectInfoPtr> redirects, + DIPSRedirectChainInfoPtr chain, + size_t index, + const DIPSState url_state) { + DCHECK_LT(index, redirects.size()); + + DIPSRedirectInfo* redirect = redirects[index].get(); + // If there's any user interaction recorded in the DIPS DB, that's engagement. + redirect->has_interaction = + url_state.user_interaction_times().last.has_value(); HandleRedirect( - redirect, chain, - site_engagement_service_->GetEngagementLevel(redirect.url), - GetCookieMode(), + *redirect, *chain, base::BindRepeating(&DIPSService::RecordBounce, base::Unretained(this))); + + if (index + 1 >= redirects.size()) { + // All redirects handled. + return; + } + + // Copy the URL out before `redirects` is moved, to avoid use-after-move. + GURL url = redirects[index + 1]->url; + storage_.AsyncCall(&DIPSStorage::Read) + .WithArgs(url) + .Then(base::BindOnce(&DIPSService::GotState, weak_factory_.GetWeakPtr(), + std::move(redirects), std::move(chain), index + 1)); } void DIPSService::RecordBounce(bool stateful, @@ -203,8 +225,6 @@ /*static*/ void DIPSService::HandleRedirect(const DIPSRedirectInfo& redirect, const DIPSRedirectChainInfo& chain, - EngagementLevel engagement_level, - DIPSCookieMode cookie_mode, RecordBounceCallback record_bounce) { const std::string site = GetSiteForDIPS(redirect.url); bool initial_site_same = (site == chain.initial_site); @@ -214,7 +234,7 @@ if (base::FeatureList::IsEnabled(kDipsUkm)) { ukm::builders::DIPS_Redirect(redirect.source_id) - .SetSiteEngagementLevel(static_cast<int64_t>(engagement_level)) + .SetSiteEngagementLevel(redirect.has_interaction.value() ? 1 : 0) .SetRedirectType(static_cast<int64_t>(redirect.redirect_type)) .SetCookieAccessType(static_cast<int64_t>(redirect.access_type)) .SetRedirectAndInitialSiteSame(initial_site_same) @@ -241,6 +261,7 @@ } RedirectCategory category = - ClassifyRedirect(redirect.access_type, engagement_level); - UmaHistogramBounceCategory(category, cookie_mode, redirect.redirect_type); + ClassifyRedirect(redirect.access_type, redirect.has_interaction.value()); + UmaHistogramBounceCategory(category, chain.cookie_mode.value(), + redirect.redirect_type); }
diff --git a/chrome/browser/dips/dips_service.h b/chrome/browser/dips/dips_service.h index 09eb31b4..7a4afd0 100644 --- a/chrome/browser/dips/dips_service.h +++ b/chrome/browser/dips/dips_service.h
@@ -13,8 +13,6 @@ #include "chrome/browser/dips/dips_storage.h" #include "chrome/browser/dips/dips_utils.h" #include "components/keyed_service/core/keyed_service.h" -#include "services/network/public/mojom/network_context.mojom.h" -#include "third_party/blink/public/mojom/site_engagement/site_engagement.mojom-forward.h" class Profile; @@ -30,10 +28,6 @@ class PersistentRepeatingTimer; } -namespace site_engagement { -class SiteEngagementService; -} - class DIPSService : public KeyedService { public: using RecordBounceCallback = base::RepeatingCallback< @@ -52,18 +46,15 @@ network::mojom::ClearDataFilterPtr filter, const DIPSEventRemovalType type); - void HandleRedirect(const DIPSRedirectInfo& redirect, - const DIPSRedirectChainInfo& chain); + void HandleRedirectChain(std::vector<DIPSRedirectInfoPtr> redirects, + DIPSRedirectChainInfoPtr chain); // This allows unit-testing the metrics emitted by HandleRedirect() without // instantiating DIPSService. - static void HandleRedirectForTesting( - const DIPSRedirectInfo& redirect, - const DIPSRedirectChainInfo& chain, - blink::mojom::EngagementLevel engagement_level, - DIPSCookieMode cookie_mode, - RecordBounceCallback callback) { - HandleRedirect(redirect, chain, engagement_level, cookie_mode, callback); + static void HandleRedirectForTesting(const DIPSRedirectInfo& redirect, + const DIPSRedirectChainInfo& chain, + RecordBounceCallback callback) { + HandleRedirect(redirect, chain, callback); } private: @@ -74,11 +65,13 @@ Profile* profile); void Shutdown() override; + void GotState(std::vector<DIPSRedirectInfoPtr> redirects, + DIPSRedirectChainInfoPtr chain, + size_t index, + const DIPSState url_state); void RecordBounce(bool stateful, const GURL& url, base::Time time); static void HandleRedirect(const DIPSRedirectInfo& redirect, const DIPSRedirectChainInfo& chain, - blink::mojom::EngagementLevel engagement_level, - DIPSCookieMode cookie_mode, RecordBounceCallback callback); scoped_refptr<base::SequencedTaskRunner> CreateTaskRunner(); @@ -86,7 +79,6 @@ void InitializeStorage(base::Time time, std::vector<std::string> sites); raw_ptr<content::BrowserContext> browser_context_; - raw_ptr<site_engagement::SiteEngagementService> site_engagement_service_; scoped_refptr<content_settings::CookieSettings> cookie_settings_; // The persisted timer controlling how often incidental state is cleared. // This timer is null if the DIPS feature isn't enabled with a valid TimeDelta
diff --git a/chrome/browser/dips/dips_service_factory.cc b/chrome/browser/dips/dips_service_factory.cc index c73e73a..c9cd92e 100644 --- a/chrome/browser/dips/dips_service_factory.cc +++ b/chrome/browser/dips/dips_service_factory.cc
@@ -6,7 +6,6 @@ #include "base/memory/singleton.h" #include "chrome/browser/dips/dips_service.h" -#include "chrome/browser/engagement/site_engagement_service_factory.h" // static DIPSService* DIPSServiceFactory::GetForBrowserContext( @@ -22,9 +21,7 @@ DIPSServiceFactory::DIPSServiceFactory() : ProfileKeyedServiceFactory( "DIPSService", - ProfileSelections::BuildForRegularAndIncognito()) { - DependsOn(site_engagement::SiteEngagementServiceFactory::GetInstance()); -} + ProfileSelections::BuildForRegularAndIncognito()) {} DIPSServiceFactory::~DIPSServiceFactory() = default;
diff --git a/chrome/browser/download/download_auto_open_policy_handler.cc b/chrome/browser/download/download_auto_open_policy_handler.cc index 7700d911..e8f8d02 100644 --- a/chrome/browser/download/download_auto_open_policy_handler.cc +++ b/chrome/browser/download/download_auto_open_policy_handler.cc
@@ -54,7 +54,7 @@ return; DCHECK(policy_value->is_list()); - base::ListValue pref_values; + base::Value::List pref_values; for (const auto& entry : policy_value->GetList()) { const std::string extension = entry.GetString(); // If it's empty or malformed, then skip the entry. @@ -65,5 +65,5 @@ pref_values.Append(extension); } prefs_value_map->SetValue(prefs::kDownloadExtensionsToOpenByPolicy, - std::move(pref_values)); + base::Value(std::move(pref_values))); }
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc index 4dd6585..8f38b0c7 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc
@@ -70,6 +70,12 @@ return &enabled; } +ContentAnalysisDelegate::OnAckAllRequestsCallback* OnAckAllRequestsStorage() { + static base::NoDestructor<ContentAnalysisDelegate::OnAckAllRequestsCallback> + callback; + return callback.get(); +} + } // namespace StringAnalysisRequest::StringAnalysisRequest( @@ -316,6 +322,12 @@ *UIEnabledStorage() = false; } +// static +void ContentAnalysisDelegate::SetOnAckAllRequestsCallbackForTesting( + OnAckAllRequestsCallback callback) { + *OnAckAllRequestsStorage() = std::move(callback); +} + ContentAnalysisDelegate::ContentAnalysisDelegate( content::WebContents* web_contents, Data data, @@ -395,6 +407,7 @@ } UpdateFinalResult(result, results[index].tag); } + files_request_results_ = std::move(results); files_request_complete_ = true; MaybeCompleteScanRequest(); @@ -608,13 +621,13 @@ return; } - AckAllRequests(); - // If showing the warning message, wait before running the callback. The // callback will be called either in BypassWarnings or Cancel. if (final_result_ != FinalContentAnalysisResult::WARNING) RunCallback(); + AckAllRequests(); + if (!UpdateDialog() && data_uploaded_) { // No UI was shown. Delete |this| to cleanup, unless UploadData isn't done // yet. @@ -623,8 +636,22 @@ } void ContentAnalysisDelegate::RunCallback() { - if (!callback_.is_null()) - std::move(callback_).Run(data_, result_); + if (callback_.is_null()) + return; + + std::move(callback_).Run(data_, result_); + + // Since `result_` might have been tweaked by `callback_`, `final_actions_` + // need to be updated before Acks are sent. + for (size_t i = 0; i < result_.paths_results.size(); ++i) { + if (!result_.paths_results[i] && files_request_results_.size() > i && + final_actions_.count(files_request_results_[i].request_token) && + final_actions_[files_request_results_[i].request_token] == + ContentAnalysisAcknowledgement::ALLOW) { + final_actions_[files_request_results_[i].request_token] = + ContentAnalysisAcknowledgement::BLOCK; + } + } } void ContentAnalysisDelegate::UpdateFinalResult( @@ -637,17 +664,25 @@ } void ContentAnalysisDelegate::AckAllRequests() { + if (!OnAckAllRequestsStorage()->is_null()) + std::move(*OnAckAllRequestsStorage()).Run(final_actions_); + BinaryUploadService* upload_service = GetBinaryUploadService(); if (!upload_service) return; for (const auto& token_and_action : final_actions_) { - auto ack = std::make_unique<safe_browsing::BinaryUploadService::Ack>( - data_.settings.cloud_or_local_settings); - ack->set_request_token(token_and_action.first); - ack->set_status(ContentAnalysisAcknowledgement::SUCCESS); - ack->set_final_action(token_and_action.second); - upload_service->MaybeAcknowledge(std::move(ack)); + // Only have files that have a request token. Not having one implies that + // the agent never received the request for some reason (size, encryption, + // etc.) so it doesn't make sense to send an ack. + if (!token_and_action.first.empty()) { + auto ack = std::make_unique<safe_browsing::BinaryUploadService::Ack>( + data_.settings.cloud_or_local_settings); + ack->set_request_token(token_and_action.first); + ack->set_status(ContentAnalysisAcknowledgement::SUCCESS); + ack->set_final_action(token_and_action.second); + upload_service->MaybeAcknowledge(std::move(ack)); + } } }
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h index 641a69c..30f1e32 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h
@@ -139,7 +139,7 @@ // Callback used with CreateForWebContents() that informs caller of verdict // of deep scans. using CompletionCallback = - base::OnceCallback<void(const Data& data, const Result& result)>; + base::OnceCallback<void(const Data& data, Result& result)>; // A factory function used in tests to create fake ContentAnalysisDelegate // instances. @@ -210,6 +210,14 @@ // Showing the UI is not possible in unit tests, call this to disable it. static void DisableUIForTesting(); + // Add a callback to allow tests to validate `AckAllRequests` will send the + // appropriate actions. + using OnAckAllRequestsCallback = base::OnceCallback<void( + const std::map<std::string, + ContentAnalysisAcknowledgement::FinalAction>&)>; + static void SetOnAckAllRequestsCallbackForTesting( + OnAckAllRequestsCallback callback); + protected: ContentAnalysisDelegate(content::WebContents* web_contents, Data data, @@ -381,6 +389,9 @@ std::map<std::string, ContentAnalysisAcknowledgement::FinalAction> final_actions_; + // Results returned from files_request_handler_. + std::vector<RequestHandlerResult> files_request_results_; + base::TimeTicks upload_start_time_; base::WeakPtrFactory<ContentAnalysisDelegate> weak_ptr_factory_{this};
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc index 73dbf81..4d762e9 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc
@@ -372,9 +372,8 @@ ContentAnalysisDelegate::CreateForWebContents( browser()->tab_strip_model()->GetActiveWebContents(), std::move(data), base::BindLambdaForTesting( - [&quit_closure, &called]( - const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + [&quit_closure, &called](const ContentAnalysisDelegate::Data& data, + ContentAnalysisDelegate::Result& result) { ASSERT_EQ(result.text_results.size(), 1u); ASSERT_EQ(result.paths_results.size(), 1u); ASSERT_TRUE(result.text_results[0]); @@ -466,7 +465,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), std::move(data), base::BindLambdaForTesting( [&called](const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { ASSERT_TRUE(result.text_results.empty()); ASSERT_EQ(result.paths_results.size(), 2u); ASSERT_TRUE(result.paths_results[0]); @@ -555,7 +554,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), std::move(data), base::BindLambdaForTesting( [&called](const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { ASSERT_TRUE(result.paths_results.empty()); ASSERT_EQ(result.text_results.size(), 2u); ASSERT_FALSE(result.text_results[0]); @@ -639,7 +638,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), std::move(data), base::BindLambdaForTesting( [&called](const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { ASSERT_TRUE(result.text_results.empty()); ASSERT_EQ(result.paths_results.size(), 3u); for (bool paths_result : result.paths_results) @@ -758,7 +757,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), std::move(data), base::BindLambdaForTesting( [this, &called](const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { ASSERT_TRUE(result.text_results.empty()); ASSERT_EQ(result.paths_results.size(), 1u); ASSERT_EQ(result.paths_results[0], expected_result()); @@ -856,7 +855,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), std::move(data), base::BindLambdaForTesting( [this, &called](const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { ASSERT_TRUE(result.text_results.empty()); ASSERT_EQ(result.paths_results.size(), 1u); ASSERT_EQ(result.paths_results[0], expected_result()); @@ -916,7 +915,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), std::move(data), base::BindLambdaForTesting( [this, &called](const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { ASSERT_TRUE(result.paths_results.empty()); ASSERT_TRUE(result.text_results.empty()); ASSERT_EQ(result.page_result, expected_result()); @@ -1026,7 +1025,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), std::move(data), base::BindLambdaForTesting( [this, &called](const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { ASSERT_TRUE(result.text_results.empty()); ASSERT_EQ(result.paths_results.size(), 1u); ASSERT_EQ(result.paths_results[0], expected_result()); @@ -1152,9 +1151,8 @@ ContentAnalysisDelegate::CreateForWebContents( browser()->tab_strip_model()->GetActiveWebContents(), std::move(data), base::BindLambdaForTesting( - [&quit_closure, &called]( - const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + [&quit_closure, &called](const ContentAnalysisDelegate::Data& data, + ContentAnalysisDelegate::Result& result) { ASSERT_EQ(result.text_results.size(), 1u); ASSERT_EQ(result.paths_results.size(), 0u); ASSERT_TRUE(result.text_results[0]); @@ -1201,9 +1199,8 @@ ContentAnalysisDelegate::CreateForWebContents( browser()->tab_strip_model()->GetActiveWebContents(), std::move(data), base::BindLambdaForTesting( - [&quit_closure, &called]( - const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + [&quit_closure, &called](const ContentAnalysisDelegate::Data& data, + ContentAnalysisDelegate::Result& result) { ASSERT_EQ(result.text_results.size(), 0u); ASSERT_EQ(result.paths_results.size(), 2u); ASSERT_TRUE(result.paths_results[0]);
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_unittest.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_unittest.cc index 1271869..4c2a146 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_unittest.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_unittest.cc
@@ -699,7 +699,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(0u, data.text.size()); EXPECT_EQ(0u, data.paths.size()); EXPECT_EQ(0u, result.text_results.size()); @@ -723,7 +723,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(1u, data.text.size()); EXPECT_EQ(0u, data.paths.size()); ASSERT_EQ(1u, result.text_results.size()); @@ -749,7 +749,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(2u, data.text.size()); EXPECT_EQ(0u, data.paths.size()); ASSERT_EQ(2u, result.text_results.size()); @@ -781,7 +781,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(2u, data.text.size()); EXPECT_EQ(0u, data.paths.size()); ASSERT_EQ(2u, result.text_results.size()); @@ -808,7 +808,7 @@ contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(0u, data.text.size()); EXPECT_EQ(0u, data.paths.size()); // The page data should no longer be valid since it's moved @@ -840,7 +840,7 @@ contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(0u, data.text.size()); EXPECT_EQ(0u, data.paths.size()); // The page data should no longer be valid since it's moved @@ -870,7 +870,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(0u, data.text.size()); EXPECT_EQ(1u, data.paths.size()); EXPECT_EQ(0u, result.text_results.size()); @@ -897,7 +897,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(0u, data.text.size()); EXPECT_EQ(2u, data.paths.size()); EXPECT_EQ(0u, result.text_results.size()); @@ -925,7 +925,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(0u, data.text.size()); EXPECT_EQ(2u, data.paths.size()); EXPECT_EQ(0u, result.text_results.size()); @@ -970,7 +970,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(0u, data.text.size()); EXPECT_EQ(1u, data.paths.size()); EXPECT_EQ(0u, result.text_results.size()); @@ -1014,7 +1014,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(0u, data.text.size()); EXPECT_EQ(1u, data.paths.size()); EXPECT_EQ(0u, result.text_results.size()); @@ -1043,7 +1043,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(0u, data.text.size()); EXPECT_EQ(2u, data.paths.size()); EXPECT_EQ(0u, result.text_results.size()); @@ -1071,7 +1071,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(0u, data.text.size()); EXPECT_EQ(2u, data.paths.size()); EXPECT_EQ(0u, result.text_results.size()); @@ -1103,7 +1103,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(0u, data.text.size()); EXPECT_EQ(2u, data.paths.size()); EXPECT_EQ(0u, result.text_results.size()); @@ -1138,7 +1138,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(0u, data.text.size()); EXPECT_EQ(2u, data.paths.size()); EXPECT_EQ(0u, result.text_results.size()); @@ -1166,7 +1166,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(1u, data.text.size()); EXPECT_EQ(2u, data.paths.size()); ASSERT_EQ(1u, result.text_results.size()); @@ -1198,7 +1198,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(2u, data.text.size()); EXPECT_EQ(2u, data.paths.size()); ASSERT_EQ(2u, result.text_results.size()); @@ -1231,7 +1231,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(2u, data.text.size()); EXPECT_EQ(0u, data.paths.size()); ASSERT_EQ(2u, result.text_results.size()); @@ -1275,7 +1275,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(1u, data.text.size()); EXPECT_EQ(5u, data.paths.size()); ASSERT_EQ(1u, result.text_results.size()); @@ -1338,7 +1338,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(1u, data.text.size()); EXPECT_EQ(5u, data.paths.size()); EXPECT_EQ(1u, result.text_results.size()); @@ -1369,7 +1369,7 @@ ScanUpload(contents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { EXPECT_EQ(0u, data.text.size()); EXPECT_EQ(0u, data.paths.size()); ASSERT_EQ(0u, result.text_results.size()); @@ -1441,21 +1441,20 @@ CreateFilesForTest({FILE_PATH_LITERAL("foo.txt")}, &data); bool called = false; - ScanUpload( - contents(), std::move(data), - base::BindLambdaForTesting( - [this, &called](const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { - EXPECT_EQ(0u, data.text.size()); - EXPECT_EQ(1u, data.paths.size()); - EXPECT_EQ(0u, result.text_results.size()); - EXPECT_EQ(1u, result.paths_results.size()); + ScanUpload(contents(), std::move(data), + base::BindLambdaForTesting( + [this, &called](const ContentAnalysisDelegate::Data& data, + ContentAnalysisDelegate::Result& result) { + EXPECT_EQ(0u, data.text.size()); + EXPECT_EQ(1u, data.paths.size()); + EXPECT_EQ(0u, result.text_results.size()); + EXPECT_EQ(1u, result.paths_results.size()); - bool expected = - ResultShouldAllowDataUse(data.settings, this->result()); - EXPECT_EQ(expected, result.paths_results[0]); - called = true; - })); + bool expected = + ResultShouldAllowDataUse(data.settings, this->result()); + EXPECT_EQ(expected, result.paths_results[0]); + called = true; + })); RunUntilDone(); EXPECT_TRUE(called);
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 b2f7bac..e0e65f3 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc
@@ -518,7 +518,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { *called = true; }, + ContentAnalysisDelegate::Result& result) { *called = true; }, &called), safe_browsing::DeepScanAccessPoint::UPLOAD); run_loop.Run(); @@ -582,7 +582,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), std::move(data), base::BindOnce( [](bool* called, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { for (bool paths_result : result.paths_results) ASSERT_FALSE(paths_result); *called = true; @@ -633,7 +633,7 @@ base::BindOnce( [](bool* called, bool user_bypasses_warning, const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { ASSERT_EQ(result.text_results.size(), 2u); ASSERT_EQ(result.text_results[0], user_bypasses_warning); ASSERT_EQ(result.text_results[1], user_bypasses_warning); @@ -689,7 +689,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), std::move(data), base::BindLambdaForTesting( [this, &called](const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { for (bool paths_result : result.paths_results) ASSERT_EQ(paths_result, success()); called = true; @@ -749,7 +749,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), std::move(data), base::BindLambdaForTesting( [this, &called](const ContentAnalysisDelegate::Data& data, - const ContentAnalysisDelegate::Result& result) { + ContentAnalysisDelegate::Result& result) { for (bool paths_result : result.paths_results) ASSERT_EQ(paths_result, success()); called = true;
diff --git a/chrome/browser/enterprise/connectors/common.cc b/chrome/browser/enterprise/connectors/common.cc index 65896f4..6fa91a2 100644 --- a/chrome/browser/enterprise/connectors/common.cc +++ b/chrome/browser/enterprise/connectors/common.cc
@@ -101,6 +101,7 @@ RequestHandlerResult result; result.complies = file_complies; + result.request_token = response.request_token(); result.tag = tag; if (!file_complies) { if (upload_result ==
diff --git a/chrome/browser/enterprise/connectors/common.h b/chrome/browser/enterprise/connectors/common.h index d477f0a..cb009dd 100644 --- a/chrome/browser/enterprise/connectors/common.h +++ b/chrome/browser/enterprise/connectors/common.h
@@ -196,6 +196,7 @@ bool complies; FinalContentAnalysisResult final_result; std::string tag; + std::string request_token; }; // Calculates the result for the request handler based on the upload result and
diff --git a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc index a1d7317..e61caf93 100644 --- a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc +++ b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
@@ -6167,8 +6167,9 @@ // Test that GetAvailableStaticRuleCount includes the excess unused allocation // after an extension update. +// TODO(crbug.com/1399879): Deflake and re-enable. IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestGlobalRulesBrowserTest_Packed, - GetAvailableStaticRuleCountAfterPackedUpdate) { + DISABLED_GetAvailableStaticRuleCountAfterPackedUpdate) { // This is not tested for unpacked extensions since the unpacked extension // directory won't be persisted across browser restarts. ASSERT_EQ(ExtensionLoadType::PACKED, GetParam());
diff --git a/chrome/browser/extensions/api/downloads/downloads_api.cc b/chrome/browser/extensions/api/downloads/downloads_api.cc index be730d8..c8b42caf 100644 --- a/chrome/browser/extensions/api/downloads/downloads_api.cc +++ b/chrome/browser/extensions/api/downloads/downloads_api.cc
@@ -1315,15 +1315,13 @@ RunDownloadQuery(params->query, manager, incognito_manager, &error, &results); if (!error.empty()) return RespondNow(Error(std::move(error))); - std::unique_ptr<base::ListValue> json_results(new base::ListValue()); - for (DownloadManager::DownloadVector::const_iterator it = results.begin(); - it != results.end(); ++it) { - json_results->Append(static_cast<int>((*it)->GetId())); - (*it)->Remove(); + base::Value::List json_results; + for (auto* result : results) { + json_results.Append(static_cast<int>(result->GetId())); + result->Remove(); } RecordApiFunctions(DOWNLOADS_FUNCTION_ERASE); - return RespondNow( - WithArguments(base::Value::FromUniquePtrValue(std::move(json_results)))); + return RespondNow(WithArguments(std::move(json_results))); } DownloadsRemoveFileFunction::DownloadsRemoveFileFunction() {}
diff --git a/chrome/browser/extensions/api/management/management_api_unittest.cc b/chrome/browser/extensions/api/management/management_api_unittest.cc index cca42faa4..b640ca81 100644 --- a/chrome/browser/extensions/api/management/management_api_unittest.cc +++ b/chrome/browser/extensions/api/management/management_api_unittest.cc
@@ -80,13 +80,13 @@ ManagementApiUnitTest& operator=(const ManagementApiUnitTest&) = delete; protected: - ManagementApiUnitTest() {} - ~ManagementApiUnitTest() override {} + ManagementApiUnitTest() = default; + ~ManagementApiUnitTest() override = default; // A wrapper around extension_function_test_utils::RunFunction that runs with // the associated browser, no flags, and can take stack-allocated arguments. bool RunFunction(const scoped_refptr<ExtensionFunction>& function, - const base::Value& args); + const base::Value::List& args); // Runs the management.setEnabled() function to enable an extension. bool RunSetEnabledFunction(content::WebContents* web_contents, @@ -115,11 +115,9 @@ bool ManagementApiUnitTest::RunFunction( const scoped_refptr<ExtensionFunction>& function, - const base::Value& args) { + const base::Value::List& args) { return extension_function_test_utils::RunFunction( - function.get(), - base::ListValue::From(base::Value::ToUniquePtrValue(args.Clone())), - browser(), api_test_utils::NONE); + function.get(), args.Clone(), browser(), api_test_utils::NONE); } bool ManagementApiUnitTest::RunSetEnabledFunction( @@ -139,7 +137,7 @@ auto function = base::MakeRefCounted<ManagementSetEnabledFunction>(); if (web_contents) function->SetRenderFrameHost(web_contents->GetPrimaryMainFrame()); - base::Value args(base::Value::Type::LIST); + base::Value::List args; args.Append(extension_id); args.Append(enabled); bool result = RunFunction(function, args); @@ -181,7 +179,7 @@ auto function = base::MakeRefCounted<ManagementSetEnabledFunction>(); function->set_extension(source_extension); - base::Value disable_args(base::Value::Type::LIST); + base::Value::List disable_args; disable_args.Append(extension_id); disable_args.Append(false); @@ -190,7 +188,7 @@ EXPECT_TRUE(RunFunction(function, disable_args)) << function->GetError(); EXPECT_TRUE(registry()->disabled_extensions().Contains(extension_id)); - base::Value enable_args(base::Value::Type::LIST); + base::Value::List enable_args; enable_args.Append(extension_id); enable_args.Append(true); @@ -244,7 +242,7 @@ [this](scoped_refptr<const Extension> source_extension, scoped_refptr<const Extension> target_extension) { std::string id = target_extension->id(); - base::Value args(base::Value::Type::LIST); + base::Value::List args; args.Append(id); args.Append(false /* disable the extension */); auto function = base::MakeRefCounted<ManagementSetEnabledFunction>(); @@ -299,7 +297,7 @@ [this, component](scoped_refptr<const Extension> source_extension, scoped_refptr<const Extension> target_extension) { std::string id = target_extension->id(); - base::Value args(base::Value::Type::LIST); + base::Value::List args; args.Append(id); args.Append(true /* enable the extension */); auto function = base::MakeRefCounted<ManagementSetEnabledFunction>(); @@ -332,7 +330,7 @@ service()->AddExtension(extension.get()); std::string extension_id = extension->id(); - base::Value uninstall_args(base::Value::Type::LIST); + base::Value::List uninstall_args; uninstall_args.Append(extension->id()); base::HistogramTester tester; @@ -405,7 +403,7 @@ // If we have the extension uninstall itself, the uninstall should succeed // (even though we auto-cancel any dialog), because the dialog is never // shown. - uninstall_args.GetList().erase(uninstall_args.GetList().begin()); + uninstall_args.erase(uninstall_args.begin()); function = base::MakeRefCounted<ManagementUninstallSelfFunction>(); // Note: this time the source is coming from the extension itself, not a // WebUI based context. @@ -426,7 +424,7 @@ scoped_refptr<const Extension> extension = ExtensionBuilder("Test").Build(); service()->AddExtension(extension.get()); std::string extension_id = extension->id(); - base::Value uninstall_args(base::Value::Type::LIST); + base::Value::List uninstall_args; uninstall_args.Append(extension->id()); base::HistogramTester tester; @@ -487,7 +485,7 @@ scoped_refptr<const Extension> extension = ExtensionBuilder("Test").Build(); service()->AddExtension(extension.get()); std::string extension_id = extension->id(); - base::Value uninstall_args(base::Value::Type::LIST); + base::Value::List uninstall_args; uninstall_args.Append(extension->id()); base::HistogramTester tester; @@ -529,7 +527,7 @@ scoped_refptr<const Extension> extension = ExtensionBuilder("Test").Build(); service()->AddExtension(extension.get()); std::string extension_id = extension->id(); - base::Value uninstall_args(base::Value::Type::LIST); + base::Value::List uninstall_args; uninstall_args.Append(extension->id()); base::HistogramTester tester; { @@ -576,7 +574,7 @@ ExtensionFunction::ScopedUserGestureForTests scoped_user_gesture; auto function = base::MakeRefCounted<ManagementUninstallFunction>(); function->set_source_context_type(Feature::WEBUI_CONTEXT); - base::Value uninstall_args(base::Value::Type::LIST); + base::Value::List uninstall_args; uninstall_args.Append(id); EXPECT_TRUE(RunFunction(function, uninstall_args)) << function->GetError(); @@ -593,7 +591,7 @@ // Test enabling it. { - base::Value enable_args(base::Value::Type::LIST); + base::Value::List enable_args; enable_args.Append(id); enable_args.Append(true); auto function = base::MakeRefCounted<ManagementSetEnabledFunction>(); @@ -604,7 +602,7 @@ // Test disabling it { - base::Value disable_args(base::Value::Type::LIST); + base::Value::List disable_args; disable_args.Append(id); disable_args.Append(false);
diff --git a/chrome/browser/extensions/chrome_app_sorting.cc b/chrome/browser/extensions/chrome_app_sorting.cc index 6d4f7e4..4086af58 100644 --- a/chrome/browser/extensions/chrome_app_sorting.cc +++ b/chrome/browser/extensions/chrome_app_sorting.cc
@@ -193,7 +193,7 @@ return; web_app_registrar_ = &web_app_provider->registrar_unsafe(); - web_app_sync_bridge_ = &web_app_provider->sync_bridge(); + web_app_sync_bridge_ = &web_app_provider->sync_bridge_unsafe(); app_registrar_observation_.Observe(&web_app_provider->registrar_unsafe()); install_manager_observation_.Observe(&web_app_provider->install_manager()); InitializePageOrdinalMap(web_app_registrar_->GetAppIds());
diff --git a/chrome/browser/extensions/chrome_component_extension_resource_manager.cc b/chrome/browser/extensions/chrome_component_extension_resource_manager.cc index e794155..ef131afb 100644 --- a/chrome/browser/extensions/chrome_component_extension_resource_manager.cc +++ b/chrome/browser/extensions/chrome_component_extension_resource_manager.cc
@@ -149,7 +149,6 @@ base::Value::Dict dict; pdf_extension_util::AddStrings( pdf_extension_util::PdfViewerContext::kPdfViewer, &dict); - pdf_extension_util::AddAdditionalData(/*enable_annotations=*/true, &dict); ui::TemplateReplacements pdf_viewer_replacements; ui::TemplateReplacementsFromDictionaryValue(dict, &pdf_viewer_replacements);
diff --git a/chrome/browser/extensions/extension_function_test_utils.cc b/chrome/browser/extensions/extension_function_test_utils.cc index 40e8908..1c6c889 100644 --- a/chrome/browser/extensions/extension_function_test_utils.cc +++ b/chrome/browser/extensions/extension_function_test_utils.cc
@@ -168,11 +168,4 @@ std::move(dispatcher), flags); } -bool RunFunction(ExtensionFunction* function, - std::unique_ptr<base::ListValue> args, - Browser* browser, - extensions::api_test_utils::RunFunctionFlags flags) { - return RunFunction(function, std::move(*args).TakeList(), browser, flags); -} - } // namespace extension_function_test_utils
diff --git a/chrome/browser/extensions/extension_function_test_utils.h b/chrome/browser/extensions/extension_function_test_utils.h index ab66d397..0796c2c 100644 --- a/chrome/browser/extensions/extension_function_test_utils.h +++ b/chrome/browser/extensions/extension_function_test_utils.h
@@ -78,11 +78,6 @@ base::Value::List args, Browser* browser, extensions::api_test_utils::RunFunctionFlags flags); -// DEPRECATED. Use the version above. -bool RunFunction(ExtensionFunction* function, - std::unique_ptr<base::ListValue> args, - Browser* browser, - extensions::api_test_utils::RunFunctionFlags flags); } // namespace extension_function_test_utils
diff --git a/chrome/browser/extensions/unpacked_installer.cc b/chrome/browser/extensions/unpacked_installer.cc index 3a9e368..58c07fd 100644 --- a/chrome/browser/extensions/unpacked_installer.cc +++ b/chrome/browser/extensions/unpacked_installer.cc
@@ -36,6 +36,7 @@ #include "extensions/browser/requirements_checker.h" #include "extensions/common/constants.h" #include "extensions/common/extension.h" +#include "extensions/common/extension_features.h" #include "extensions/common/extension_l10n_util.h" #include "extensions/common/file_util.h" #include "extensions/common/manifest.h" @@ -242,6 +243,12 @@ if (require_modern_manifest_version_) result |= Extension::REQUIRE_MODERN_MANIFEST_VERSION; + if (base::FeatureList::IsEnabled( + extensions_features:: + kAllowWithholdingExtensionPermissionsOnInstall)) { + result |= Extension::WITHHOLD_PERMISSIONS; + } + return result; }
diff --git a/chrome/browser/extensions/unpacked_installer_unittest.cc b/chrome/browser/extensions/unpacked_installer_unittest.cc new file mode 100644 index 0000000..62dc160 --- /dev/null +++ b/chrome/browser/extensions/unpacked_installer_unittest.cc
@@ -0,0 +1,62 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/extensions/unpacked_installer.h" + +#include "base/test/scoped_feature_list.h" +#include "chrome/browser/extensions/extension_service_test_base.h" +#include "components/crx_file/id_util.h" +#include "extensions/browser/extension_registry.h" +#include "extensions/browser/permissions_manager.h" +#include "extensions/browser/test_extension_registry_observer.h" +#include "extensions/common/extension_features.h" + +namespace extensions { + +class UnpackedInstallerUnitTest : public ExtensionServiceTestBase, + public testing::WithParamInterface<bool> { + public: + UnpackedInstallerUnitTest() { + if (GetParam()) { + feature_list_.InitAndEnableFeature( + extensions_features::kAllowWithholdingExtensionPermissionsOnInstall); + } else { + feature_list_.InitAndDisableFeature( + extensions_features::kAllowWithholdingExtensionPermissionsOnInstall); + } + } + ~UnpackedInstallerUnitTest() override = default; + + private: + base::test::ScopedFeatureList feature_list_; +}; + +// Tests host permissions are withheld by default at installation when flag is +// enabled. +TEST_P(UnpackedInstallerUnitTest, WithheldHostPermissionsWithFlag) { + InitializeEmptyExtensionService(); + + // Load extension. + TestExtensionRegistryObserver observer(registry()); + base::FilePath extension_path = + data_dir().AppendASCII("api_test/simple_all_urls"); + extensions::UnpackedInstaller::Create(service())->Load(extension_path); + scoped_refptr<const Extension> loaded_extension = + observer.WaitForExtensionLoaded(); + + // Verify extension was installed. + EXPECT_EQ(loaded_extension->name(), "All Urls Extension"); + + // Host permissions should be withheld at installation only when flag is + // enabled. + bool flag_enabled = GetParam(); + PermissionsManager* permissions_manager = + PermissionsManager::Get(browser_context()); + EXPECT_EQ(permissions_manager->HasWithheldHostPermissions(*loaded_extension), + flag_enabled); +} + +INSTANTIATE_TEST_SUITE_P(All, UnpackedInstallerUnitTest, testing::Bool()); + +} // namespace extensions
diff --git a/chrome/browser/file_select_helper.cc b/chrome/browser/file_select_helper.cc index 5127f0e..679f2ea6 100644 --- a/chrome/browser/file_select_helper.cc +++ b/chrome/browser/file_select_helper.cc
@@ -373,7 +373,7 @@ void FileSelectHelper::ContentAnalysisCompletionCallback( std::vector<blink::mojom::FileChooserFileInfoPtr> list, const enterprise_connectors::ContentAnalysisDelegate::Data& data, - const enterprise_connectors::ContentAnalysisDelegate::Result& result) { + enterprise_connectors::ContentAnalysisDelegate::Result& result) { if (AbortIfWebContentsDestroyed()) return; @@ -383,7 +383,8 @@ DCHECK_GE(list.size(), result.paths_results.size()); // Remove any files that did not pass the deep scan. Non-native files are - // skipped. + // skipped. There is no need to update `result` since the logic here doesn't + // change verdicts. size_t i = 0; for (auto it = list.begin(); it != list.end();) { if ((*it)->is_native_file()) {
diff --git a/chrome/browser/file_select_helper.h b/chrome/browser/file_select_helper.h index 9d60b4e..19415d7 100644 --- a/chrome/browser/file_select_helper.h +++ b/chrome/browser/file_select_helper.h
@@ -230,7 +230,7 @@ void ContentAnalysisCompletionCallback( std::vector<blink::mojom::FileChooserFileInfoPtr> list, const enterprise_connectors::ContentAnalysisDelegate::Data& data, - const enterprise_connectors::ContentAnalysisDelegate::Result& result); + enterprise_connectors::ContentAnalysisDelegate::Result& result); #endif // Finish the PerformContentAnalysisIfNeeded() handling after the
diff --git a/chrome/browser/first_party_sets/first_party_sets_navigation_throttle.cc b/chrome/browser/first_party_sets/first_party_sets_navigation_throttle.cc index 6000ae4..af20c5d7 100644 --- a/chrome/browser/first_party_sets/first_party_sets_navigation_throttle.cc +++ b/chrome/browser/first_party_sets/first_party_sets_navigation_throttle.cc
@@ -13,6 +13,7 @@ #include "base/timer/timer.h" #include "chrome/browser/first_party_sets/first_party_sets_policy_service.h" #include "chrome/browser/first_party_sets/first_party_sets_policy_service_factory.h" +#include "chrome/browser/profiles/profile.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/web_contents.h" @@ -66,9 +67,17 @@ FirstPartySetsNavigationThrottle::MaybeCreateNavigationThrottle( content::NavigationHandle* navigation_handle) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + Profile* profile = Profile::FromBrowserContext( + navigation_handle->GetWebContents()->GetBrowserContext()); + // The `service` might be null for some irregular profiles. + // TODO(https://crbug.com/1348572): regular profiles and guest sessions + // aren't mutually exclusive on ChromeOS. + if (!profile->IsRegularProfile() || profile->IsGuestSession()) + return nullptr; + FirstPartySetsPolicyService* service = - FirstPartySetsPolicyServiceFactory::GetForBrowserContext( - navigation_handle->GetWebContents()->GetBrowserContext()); + FirstPartySetsPolicyServiceFactory::GetForBrowserContext(profile); + DCHECK(service); if (!features::kFirstPartySetsClearSiteDataOnChangedSets.Get() || navigation_handle->GetParentFrameOrOuterDocument() || service->is_ready()) {
diff --git a/chrome/browser/first_party_sets/first_party_sets_navigation_throttle.h b/chrome/browser/first_party_sets/first_party_sets_navigation_throttle.h index 09c7a33..61bafbd 100644 --- a/chrome/browser/first_party_sets/first_party_sets_navigation_throttle.h +++ b/chrome/browser/first_party_sets/first_party_sets_navigation_throttle.h
@@ -36,9 +36,9 @@ const char* GetNameForLogging() override; void Resume() override; - // Only create throttle if FPS initialization has not completed and FPS - // clearing is enabled and this is the outermost frame navigation; returns - // nullptr otherwise. + // Only create throttle for the regular profile if FPS initialization has not + // completed and FPS clearing is enabled and this is the outermost frame + // navigation; returns nullptr otherwise. static std::unique_ptr<FirstPartySetsNavigationThrottle> MaybeCreateNavigationThrottle(content::NavigationHandle* navigation_handle);
diff --git a/chrome/browser/first_party_sets/first_party_sets_navigation_throttle_unittest.cc b/chrome/browser/first_party_sets/first_party_sets_navigation_throttle_unittest.cc index d20ca1e7..eec245e 100644 --- a/chrome/browser/first_party_sets/first_party_sets_navigation_throttle_unittest.cc +++ b/chrome/browser/first_party_sets/first_party_sets_navigation_throttle_unittest.cc
@@ -110,6 +110,16 @@ } TEST_F(FirstPartySetsNavigationThrottleTest, + MaybeCreateNavigationThrottle_IrregularProfile) { + // Create throttle for main frames. + content::MockNavigationHandle handle(GURL(kExampleURL), main_rfh()); + ASSERT_TRUE(handle.IsInOutermostMainFrame()); + profile()->SetGuestSession(true); + EXPECT_FALSE( + FirstPartySetsNavigationThrottle::MaybeCreateNavigationThrottle(&handle)); +} + +TEST_F(FirstPartySetsNavigationThrottleTest, MaybeCreateNavigationThrottle_ServiceNotReady) { // Create throttle for main frames. content::MockNavigationHandle handle(GURL(kExampleURL), main_rfh());
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 3aefe2b4..8ac9b766 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -954,14 +954,9 @@ "expiry_milestone": 95 }, { - "name": "chrome-whats-new-in-main-menu-new-badge", - "owners": [ "rbpotter" ], - "expiry_milestone": 106 - }, - { "name": "chrome-whats-new-ui", "owners": [ "rbpotter" ], - "expiry_milestone": 110 + "expiry_milestone": 116 }, { "name": "chrome-wide-echo-cancellation", @@ -4146,12 +4141,6 @@ "expiry_milestone": 116 }, { - "name": "improve-reader-mode-prompt", - "owners": ["lazzzis@google.com", "aishwaryarj@google.com", - "//chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/OWNERS"], - "expiry_milestone": 110 - }, - { "name": "improved-keyboard-shortcuts", "owners": [ "zentaro@google.com", "jimmyxgong@google.com", "cros-peripherals@google.com"], @@ -5865,6 +5854,14 @@ "expiry_milestone": -1 }, { + "name": "record-permission-expiration-timestamps", + "owners": [ + "sideyilmaz", + "dullweber", + "chrome-friendly-settings@google.com"], + "expiry_milestone": 115 + }, + { "name": "record-snapshot-size", "owners": ["edchin","bling-flags@google.com"], "expiry_milestone": 91
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 8bfc18d..5e0dbe5 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -226,8 +226,7 @@ const char kWebFilterInterstitialRefreshName[] = "Web filter interstitial refresh."; const char kWebFilterInterstitialRefreshDescription[] = - "Enable web filter interstitial refresh for Family Link users on Chrome " - "OS."; + "Enable web filter interstitial refresh for Family Link users."; #endif // ENABLE_SUPERVISED_USERS const char kUpcomingSharingFeaturesName[] = "Enable upcoming sharing features."; @@ -691,14 +690,6 @@ const char kChromeWhatsNewUIDescription[] = "Enables Chrome What's New page at chrome://whats-new."; -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) -const char kChromeWhatsNewInMainMenuNewBadgeName[] = - "Show 'New' badge on 'What's New' menu item."; -const char kChromeWhatsNewInMainMenuNewBadgeDescription[] = - "Enables 'New' promo badge on 'What's New' in the Help portion of the main " - "menu."; -#endif - const char kDarkLightModeKMeansColorName[] = "K Means color algorithm for dark light mode"; const char kDarkLightModeKMeansColorDescription[] = @@ -2380,6 +2371,12 @@ "right-hand side address bar icon for quiet permission prompts. Requires " "chrome://flags/#quiet-notification-prompts to be enabled."; +const char kRecordPermissionExpirationTimestampsName[] = + "Record permission expiration timestamps"; +const char kRecordPermissionExpirationTimestampsDescription[] = + "When enabled, permissions grants with a durable session model will have " + "an expiration date set."; + const char kPointerLockOptionsName[] = "Enables pointer lock options"; const char kPointerLockOptionsDescription[] = "Enables pointer lock unadjustedMovement. When unadjustedMovement is set " @@ -5672,11 +5669,6 @@ const char kListAllDisplayModesDescription[] = "Enables listing all external displays' modes in the display settings."; -const char kLocalWebApprovalsName[] = "Local web approvals"; -const char kLocalWebApprovalsDescription[] = - "Enable local web approvals for Family Link users on ChromeOS. Web filter " - "interstitial refresh needs to also be enabled."; - const char kEnableHardwareMirrorModeName[] = "Enable Hardware Mirror Mode"; const char kEnableHardwareMirrorModeDescription[] = "Enables hardware support when multiple displays are set to mirror mode."; @@ -6371,6 +6363,13 @@ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || // BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_ANDROID) +const char kLocalWebApprovalsName[] = "Local web approvals"; +const char kLocalWebApprovalsDescription[] = + "Enable local web approvals for Family Link users. Web filter interstitial " + "refresh needs to also be enabled."; +#endif + #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) const char kWebShareName[] = "Web Share"; const char kWebShareDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index c7b06074..017b386 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -385,11 +385,6 @@ extern const char kChromeWhatsNewUIName[]; extern const char kChromeWhatsNewUIDescription[]; -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) -extern const char kChromeWhatsNewInMainMenuNewBadgeName[]; -extern const char kChromeWhatsNewInMainMenuNewBadgeDescription[]; -#endif - extern const char kDarkLightModeKMeansColorName[]; extern const char kDarkLightModeKMeansColorDescription[]; @@ -1340,6 +1335,9 @@ extern const char kPermissionQuietChipName[]; extern const char kPermissionQuietChipDescription[]; +extern const char kRecordPermissionExpirationTimestampsName[]; +extern const char kRecordPermissionExpirationTimestampsDescription[]; + extern const char kPointerLockOptionsName[]; extern const char kPointerLockOptionsDescription[]; @@ -3264,9 +3262,6 @@ extern const char kListAllDisplayModesName[]; extern const char kListAllDisplayModesDescription[]; -extern const char kLocalWebApprovalsName[]; -extern const char kLocalWebApprovalsDescription[]; - extern const char kEnableHardwareMirrorModeName[]; extern const char kEnableHardwareMirrorModeDescription[]; @@ -3720,6 +3715,11 @@ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || // BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_ANDROID) +extern const char kLocalWebApprovalsName[]; +extern const char kLocalWebApprovalsDescription[]; +#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_ANDROID) + // Feature flags -------------------------------------------------------------- #if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 3777b0a6..b3f48721 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -97,6 +97,7 @@ &autofill::features::kAutofillEnableSupportForHonorificPrefixes, &autofill::features::kAutofillEnableUpdateVirtualCardEnrollment, &autofill::features::kAutofillEnableVirtualCardMetadata, + &autofill::features::kAutofillEnableCardProductName, &blink::features::kForceWebContentsDarkMode, &blink::features::kOSKResizesVisualViewportByDefault, &blink::features::kPrerender2,
diff --git a/chrome/browser/flags/android/chrome_session_state.cc b/chrome/browser/flags/android/chrome_session_state.cc index d7175a4..09463de 100644 --- a/chrome/browser/flags/android/chrome_session_state.cc +++ b/chrome/browser/flags/android/chrome_session_state.cc
@@ -17,7 +17,7 @@ using chrome::android::MultipleUserProfilesState; namespace { -ActivityType activity_type = ActivityType::kUndeclared; +ActivityType activity_type = ActivityType::kPreFirstTab; bool is_in_multi_window_mode = false; DarkModeState dark_mode_state = DarkModeState::kUnknown; MultipleUserProfilesState multiple_user_profiles_state = @@ -42,7 +42,7 @@ case ActivityType::kCustomTab: case ActivityType::kTrustedWebActivity: return VISIBLE_CUSTOM_TAB; - case ActivityType::kUndeclared: + case ActivityType::kPreFirstTab: return NO_VISIBLE_TAB; } NOTREACHED(); @@ -59,13 +59,13 @@ void SetActivityType(PrefService* local_state, ActivityType type) { DCHECK(local_state); - DCHECK_NE(type, ActivityType::kUndeclared); + DCHECK_NE(type, ActivityType::kPreFirstTab); ActivityType prev_activity_type = activity_type; activity_type = type; // EmitActivityTypeHistograms on first SetActivityType call. - if (prev_activity_type == ActivityType::kUndeclared) { + if (prev_activity_type == ActivityType::kPreFirstTab) { EmitActivityTypeHistograms(activity_type); SaveActivityTypeToLocalState(local_state, activity_type); }
diff --git a/chrome/browser/flags/android/chrome_session_state.h b/chrome/browser/flags/android/chrome_session_state.h index 324fe30..900034997 100644 --- a/chrome/browser/flags/android/chrome_session_state.h +++ b/chrome/browser/flags/android/chrome_session_state.h
@@ -24,13 +24,37 @@ // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.flags enum class ActivityType { + // Chrome is running as the Chrome Android Browser App (i.e., traditional Chrome). kTabbed, + + // Chrome is running embedded in another application as a Custom Tab. + // See: + // - https://developer.chrome.com/docs/android/custom-tabs/ kCustomTab, + + // Chrome is running as a Trusted Web Activity. + // + // See: + // - https://developer.chrome.com/docs/android/trusted-web-activity/ kTrustedWebActivity, + + // Chrome is running as a Web App + // + // See + // - https://chromium.googlesource.com/chromium/src/+/HEAD/docs/webapps/README.md kWebapp, + + // Chrome is running as a WebAPK. + // + // See: + // - https://web.dev/webapks/ + // - https://chromium.googlesource.com/chromium/src/+/refs/heads/main/chrome/android/webapk/README.md kWebApk, - kUndeclared, - kMaxValue = kUndeclared, + + // Chrome has started running, but no tab has yet become visible (for example: warm-up, + // FRE, downloads manager shown in response to a notification click, etc). + kPreFirstTab, + kMaxValue = kPreFirstTab, }; // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.flags
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 d0859b5..c686815a 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
@@ -189,6 +189,7 @@ "AutofillRankingFormulaUsageHalfLife"; public static final String AUTOFILL_ENABLE_VIRTUAL_CARD_METADATA = "AutofillEnableVirtualCardMetadata"; + public static final String AUTOFILL_ENABLE_CARD_PRODUCT_NAME = "AutofillEnableCardProductName"; public static final String ANDROID_SEARCH_ENGINE_CHOICE_NOTIFICATION = "AndroidSearchEngineChoiceNotification"; public static final String ANONYMOUS_UPDATE_CHECKS = "AnonymousUpdateChecks";
diff --git a/chrome/browser/hid/hid_browsertest.cc b/chrome/browser/hid/hid_browsertest.cc index a4c05cdb..355d2879 100644 --- a/chrome/browser/hid/hid_browsertest.cc +++ b/chrome/browser/hid/hid_browsertest.cc
@@ -9,6 +9,7 @@ #include "base/memory/raw_ptr.h" #include "base/test/bind.h" #include "base/test/values_test_util.h" +#include "chrome/app/chrome_command_ids.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chrome_content_browser_client.h" #include "chrome/browser/hid/chrome_hid_delegate.h" @@ -41,6 +42,12 @@ #include "components/user_manager/scoped_user_manager.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS) +#include "chrome/browser/hid/hid_pinned_notification.h" +#else +#include "chrome/browser/hid/hid_status_icon.h" +#endif // BUILDFLAG(IS_CHROMEOS) + namespace { using ::extensions::Extension; @@ -92,6 +99,8 @@ return device; } +} // namespace + #if BUILDFLAG(ENABLE_EXTENSIONS) // Base Test fixture with kEnableWebHidOnExtensionServiceWorker default // disabled. @@ -128,6 +137,12 @@ display_service_for_profile_notification_ = std::make_unique<NotificationDisplayServiceTester>(profile()); + +#if BUILDFLAG(IS_CHROMEOS) + display_service_for_system_notification_ = + std::make_unique<NotificationDisplayServiceTester>( + /*profile=*/nullptr); +#endif // BUILDFLAG(IS_CHROMEOS) } void TearDownOnMainThread() override { @@ -207,10 +222,38 @@ EXPECT_EQ(web_contents->GetURL(), expected_link_destination); } + void SimulateClickOnSystemTrayIconButton(Browser* browser) { +#if BUILDFLAG(IS_CHROMEOS) + auto expected_pinned_notification_id = + HidPinnedNotification::GetNotificationId(browser->profile()); + auto maybe_indicator_notification = + display_service_for_system_notification_->GetNotification( + expected_pinned_notification_id); + ASSERT_TRUE(maybe_indicator_notification); + EXPECT_TRUE(maybe_indicator_notification->pinned()); + display_service_for_system_notification_->SimulateClick( + NotificationHandler::Type::TRANSIENT, expected_pinned_notification_id, + /*action_index=*/0, /*reply=*/absl::nullopt); +#else + // On non-ChromeOS platforms, as they use status icon and there isn't good + // test infra to simulate click on the status icon button, so simulate the + // click event by invoking ExecuteCommand of HidConnectionTracker directly. + auto* hid_status_icon = + static_cast<HidStatusIcon*>(g_browser_process->hid_system_tray_icon()); + hid_status_icon->ExecuteCommand(IDC_MANAGE_HID_DEVICES_FIRST, 0); +#endif + auto* web_contents = browser->tab_strip_model()->GetActiveWebContents(); + EXPECT_EQ(web_contents->GetURL(), "chrome://settings/content/hidDevices"); + } + protected: base::test::ScopedFeatureList scoped_feature_list_; std::unique_ptr<NotificationDisplayServiceTester> display_service_for_profile_notification_; +#if BUILDFLAG(IS_CHROMEOS) + std::unique_ptr<NotificationDisplayServiceTester> + display_service_for_system_notification_; +#endif // BUILDFLAG(IS_CHROMEOS) private: device::FakeHidManager hid_manager_; @@ -344,7 +387,6 @@ )"; const auto* extension = LoadExtensionAndRunTest(kBackgroundJs); SimulateClickOnDeviceOpenedNotification(browser(), extension); + SimulateClickOnSystemTrayIconButton(browser()); } #endif // BUILDFLAG(ENABLE_EXTENSIONS) - -} // namespace
diff --git a/chrome/browser/hid/hid_connection_tracker.cc b/chrome/browser/hid/hid_connection_tracker.cc index 76d6006c..b1307f3 100644 --- a/chrome/browser/hid/hid_connection_tracker.cc +++ b/chrome/browser/hid/hid_connection_tracker.cc
@@ -11,6 +11,7 @@ #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/hid/hid_system_tray_icon.h" #include "chrome/browser/notifications/notification_display_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/chrome_pages.h" @@ -67,12 +68,30 @@ void HidConnectionTracker::IncrementConnectionCount() { ++connection_count_; - // TODO(crbug.com/1360981): Hook up HidSystemTrayIcon. + auto* hid_system_tray_icon = g_browser_process->hid_system_tray_icon(); + if (!hid_system_tray_icon) { + return; + } + + if (connection_count_ == 1) { + hid_system_tray_icon->AddProfile(profile_); + } else { + hid_system_tray_icon->NotifyConnectionCountUpdated(profile_); + } } void HidConnectionTracker::DecrementConnectionCount() { --connection_count_; - // TODO(crbug.com/1360981): Hook up HidSystemTrayIcon. + auto* hid_system_tray_icon = g_browser_process->hid_system_tray_icon(); + if (!hid_system_tray_icon) { + return; + } + + if (connection_count_ == 0) { + hid_system_tray_icon->RemoveProfile(profile_); + } else { + hid_system_tray_icon->NotifyConnectionCountUpdated(profile_); + } } void HidConnectionTracker::NotifyDeviceConnected(const url::Origin& origin) { @@ -123,6 +142,8 @@ void HidConnectionTracker::CleanUp() { if (connection_count_ > 0) { connection_count_ = 0; - // TODO(crbug.com/1360981): Hook up HidSystemTrayIcon. + auto* hid_system_tray_icon = g_browser_process->hid_system_tray_icon(); + if (hid_system_tray_icon) + hid_system_tray_icon->RemoveProfile(profile_); } }
diff --git a/chrome/browser/hid/hid_connection_tracker_unittest.cc b/chrome/browser/hid/hid_connection_tracker_unittest.cc index 9b2fbf6..ce691e0 100644 --- a/chrome/browser/hid/hid_connection_tracker_unittest.cc +++ b/chrome/browser/hid/hid_connection_tracker_unittest.cc
@@ -11,11 +11,13 @@ #include "build/chromeos_buildflags.h" #include "chrome/browser/hid/hid_connection_tracker.h" #include "chrome/browser/hid/hid_connection_tracker_factory.h" +#include "chrome/browser/hid/hid_system_tray_icon.h" #include "chrome/browser/notifications/notification_display_service_tester.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/grit/generated_resources.h" #include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/testing_browser_process.h" +#include "chrome/test/base/testing_profile_manager.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/l10n/l10n_util.h" @@ -32,7 +34,8 @@ namespace { -constexpr base::StringPiece kExtensionName = "Fake extension"; +constexpr char kExtensionName[] = "Fake extension"; +constexpr char kTestProfileName[] = "user@gmail.com"; class MockHidConnectionTracker : public HidConnectionTracker { public: @@ -51,6 +54,13 @@ }); } +class MockHidSystemTrayIcon : public HidSystemTrayIcon { + public: + MOCK_METHOD(void, AddProfile, (Profile*), (override)); + MOCK_METHOD(void, RemoveProfile, (Profile*), (override)); + MOCK_METHOD(void, NotifyConnectionCountUpdated, (Profile*), (override)); +}; + class HidConnectionTrackerTest : public BrowserWithTestWindowTest { public: HidConnectionTrackerTest() = default; @@ -80,6 +90,10 @@ display_service_ = std::make_unique<NotificationDisplayServiceTester>(profile()); + auto hid_system_tray_icon = std::make_unique<MockHidSystemTrayIcon>(); + hid_system_tray_icon_ = hid_system_tray_icon.get(); + TestingBrowserProcess::GetGlobal()->SetHidSystemTrayIcon( + std::move(hid_system_tray_icon)); hid_connection_tracker_ = static_cast<MockHidConnectionTracker*>( HidConnectionTrackerFactory::GetForProfile(profile(), /*create=*/true)); @@ -159,13 +173,67 @@ return *hid_connection_tracker_; } + MockHidSystemTrayIcon& hid_system_tray_icon() { + return *hid_system_tray_icon_; + } + + Profile* CreateTestingProfile(const std::string& profile_name) { + // Ideally, we should be able to pass testing factory when calling profile + // manager's CreateTestingProfile. However, due to the fact that: + // 1) TestingProfile::TestingProfile(...) will call BrowserContextShutdown + // as part of setting testing factory. + // 2) HidConnectionTrackerFactory::BrowserContextShutdown() at some point + // need valid profile_metrics::GetBrowserProfileType() as part of + // HidConnectionTrackerFactory::GetForProfile(). + // It will hit failure in profile_metrics::GetBrowserProfileType() because + // the profile is not initialized properly before setting testing factory. + // As a result, here create a profile then call SetTestingFactory to inject + // MockHidConnectionTracker. + Profile* profile = profile_manager()->CreateTestingProfile(profile_name); + HidConnectionTrackerFactory::GetInstance()->SetTestingFactory( + profile, GetHidConnectionTrackerTestingFactory()); + return profile; + } + private: std::unique_ptr<NotificationDisplayServiceTester> display_service_; raw_ptr<MockHidConnectionTracker> hid_connection_tracker_; + raw_ptr<MockHidSystemTrayIcon> hid_system_tray_icon_; }; } // namespace +TEST_F(HidConnectionTrackerTest, DeviceConnection) { + EXPECT_CALL(hid_system_tray_icon(), AddProfile(profile())); + hid_connection_tracker().IncrementConnectionCount(); + EXPECT_CALL(hid_system_tray_icon(), NotifyConnectionCountUpdated(profile())); + hid_connection_tracker().IncrementConnectionCount(); + EXPECT_CALL(hid_system_tray_icon(), NotifyConnectionCountUpdated(profile())); + hid_connection_tracker().DecrementConnectionCount(); + EXPECT_CALL(hid_system_tray_icon(), RemoveProfile(profile())); + hid_connection_tracker().DecrementConnectionCount(); +} + +TEST_F(HidConnectionTrackerTest, DeviceConnectionWithNullSystemTrayIcon) { + // Test the scenario with null HID system tray icon and it doesn't cause + // crash. + TestingBrowserProcess::GetGlobal()->SetHidSystemTrayIcon(nullptr); + hid_connection_tracker().IncrementConnectionCount(); + hid_connection_tracker().IncrementConnectionCount(); + hid_connection_tracker().DecrementConnectionCount(); + hid_connection_tracker().DecrementConnectionCount(); +} + +TEST_F(HidConnectionTrackerTest, ProfileDestroyed) { + CreateTestingProfile(kTestProfileName); + EXPECT_CALL(hid_system_tray_icon(), AddProfile(profile())); + hid_connection_tracker().IncrementConnectionCount(); + EXPECT_CALL(hid_system_tray_icon(), NotifyConnectionCountUpdated(profile())); + hid_connection_tracker().IncrementConnectionCount(); + EXPECT_CALL(hid_system_tray_icon(), RemoveProfile(profile())); + profile_manager()->DeleteTestingProfile(kTestProfileName); +} + #if BUILDFLAG(ENABLE_EXTENSIONS) TEST_F(HidConnectionTrackerTest, DeviceConnectedNotificationByExtension) { std::string extension_name(kExtensionName); @@ -173,5 +241,4 @@ hid_connection_tracker().NotifyDeviceConnected(extension->origin()); CheckDeviceConnectedNotification(extension->origin(), extension_name); } - #endif // BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/hid/hid_pinned_notification.cc b/chrome/browser/hid/hid_pinned_notification.cc new file mode 100644 index 0000000..2dd6112 --- /dev/null +++ b/chrome/browser/hid/hid_pinned_notification.cc
@@ -0,0 +1,96 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/hid/hid_pinned_notification.h" + +#include "base/containers/contains.h" +#include "base/strings/strcat.h" +#include "build/build_config.h" +#include "chrome/browser/hid/hid_connection_tracker.h" +#include "chrome/browser/hid/hid_connection_tracker_factory.h" +#include "chrome/browser/notifications/system_notification_helper.h" +#include "chrome/browser/profiles/profile.h" +#include "extensions/buildflags/buildflags.h" +#include "ui/base/models/image_model.h" +#include "ui/message_center/public/cpp/notification.h" +#include "ui/message_center/public/cpp/notification_delegate.h" + +HidPinnedNotification::HidPinnedNotification() = default; + +HidPinnedNotification::~HidPinnedNotification() = default; + +// static +std::string HidPinnedNotification::GetNotificationId(Profile* profile) { + return base::StrCat({"chrome://device_indicator/hid/", profile->UniqueId()}); +} + +std::unique_ptr<message_center::Notification> +HidPinnedNotification::CreateNotification(Profile* profile) { + message_center::RichNotificationData data; + data.buttons.emplace_back(GetManageHidDeviceButtonLabel(profile)); + auto delegate = + base::MakeRefCounted<message_center::HandleNotificationClickDelegate>( + base::BindRepeating( + [](Profile* profile, absl::optional<int> button_index) { + // HidConnectionTracker guarantees that RemoveProfile() is + // called on Profile destruction so it is impossible to interact + // with the notification after |profile| becomes a dangling + // pointer. + if (!button_index) + return; + + DCHECK_EQ(*button_index, 0); + auto* hid_connection_tracker = + HidConnectionTrackerFactory::GetForProfile( + profile, /*create=*/false); + DCHECK(hid_connection_tracker); + hid_connection_tracker->ShowHidContentSettingsExceptions(); + }, + profile)); + auto notification_id = GetNotificationId(profile); + auto* hid_connection_tracker = + HidConnectionTrackerFactory::GetForProfile(profile, /*create=*/false); + DCHECK(hid_connection_tracker); + auto notification = std::make_unique<message_center::Notification>( + message_center::NOTIFICATION_TYPE_SIMPLE, notification_id, + GetTooltipLabel(hid_connection_tracker->connection_count()), + /*message=*/std::u16string(), /*icon=*/ui::ImageModel(), + /*display_source=*/std::u16string(), /*origin_url=*/GURL(), +#if BUILDFLAG(IS_CHROMEOS_ASH) + message_center::NotifierId(message_center::NotifierType::SYSTEM_COMPONENT, + notification_id, + ash::NotificationCatalogName::kWebHid), +#else + message_center::NotifierId(message_center::NotifierType::SYSTEM_COMPONENT, + notification_id), +#endif + data, std::move(delegate)); + notification->set_small_image(gfx::Image(GetStatusTrayIcon())); + notification->set_pinned(true); + // Set to system priority so it will never timeout. + notification->SetSystemPriority(); + return notification; +} + +void HidPinnedNotification::DisplayNotification( + std::unique_ptr<message_center::Notification> notification) { + SystemNotificationHelper::GetInstance()->Display(*notification); +} + +void HidPinnedNotification::AddProfile(Profile* profile) { + DCHECK(!base::Contains(profiles_, profile)); + profiles_.emplace(profile); + DisplayNotification(CreateNotification(profile)); +} + +void HidPinnedNotification::RemoveProfile(Profile* profile) { + DCHECK(base::Contains(profiles_, profile)); + profiles_.erase(profile); + SystemNotificationHelper::GetInstance()->Close(GetNotificationId(profile)); +} + +void HidPinnedNotification::NotifyConnectionCountUpdated(Profile* profile) { + DCHECK(base::Contains(profiles_, profile)); + DisplayNotification(CreateNotification(profile)); +}
diff --git a/chrome/browser/hid/hid_pinned_notification.h b/chrome/browser/hid/hid_pinned_notification.h new file mode 100644 index 0000000..a66b2bcf --- /dev/null +++ b/chrome/browser/hid/hid_pinned_notification.h
@@ -0,0 +1,44 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_HID_HID_PINNED_NOTIFICATION_H_ +#define CHROME_BROWSER_HID_HID_PINNED_NOTIFICATION_H_ + +#include <memory> +#include <string> +#include <vector> + +#include "base/containers/flat_set.h" +#include "chrome/browser/hid/hid_system_tray_icon.h" +#include "ui/message_center/public/cpp/notification.h" + +class HidPinnedNotification : public HidSystemTrayIcon { + public: + HidPinnedNotification(); + HidPinnedNotification(const HidPinnedNotification&) = delete; + HidPinnedNotification& operator=(const HidPinnedNotification&) = delete; + ~HidPinnedNotification() override; + + void AddProfile(Profile* profile) override; + void RemoveProfile(Profile* profile) override; + void NotifyConnectionCountUpdated(Profile* profile) override; + + static std::string GetNotificationId(Profile* profile); + + private: + // Create a pinned notification for |profile| to indicate at least one HID + // device is being accessed. + std::unique_ptr<message_center::Notification> CreateNotification( + Profile* profile); + + // Display |notification| in the system notification. + void DisplayNotification( + std::unique_ptr<message_center::Notification> notification); + + // A set of profiles being tracked, each profile have a pinned notification in + // the system tray. + base::flat_set<Profile*> profiles_; +}; + +#endif // CHROME_BROWSER_HID_HID_PINNED_NOTIFICATION_H_
diff --git a/chrome/browser/hid/hid_pinned_notification_unittest.cc b/chrome/browser/hid/hid_pinned_notification_unittest.cc new file mode 100644 index 0000000..d287520 --- /dev/null +++ b/chrome/browser/hid/hid_pinned_notification_unittest.cc
@@ -0,0 +1,98 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/hid/hid_pinned_notification.h" + +#include "chrome/browser/hid/hid_connection_tracker.h" +#include "chrome/browser/hid/hid_connection_tracker_factory.h" +#include "chrome/browser/hid/hid_system_tray_icon_unittest.h" +#include "chrome/browser/notifications/notification_display_service_tester.h" +#include "chrome/browser/notifications/system_notification_helper.h" +#include "chrome/test/base/testing_browser_process.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +class HidPinnedNotificationTest : public HidSystemTrayIconTestBase { + public: + void SetUp() override { + HidSystemTrayIconTestBase::SetUp(); + TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper( + std::make_unique<SystemNotificationHelper>()); + display_service_ = + std::make_unique<NotificationDisplayServiceTester>(/*profile=*/nullptr); + } + + void TearDown() override { + TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper(nullptr); + HidSystemTrayIconTestBase::TearDown(); + } + + void CheckIcon(const std::vector<std::pair<Profile*, size_t>>& + profile_connection_counts) override { + EXPECT_FALSE(display_service_ + ->GetDisplayedNotificationsForType( + NotificationHandler::Type::TRANSIENT) + .empty()); + + // Check each button label and behavior of clicking the button. + for (const auto& pair : profile_connection_counts) { + auto* hid_connection_tracker = static_cast<MockHidConnectionTracker*>( + HidConnectionTrackerFactory::GetForProfile(pair.first, + /*create=*/false)); + EXPECT_TRUE(hid_connection_tracker); + auto maybe_notification = display_service_->GetNotification( + HidPinnedNotification::GetNotificationId(pair.first)); + ASSERT_TRUE(maybe_notification); + EXPECT_EQ(maybe_notification->title(), GetExpectedIconTooltip( + /*num_devices=*/pair.second)); + + EXPECT_EQ(maybe_notification->rich_notification_data().buttons.size(), + 1u); + EXPECT_EQ(maybe_notification->rich_notification_data().buttons[0].title, + GetExpectedButtonTitleForProfile(pair.first)); + EXPECT_TRUE(maybe_notification->delegate()); + + EXPECT_CALL(*hid_connection_tracker, ShowHidContentSettingsExceptions()); + SimulateButtonClick(pair.first); + } + } + + void CheckIconHidden() override { + EXPECT_TRUE(display_service_ + ->GetDisplayedNotificationsForType( + NotificationHandler::Type::TRANSIENT) + .empty()); + } + + private: + void SimulateButtonClick(Profile* profile) { + display_service_->SimulateClick( + NotificationHandler::Type::TRANSIENT, + HidPinnedNotification::GetNotificationId(profile), + /*action_index=*/0, /*reply=*/absl::nullopt); + } + + std::unique_ptr<NotificationDisplayServiceTester> display_service_; +}; + +TEST_F(HidPinnedNotificationTest, SingleProfileEmptyName) { + // Current TestingProfileManager can't support empty profile name as it uses + // profile name for profile path. Passing empty would result in a failure in + // ProfileManager::IsAllowedProfilePath(). Changing the way + // TestingProfileManager creating profile path like adding "profile" prefix + // doesn't work either as some tests are written in a way that takes + // assumption of testing profile path pattern. Hence it creates testing + // profile with non-empty name and then change the profile name to empty which + // can still achieve what this file wants to test. + profile()->set_profile_name(""); + TestSingleProfile(); +} + +TEST_F(HidPinnedNotificationTest, SingleProfileNonEmptyName) { + TestSingleProfile(); +} + +TEST_F(HidPinnedNotificationTest, MultipleProfiles) { + TestMultipleProfiles(); +}
diff --git a/chrome/browser/hid/hid_status_icon.cc b/chrome/browser/hid/hid_status_icon.cc new file mode 100644 index 0000000..589e034 --- /dev/null +++ b/chrome/browser/hid/hid_status_icon.cc
@@ -0,0 +1,106 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/hid/hid_status_icon.h" + +#include <string> +#include <vector> + +#include "base/containers/contains.h" +#include "base/containers/cxx20_erase_vector.h" +#include "build/build_config.h" +#include "chrome/app/chrome_command_ids.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/hid/hid_connection_tracker.h" +#include "chrome/browser/hid/hid_connection_tracker_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/status_icons/status_icon.h" +#include "chrome/browser/status_icons/status_icon_menu_model.h" +#include "chrome/browser/status_icons/status_tray.h" +#include "extensions/buildflags/buildflags.h" + +HidStatusIcon::HidStatusIcon() = default; + +HidStatusIcon::~HidStatusIcon() { + if (status_icon_) { + auto* status_tray = g_browser_process->status_tray(); + DCHECK(status_tray); + status_tray->RemoveStatusIcon(status_icon_); + } +} + +void HidStatusIcon::AddProfile(Profile* profile) { + DCHECK(!base::Contains(profiles_, profile)); + profiles_.emplace_back(profile); + RefreshIcon(); +} + +void HidStatusIcon::RemoveProfile(Profile* profile) { + DCHECK(base::Contains(profiles_, profile)); + base::EraseIf(profiles_, [&](Profile* entry) { return profile == entry; }); + RefreshIcon(); +} + +void HidStatusIcon::NotifyConnectionCountUpdated(Profile* profile) { + DCHECK(status_icon_); + DCHECK(base::Contains(profiles_, profile)); + status_icon_->SetToolTip(GetTooltipLabel(GetTotalConnectionCount())); +} + +void HidStatusIcon::ExecuteCommand(int command_id, int event_flags) { + DCHECK_GE(command_id, IDC_MANAGE_HID_DEVICES_FIRST); + DCHECK_LE(command_id, IDC_MANAGE_HID_DEVICES_LAST); + size_t profile_idx = command_id - IDC_MANAGE_HID_DEVICES_FIRST; + if (profile_idx < profiles_.size()) { + // |profiles_[profile_idx]|'s HidConnectionTracker guarantees the entry in + // |profiles_| is removed when the profile is destroyed. + auto* hid_connection_tracker = HidConnectionTrackerFactory::GetForProfile( + profiles_[profile_idx], /*create=*/false); + DCHECK(hid_connection_tracker); + hid_connection_tracker->ShowHidContentSettingsExceptions(); + } +} + +size_t HidStatusIcon::GetTotalConnectionCount() { + size_t total_connection_count = 0; + for (Profile* profile : profiles_) { + auto* hid_connection_tracker = + HidConnectionTrackerFactory::GetForProfile(profile, /*create=*/false); + DCHECK(hid_connection_tracker); + total_connection_count += hid_connection_tracker->connection_count(); + } + return total_connection_count; +} + +void HidStatusIcon::RefreshIcon() { + auto* status_tray = g_browser_process->status_tray(); + DCHECK(status_tray); + if (profiles_.empty()) { + DCHECK(status_icon_); + status_tray->RemoveStatusIcon(status_icon_); + status_icon_ = nullptr; + return; + } + + auto menu = std::make_unique<StatusIconMenuModel>(this); + for (size_t idx = 0; idx < profiles_.size(); idx++) { + int command_id = IDC_MANAGE_HID_DEVICES_FIRST + static_cast<int>(idx); + if (command_id > IDC_MANAGE_HID_DEVICES_LAST) { + // This case should be fairly rare, but if we have more profiles than + // pre-defined command ids, we don't put those in the status icon menu. + // TODO(crbug.com/1360981): Add a metric to capture this. + break; + } + menu->AddItem(command_id, GetManageHidDeviceButtonLabel(profiles_[idx])); + } + auto tooltip_label = GetTooltipLabel(GetTotalConnectionCount()); + + if (!status_icon_) { + status_icon_ = status_tray->CreateStatusIcon( + StatusTray::OTHER_ICON, GetStatusTrayIcon(), tooltip_label); + } else { + status_icon_->SetToolTip(tooltip_label); + } + status_icon_->SetContextMenu(std::move(menu)); +}
diff --git a/chrome/browser/hid/hid_status_icon.h b/chrome/browser/hid/hid_status_icon.h new file mode 100644 index 0000000..aa6d793 --- /dev/null +++ b/chrome/browser/hid/hid_status_icon.h
@@ -0,0 +1,54 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_HID_HID_STATUS_ICON_H_ +#define CHROME_BROWSER_HID_HID_STATUS_ICON_H_ + +#include <memory> +#include <string> +#include <vector> + +#include "chrome/browser/hid/hid_system_tray_icon.h" +#include "chrome/browser/status_icons/status_icon.h" + +class HidStatusIcon : public HidSystemTrayIcon, + public StatusIconMenuModel::Delegate { + public: + HidStatusIcon(); + HidStatusIcon(const HidStatusIcon&) = delete; + HidStatusIcon& operator=(const HidStatusIcon&) = delete; + ~HidStatusIcon() override; + + void AddProfile(Profile* profile) override; + void RemoveProfile(Profile* profile) override; + void NotifyConnectionCountUpdated(Profile* profile) override; + + private: + // For using ExecuteCommand to simulate button click. + friend class WebHidExtensionBrowserTest; + + // Get the total connection count from all the profiles being tracked. + size_t GetTotalConnectionCount(); + + // StatusIconMenuModel::Delegate + void ExecuteCommand(int command_id, int event_flags) override; + + // To refresh the system tray icon when there is a button (for a profile) + // added/removed. + void RefreshIcon(); + + // Reference to our status icon (if any) - owned by the StatusTray. + raw_ptr<StatusIcon> status_icon_ = nullptr; + + // A list of profiles being tracked, each profile has an entry in the context + // menu of the system tray icon. Each entry in |profiles_| is expected to be + // maintained by the profile's HidConnectionTracker. Meaning + // HidConnectionTracker is responsible for removing the profile from + // |profiles_| by calling RemoveProfile when the profile is about to be + // destroyed, so that there is never a case where a destroyed profile can be + // accessed through |profiles_|. + std::vector<Profile*> profiles_; +}; + +#endif // CHROME_BROWSER_HID_HID_STATUS_ICON_H_
diff --git a/chrome/browser/hid/hid_status_icon_unittest.cc b/chrome/browser/hid/hid_status_icon_unittest.cc new file mode 100644 index 0000000..eb88be2 --- /dev/null +++ b/chrome/browser/hid/hid_status_icon_unittest.cc
@@ -0,0 +1,177 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/hid/hid_system_tray_icon_unittest.h" + +#include <string> + +#include "base/strings/stringprintf.h" +#include "build/build_config.h" +#include "build/chromeos_buildflags.h" +#include "chrome/app/chrome_command_ids.h" +#include "chrome/browser/hid/hid_connection_tracker.h" +#include "chrome/browser/hid/hid_connection_tracker_factory.h" +#include "chrome/browser/status_icons/status_icon.h" +#include "chrome/browser/status_icons/status_icon_menu_model.h" +#include "chrome/browser/status_icons/status_tray.h" +#include "chrome/test/base/browser_with_test_window_test.h" +#include "chrome/test/base/testing_browser_process.h" +#include "chrome/test/base/testing_profile_manager.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +constexpr size_t kMenuMaxItemCount = + (IDC_MANAGE_HID_DEVICES_LAST - IDC_MANAGE_HID_DEVICES_FIRST + 1); + +} // namespace + +class MockStatusIcon : public StatusIcon { + public: + explicit MockStatusIcon(const std::u16string& tool_tip) + : tool_tip_(tool_tip) {} + void SetImage(const gfx::ImageSkia& image) override {} + void SetToolTip(const std::u16string& tool_tip) override { + tool_tip_ = tool_tip; + } + void DisplayBalloon(const gfx::ImageSkia& icon, + const std::u16string& title, + const std::u16string& contents, + const message_center::NotifierId& notifier_id) override {} + void UpdatePlatformContextMenu(StatusIconMenuModel* menu) override { + menu_item_ = menu; + } + const std::u16string& tool_tip() const { return tool_tip_; } + StatusIconMenuModel* menu_item() const { return menu_item_; } + + private: + raw_ptr<StatusIconMenuModel> menu_item_ = nullptr; + std::u16string tool_tip_; +}; + +class MockStatusTray : public StatusTray { + public: + std::unique_ptr<StatusIcon> CreatePlatformStatusIcon( + StatusIconType type, + const gfx::ImageSkia& image, + const std::u16string& tool_tip) override { + return std::make_unique<MockStatusIcon>(tool_tip); + } + + const StatusIcons& GetStatusIconsForTest() const { return status_icons(); } +}; + +class HidStatusIconTest : public HidSystemTrayIconTestBase { + public: + void SetUp() override { + HidSystemTrayIconTestBase::SetUp(); + TestingBrowserProcess::GetGlobal()->SetStatusTray( + std::make_unique<MockStatusTray>()); + } + + void TearDown() override { + HidSystemTrayIconTestBase::TearDown(); + TestingBrowserProcess::GetGlobal()->SetStatusTray(nullptr); + } + + void CheckIcon(const std::vector<std::pair<Profile*, size_t>>& + profile_connection_counts) override { + const auto* status_tray = static_cast<MockStatusTray*>( + TestingBrowserProcess::GetGlobal()->status_tray()); + ASSERT_TRUE(status_tray); + EXPECT_EQ(status_tray->GetStatusIconsForTest().size(), 1u); + const auto* status_icon = static_cast<MockStatusIcon*>( + status_tray->GetStatusIconsForTest().back().get()); + + size_t total_connection_count = 0; + auto* menu_item = status_icon->menu_item(); + EXPECT_EQ(menu_item->GetItemCount(), + std::min(profile_connection_counts.size(), kMenuMaxItemCount)); + // Check each button label and behavior of clicking the button. + for (size_t idx = 0; idx < profile_connection_counts.size(); idx++) { + auto* hid_connection_tracker = static_cast<MockHidConnectionTracker*>( + HidConnectionTrackerFactory::GetForProfile( + profile_connection_counts[idx].first, + /*create=*/false)); + EXPECT_TRUE(hid_connection_tracker); + if (idx < kMenuMaxItemCount) { + EXPECT_EQ(menu_item->GetCommandIdAt(idx), + IDC_MANAGE_HID_DEVICES_FIRST + static_cast<int>(idx)); + EXPECT_EQ(menu_item->GetLabelAt(idx), + GetExpectedButtonTitleForProfile( + profile_connection_counts[idx].first)); + EXPECT_CALL(*hid_connection_tracker, + ShowHidContentSettingsExceptions()); + SimulateButtonClick(idx); + } + total_connection_count += profile_connection_counts[idx].second; + } + + // Check the icon tool tip is with the right singular/plural term according + // to total connection count across profiles. + EXPECT_EQ(status_icon->tool_tip(), + GetExpectedIconTooltip(total_connection_count)); + } + + void CheckIconHidden() override { + const auto* status_tray = static_cast<MockStatusTray*>( + TestingBrowserProcess::GetGlobal()->status_tray()); + ASSERT_TRUE(status_tray); + EXPECT_TRUE(status_tray->GetStatusIconsForTest().empty()); + } + + private: + void SimulateButtonClick(size_t button_idx) { + const auto* status_tray = static_cast<MockStatusTray*>( + TestingBrowserProcess::GetGlobal()->status_tray()); + ASSERT_TRUE(status_tray); + EXPECT_EQ(status_tray->GetStatusIconsForTest().size(), 1u); + const auto* status_icon = static_cast<MockStatusIcon*>( + status_tray->GetStatusIconsForTest().back().get()); + auto* menu_item = status_icon->menu_item(); + EXPECT_LT(button_idx, menu_item->GetItemCount()); + menu_item->ActivatedAt(button_idx); + } +}; + +TEST_F(HidStatusIconTest, SingleProfileEmptyName) { + // Current TestingProfileManager can't support empty profile name as it uses + // profile name for profile path. Passing empty would result in a failure in + // ProfileManager::IsAllowedProfilePath(). Changing the way + // TestingProfileManager creating profile path like adding "profile" prefix + // doesn't work either as some tests are written in a way that takes + // assumption of testing profile path pattern. Hence it creates testing + // profile with non-empty name and then change the profile name to empty which + // can still achieve what this file wants to test. + profile()->set_profile_name(""); + TestSingleProfile(); +} + +TEST_F(HidStatusIconTest, SingleProfileNonEmptyName) { + TestSingleProfile(); +} + +TEST_F(HidStatusIconTest, MultipleProfiles) { + TestMultipleProfiles(); +} + +TEST_F(HidStatusIconTest, NumProfilesOverLimit) { + // Set to 10 more profiles than the max limit. + size_t num_profiles = kMenuMaxItemCount + 10; + std::vector<std::pair<Profile*, size_t>> profile_connection_counts; + std::vector<HidConnectionTracker*> hid_connection_trackers; + for (size_t idx = 0; idx < num_profiles; idx++) { + std::string profile_name = base::StringPrintf("user%zu", idx); + auto* profile = CreateTestingProfile(profile_name); + hid_connection_trackers.emplace_back( + HidConnectionTrackerFactory::GetForProfile(profile, + /*create=*/true)); + hid_connection_trackers[idx]->IncrementConnectionCount(); + profile_connection_counts.push_back({profile, 1}); + } + // CheckIcon has the logic to expect the icon button size is + // |kMenuMaxItemCount|. + CheckIcon(profile_connection_counts); +}
diff --git a/chrome/browser/hid/hid_system_tray_icon.cc b/chrome/browser/hid/hid_system_tray_icon.cc new file mode 100644 index 0000000..e0b7df42 --- /dev/null +++ b/chrome/browser/hid/hid_system_tray_icon.cc
@@ -0,0 +1,40 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/hid/hid_system_tray_icon.h" + +#include <vector> + +#include "base/strings/utf_string_conversions.h" +#include "chrome/grit/chromium_strings.h" +#include "chrome/grit/generated_resources.h" +#include "components/vector_icons/vector_icons.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/gfx/paint_vector_icon.h" + +// static +gfx::ImageSkia HidSystemTrayIcon::GetStatusTrayIcon() { + return gfx::CreateVectorIcon(vector_icons::kVideogameAssetIcon, + gfx::kGoogleGrey300); +} + +// static +std::u16string HidSystemTrayIcon::GetManageHidDeviceButtonLabel( + Profile* profile) { + std::u16string profile_name = + base::UTF8ToUTF16(profile->GetProfileUserName()); + if (profile_name.empty()) { + return l10n_util::GetStringUTF16( + IDS_WEBHID_SYSTEM_TRAY_ICON_BUTTON_FOR_MANAGE_HID_DEVICE); + } + return l10n_util::GetStringFUTF16( + IDS_WEBHID_SYSTEM_TRAY_ICON_BUTTON_FOR_MANAGE_HID_DEVICE_WITH_PROFILE_NAME, + profile_name); +} + +// static +std::u16string HidSystemTrayIcon::GetTooltipLabel(size_t num_devices) { + return l10n_util::GetPluralStringFUTF16(IDS_WEBHID_SYSTEM_TRAY_ICON_TOOLTIP, + static_cast<int>(num_devices)); +}
diff --git a/chrome/browser/hid/hid_system_tray_icon.h b/chrome/browser/hid/hid_system_tray_icon.h new file mode 100644 index 0000000..8690afb --- /dev/null +++ b/chrome/browser/hid/hid_system_tray_icon.h
@@ -0,0 +1,40 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_HID_HID_SYSTEM_TRAY_ICON_H_ +#define CHROME_BROWSER_HID_HID_SYSTEM_TRAY_ICON_H_ + +#include "chrome/browser/profiles/profile.h" +#include "ui/gfx/image/image_skia.h" + +class HidSystemTrayIcon { + public: + HidSystemTrayIcon() = default; + HidSystemTrayIcon(const HidSystemTrayIcon&) = delete; + HidSystemTrayIcon& operator=(const HidSystemTrayIcon&) = delete; + virtual ~HidSystemTrayIcon() = default; + + // Add a profile to the system tray icon. + virtual void AddProfile(Profile* profile) = 0; + + // Remove a profile from the system tray icon. + virtual void RemoveProfile(Profile* profile) = 0; + + // Notify the system tray icon the connection count of the |profile| has + // changed. + virtual void NotifyConnectionCountUpdated(Profile* profile) = 0; + + protected: + // Get the image for the status tray icon. + static gfx::ImageSkia GetStatusTrayIcon(); + + // Get the label of the button for managing HID device permission on the HID + // system tray icon. + static std::u16string GetManageHidDeviceButtonLabel(Profile* profile); + + // Get the label of the tooltip of the HID system tray icon. + static std::u16string GetTooltipLabel(size_t num_devices); +}; + +#endif // CHROME_BROWSER_HID_HID_SYSTEM_TRAY_ICON_H_
diff --git a/chrome/browser/hid/hid_system_tray_icon_unittest.cc b/chrome/browser/hid/hid_system_tray_icon_unittest.cc new file mode 100644 index 0000000..5a44059f --- /dev/null +++ b/chrome/browser/hid/hid_system_tray_icon_unittest.cc
@@ -0,0 +1,133 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/hid/hid_system_tray_icon_unittest.h" + +#include <string> + +#include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" +#include "build/build_config.h" +#include "build/chromeos_buildflags.h" +#include "chrome/browser/hid/hid_connection_tracker.h" +#include "chrome/browser/hid/hid_connection_tracker_factory.h" +#include "chrome/grit/chromium_strings.h" +#include "chrome/grit/generated_resources.h" +#include "chrome/test/base/browser_with_test_window_test.h" +#include "chrome/test/base/testing_profile_manager.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/l10n/l10n_util.h" + +MockHidConnectionTracker::MockHidConnectionTracker(Profile* profile) + : HidConnectionTracker(profile) {} + +MockHidConnectionTracker::~MockHidConnectionTracker() = default; + +std::u16string HidSystemTrayIconTestBase::GetExpectedButtonTitleForProfile( + Profile* profile) { + const std::string profile_name = profile->GetProfileUserName(); + if (profile_name.empty()) { + return u"Manage HID devices"; + } + return base::UTF8ToUTF16( + base::StringPrintf("Manage HID devices for %s", profile_name.c_str())); +} + +std::u16string HidSystemTrayIconTestBase::GetExpectedIconTooltip( + size_t num_devices) { + // It might be either "Chromium is connected to a HID device" or "Google + // Chrome is connected to a HID device" depending is_chrome_branded in the + // build config file, hence using l10n_util to get the expected string. + return l10n_util::GetPluralStringFUTF16(IDS_WEBHID_SYSTEM_TRAY_ICON_TOOLTIP, + static_cast<int>(num_devices)); +} + +BrowserContextKeyedServiceFactory::TestingFactory +HidSystemTrayIconTestBase::GetHidConnectionTrackerTestingFactory() { + return base::BindRepeating([](content::BrowserContext* browser_context) { + return static_cast<std::unique_ptr<KeyedService>>( + std::make_unique<MockHidConnectionTracker>( + Profile::FromBrowserContext(browser_context))); + }); +} + +Profile* HidSystemTrayIconTestBase::CreateTestingProfile( + const std::string& profile_name) { + // TODO(crbug.com/1399310): Pass testing factory when creating profile. + // Ideally, we should be able to pass testing factory when calling profile + // manager's CreateTestingProfile. However, due to the fact that: + // 1) TestingProfile::TestingProfile(...) will call BrowserContextShutdown as + // part of setting testing factory. + // 2) HidConnectionTrackerFactory::BrowserContextShutdown() at some point need + // valid profile_metrics::GetBrowserProfileType() as part of + // HidConnectionTrackerFactory::GetForProfile(). + // It will hit failure in profile_metrics::GetBrowserProfileType() due to + // profile is not initialized properly before setting testing factory. As a + // result, here create a profile then call SetTestingFactory to inject + // MockHidConnectionTracker. + Profile* profile = profile_manager()->CreateTestingProfile(profile_name); + HidConnectionTrackerFactory::GetInstance()->SetTestingFactory( + profile, GetHidConnectionTrackerTestingFactory()); + return profile; +} + +void HidSystemTrayIconTestBase::TestSingleProfile() { + Profile* profile = CreateTestingProfile("user"); + HidConnectionTracker* hid_connection_tracker = + HidConnectionTrackerFactory::GetForProfile(profile, /*create=*/true); + CheckIconHidden(); + + hid_connection_tracker->IncrementConnectionCount(); + CheckIcon({{profile, 1}}); + + hid_connection_tracker->IncrementConnectionCount(); + CheckIcon({{profile, 2}}); + + hid_connection_tracker->IncrementConnectionCount(); + CheckIcon({{profile, 3}}); + + hid_connection_tracker->DecrementConnectionCount(); + CheckIcon({{profile, 2}}); + + hid_connection_tracker->DecrementConnectionCount(); + CheckIcon({{profile, 1}}); + + hid_connection_tracker->DecrementConnectionCount(); + CheckIconHidden(); +} + +void HidSystemTrayIconTestBase::TestMultipleProfiles() { + size_t num_profiles = 3; + std::vector<Profile*> profiles; + std::vector<HidConnectionTracker*> hid_connection_trackers; + for (size_t idx = 0; idx < num_profiles; idx++) { + std::string profile_name = base::StringPrintf("user%zu", idx); + profiles.emplace_back(CreateTestingProfile(profile_name)); + hid_connection_trackers.emplace_back( + HidConnectionTrackerFactory::GetForProfile(profiles.back(), + /*create=*/true)); + } + CheckIconHidden(); + + hid_connection_trackers[0]->IncrementConnectionCount(); + CheckIcon({{profiles[0], 1}}); + + hid_connection_trackers[1]->IncrementConnectionCount(); + CheckIcon({{profiles[0], 1}, {profiles[1], 1}}); + + hid_connection_trackers[2]->IncrementConnectionCount(); + CheckIcon({{profiles[0], 1}, {profiles[1], 1}, {profiles[2], 1}}); + + // Destroyed a profile will remove it from being tracked in the hid system + // tray icon. + profile_manager()->DeleteTestingProfile(profiles[0]->GetProfileUserName()); + CheckIcon({{profiles[1], 1}, {profiles[2], 1}}); + + hid_connection_trackers[2]->DecrementConnectionCount(); + CheckIcon({{profiles[1], 1}}); + + hid_connection_trackers[1]->DecrementConnectionCount(); + CheckIconHidden(); +}
diff --git a/chrome/browser/hid/hid_system_tray_icon_unittest.h b/chrome/browser/hid/hid_system_tray_icon_unittest.h new file mode 100644 index 0000000..a29dae1 --- /dev/null +++ b/chrome/browser/hid/hid_system_tray_icon_unittest.h
@@ -0,0 +1,51 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_HID_HID_SYSTEM_TRAY_ICON_UNITTEST_H_ +#define CHROME_BROWSER_HID_HID_SYSTEM_TRAY_ICON_UNITTEST_H_ + +#include <string> + +#include "chrome/browser/hid/hid_connection_tracker.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/test/base/browser_with_test_window_test.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +class MockHidConnectionTracker : public HidConnectionTracker { + public: + explicit MockHidConnectionTracker(Profile* profile); + ~MockHidConnectionTracker() override; + MOCK_METHOD(void, ShowHidContentSettingsExceptions, (), (override)); +}; + +class HidSystemTrayIconTestBase : public BrowserWithTestWindowTest { + public: + // Check if the hid system tray icon is shown and all the action buttons work + // correctly with the given |profile_connection_counts|. + virtual void CheckIcon(const std::vector<std::pair<Profile*, size_t>>& + profile_connection_counts) = 0; + + // Check no hid system tray is being shown. + virtual void CheckIconHidden() = 0; + + std::u16string GetExpectedButtonTitleForProfile(Profile* profile); + std::u16string GetExpectedIconTooltip(size_t num_devices); + + // This is used to inject MockHidConnectionTracker. + BrowserContextKeyedServiceFactory::TestingFactory + GetHidConnectionTrackerTestingFactory(); + + // Create a testing profile with MockHidConnectionTracker. + Profile* CreateTestingProfile(const std::string& profile_name); + + // Test the scenario involving multiple profiles including profile + // destruction. + void TestMultipleProfiles(); + + // Test the scenario with single profile. + void TestSingleProfile(); +}; + +#endif // CHROME_BROWSER_HID_HID_SYSTEM_TRAY_ICON_UNITTEST_H_
diff --git a/chrome/browser/history/history_tab_helper.cc b/chrome/browser/history/history_tab_helper.cc index 32748be..2fdde2cc 100644 --- a/chrome/browser/history/history_tab_helper.cc +++ b/chrome/browser/history/history_tab_helper.cc
@@ -119,7 +119,7 @@ case chrome::android::ActivityType::kTrustedWebActivity: case chrome::android::ActivityType::kWebapp: case chrome::android::ActivityType::kWebApk: - case chrome::android::ActivityType::kUndeclared: + case chrome::android::ActivityType::kPreFirstTab: return history::VisitContextAnnotations::BrowserType::kUnknown; } #else
diff --git a/chrome/browser/media/webrtc/get_display_media_set_browsertest.cc b/chrome/browser/media/webrtc/get_display_media_set_browsertest.cc index 254f4e49e..8b5efd0 100644 --- a/chrome/browser/media/webrtc/get_display_media_set_browsertest.cc +++ b/chrome/browser/media/webrtc/get_display_media_set_browsertest.cc
@@ -11,6 +11,7 @@ #include "base/containers/flat_set.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" +#include "base/test/gtest_tags.h" #include "chrome/browser/chrome_content_browser_client.h" #include "chrome/browser/media/webrtc/webrtc_browsertest_base.h" #include "chrome/browser/ui/browser.h" @@ -158,6 +159,8 @@ IN_PROC_BROWSER_TEST_F(GetDisplayMediaSetBrowserTest, GetDisplayMediaSetMultipleScreensSuccess) { + base::AddTagToTestResult("feature_id", + "screenplay-f3601ae4-bff7-495a-a51f-3c0997a46445"); SetScreens(/*screen_count=*/5u); std::vector<std::string> track_ids; EXPECT_TRUE(RunGetDisplayMediaSet(contents_, "{autoSelectAllScreens: true}",
diff --git a/chrome/browser/metrics/chrome_android_metrics_provider_unittest.cc b/chrome/browser/metrics/chrome_android_metrics_provider_unittest.cc index 15b6189..d5595e7 100644 --- a/chrome/browser/metrics/chrome_android_metrics_provider_unittest.cc +++ b/chrome/browser/metrics/chrome_android_metrics_provider_unittest.cc
@@ -111,14 +111,14 @@ histogram_tester_.ExpectTotalCount("Android.ChromeActivity.Type", 0); } -// Tests initial transition from kUndeclared to !kUndeclared. +// Tests initial transition from kPreFirstTab to !kPreFirstTab. TEST_P(ChromeAndroidMetricsProviderTest, SetActivityType_CustomTabs) { - // kUndeclared -> kUndeclared is not a valid scenario. Early exit. - if (activity_type() == ActivityType::kUndeclared) + // kPreFirstTab -> kPreFirstTab is not a valid scenario. Early exit. + if (activity_type() == ActivityType::kPreFirstTab) return; - // Validating startup, so seed the activity type to kUndeclared, - SetInitialActivityTypeForTesting(ActivityType::kUndeclared); + // Validating startup, so seed the activity type to kPreFirstTab, + SetInitialActivityTypeForTesting(ActivityType::kPreFirstTab); // Set the activity type as if a new tab was created.. SetActivityType(&pref_service_, activity_type()); @@ -133,8 +133,8 @@ // Tests initial warmup records, no tab becomes visible TEST_F(ChromeAndroidMetricsProviderTest, NoInitialTab) { - // Validating startup, so seed the activity type to kUndeclared, - SetInitialActivityTypeForTesting(ActivityType::kUndeclared); + // Validating startup, so seed the activity type to kPreFirstTab, + SetInitialActivityTypeForTesting(ActivityType::kPreFirstTab); // On startup an initial record is created... but no tab becomes active // (example: background warmup or user is still going through FRE), and @@ -145,33 +145,33 @@ // Only one sample issued over lifetime of first record. histogram_tester_.ExpectUniqueSample( "CustomTabs.Visible", - GetCustomTabsVisibleValue(ActivityType::kUndeclared), 1); + GetCustomTabsVisibleValue(ActivityType::kPreFirstTab), 1); histogram_tester_.ExpectUniqueSample("Android.ChromeActivity.Type", - ActivityType::kUndeclared, 1); + ActivityType::kPreFirstTab, 1); // ... and a new record opened... triggering another sample. metrics_provider_.OnDidCreateMetricsLog(); histogram_tester_.ExpectUniqueSample( "CustomTabs.Visible", - GetCustomTabsVisibleValue(ActivityType::kUndeclared), 2); + GetCustomTabsVisibleValue(ActivityType::kPreFirstTab), 2); // ... and subsequently closed... metrics_provider_.ProvideCurrentSessionData(&uma_proto_); histogram_tester_.ExpectUniqueSample( "CustomTabs.Visible", - GetCustomTabsVisibleValue(ActivityType::kUndeclared), 2); + GetCustomTabsVisibleValue(ActivityType::kPreFirstTab), 2); histogram_tester_.ExpectUniqueSample("Android.ChromeActivity.Type", - ActivityType::kUndeclared, 2); + ActivityType::kPreFirstTab, 2); } -// Tests initial transition from kUndeclared to !kUndeclared. +// Tests initial transition from kPreFirstTab to !kPreFirstTab. TEST_P(ChromeAndroidMetricsProviderTest, InitialTab) { - // kUndeclared -> kUndeclared is not a valid scenario. Early exit. - if (activity_type() == ActivityType::kUndeclared) + // kPreFirstTab -> kPreFirstTab is not a valid scenario. Early exit. + if (activity_type() == ActivityType::kPreFirstTab) return; - // Validating startup, so seed the activity type to kUndeclared, - SetInitialActivityTypeForTesting(ActivityType::kUndeclared); + // Validating startup, so seed the activity type to kPreFirstTab, + SetInitialActivityTypeForTesting(ActivityType::kPreFirstTab); // On startup an initial record is created... then a tab is resumed which // sets the activity type and eventually closes the first log record. @@ -184,12 +184,12 @@ histogram_tester_.ExpectTotalCount("CustomTabs.Visible", 2); histogram_tester_.ExpectBucketCount( "CustomTabs.Visible", - GetCustomTabsVisibleValue(ActivityType::kUndeclared), 1); + GetCustomTabsVisibleValue(ActivityType::kPreFirstTab), 1); histogram_tester_.ExpectBucketCount( "CustomTabs.Visible", GetCustomTabsVisibleValue(activity_type()), 1); histogram_tester_.ExpectTotalCount("Android.ChromeActivity.Type", 2); histogram_tester_.ExpectBucketCount("Android.ChromeActivity.Type", - ActivityType::kUndeclared, 1); + ActivityType::kPreFirstTab, 1); histogram_tester_.ExpectBucketCount("Android.ChromeActivity.Type", activity_type(), 1); @@ -201,20 +201,20 @@ histogram_tester_.ExpectTotalCount("CustomTabs.Visible", 3); histogram_tester_.ExpectBucketCount( "CustomTabs.Visible", - GetCustomTabsVisibleValue(ActivityType::kUndeclared), 1); + GetCustomTabsVisibleValue(ActivityType::kPreFirstTab), 1); histogram_tester_.ExpectBucketCount( "CustomTabs.Visible", GetCustomTabsVisibleValue(activity_type()), 2); histogram_tester_.ExpectTotalCount("Android.ChromeActivity.Type", 3); histogram_tester_.ExpectBucketCount("Android.ChromeActivity.Type", - ActivityType::kUndeclared, 1); + ActivityType::kPreFirstTab, 1); histogram_tester_.ExpectBucketCount("Android.ChromeActivity.Type", activity_type(), 2); } -// Tests initial transition from kUndeclared to !kUndeclared. +// Tests initial transition from kPreFirstTab to !kPreFirstTab. TEST_P(ChromeAndroidMetricsProviderTest, TabSwitching) { - // kUndeclared -> kUndeclared is not a valid scenario. Early exit. - if (activity_type() == ActivityType::kUndeclared) + // kPreFirstTab -> kPreFirstTab is not a valid scenario. Early exit. + if (activity_type() == ActivityType::kPreFirstTab) return; const auto first_activity_type = activity_type(); @@ -222,8 +222,8 @@ static_cast<ActivityType>((static_cast<int>(first_activity_type) + 1) % static_cast<int>(ActivityType::kMaxValue)); - // Validating startup, so seed the activity type to kUndeclared, - SetInitialActivityTypeForTesting(ActivityType::kUndeclared); + // Validating startup, so seed the activity type to kPreFirstTab, + SetInitialActivityTypeForTesting(ActivityType::kPreFirstTab); // On startup an initial record is created metrics_provider_.OnDidCreateMetricsLog(); @@ -260,4 +260,4 @@ ActivityType::kTrustedWebActivity, ActivityType::kWebapp, ActivityType::kWebApk, - ActivityType::kUndeclared)); + ActivityType::kPreFirstTab));
diff --git a/chrome/browser/new_tab_page/modules/drive/drive_service.cc b/chrome/browser/new_tab_page/modules/drive/drive_service.cc index 17ed86ac..0a553e2 100644 --- a/chrome/browser/new_tab_page/modules/drive/drive_service.cc +++ b/chrome/browser/new_tab_page/modules/drive/drive_service.cc
@@ -103,7 +103,9 @@ "mimeType": "application/vnd.google-apps.document" }, "justification": { - "displayText": { "textSegment": [{"text": "You opened yesterday"}]} + "unstructuredJustificationDescription": { + "textSegment": [{"text": "You opened yesterday"}] + } } }, { @@ -114,7 +116,9 @@ "mimeType": "application/vnd.google-apps.spreadsheet" }, "justification": { - "displayText": { "textSegment": [{"text": "You opened today"}]} + "unstructuredJustificationDescription": { + "textSegment": [{"text": "You opened today"}] + } } }, { @@ -125,7 +129,9 @@ "mimeType": "application/vnd.google-apps.presentation" }, "justification": { - "displayText": { "textSegment": [{"text": "You opened on Monday"}]} + "unstructuredJustificationDescription": { + "textSegment": [{"text": "You opened on Monday"}] + } } } ] @@ -309,8 +315,8 @@ for (const auto& item : items->GetList()) { auto* title = item.FindStringPath("driveItem.title"); auto* mime_type = item.FindStringPath("driveItem.mimeType"); - auto* justification_text_segments = - item.FindListPath("justification.displayText.textSegment"); + auto* justification_text_segments = item.FindListPath( + "justification.unstructuredJustificationDescription.textSegment"); if (!justification_text_segments || justification_text_segments->GetList().size() == 0) { continue;
diff --git a/chrome/browser/new_tab_page/modules/drive/drive_service_unittest.cc b/chrome/browser/new_tab_page/modules/drive/drive_service_unittest.cc index 4af7c8c0..5a83771 100644 --- a/chrome/browser/new_tab_page/modules/drive/drive_service_unittest.cc +++ b/chrome/browser/new_tab_page/modules/drive/drive_service_unittest.cc
@@ -92,7 +92,7 @@ "mimeType": "application/vnd.google-apps.spreadsheet" }, "justification": { - "displayText": { + "unstructuredJustificationDescription": { "textSegment": [ { "text": "Foo foo" @@ -109,7 +109,7 @@ "mimeType": "application/vnd.google-apps.document" }, "justification": { - "displayText": { + "unstructuredJustificationDescription": { "textSegment": [ { "text": "Foo " @@ -203,7 +203,7 @@ "mimeType": "application/vnd.google-apps.spreadsheet" }, "justification": { - "displayText": { + "unstructuredJustificationDescription": { "textSegment": [ { "text": "Foo foo" @@ -259,7 +259,7 @@ "mimeType": "application/vnd.google-apps.spreadsheet" }, "justification": { - "displayText": { + "unstructuredJustificationDescription": { "textSegment": [ { "text": "Foo foo" @@ -584,7 +584,7 @@ "mimeType": "application/vnd.google-apps.document" }, "justification": { - "displayText": { + "unstructuredJustificationDescription": { "textSegment": [ { "text": "Foo "
diff --git a/chrome/browser/omaha/android/java/src/org/chromium/chrome/browser/omaha/ExponentialBackoffScheduler.java b/chrome/browser/omaha/android/java/src/org/chromium/chrome/browser/omaha/ExponentialBackoffScheduler.java index 7d42b60..16240ce 100644 --- a/chrome/browser/omaha/android/java/src/org/chromium/chrome/browser/omaha/ExponentialBackoffScheduler.java +++ b/chrome/browser/omaha/android/java/src/org/chromium/chrome/browser/omaha/ExponentialBackoffScheduler.java
@@ -7,6 +7,9 @@ import android.content.Context; import android.content.SharedPreferences; +import org.chromium.base.ContextUtils; +import org.chromium.base.TimeUtils; + import java.util.Random; import javax.annotation.concurrent.NotThreadSafe; @@ -43,20 +46,17 @@ private final long mBaseMilliseconds; private final long mMaxMilliseconds; - private final Context mContext; private final String mPreferencePackage; /** * Creates a new scheduler. * @param packageName The name under which to store its state in SharedPreferences. - * @param context The application's context. * @param baseMilliseconds Used to calculate random backoff times. * @param maxMilliseconds The absolute maximum delay allowed. */ public ExponentialBackoffScheduler( - String packageName, Context context, long baseMilliseconds, long maxMilliseconds) { + String packageName, long baseMilliseconds, long maxMilliseconds) { mPreferencePackage = packageName; - mContext = context; mBaseMilliseconds = baseMilliseconds; mMaxMilliseconds = maxMilliseconds; } @@ -88,7 +88,7 @@ * Returns a timestamp representing now, according to the backoff scheduler. */ public long getCurrentTime() { - return System.currentTimeMillis(); + return TimeUtils.currentTimeMillis(); } /** @@ -133,8 +133,8 @@ } private SharedPreferences getSharedPreferences() { - SharedPreferences preferences = - mContext.getSharedPreferences(mPreferencePackage, Context.MODE_PRIVATE); + SharedPreferences preferences = ContextUtils.getApplicationContext().getSharedPreferences( + mPreferencePackage, Context.MODE_PRIVATE); return preferences; } }
diff --git a/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc b/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc index d348577..8ade488 100644 --- a/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc +++ b/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc
@@ -153,7 +153,8 @@ Bucket(page_load_metrics::LayoutShiftUmaValue(expect_score), 1)); } -IN_PROC_BROWSER_TEST_F(LayoutInstabilityTest, SimpleBlockMovement) { +// TODO(crbug.com/1400401): Deflake and re-enable this test. +IN_PROC_BROWSER_TEST_F(LayoutInstabilityTest, DISABLED_SimpleBlockMovement) { RunWPT("simple-block-movement.html", ShiftFrame::LayoutShiftOnlyInMainFrame, true /* check_UKM_UMA_metrics */); } @@ -162,7 +163,8 @@ RunWPT("sources-enclosure.html"); } -IN_PROC_BROWSER_TEST_F(LayoutInstabilityTest, Sources_MaxImpact) { +// TODO(crbug.com/1400401): Deflake and re-enable this test. +IN_PROC_BROWSER_TEST_F(LayoutInstabilityTest, DISABLED_Sources_MaxImpact) { RunWPT("sources-maximpact.html"); } @@ -183,8 +185,9 @@ page_load_metrics::LayoutShiftUmaValue(0.03)); } +// TODO(crbug.com/1400401): Deflake and re-enable this test. IN_PROC_BROWSER_TEST_F(LayoutInstabilityTest, - CumulativeLayoutShift_OneSecondGap) { + DISABLED_CumulativeLayoutShift_OneSecondGap) { auto waiter = std::make_unique<page_load_metrics::PageLoadMetricsTestWaiter>( web_contents()); waiter->AddPageLayoutShiftExpectation(); @@ -264,8 +267,9 @@ Bucket(page_load_metrics::LayoutShiftUmaValue(*record_score_two), 1)); } +// TODO(crbug.com/1400401): Deflake and re-enable this test. IN_PROC_BROWSER_TEST_F(LayoutInstabilityTest, - CumulativeLayoutShift_hadRecentInput) { + DISABLED_CumulativeLayoutShift_hadRecentInput) { auto waiter = std::make_unique<page_load_metrics::PageLoadMetricsTestWaiter>( web_contents()); waiter->AddPageLayoutShiftExpectation();
diff --git a/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckImpl.java b/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckImpl.java index 4259cbea..c1085cb 100644 --- a/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckImpl.java +++ b/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckImpl.java
@@ -154,12 +154,6 @@ } @Override - public void onAutomatedPasswordChangeStarted(CompromisedCredential credential) { - PasswordChangeSuccessTrackerBridge.onAutomatedPasswordChangeStarted( - credential.getAssociatedUrl(), credential.getUsername()); - } - - @Override public void onManualPasswordChangeStarted(CompromisedCredential credential) { PasswordChangeSuccessTrackerBridge.onManualPasswordChangeStarted( credential.getAssociatedUrl(), credential.getUsername());
diff --git a/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/PasswordCheckComponentUi.java b/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/PasswordCheckComponentUi.java index bd30854..c6be8135 100644 --- a/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/PasswordCheckComponentUi.java +++ b/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/PasswordCheckComponentUi.java
@@ -31,12 +31,6 @@ void removeCredential(CompromisedCredential credential); /** - * Register the start of an automated password change flow. - * @param credential A {@link CompromisedCredential} for which a flow was started. - */ - void onAutomatedPasswordChangeStarted(CompromisedCredential credential); - - /** * Register the start of a manual password change flow. * @param credential A {@link CompromisedCredential} for which a flow was started. */
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordChangeSuccessTrackerBridge.java b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordChangeSuccessTrackerBridge.java index afeac48..014a1fb7 100644 --- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordChangeSuccessTrackerBridge.java +++ b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordChangeSuccessTrackerBridge.java
@@ -19,16 +19,6 @@ "org.chromium.chrome.browser.password_change.username"; /** - * Register the start of an automated password change flow. Notifies the - * password change success tracker. - * @param url The URL associated with the credential that is to be changed. - * @param username The username of the credential that is to be changed. - */ - public static void onAutomatedPasswordChangeStarted(GURL url, String username) { - PasswordChangeSuccessTrackerBridgeJni.get().onAutomatedPasswordChangeStarted(url, username); - } - - /** * Register the start of a manual password change flow. Notifies the * password change success tracker. * @param url The URL associated with the credential that is to be changed. @@ -43,7 +33,6 @@ */ @NativeMethods public interface Natives { - void onAutomatedPasswordChangeStarted(GURL url, String username); void onManualPasswordChangeStarted(GURL url, String username); } }
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelper.java b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelper.java index 105aad13..f6caa212 100644 --- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelper.java +++ b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelper.java
@@ -21,6 +21,7 @@ import androidx.annotation.VisibleForTesting; import com.google.android.gms.common.GoogleApiAvailability; +import com.google.android.gms.common.api.ApiException; import org.chromium.base.Callback; import org.chromium.base.metrics.RecordHistogram; @@ -88,6 +89,10 @@ "PasswordManager.CredentialManager.Account.GetIntent.Success"; private static final String ACCOUNT_GET_INTENT_ERROR_HISTOGRAM = "PasswordManager.CredentialManager.Account.GetIntent.Error"; + private static final String ACCOUNT_GET_INTENT_API_ERROR_HISTOGRAM = + "PasswordManager.CredentialManager.Account.GetIntent.APIError"; + private static final String ACCOUNT_GET_INTENT_ERROR_CONNECTION_RESULT_CODE_HISTOGRAM = + "PasswordManager.CredentialManager.Account.GetIntent.APIError.ConnectionResultCode"; private static final String ACCOUNT_LAUNCH_CREDENTIAL_MANAGER_SUCCESS_HISTOGRAM = "PasswordManager.CredentialManager.Account.Launch.Success"; @@ -97,6 +102,11 @@ "PasswordManager.CredentialManager.LocalProfile.GetIntent.Success"; private static final String LOCAL_GET_INTENT_ERROR_HISTOGRAM = "PasswordManager.CredentialManager.LocalProfile.GetIntent.Error"; + private static final String LOCAL_GET_INTENT_API_ERROR_HISTOGRAM = + "PasswordManager.CredentialManager.LocalProfile.GetIntent.APIError"; + private static final String LOCAL_GET_INTENT_ERROR_CONNECTION_RESULT_CODE_HISTOGRAM = + "PasswordManager.CredentialManager.LocalProfile.GetIntent.APIError" + + ".ConnectionResultCode"; private static final String LOCAL_LAUNCH_CREDENTIAL_MANAGER_SUCCESS_HISTOGRAM = "PasswordManager.CredentialManager.LocalProfile.Launch.Success"; @@ -211,8 +221,8 @@ * PasswordSpecifics then saves it to the ChromeSync module. * * @param referrer the place that requested to start a check. - * @param accountName the account name that is syncing passwords. If no value was provided local - * account will be used + * @param accountName the account name that is syncing passwords. If no value was provided, the + * local account will be used * @param successCallback callback called when password check finishes successfully * @param failureCallback callback called if password check encountered an error */ @@ -249,8 +259,8 @@ * Asynchronously returns the number of breached credentials for the provided account. * * @param referrer the place that requested number of breached credentials. - * @param accountName the account name that is syncing passwords. If no value was provided local - * account will be used. + * @param accountName the account name that is syncing passwords. If no value was provided, the + * local account will be used. * @param successCallback callback called with the number of breached passwords. * @param failureCallback callback called if encountered an error. */ @@ -284,8 +294,8 @@ } /** - * Checks whether the sync feature is enabled and the user has chosen to sync passwords. - * Note that this doesn't mean that passwords are actively syncing. + * Checks whether the sync feature is enabled and the user has chosen to sync passwords. + * Note that this doesn't mean that passwords are actively syncing. * * @param syncService the service to query about the sync status. * @return true if syncing passwords is enabled @@ -296,9 +306,10 @@ } /** - * Checks whether the sync feature is enabled, the user has chosen to sync passwords and - * they haven't set up a custom passphrase. - * The caller should make sure that the sync engine is initialized before calling this method. + * Checks whether the sync feature is enabled, the user has chosen to sync passwords and + * they haven't set up a custom passphrase. + * The caller should make sure that the sync engine is initialized before calling this + * method. * * Note that this doesn't mean that passwords are actively syncing. * @@ -313,7 +324,8 @@ /** * Checks whether the user is actively syncing passwords without a custom passphrase. - * The caller should make sure that the sync engine is initialized before calling this method. + * The caller should make sure that the sync engine is initialized before calling this + * method. * * @param syncService the service to query about the sync status. * @return true if actively syncing passwords and no custom passphrase was set. @@ -352,15 +364,16 @@ // TODO(http://crbug.com/1371422): Remove method and manage eviction from native code // as this is covered by chrome://password-manager-internals page. public static void resetUpmUnenrollment() { - // Exit early if Chrome doesn't need UPM UI. Assumes the unenroll pref isn't included in the - // usesUnifiedPasswordManagementUI check. + // Exit early if Chrome doesn't need UPM UI. Assumes the unenroll pref isn't included in + // the usesUnifiedPasswordManagementUI check. if (!PasswordManagerHelper.usesUnifiedPasswordManagerUI()) return; PrefService prefs = UserPrefs.get(Profile.getLastUsedRegularProfile()); // Exit early if the user is not unenrolled. if (!prefs.getBoolean(Pref.UNENROLLED_FROM_GOOGLE_MOBILE_SERVICES_DUE_TO_ERRORS)) return; - // Re-enroll the user by resetting the enroll pref. Other state reset happens on unenroll. + // Re-enroll the user by resetting the enroll pref. Other state reset happens on + // unenroll. prefs.setBoolean(Pref.UNENROLLED_FROM_GOOGLE_MOBILE_SERVICES_DUE_TO_ERRORS, false); } @@ -401,13 +414,13 @@ loadingDialogCoordinator.show(); long startTimeMs = SystemClock.elapsedRealtime(); - credentialManagerLauncher.getCredentialManagerIntentForAccount(referrer, + credentialManagerLauncher.getAccountCredentialManagerIntent(referrer, CoreAccountInfo.getEmailFrom(syncService.getAccountInfo()), (intent) -> PasswordManagerHelper.launchCredentialManagerIntent( intent, startTimeMs, true, loadingDialogCoordinator), - (error) -> { - PasswordManagerHelper.recordFailureMetrics(error, true); + (exception) -> { + PasswordManagerHelper.recordFailureMetrics(exception, true); recordLoadingDialogMetrics(LOADING_DIALOG_CREDENTIAL_MANAGER_HISTOGRAM, loadingDialogCoordinator.getState()); loadingDialogCoordinator.dismiss(); @@ -450,8 +463,7 @@ }); } - private static void recordFailureMetrics( - @CredentialManagerError int error, boolean forAccount) { + private static void recordFailureMetrics(Exception exception, boolean forAccount) { // While support for the local storage API exists in Chrome, it isn't used at this time. assert forAccount : "Local storage for preferences not ready for use"; final String kGetIntentSuccessHistogram = forAccount ? ACCOUNT_GET_INTENT_SUCCESS_HISTOGRAM @@ -459,8 +471,35 @@ final String kGetIntentErrorHistogram = forAccount ? ACCOUNT_GET_INTENT_ERROR_HISTOGRAM : LOCAL_GET_INTENT_ERROR_HISTOGRAM; RecordHistogram.recordBooleanHistogram(kGetIntentSuccessHistogram, false); - RecordHistogram.recordEnumeratedHistogram( - kGetIntentErrorHistogram, error, CredentialManagerError.COUNT); + if (exception instanceof CredentialManagerBackendException) { + int errorCode = ((CredentialManagerBackendException) exception).errorCode; + RecordHistogram.recordEnumeratedHistogram( + kGetIntentErrorHistogram, errorCode, CredentialManagerError.COUNT); + return; + } + + // If the exception is not a Chrome-defined one, it means that the call failed at the + // API call level. + RecordHistogram.recordEnumeratedHistogram(kGetIntentErrorHistogram, + CredentialManagerError.API_ERROR, CredentialManagerError.COUNT); + + if (!(exception instanceof ApiException)) return; + + final String kGetIntentApiErrorHistogram = forAccount + ? ACCOUNT_GET_INTENT_API_ERROR_HISTOGRAM + : LOCAL_GET_INTENT_API_ERROR_HISTOGRAM; + final String kGetIntentErrorConnectionResultCodeHistogram = forAccount + ? ACCOUNT_GET_INTENT_ERROR_CONNECTION_RESULT_CODE_HISTOGRAM + : LOCAL_GET_INTENT_ERROR_CONNECTION_RESULT_CODE_HISTOGRAM; + + int apiErrorCode = PasswordManagerAndroidBackendUtil.getApiErrorCode(exception); + RecordHistogram.recordSparseHistogram(kGetIntentApiErrorHistogram, apiErrorCode); + Integer connectionResultCode = + PasswordManagerAndroidBackendUtil.getConnectionResultCode(exception); + if (connectionResultCode == null) return; + + RecordHistogram.recordSparseHistogram( + kGetIntentErrorConnectionResultCodeHistogram, connectionResultCode); } private static void launchIntentAndRecordSuccess( @@ -500,8 +539,9 @@ } /** - * Launches the pending intent and reports metrics if the loading dialog was not cancelled or - * timed out. Intent launch metric is not recorded if the loading was cancelled or timed out. + * Launches the pending intent and reports metrics if the loading dialog was not cancelled + * or timed out. Intent launch metric is not recorded if the loading was cancelled or timed + * out. * * @param loadingDialogCoordinator {@link LoadingModalDialogCoordinator}. * @param intent {@link PendingIntent} to be launched. @@ -514,8 +554,8 @@ int loadingDialogState = loadingDialogCoordinator.getState(); if (loadingDialogState == LoadingModalDialogCoordinator.State.CANCELLED || loadingDialogState == LoadingModalDialogCoordinator.State.TIMED_OUT) { - // Dialog was dismissed or timeout occurred before the loading finished, do not launch - // the intent. + // Dialog was dismissed or timeout occurred before the loading finished, do not + // launch the intent. recordLoadingDialogMetrics(loadingDialogOutcomeHistogram, loadingDialogState); return; } @@ -562,8 +602,8 @@ /** * Reports metric for the GMS Core UI loading dialog. - * Should be called right before launching the loaded intent or before dismissing the dialog if - * the intent will not be launched. + * Should be called right before launching the loaded intent or before dismissing the dialog + * if the intent will not be launched. * * @param histogramName Name of the histogram to report metric via. * @param loadingDialogState State of the loading dialog before launching the intent.
diff --git a/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelperTest.java b/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelperTest.java index efe07631..19cfef8 100644 --- a/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelperTest.java +++ b/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordManagerHelperTest.java
@@ -27,6 +27,7 @@ import android.net.Uri; import android.os.Bundle; +import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.common.api.ApiException; import com.google.android.gms.common.api.CommonStatusCodes; @@ -91,6 +92,10 @@ "PasswordManager.CredentialManager.Account.GetIntent.Success"; private static final String ACCOUNT_GET_INTENT_ERROR_HISTOGRAM = "PasswordManager.CredentialManager.Account.GetIntent.Error"; + private static final String ACCOUNT_GET_INTENT_API_ERROR_HISTOGRAM = + "PasswordManager.CredentialManager.Account.GetIntent.APIError"; + private static final String ACCOUNT_GET_INTENT_ERROR_CONNECTION_RESULT_CODE_HISTOGRAM = + "PasswordManager.CredentialManager.Account.GetIntent.APIError.ConnectionResultCode"; private static final String ACCOUNT_LAUNCH_CREDENTIAL_MANAGER_SUCCESS_HISTOGRAM = "PasswordManager.CredentialManager.Account.Launch.Success"; @@ -511,7 +516,7 @@ mModalDialogManagerSupplier); verify(mCredentialManagerLauncherMock) - .getCredentialManagerIntentForAccount(eq(ManagePasswordsReferrer.CHROME_SETTINGS), + .getAccountCredentialManagerIntent(eq(ManagePasswordsReferrer.CHROME_SETTINGS), eq(TEST_EMAIL_ADDRESS), any(Callback.class), any(Callback.class)); } @@ -558,7 +563,7 @@ @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID) public void testRecordsErrorMetricsForAccountIntent() { chooseToSyncPasswordsWithoutCustomPassphrase(); - returnErrorWhenFetchingIntentForAccount(CredentialManagerError.API_ERROR); + returnErrorWhenFetchingIntentForAccount(CredentialManagerError.UNCATEGORIZED); PasswordManagerHelper.showPasswordSettings(ContextUtils.getApplicationContext(), ManagePasswordsReferrer.CHROME_SETTINGS, mSettingsLauncherMock, mSyncServiceMock, @@ -566,7 +571,7 @@ assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( - ACCOUNT_GET_INTENT_ERROR_HISTOGRAM, CredentialManagerError.API_ERROR)); + ACCOUNT_GET_INTENT_ERROR_HISTOGRAM, CredentialManagerError.UNCATEGORIZED)); assertEquals(1, RecordHistogram.getHistogramValueCountForTesting( ACCOUNT_GET_INTENT_SUCCESS_HISTOGRAM, 0)); @@ -1418,6 +1423,66 @@ Optional.of(TEST_EMAIL_ADDRESS), mock(Callback.class), mock(Callback.class)); } + @Test + @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID) + public void testRecordsApiErrorWhenFetchingCredentialManagerIntent() { + chooseToSyncPasswordsWithoutCustomPassphrase(); + ApiException returnedException = + new ApiException(new Status(CommonStatusCodes.INTERNAL_ERROR)); + returnApiExceptionWhenFetchingIntentForAccount(returnedException); + + PasswordManagerHelper.showPasswordSettings(ContextUtils.getApplicationContext(), + ManagePasswordsReferrer.CHROME_SETTINGS, mSettingsLauncherMock, mSyncServiceMock, + mModalDialogManagerSupplier); + + assertEquals(1, + RecordHistogram.getHistogramValueCountForTesting( + ACCOUNT_GET_INTENT_SUCCESS_HISTOGRAM, 0)); + assertEquals(1, + RecordHistogram.getHistogramValueCountForTesting( + ACCOUNT_GET_INTENT_ERROR_HISTOGRAM, CredentialManagerError.API_ERROR)); + assertEquals(1, + RecordHistogram.getHistogramValueCountForTesting( + ACCOUNT_GET_INTENT_API_ERROR_HISTOGRAM, CommonStatusCodes.INTERNAL_ERROR)); + assertEquals(0, + RecordHistogram.getHistogramTotalCountForTesting( + ACCOUNT_GET_INTENT_ERROR_CONNECTION_RESULT_CODE_HISTOGRAM)); + assertEquals(0, + RecordHistogram.getHistogramTotalCountForTesting( + ACCOUNT_LAUNCH_CREDENTIAL_MANAGER_SUCCESS_HISTOGRAM)); + } + + @Test + @EnableFeatures(ChromeFeatureList.UNIFIED_PASSWORD_MANAGER_ANDROID) + public void testRecordsConnectionResultWhenFetchingCredentialManagerIntent() { + chooseToSyncPasswordsWithoutCustomPassphrase(); + ApiException returnedException = new ApiException( + new Status(new ConnectionResult(ConnectionResult.API_UNAVAILABLE), "")); + returnApiExceptionWhenFetchingIntentForAccount(returnedException); + + PasswordManagerHelper.showPasswordSettings(ContextUtils.getApplicationContext(), + ManagePasswordsReferrer.CHROME_SETTINGS, mSettingsLauncherMock, mSyncServiceMock, + mModalDialogManagerSupplier); + + assertEquals(1, + RecordHistogram.getHistogramValueCountForTesting( + ACCOUNT_GET_INTENT_SUCCESS_HISTOGRAM, 0)); + assertEquals(1, + RecordHistogram.getHistogramValueCountForTesting( + ACCOUNT_GET_INTENT_ERROR_HISTOGRAM, CredentialManagerError.API_ERROR)); + assertEquals(1, + RecordHistogram.getHistogramValueCountForTesting( + ACCOUNT_GET_INTENT_API_ERROR_HISTOGRAM, + CommonStatusCodes.API_NOT_CONNECTED)); + assertEquals(1, + RecordHistogram.getHistogramValueCountForTesting( + ACCOUNT_GET_INTENT_ERROR_CONNECTION_RESULT_CODE_HISTOGRAM, + ConnectionResult.API_UNAVAILABLE)); + assertEquals(0, + RecordHistogram.getHistogramTotalCountForTesting( + ACCOUNT_LAUNCH_CREDENTIAL_MANAGER_SUCCESS_HISTOGRAM)); + } + private void chooseToSyncPasswordsWithoutCustomPassphrase() { when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(true); when(mSyncServiceMock.getSelectedTypes()) @@ -1433,7 +1498,7 @@ return true; }) .when(mCredentialManagerLauncherMock) - .getCredentialManagerIntentForAccount(eq(ManagePasswordsReferrer.CHROME_SETTINGS), + .getAccountCredentialManagerIntent(eq(ManagePasswordsReferrer.CHROME_SETTINGS), eq(TEST_EMAIL_ADDRESS), any(Callback.class), any(Callback.class)); } @@ -1450,12 +1515,23 @@ private void returnErrorWhenFetchingIntentForAccount(@CredentialManagerError int error) { doAnswer(invocation -> { - Callback<Integer> cb = invocation.getArgument(3); - cb.onResult(error); + Callback<Exception> cb = invocation.getArgument(3); + cb.onResult(new CredentialManagerBackendException("", error)); return true; }) .when(mCredentialManagerLauncherMock) - .getCredentialManagerIntentForAccount(eq(ManagePasswordsReferrer.CHROME_SETTINGS), + .getAccountCredentialManagerIntent(eq(ManagePasswordsReferrer.CHROME_SETTINGS), + eq(TEST_EMAIL_ADDRESS), any(Callback.class), any(Callback.class)); + } + + private void returnApiExceptionWhenFetchingIntentForAccount(ApiException exception) { + doAnswer(invocation -> { + Callback<Exception> cb = invocation.getArgument(3); + cb.onResult(exception); + return true; + }) + .when(mCredentialManagerLauncherMock) + .getAccountCredentialManagerIntent(eq(ManagePasswordsReferrer.CHROME_SETTINGS), eq(TEST_EMAIL_ADDRESS), any(Callback.class), any(Callback.class)); }
diff --git a/chrome/browser/password_manager/android/password_change_success_tracker_bridge.cc b/chrome/browser/password_manager/android/password_change_success_tracker_bridge.cc index 88f82c9..8481a7b 100644 --- a/chrome/browser/password_manager/android/password_change_success_tracker_bridge.cc +++ b/chrome/browser/password_manager/android/password_change_success_tracker_bridge.cc
@@ -25,20 +25,6 @@ } // namespace -// Called by Java to register the start of an automated password change flow. -void JNI_PasswordChangeSuccessTrackerBridge_OnAutomatedPasswordChangeStarted( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& url, - const base::android::JavaParamRef<jstring>& username) { - std::unique_ptr<GURL> native_gurl = url::GURLAndroid::ToNativeGURL(env, url); - if (!native_gurl->is_empty()) { - GetPasswordChangeSuccessTracker()->OnChangePasswordFlowStarted( - *native_gurl, ConvertJavaStringToUTF8(env, username), - PasswordChangeSuccessTracker::StartEvent::kAutomatedFlow, - PasswordChangeSuccessTracker::EntryPoint::kLeakCheckInSettings); - } -} - // Called by Java to register the start of a manual password change flow. void JNI_PasswordChangeSuccessTrackerBridge_OnManualPasswordChangeStarted( JNIEnv* env,
diff --git a/chrome/browser/pdf/pdf_extension_util.cc b/chrome/browser/pdf/pdf_extension_util.cc index ebf6b69..4a28324 100644 --- a/chrome/browser/pdf/pdf_extension_util.cc +++ b/chrome/browser/pdf/pdf_extension_util.cc
@@ -190,6 +190,9 @@ } void AddAdditionalData(bool enable_annotations, base::Value::Dict* dict) { + // NOTE: This function should not include any data used for $i18n{} + // replacements. The i18n string resources should be added using AddStrings() + // above instead. bool printing_enabled = true; bool annotations_enabled = false; #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/permissions/unused_site_permissions_service_browsertest.cc b/chrome/browser/permissions/unused_site_permissions_service_browsertest.cc index 5e4f7321..0609f03 100644 --- a/chrome/browser/permissions/unused_site_permissions_service_browsertest.cc +++ b/chrome/browser/permissions/unused_site_permissions_service_browsertest.cc
@@ -33,6 +33,15 @@ ASSERT_TRUE(embedded_test_server()->Start()); } + ContentSettingsForOneType GetRevokedUnusedPermissions( + HostContentSettingsMap* hcsm) { + ContentSettingsForOneType settings; + hcsm->GetSettingsForOneType( + ContentSettingsType::REVOKED_UNUSED_SITE_PERMISSIONS, &settings); + + return settings; + } + private: base::test::ScopedFeatureList feature_list; }; @@ -87,3 +96,42 @@ ASSERT_FALSE(UnusedSitePermissionsServiceFactory::GetForProfile( otr_browser->profile())); } + +// Test that revocation is happen correctly when auto-revoke is on. +IN_PROC_BROWSER_TEST_F(UnusedSitePermissionsServiceBrowserTest, + TestRevokeUnusedPermissions) { + auto* map = + HostContentSettingsMapFactory::GetForProfile(browser()->profile()); + auto* service = + UnusedSitePermissionsServiceFactory::GetForProfile(browser()->profile()); + GURL url = embedded_test_server()->GetURL("/title1.html"); + + // Create content setting 20 days in the past. + base::Time now(base::Time::Now()); + base::Time past(now - base::Days(20)); + base::SimpleTestClock clock; + clock.SetNow(past); + map->SetClockForTesting(&clock); + service->SetClockForTesting(&clock); + map->SetContentSettingDefaultScope( + url, url, ContentSettingsType::GEOLOCATION, CONTENT_SETTING_ALLOW, + {.track_last_visit_for_autoexpiration = true}); + clock.SetNow(now); + + // Check if the content setting is still ALLOW, before auto-revocation. + service->UpdateUnusedPermissionsForTesting(); + ASSERT_EQ(service->GetTrackedUnusedPermissionsForTesting().size(), 1u); + ASSERT_EQ(GetRevokedUnusedPermissions(map).size(), 0u); + EXPECT_EQ(CONTENT_SETTING_ALLOW, + map->GetContentSetting(url, url, ContentSettingsType::GEOLOCATION)); + + // Travel through time for 40 days to make permissions be revoked. + clock.Advance(base::Days(40)); + + // Check if the content setting turn to ASK, when auto-revocation happens. + service->UpdateUnusedPermissionsForTesting(); + ASSERT_EQ(service->GetTrackedUnusedPermissionsForTesting().size(), 0u); + ASSERT_EQ(GetRevokedUnusedPermissions(map).size(), 1u); + EXPECT_EQ(CONTENT_SETTING_ASK, + map->GetContentSetting(url, url, ContentSettingsType::GEOLOCATION)); +}
diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc index 7a41f22..3a0834b 100644 --- a/chrome/browser/printing/print_view_manager_base.cc +++ b/chrome/browser/printing/print_view_manager_base.cc
@@ -1184,8 +1184,9 @@ base::BindOnce( [](base::OnceCallback<void(bool should_proceed)> callback, const enterprise_connectors::ContentAnalysisDelegate::Data& data, - const enterprise_connectors::ContentAnalysisDelegate::Result& - result) { std::move(callback).Run(result.page_result); }, + enterprise_connectors::ContentAnalysisDelegate::Result& result) { + std::move(callback).Run(result.page_result); + }, std::move(callback)), safe_browsing::DeepScanAccessPoint::PRINT); }
diff --git a/chrome/browser/privacy_guide/android/BUILD.gn b/chrome/browser/privacy_guide/android/BUILD.gn index 997c9a0..0535d82c 100644 --- a/chrome/browser/privacy_guide/android/BUILD.gn +++ b/chrome/browser/privacy_guide/android/BUILD.gn
@@ -96,6 +96,7 @@ "//chrome/browser/signin/services/android:java", "//chrome/browser/sync/android:java", "//chrome/test/android:chrome_java_test_support_common", + "//components/sync/android:sync_java", "//content/public/test/android:content_java_test_support", "//third_party/android_deps:espresso_java", "//third_party/androidx:androidx_test_runner_java",
diff --git a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideMetricsDelegate.java b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideMetricsDelegate.java index 80f80bf..83d2d47 100644 --- a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideMetricsDelegate.java +++ b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideMetricsDelegate.java
@@ -18,6 +18,10 @@ * Initial state of the MSBB when {@link MSBBFragment} is created. */ private Boolean mInitialMsbbState; + /** + * Initial state of History Sync when {@link SyncFragment} is created. + */ + private boolean mInitialHistorySyncState; /** * A method to record metrics on the next click of {@link MSBBFragment} @@ -47,6 +51,31 @@ } /** + * A method to record metrics on the next click of {@link SyncFragment}. + */ + private void recordMetricsOnNextForSyncCard() { + boolean currentValue = PrivacyGuideUtils.isHistorySyncEnabled(); + + int stateChange; + + if (mInitialHistorySyncState && currentValue) { + stateChange = PrivacyGuideSettingsStates.HISTORY_SYNC_ON_TO_ON; + } else if (mInitialHistorySyncState && !currentValue) { + stateChange = PrivacyGuideSettingsStates.HISTORY_SYNC_ON_TO_OFF; + } else if (!mInitialHistorySyncState && currentValue) { + stateChange = PrivacyGuideSettingsStates.HISTORY_SYNC_OFF_TO_ON; + } else { + stateChange = PrivacyGuideSettingsStates.HISTORY_SYNC_OFF_TO_OFF; + } + + // Record histogram comparing |mInitialHistorySyncState| and |currentValue| + RecordHistogram.recordEnumeratedHistogram("Settings.PrivacyGuide.SettingsStates", + stateChange, PrivacyGuideSettingsStates.MAX_VALUE); + // Record user action for clicking the next button on the Sync card + RecordUserAction.record("Settings.PrivacyGuide.NextClickHistorySync"); + } + + /** * A method to set the initial state of a card {@link PrivacyGuideFragment.FragmentType} in * Privacy Guide. * TODO(crbug.com/1238896): Support for other fragment types (SYNC, SAFE_BROWSING, COOKIES) @@ -59,6 +88,10 @@ mInitialMsbbState = PrivacyGuideUtils.isMsbbEnabled(); break; } + case PrivacyGuideFragment.FragmentType.SYNC: { + mInitialHistorySyncState = PrivacyGuideUtils.isHistorySyncEnabled(); + break; + } } } @@ -75,6 +108,10 @@ recordMetricsOnNextForMSBBCard(); break; } + case PrivacyGuideFragment.FragmentType.SYNC: { + recordMetricsOnNextForSyncCard(); + break; + } } }
diff --git a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideUtils.java b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideUtils.java index a3a02bfc..d7ef834 100644 --- a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideUtils.java +++ b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideUtils.java
@@ -6,6 +6,10 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.signin.services.UnifiedConsentServiceBridge; +import org.chromium.chrome.browser.sync.SyncService; +import org.chromium.components.sync.UserSelectableType; + +import java.util.Set; /** * A utility class for Privacy Guide that fetches the current state of {@link @@ -18,4 +22,8 @@ return UnifiedConsentServiceBridge.isUrlKeyedAnonymizedDataCollectionEnabled( Profile.getLastUsedRegularProfile()); } + public static boolean isHistorySyncEnabled() { + Set<Integer> syncTypes = SyncService.get().getSelectedTypes(); + return syncTypes.contains(UserSelectableType.HISTORY); + } }
diff --git a/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java b/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java index 7521193..5ac39b4 100644 --- a/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java +++ b/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java
@@ -41,10 +41,13 @@ import org.chromium.chrome.browser.signin.services.UnifiedConsentServiceBridge; import org.chromium.chrome.browser.sync.SyncService; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.components.sync.UserSelectableType; import org.chromium.content_public.browser.test.NativeLibraryTestUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.ui.test.util.ViewUtils; +import java.util.Set; + /** * Tests {@link PrivacyGuideFragment} */ @@ -67,8 +70,11 @@ private SyncService mSyncService; @Mock private PrivacyGuideMetricsDelegate mPrivacyGuideMetricsDelegateMock; + @Mock + private Set<Integer> mSyncTypes; private UserActionTester mActionTester; + private boolean mIsHistorySyncOn; @BeforeClass public static void setUpBeforeActivityLaunched() { @@ -81,6 +87,8 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { SyncService.overrideForTests(mSyncService); when(mSyncService.isSyncFeatureEnabled()).thenReturn(true); + when(mSyncService.getSelectedTypes()).thenReturn(mSyncTypes); + when(mSyncTypes.contains(UserSelectableType.HISTORY)).thenAnswer(i -> mIsHistorySyncOn); }); } @@ -94,6 +102,16 @@ ViewUtils.onViewWaiting(withText(R.string.prefs_privacy_guide_title)); } + private void navigateToSyncCard() { + // Welcome page -> MSBB page + onView(withText(R.string.privacy_guide_welcome_title)).check(matches(isDisplayed())); + onView(withText(R.string.privacy_guide_start_button)).perform(click()); + + // MSBB page -> Sync page + ViewUtils.waitForView(withText(R.string.url_keyed_anonymized_data_title)); + onView(withText(R.string.next)).perform(click()); + } + private void setMSBBState(boolean isMSBBon) { TestThreadUtils.runOnUiThreadBlocking( () @@ -101,6 +119,10 @@ Profile.getLastUsedRegularProfile(), isMSBBon)); } + private void setHistorySyncState(boolean isHistorySyncOn) { + mIsHistorySyncOn = isHistorySyncOn; + } + private void testButtonVisibility(int buttonTextId, boolean isVisible) { if (isVisible) { onView(withText(buttonTextId)).check(matches(isDisplayed())); @@ -399,17 +421,156 @@ @Test @SmallTest @Feature({"PrivacyGuide"}) + public void testSyncCard_nextClickHistorySyncUserAction() { + launchPrivacyGuide(); + mActionTester = new UserActionTester(); + navigateToSyncCard(); + + // Sync page -> SB page + ViewUtils.waitForView(withText(R.string.privacy_guide_sync_toggle)); + onView(withText(R.string.next)).perform(click()); + + assertTrue( + mActionTester.getActions().contains("Settings.PrivacyGuide.NextClickHistorySync")); + } + + @Test + @SmallTest + @Feature({"PrivacyGuide"}) + public void testSyncCard_offToOffSettingsStatesHistogram() { + launchPrivacyGuide(); + navigateToSyncCard(); + + assertEquals(0, + mHistogramTestRule.getHistogramValueCount(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_OFF_TO_OFF)); + + // Sync page -> SB page + ViewUtils.waitForView(withText(R.string.privacy_guide_sync_toggle)); + onView(withText(R.string.next)).perform(click()); + + assertEquals(1, + mHistogramTestRule.getHistogramValueCount(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_OFF_TO_OFF)); + } + + @Test + @SmallTest + @Feature({"PrivacyGuide"}) + public void testSyncCard_offToOnSettingsStatesHistogram() { + launchPrivacyGuide(); + navigateToSyncCard(); + + assertEquals(0, + mHistogramTestRule.getHistogramValueCount(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_OFF_TO_ON)); + + // Sync page -> SB page | with click on sync switch + ViewUtils.waitForView(withText(R.string.privacy_guide_sync_toggle)); + onView(withId(R.id.sync_switch)).perform(click()); + setHistorySyncState(true); + onView(withText(R.string.next)).perform(click()); + + assertEquals(1, + mHistogramTestRule.getHistogramValueCount(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_OFF_TO_ON)); + } + + @Test + @SmallTest + @Feature({"PrivacyGuide"}) + public void testSyncCard_onToOffSettingsStatesHistogram() { + launchPrivacyGuide(); + setHistorySyncState(true); + navigateToSyncCard(); + + assertEquals(0, + mHistogramTestRule.getHistogramValueCount(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_ON_TO_OFF)); + + // Sync page -> SB page | with click on sync switch + ViewUtils.waitForView(withText(R.string.privacy_guide_sync_toggle)); + onView(withId(R.id.sync_switch)).perform(click()); + setHistorySyncState(false); + onView(withText(R.string.next)).perform(click()); + + assertEquals(1, + mHistogramTestRule.getHistogramValueCount(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_ON_TO_OFF)); + } + + @Test + @SmallTest + @Feature({"PrivacyGuide"}) + public void testSyncCard_onToOnSettingsStatesHistogram() { + launchPrivacyGuide(); + setHistorySyncState(true); + navigateToSyncCard(); + + assertEquals(0, + mHistogramTestRule.getHistogramValueCount(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_ON_TO_ON)); + + // Sync page -> SB page + ViewUtils.waitForView(withText(R.string.privacy_guide_sync_toggle)); + onView(withText(R.string.next)).perform(click()); + + assertEquals(1, + mHistogramTestRule.getHistogramValueCount(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_ON_TO_ON)); + } + + @Test + @SmallTest + @Feature({"PrivacyGuide"}) + public void testSyncCard_nextButtonInitialSyncStateIsSet() { + launchPrivacyGuide(); + mSettingsActivityTestRule.getFragment().setPrivacyGuideMetricsDelegateForTesting( + mPrivacyGuideMetricsDelegateMock); + navigateToSyncCard(); + + // Sync page + ViewUtils.waitForView(withText(R.string.privacy_guide_sync_toggle)); + + verify(mPrivacyGuideMetricsDelegateMock) + .setInitialStateForCard(PrivacyGuideFragment.FragmentType.SYNC); + + mSettingsActivityTestRule.getFragment().setPrivacyGuideMetricsDelegateForTesting(null); + } + + @Test + @SmallTest + @Feature({"PrivacyGuide"}) + public void testSyncCard_backButtonInitialSyncStateIsSet() { + launchPrivacyGuide(); + mSettingsActivityTestRule.getFragment().setPrivacyGuideMetricsDelegateForTesting( + mPrivacyGuideMetricsDelegateMock); + navigateToSyncCard(); + + // Sync page -> SB page + ViewUtils.waitForView(withText(R.string.privacy_guide_sync_toggle)); + onView(withText(R.string.next)).perform(click()); + + // Sync page <- SB page + ViewUtils.waitForView(withText(R.string.privacy_guide_safe_browsing_intro)); + onView(withText(R.string.back)).perform(click()); + + // Sync page + ViewUtils.waitForView(withText(R.string.privacy_guide_sync_toggle)); + + verify(mPrivacyGuideMetricsDelegateMock, times(2)) + .setInitialStateForCard(PrivacyGuideFragment.FragmentType.SYNC); + + mSettingsActivityTestRule.getFragment().setPrivacyGuideMetricsDelegateForTesting(null); + } + + @Test + @SmallTest + @Feature({"PrivacyGuide"}) public void testSyncCard_backClickHistorySyncUserAction() { launchPrivacyGuide(); mActionTester = new UserActionTester(); - - // Welcome page -> MSBB page - onView(withText(R.string.privacy_guide_welcome_title)).check(matches(isDisplayed())); - onView(withText(R.string.privacy_guide_start_button)).perform(click()); - - // MSBB page -> Sync page - ViewUtils.waitForView(withText(R.string.url_keyed_anonymized_data_title)); - onView(withText(R.string.next)).perform(click()); + navigateToSyncCard(); // MSBB page <- Sync page ViewUtils.waitForView(withText(R.string.privacy_guide_sync_toggle));
diff --git a/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideMetricsDelegateTest.java b/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideMetricsDelegateTest.java index 096dc31a..768c11c8 100644 --- a/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideMetricsDelegateTest.java +++ b/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideMetricsDelegateTest.java
@@ -26,7 +26,11 @@ import org.chromium.chrome.browser.safe_browsing.SafeBrowsingState; import org.chromium.chrome.browser.signin.services.UnifiedConsentServiceBridge; import org.chromium.chrome.browser.signin.services.UnifiedConsentServiceBridgeJni; +import org.chromium.chrome.browser.sync.SyncService; import org.chromium.components.content_settings.CookieControlsMode; +import org.chromium.components.sync.UserSelectableType; + +import java.util.Set; /** * JUnit tests of the class {@link PrivacyGuideMetricsDelegate}. @@ -44,6 +48,10 @@ private Profile mProfile; @Mock private UnifiedConsentServiceBridge.Natives mNativeMock; + @Mock + private SyncService mSyncService; + @Mock + private Set<Integer> mSyncTypes; private final PrivacyGuideMetricsDelegate mPrivacyGuideMetricsDelegate = new PrivacyGuideMetricsDelegate(); @@ -53,6 +61,8 @@ public void setUp() { Profile.setLastUsedProfileForTesting(mProfile); mocker.mock(UnifiedConsentServiceBridgeJni.TEST_HOOKS, mNativeMock); + SyncService.overrideForTests(mSyncService); + when(mSyncService.getSelectedTypes()).thenReturn(mSyncTypes); } private void mockMSBBState(boolean initialMSBBState, boolean finalMSBBState) { @@ -60,6 +70,12 @@ .thenReturn(initialMSBBState, finalMSBBState); } + private void mockHistorySyncState( + boolean initialHistorySyncState, boolean finalHistorySyncState) { + when(mSyncTypes.contains(UserSelectableType.HISTORY)) + .thenReturn(initialHistorySyncState, finalHistorySyncState); + } + private void triggerMetricsOnNext(@PrivacyGuideFragment.FragmentType int fragmentType) { mPrivacyGuideMetricsDelegate.setInitialStateForCard(fragmentType); mPrivacyGuideMetricsDelegate.recordMetricsOnNextForCard(fragmentType); @@ -127,6 +143,67 @@ @Test @SmallTest + public void testSync_offToOffSettingsStatesHistogram() { + mockHistorySyncState(false, false); + assertEquals(0, + RecordHistogram.getHistogramValueCountForTesting(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_OFF_TO_OFF)); + triggerMetricsOnNext(PrivacyGuideFragment.FragmentType.SYNC); + assertEquals(1, + RecordHistogram.getHistogramValueCountForTesting(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_OFF_TO_OFF)); + } + + @Test + @SmallTest + public void testSync_offToOnSettingsStatesHistogram() { + mockHistorySyncState(false, true); + assertEquals(0, + RecordHistogram.getHistogramValueCountForTesting(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_OFF_TO_ON)); + triggerMetricsOnNext(PrivacyGuideFragment.FragmentType.SYNC); + assertEquals(1, + RecordHistogram.getHistogramValueCountForTesting(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_OFF_TO_ON)); + } + + @Test + @SmallTest + public void testSync_onToOffSettingsStatesHistogram() { + mockHistorySyncState(true, false); + assertEquals(0, + RecordHistogram.getHistogramValueCountForTesting(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_ON_TO_OFF)); + triggerMetricsOnNext(PrivacyGuideFragment.FragmentType.SYNC); + assertEquals(1, + RecordHistogram.getHistogramValueCountForTesting(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_ON_TO_OFF)); + } + + @Test + @SmallTest + public void testSync_onToOnSettingsStatesHistogram() { + mockHistorySyncState(true, true); + assertEquals(0, + RecordHistogram.getHistogramValueCountForTesting(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_ON_TO_ON)); + triggerMetricsOnNext(PrivacyGuideFragment.FragmentType.SYNC); + assertEquals(1, + RecordHistogram.getHistogramValueCountForTesting(SETTINGS_STATES_HISTOGRAM, + PrivacyGuideSettingsStates.HISTORY_SYNC_ON_TO_ON)); + } + + @Test + @SmallTest + public void testSync_nextClickUserAction() { + mockHistorySyncState(false, false); + triggerMetricsOnNext(PrivacyGuideFragment.FragmentType.SYNC); + assertTrue( + mActionTester.getActions().contains("Settings.PrivacyGuide.NextClickHistorySync")); + } + + @Test + @SmallTest public void testMSBB_changeMSBBOnUserAction() { PrivacyGuideMetricsDelegate.recordMetricsOnMSBBChange(true); assertTrue(mActionTester.getActions().contains("Settings.PrivacyGuide.ChangeMSBBOn"));
diff --git a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent_eea_v4.xml b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent_eea_v4.xml index 4be5754..9abef73 100644 --- a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent_eea_v4.xml +++ b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent_eea_v4.xml
@@ -44,7 +44,7 @@ app:maxWidthPortrait="@dimen/privacy_sandbox_dialog_max_width"> <org.chromium.components.browser_ui.widget.FadingEdgeScrollView - android:id="@+id/privacy_sandbox_dialog_scroll_view" + android:id="@+id/privacy_sandbox_consent_eea_scroll_view" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1">
diff --git a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_eea_v4.xml b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_eea_v4.xml index 996e3c6..3a1344c2 100644 --- a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_eea_v4.xml +++ b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_eea_v4.xml
@@ -22,19 +22,18 @@ app:maxWidthPortrait="@dimen/privacy_sandbox_dialog_max_width"> <org.chromium.components.browser_ui.widget.FadingEdgeScrollView - android:id="@+id/privacy_sandbox_dialog_scroll_view" + android:id="@+id/privacy_sandbox_notice_eea_scroll_view" android:layout_width="match_parent" android:layout_height="0dp" - android:fillViewport="true" - android:layout_weight="1" - android:visibility="invisible"> + android:layout_weight="1"> <LinearLayout android:id="@+id/privacy_sandbox_notice_eea_content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginHorizontal="@dimen/list_item_default_margin" - android:gravity="center_vertical" + android:layout_gravity="center_vertical" + android:gravity="center_horizontal" android:orientation="vertical"> <ImageView @@ -42,7 +41,6 @@ android:layout_marginBottom="@dimen/privacy_sandbox_dialog_illustration_margin_bottom" android:layout_height="wrap_content" android:layout_width="wrap_content" - android:layout_gravity="center" app:srcCompat="@drawable/privacy_sandbox_notice_eea_illustration_v4" android:importantForAccessibility="no" /> @@ -52,7 +50,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/privacy_sandbox_m1_notice_eea_title" - android:layout_gravity="center" + android:gravity="center" style="@style/TextAppearance.Headline.Primary" /> <TextView @@ -81,6 +79,7 @@ android:id="@+id/dropdown_element" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_gravity="center" android:orientation="horizontal"> <TextView @@ -109,7 +108,6 @@ android:layout_marginBottom="@dimen/privacy_sandbox_notice_margin_bottom" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="center_vertical" android:text="@string/privacy_sandbox_m1_notice_eea_description_2" style="@style/TextAppearance.TextMedium.Secondary" /> @@ -117,28 +115,12 @@ </org.chromium.components.browser_ui.widget.FadingEdgeScrollView> - <org.chromium.ui.widget.ButtonCompat - android:id="@+id/more_button" - android:focusable="true" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/privacy_sandbox_m1_dialog_more_button" - android:visibility="gone" - android:layout_marginHorizontal="24dp" - android:layout_marginVertical="@dimen/promo_dialog_padding" - style="@style/FilledButton.Flat" /> - <LinearLayout - android:id="@+id/action_buttons" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:weightSum="2" - android:layout_marginTop="@dimen/promo_dialog_padding" - android:layout_marginBottom="@dimen/promo_dialog_padding" - android:layout_marginHorizontal="24dp" - android:visibility="invisible" > - + android:layout_marginHorizontal="24dp"> <org.chromium.ui.widget.ButtonCompat android:id="@+id/ack_button"
diff --git a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_row_v4.xml b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_row_v4.xml index 3a7fc24..fcce606 100644 --- a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_row_v4.xml +++ b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_row_v4.xml
@@ -22,17 +22,16 @@ app:maxWidthPortrait="@dimen/privacy_sandbox_dialog_max_width"> <org.chromium.components.browser_ui.widget.FadingEdgeScrollView - android:id="@+id/privacy_sandbox_dialog_scroll_view" + android:id="@+id/privacy_sandbox_notice_row_scroll_view" android:layout_width="match_parent" android:layout_height="0dp" - android:fillViewport="true" android:layout_weight="1"> <LinearLayout android:id="@+id/privacy_sandbox_notice_row_content" android:layout_width="match_parent" android:layout_height="match_parent" - android:gravity="center_vertical" + android:gravity="center_horizontal" android:orientation="vertical"> <ImageView @@ -41,7 +40,6 @@ android:layout_marginHorizontal="@dimen/list_item_default_margin" android:layout_height="@dimen/privacy_sandbox_chrome_logo_height" android:layout_width="@dimen/privacy_sandbox_chrome_logo_width" - android:layout_gravity="center" app:srcCompat="@drawable/chrome_sync_logo" android:importantForAccessibility="no" /> @@ -51,7 +49,6 @@ android:layout_marginHorizontal="@dimen/list_item_default_margin" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" android:text="@string/privacy_sandbox_m1_notice_row_title" android:gravity="center" style="@style/TextAppearance.Headline.Primary" /> @@ -131,26 +128,13 @@ </org.chromium.components.browser_ui.widget.FadingEdgeScrollView> - <org.chromium.ui.widget.ButtonCompat - android:id="@+id/more_button" - android:focusable="true" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/privacy_sandbox_m1_dialog_more_button" - android:visibility="gone" - android:layout_marginHorizontal="24dp" - android:layout_marginVertical="@dimen/promo_dialog_padding" - style="@style/FilledButton.Flat" /> - <LinearLayout - android:id="@+id/action_buttons" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:weightSum="2" - android:layout_marginVertical="@dimen/promo_dialog_padding" - android:layout_marginHorizontal="24dp" - android:visibility="invisible"> + android:layout_marginTop="@dimen/privacy_sandbox_dialog_buttons_margin_top" + android:layout_marginHorizontal="24dp"> <org.chromium.ui.widget.ButtonCompat android:id="@+id/ack_button"
diff --git a/chrome/browser/privacy_sandbox/android/java/res/values/dimens.xml b/chrome/browser/privacy_sandbox/android/java/res/values/dimens.xml index edd30b0..7fee6f6c 100644 --- a/chrome/browser/privacy_sandbox/android/java/res/values/dimens.xml +++ b/chrome/browser/privacy_sandbox/android/java/res/values/dimens.xml
@@ -17,6 +17,7 @@ <dimen name="privacy_sandbox_notice_dialog_dropdown_button_height">24dp</dimen> <dimen name="privacy_sandbox_notice_margin_bottom">32dp</dimen> <dimen name="privacy_sandbox_dialog_title_margin">20dp</dimen> + <dimen name="privacy_sandbox_dialog_buttons_margin_top">24dp</dimen> <dimen name="privacy_sandbox_chrome_logo_width">60dp</dimen> <dimen name="privacy_sandbox_chrome_logo_height">61dp</dimen> <dimen name="privacy_sandbox_interests_illustration_height">185dp</dimen>
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogConsentEEAV4.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogConsentEEAV4.java index 28f9e58..008f43e 100644 --- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogConsentEEAV4.java +++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogConsentEEAV4.java
@@ -60,7 +60,7 @@ noButton.setOnClickListener(this); mMoreButton = mContentView.findViewById(R.id.more_button); mActionButtons = mContentView.findViewById(R.id.action_buttons); - mScrollView = mContentView.findViewById(R.id.privacy_sandbox_dialog_scroll_view); + mScrollView = mContentView.findViewById(R.id.privacy_sandbox_consent_eea_scroll_view); mProgressBarContainer = mContentView.findViewById(R.id.progress_bar_container); mConsentViewContainer = mContentView.findViewById(R.id.privacy_sandbox_consent_eea_view);
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogNoticeEEAV4.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogNoticeEEAV4.java index 1365cc7a..fb4d5bfe8 100644 --- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogNoticeEEAV4.java +++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogNoticeEEAV4.java
@@ -6,9 +6,10 @@ import android.app.Dialog; import android.content.Context; -import android.content.DialogInterface; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; +import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.ScrollView; @@ -26,16 +27,10 @@ /** * Dialog in the form of a notice shown for the Privacy Sandbox. */ -public class PrivacySandboxDialogNoticeEEAV4 - extends Dialog implements View.OnClickListener, DialogInterface.OnShowListener { +public class PrivacySandboxDialogNoticeEEAV4 extends Dialog implements View.OnClickListener { private SettingsLauncher mSettingsLauncher; private View mContentView; - private ButtonCompat mMoreButton; - private LinearLayout mActionButtons; - private ScrollView mScrollView; - private LinearLayout mDropdownElement; - private final CheckableImageView mExpandArrowView; private LinearLayout mDropdownContainer; @@ -53,30 +48,15 @@ ButtonCompat settingsButton = mContentView.findViewById(R.id.settings_button); settingsButton.setOnClickListener(this); - mMoreButton = mContentView.findViewById(R.id.more_button); - mActionButtons = mContentView.findViewById(R.id.action_buttons); - mScrollView = mContentView.findViewById(R.id.privacy_sandbox_dialog_scroll_view); - // Controls for the expanding section. - mDropdownElement = mContentView.findViewById(R.id.dropdown_element); - mDropdownElement.setOnClickListener(this); + LinearLayout dropdownElement = mContentView.findViewById(R.id.dropdown_element); + dropdownElement.setOnClickListener(this); mDropdownContainer = mContentView.findViewById(R.id.dropdown_container); mExpandArrowView = mContentView.findViewById(R.id.expand_arrow); mExpandArrowView.setImageDrawable(PrivacySandboxDialogUtils.createExpandDrawable(context)); mExpandArrowView.setChecked(isDropdownExpanded()); setBulletsDescription(); - - mMoreButton.setOnClickListener(this); - setOnShowListener(this); - - mScrollView.getViewTreeObserver().addOnScrollChangedListener(() -> { - if (!mScrollView.canScrollVertically(ScrollView.FOCUS_DOWN)) { - mMoreButton.setVisibility(View.GONE); - mActionButtons.setVisibility(View.VISIBLE); - mScrollView.post(() -> { mScrollView.pageScroll(ScrollView.FOCUS_DOWN); }); - } - }); } @Override @@ -97,19 +77,18 @@ dismiss(); PrivacySandboxSettingsBaseFragment.launchPrivacySandboxSettings( getContext(), mSettingsLauncher, PrivacySandboxReferrer.PRIVACY_SANDBOX_NOTICE); - } else if (id == R.id.more_button) { - if (mScrollView.canScrollVertically(ScrollView.FOCUS_DOWN)) { - mScrollView.post(() -> { mScrollView.pageScroll(ScrollView.FOCUS_DOWN); }); - } else { - mMoreButton.setVisibility(View.GONE); - mActionButtons.setVisibility(View.VISIBLE); - mScrollView.post(() -> { mScrollView.pageScroll(ScrollView.FOCUS_DOWN); }); - } } else if (id == R.id.dropdown_element) { + var content = mContentView.findViewById(R.id.privacy_sandbox_notice_eea_content); + ScrollView scrollView = + mContentView.findViewById(R.id.privacy_sandbox_notice_eea_scroll_view); + if (isDropdownExpanded()) { PrivacySandboxBridge.promptActionOccurred(PromptAction.NOTICE_MORE_INFO_CLOSED); mDropdownContainer.setVisibility(View.GONE); mDropdownContainer.removeAllViews(); + + ((FrameLayout.LayoutParams) content.getLayoutParams()).gravity = + Gravity.CENTER_VERTICAL; } else { mDropdownContainer.setVisibility(View.VISIBLE); PrivacySandboxBridge.promptActionOccurred(PromptAction.NOTICE_MORE_INFO_OPENED); @@ -130,7 +109,12 @@ R.id.privacy_sandbox_m1_notice_eea_learn_more_bullet_three, R.string.privacy_sandbox_m1_notice_eea_learn_more_bullet_3); - mScrollView.post(() -> { mScrollView.scrollTo(0, mDropdownElement.getTop()); }); + ((FrameLayout.LayoutParams) content.getLayoutParams()).gravity = Gravity.TOP; + + scrollView.post(() -> { + scrollView.setSmoothScrollingEnabled(true); + scrollView.fullScroll(ScrollView.FOCUS_DOWN); + }); } mExpandArrowView.setChecked(isDropdownExpanded()); @@ -143,18 +127,6 @@ } } - @Override - public void onShow(DialogInterface dialogInterface) { - if (mScrollView.canScrollVertically(ScrollView.FOCUS_DOWN)) { - mMoreButton.setVisibility(View.VISIBLE); - mActionButtons.setVisibility(View.GONE); - } else { - mMoreButton.setVisibility(View.GONE); - mActionButtons.setVisibility(View.VISIBLE); - } - mScrollView.setVisibility(View.VISIBLE); - } - private void setBulletsDescription() { PrivacySandboxDialogUtils.setBulletText(getContext(), mContentView, R.id.privacy_sandbox_m1_notice_eea_bullet_one,
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogNoticeROWV4.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogNoticeROWV4.java index f2fcde1..acae9d1 100644 --- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogNoticeROWV4.java +++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/v4/PrivacySandboxDialogNoticeROWV4.java
@@ -6,7 +6,6 @@ import android.app.Dialog; import android.content.Context; -import android.content.DialogInterface; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; @@ -26,17 +25,13 @@ /** * Dialog in the form of a notice shown for the Privacy Sandbox. */ -public class PrivacySandboxDialogNoticeROWV4 - extends Dialog implements View.OnClickListener, DialogInterface.OnShowListener { +public class PrivacySandboxDialogNoticeROWV4 extends Dialog implements View.OnClickListener { private SettingsLauncher mSettingsLauncher; private View mContentView; private final CheckableImageView mExpandArrowView; private LinearLayout mDropdownContainer; private LinearLayout mDropdownElement; - private ButtonCompat mMoreButton; - private LinearLayout mActionButtons; - private ScrollView mScrollView; public PrivacySandboxDialogNoticeROWV4( Context context, @NonNull SettingsLauncher settingsLauncher) { @@ -51,10 +46,6 @@ ButtonCompat settingsButton = mContentView.findViewById(R.id.settings_button); settingsButton.setOnClickListener(this); - mMoreButton = mContentView.findViewById(R.id.more_button); - mActionButtons = mContentView.findViewById(R.id.action_buttons); - mScrollView = mContentView.findViewById(R.id.privacy_sandbox_dialog_scroll_view); - // Controls for the expanding section. mDropdownElement = mContentView.findViewById(R.id.dropdown_element); mDropdownElement.setOnClickListener(this); @@ -62,17 +53,6 @@ mExpandArrowView = mContentView.findViewById(R.id.expand_arrow); mExpandArrowView.setImageDrawable(PrivacySandboxDialogUtils.createExpandDrawable(context)); mExpandArrowView.setChecked(isDropdownExpanded()); - - mMoreButton.setOnClickListener(this); - setOnShowListener(this); - - mScrollView.getViewTreeObserver().addOnScrollChangedListener(() -> { - if (!mScrollView.canScrollVertically(ScrollView.FOCUS_DOWN)) { - mMoreButton.setVisibility(View.GONE); - mActionButtons.setVisibility(View.VISIBLE); - mScrollView.post(() -> { mScrollView.pageScroll(ScrollView.FOCUS_DOWN); }); - } - }); } @Override @@ -93,19 +73,16 @@ dismiss(); PrivacySandboxSettingsBaseFragment.launchPrivacySandboxSettings( getContext(), mSettingsLauncher, PrivacySandboxReferrer.PRIVACY_SANDBOX_NOTICE); - } else if (id == R.id.more_button) { - if (mScrollView.canScrollVertically(ScrollView.FOCUS_DOWN)) { - mScrollView.post(() -> { mScrollView.pageScroll(ScrollView.FOCUS_DOWN); }); - } else { - mMoreButton.setVisibility(View.GONE); - mActionButtons.setVisibility(View.VISIBLE); - mScrollView.post(() -> { mScrollView.pageScroll(ScrollView.FOCUS_DOWN); }); - } } else if (id == R.id.dropdown_element) { + var content = mContentView.findViewById(R.id.privacy_sandbox_notice_row_content); + ScrollView scrollView = + mContentView.findViewById(R.id.privacy_sandbox_notice_row_scroll_view); + if (isDropdownExpanded()) { PrivacySandboxBridge.promptActionOccurred(PromptAction.NOTICE_MORE_INFO_CLOSED); mDropdownContainer.setVisibility(View.GONE); mDropdownContainer.removeAllViews(); + scrollView.post(() -> { scrollView.fullScroll(ScrollView.FOCUS_UP); }); } else { mDropdownContainer.setVisibility(View.VISIBLE); PrivacySandboxBridge.promptActionOccurred(PromptAction.NOTICE_MORE_INFO_OPENED); @@ -120,7 +97,7 @@ R.id.privacy_sandbox_m1_notice_row_learn_more_bullet_two, R.string.privacy_sandbox_m1_notice_row_learn_more_bullet_2); - mScrollView.post(() -> { mScrollView.scrollTo(0, mDropdownElement.getTop()); }); + scrollView.post(() -> { scrollView.scrollTo(0, mDropdownElement.getTop()); }); } mExpandArrowView.setChecked(isDropdownExpanded()); @@ -133,18 +110,6 @@ } } - @Override - public void onShow(DialogInterface dialogInterface) { - if (mScrollView.canScrollVertically(ScrollView.FOCUS_DOWN)) { - mMoreButton.setVisibility(View.VISIBLE); - mActionButtons.setVisibility(View.GONE); - } else { - mMoreButton.setVisibility(View.GONE); - mActionButtons.setVisibility(View.VISIBLE); - } - mScrollView.setVisibility(View.VISIBLE); - } - private boolean isDropdownExpanded() { return mDropdownContainer != null && mDropdownContainer.getVisibility() == View.VISIBLE; }
diff --git a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogTest.java b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogTest.java index 58053e1f..c523826 100644 --- a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogTest.java +++ b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogTest.java
@@ -9,6 +9,7 @@ import static androidx.test.espresso.action.ViewActions.scrollTo; import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.contrib.RecyclerViewActions.scrollToPosition; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; @@ -169,7 +170,7 @@ private ScrollView getScrollView() { ScrollView[] scrollViews = {null}; - onView(withId(R.id.privacy_sandbox_dialog_scroll_view)).check(((v, e) -> { + onView(withId(R.id.privacy_sandbox_consent_eea_scroll_view)).check(((v, e) -> { scrollViews[0] = ((ScrollView) v); })); return scrollViews[0]; @@ -464,7 +465,7 @@ assertEquals("Last dialog action", PromptAction.NOTICE_SHOWN, (int) mFakePrivacySandboxBridge.getLastPromptAction()); // Ack the notice and verify it worked correctly. - tryClickOn(withId(R.id.ack_button)); + onView(withId(R.id.ack_button)).perform(click()); assertEquals("Last dialog action", PromptAction.NOTICE_ACKNOWLEDGE, (int) mFakePrivacySandboxBridge.getLastPromptAction()); onView(withId(R.id.privacy_sandbox_notice_title)).check(doesNotExist()); @@ -484,7 +485,7 @@ onView(withId(R.id.privacy_sandbox_notice_eea_dropdown)).check(doesNotExist()); // Click on the settings button and verify it worked correctly. - tryClickOn(withId(R.id.settings_button)); + onView(withId(R.id.settings_button)).perform(click()); onView(withId(R.id.privacy_sandbox_notice_title)).check(doesNotExist()); assertEquals("Last dialog action", PromptAction.NOTICE_OPEN_SETTINGS, (int) mFakePrivacySandboxBridge.getLastPromptAction()); @@ -504,7 +505,7 @@ assertEquals("Last dialog action", PromptAction.NOTICE_SHOWN, (int) mFakePrivacySandboxBridge.getLastPromptAction()); // Ack the notice and verify it worked correctly. - tryClickOn(withId(R.id.ack_button)); + onView(withId(R.id.ack_button)).perform(click()); assertEquals("Last dialog action", PromptAction.NOTICE_ACKNOWLEDGE, (int) mFakePrivacySandboxBridge.getLastPromptAction()); onView(withId(R.id.privacy_sandbox_notice_title)).check(doesNotExist()); @@ -516,6 +517,7 @@ assertEquals("Last dialog action", PromptAction.NOTICE_MORE_INFO_OPENED, (int) mFakePrivacySandboxBridge.getLastPromptAction()); + scrollToPosition(0); onView(withId(R.id.privacy_sandbox_notice_row_dropdown)).check(matches(isDisplayed())); onView(withId(R.id.dropdown_element)).perform(scrollTo(), click()); assertEquals("Last dialog action", PromptAction.NOTICE_MORE_INFO_CLOSED, @@ -523,7 +525,7 @@ onView(withId(R.id.privacy_sandbox_notice_row_dropdown)).check(doesNotExist()); // Click on the settings button and verify it worked correctly. - tryClickOn(withId(R.id.settings_button)); + onView(withId(R.id.settings_button)).perform(click()); assertEquals("Last dialog action", PromptAction.NOTICE_OPEN_SETTINGS, (int) mFakePrivacySandboxBridge.getLastPromptAction()); onView(withId(R.id.privacy_sandbox_notice_title)).check(doesNotExist());
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn index 22bca9b1..62c545b5 100644 --- a/chrome/browser/resources/BUILD.gn +++ b/chrome/browser/resources/BUILD.gn
@@ -40,6 +40,7 @@ "new_tab_page:resources", "new_tab_page_instant:resources", "new_tab_page_third_party:resources", + "omnibox_popup:resources", "password_manager:resources", "privacy_sandbox:resources", "profile_internals:resources",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js index 998a6792..db8724fa 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js
@@ -33,82 +33,105 @@ * Class to manage the panel. */ export class Panel extends PanelInterface { - /** @override */ - setPendingCallback(callback) { - /** @private {?function() : !Promise} */ - Panel.pendingCallback_ = callback; + /** @private */ + constructor() { + super(); + /** + * The currently active menu, if any. + * @private {PanelMenu} + */ + this.activeMenu_ = null; + + /** @private {string} */ + this.lastMenu_ = ''; + + /** @private {!PanelMode} */ + this.mode_ = PanelMode.COLLAPSED; + + /** + * The array of top-level menus. + * @private {!Array<PanelMenu>} + */ + this.menus_ = []; + + /** @private {!Object<!PanelNodeMenuId, !PanelNodeMenu>} */ + this.nodeMenuDictionary_ = {}; + + /** @private {boolean} */ + this.originalStickyState_ = false; + + /** @private {Window} */ + this.ownerWindow_ = window; + + /** @private {?(function(): !Promise)} */ + this.pendingCallback_ = null; + + /** @private {?PanelSearchMenu} */ + this.searchMenu_ = null; + + /** @private {string} */ + this.sessionState_ = ''; + + /** @private {Object} */ + this.tutorial_ = null; + + /** @private {Element} */ + this.brailleContainer_ = $('braille-container'); + /** @private {Element} */ + this.brailleTableElement_ = $('braille-table'); + /** @private {Element} */ + this.brailleTableElement2_ = $('braille-table2'); + /** @private {Element} */ + this.searchContainer_ = $('search-container'); + /** @private {!Element} */ + this.searchInput_ = /** @type {!Element} */ ($('search')); + /** @private {Element} */ + this.speechContainer_ = $('speech-container'); + /** @private {Element} */ + this.speechElement_ = $('speech'); + + /** @private {boolean} */ + this.disableRestartTutorialNudgesForTesting_ = false; + /** @private {boolean} */ + this.mockTouchGestureSourceForTesting_ = false; + /** @private {boolean} */ + this.tutorialReadyForTesting_ = false; } /** * Initialize the panel. */ static async init() { - /** @type {string} */ - Panel.sessionState = ''; + if (Panel.instance_) { + throw new Error('Cannot call Panel.init() more than once'); + } await LocalStorage.init(); + Panel.instance_ = new Panel(); + PanelInterface.instance = Panel.instance_; const updateSessionState = sessionState => { - Panel.sessionState = sessionState; + Panel.instance_.sessionState_ = sessionState; $('options').disabled = sessionState !== 'IN_SESSION'; }; chrome.loginState.getSessionState(updateSessionState); chrome.loginState.onSessionStateChanged.addListener(updateSessionState); LocaleOutputHelper.init(); - /** @type {Element} @private */ - Panel.speechContainer_ = $('speech-container'); + $('braille-pan-left') + .addEventListener( + 'click', + () => chrome.extension.getBackgroundPage()['ChromeVox'] + .braille.panLeft(), + false); - /** @type {Element} @private */ - Panel.speechElement_ = $('speech'); + $('braille-pan-right') + .addEventListener( + 'click', + () => chrome.extension.getBackgroundPage()['ChromeVox'] + .braille.panRight(), + false); - /** @type {Element} @private */ - Panel.brailleContainer_ = $('braille-container'); - - /** @type {Element} @private */ - Panel.searchContainer_ = $('search-container'); - - /** @type {!Element} @private */ - Panel.searchInput_ = /** @type {!Element} */ ($('search')); - - /** @type {Element} @private */ - Panel.brailleTableElement_ = $('braille-table'); - Panel.brailleTableElement2_ = $('braille-table2'); - - /** @private {Element} */ - Panel.braillePanLeft_ = $('braille-pan-left'); - Panel.braillePanLeft_.addEventListener('click', () => { - chrome.extension.getBackgroundPage()['ChromeVox'].braille.panLeft(); - }, false); - - /** @private {Element} */ - Panel.braillePanRight_ = $('braille-pan-right'); - Panel.braillePanRight_.addEventListener('click', () => { - chrome.extension.getBackgroundPage()['ChromeVox'].braille.panRight(); - }, false); - - /** @type {PanelMode} @private */ - Panel.mode_ = PanelMode.COLLAPSED; - - /** - * The array of top-level menus. - * @type {!Array<PanelMenu>} - * @private - */ - Panel.menus_ = []; - - /** - * The currently active menu, if any. - * @type {PanelMenu} - * @private - */ - Panel.activeMenu_ = null; - - /** @private {Object} */ - Panel.tutorial = null; - - PanelInterface.instance = new Panel(); - PanelInterface.instance.setPendingCallback(null); Panel.updateFromPrefs(); Msgs.addTranslatedMessagesToDom(document); @@ -137,22 +160,18 @@ PanelInterface.instance.closeMenusAndRestoreFocus(); }, false); + } - /** @type {Window} */ - Panel.ownerWindow = window; - - /** @private {boolean} */ - Panel.tutorialReadyForTesting_ = false; - - /** @private {boolean} */ - Panel.mockTouchGestureSourceForTesting_ = false; + /** @override */ + setPendingCallback(callback) { + this.pendingCallback_ = callback; } /** * Enables touch gesture mode for testing. */ static setTouchGestureSourceForTesting() { - Panel.mockTouchGestureSourceForTesting_ = true; + Panel.instance_.mockTouchGestureSourceForTesting_ = true; } /** @@ -166,23 +185,23 @@ * Update the display based on prefs. */ static updateFromPrefs() { - if (Panel.mode_ === PanelMode.SEARCH) { - Panel.speechContainer_.hidden = true; - Panel.brailleContainer_.hidden = true; - Panel.searchContainer_.hidden = false; + if (Panel.instance_.mode_ === PanelMode.SEARCH) { + Panel.instance_.speechContainer_.hidden = true; + Panel.instance_.brailleContainer_.hidden = true; + Panel.instance_.searchContainer_.hidden = false; return; } - Panel.speechContainer_.hidden = false; - Panel.brailleContainer_.hidden = false; - Panel.searchContainer_.hidden = true; + Panel.instance_.speechContainer_.hidden = false; + Panel.instance_.brailleContainer_.hidden = false; + Panel.instance_.searchContainer_.hidden = true; if (LocalStorage.get('brailleCaptions')) { - Panel.speechContainer_.style.visibility = 'hidden'; - Panel.brailleContainer_.style.visibility = 'visible'; + Panel.instance_.speechContainer_.style.visibility = 'hidden'; + Panel.instance_.brailleContainer_.style.visibility = 'visible'; } else { - Panel.speechContainer_.style.visibility = 'visible'; - Panel.brailleContainer_.style.visibility = 'hidden'; + Panel.instance_.speechContainer_.style.visibility = 'visible'; + Panel.instance_.brailleContainer_.style.visibility = 'hidden'; } } @@ -209,20 +228,20 @@ switch (command.type) { case PanelCommandType.CLEAR_SPEECH: - Panel.speechElement_.innerHTML = ''; + Panel.instance_.speechElement_.innerHTML = ''; break; case PanelCommandType.ADD_NORMAL_SPEECH: - if (Panel.speechElement_.innerHTML !== '') { - Panel.speechElement_.innerHTML += ' '; + if (Panel.instance_.speechElement_.innerHTML !== '') { + Panel.instance_.speechElement_.innerHTML += ' '; } - Panel.speechElement_.innerHTML += + Panel.instance_.speechElement_.innerHTML += '<span class="usertext">' + escapeForHtml(command.data) + '</span>'; break; case PanelCommandType.ADD_ANNOTATION_SPEECH: - if (Panel.speechElement_.innerHTML !== '') { - Panel.speechElement_.innerHTML += ' '; + if (Panel.instance_.speechElement_.innerHTML !== '') { + Panel.instance_.speechElement_.innerHTML += ' '; } - Panel.speechElement_.innerHTML += escapeForHtml(command.data); + Panel.instance_.speechElement_.innerHTML += escapeForHtml(command.data); break; case PanelCommandType.UPDATE_BRAILLE: Panel.onUpdateBraille(command.data); @@ -231,7 +250,7 @@ Panel.onOpenMenus(undefined, command.data); break; case PanelCommandType.OPEN_MENUS_MOST_RECENT: - Panel.onOpenMenus(undefined, Panel.lastMenu_); + Panel.onOpenMenus(undefined, Panel.instance_.lastMenu_); break; case PanelCommandType.SEARCH: Panel.onSearch(); @@ -253,7 +272,7 @@ * @param {PanelMode} mode The new mode. */ static setMode(mode) { - if (Panel.mode_ === mode) { + if (Panel.instance_.mode_ === mode) { return; } @@ -265,23 +284,25 @@ 'menus_title'); Msgs.addTranslatedMessagesToDom(document); - Panel.mode_ = mode; + Panel.instance_.mode_ = mode; - document.title = Msgs.getMsg(PanelModeInfo[Panel.mode_].title); + document.title = Msgs.getMsg(PanelModeInfo[Panel.instance_.mode_].title); // Fully qualify the path here because this function might be called with a // window object belonging to the background page. - Panel.ownerWindow.location = + Panel.instance_.ownerWindow_.location = chrome.extension.getURL('chromevox/panel/panel.html') + - PanelModeInfo[Panel.mode_].location; + PanelModeInfo[Panel.instance_.mode_].location; - $('main').hidden = (Panel.mode_ === PanelMode.FULLSCREEN_TUTORIAL); - $('menus_background').hidden = (Panel.mode_ !== PanelMode.FULLSCREEN_MENUS); + $('main').hidden = + (Panel.instance_.mode_ === PanelMode.FULLSCREEN_TUTORIAL); + $('menus_background').hidden = + (Panel.instance_.mode_ !== PanelMode.FULLSCREEN_MENUS); // Interactive tutorial elements may not have been loaded yet. const iTutorialContainer = $('chromevox-tutorial-container'); if (iTutorialContainer) { iTutorialContainer.hidden = - (Panel.mode_ !== PanelMode.FULLSCREEN_TUTORIAL); + (Panel.instance_.mode_ !== PanelMode.FULLSCREEN_TUTORIAL); } Panel.updateFromPrefs(); @@ -302,7 +323,7 @@ */ static async onOpenMenus(opt_event, opt_activateMenuTitle) { // If the menu was already open, close it now and exit early. - if (Panel.mode_ !== PanelMode.COLLAPSED) { + if (Panel.instance_.mode_ !== PanelMode.COLLAPSED) { Panel.setMode(PanelMode.COLLAPSED); return; } @@ -326,7 +347,7 @@ const eventSourceState = await BackgroundBridge.EventSourceState.get(); const touchScreen = (eventSourceState === EventSourceType.TOUCH_GESTURE || - this.mockTouchGestureSourceForTesting_); + this.instance_.mockTouchGestureSourceForTesting_); // Build the top-level menus. const searchMenu = Panel.addSearchMenu('panel_search_menu'); @@ -481,11 +502,11 @@ }); } - if (Panel.sessionState !== 'IN_SESSION') { + if (Panel.instance_.sessionState_ !== 'IN_SESSION') { tabsMenu.disable(); // Disable commands that contain the property 'denyOOBE'. - for (let i = 0; i < Panel.menus_.length; ++i) { - const menu = Panel.menus_[i]; + for (let i = 0; i < Panel.instance_.menus_.length; ++i) { + const menu = Panel.instance_.menus_[i]; for (let j = 0; j < menu.items.length; ++j) { const item = menu.items[j]; if (CommandStore.denySignedOut( @@ -537,14 +558,15 @@ // Activate either the specified menu or the search menu. // Search menu can be null, since it is hidden behind a flag. - let selectedMenu = Panel.searchMenu || Panel.menus_[0]; - for (let i = 0; i < Panel.menus_.length; i++) { - if (Panel.menus_[i].menuMsg === opt_activateMenuTitle) { - selectedMenu = Panel.menus_[i]; + let selectedMenu = + Panel.instance_.searchMenu_ || Panel.instance_.menus_[0]; + for (let i = 0; i < Panel.instance_.menus_.length; i++) { + if (Panel.instance_.menus_[i].menuMsg === opt_activateMenuTitle) { + selectedMenu = Panel.instance_.menus_[i]; } } - const activateFirstItem = (selectedMenu !== Panel.searchMenu); + const activateFirstItem = (selectedMenu !== Panel.instance_.searchMenu_); Panel.activateMenu(selectedMenu, activateFirstItem); }; @@ -564,7 +586,7 @@ Panel.clearMenus(); Panel.pendingCallback_ = null; Panel.updateFromPrefs(); - await ISearchUI.init(Panel.searchInput_); + await ISearchUI.init(Panel.instance_.searchInput_); } /** @@ -572,15 +594,15 @@ * menus are opened. */ static clearMenus() { - while (Panel.menus_.length) { - const menu = Panel.menus_.pop(); + while (Panel.instance_.menus_.length) { + const menu = Panel.instance_.menus_.pop(); $('menu-bar').removeChild(menu.menuBarItemElement); $('menus_background').removeChild(menu.menuContainerElement); } - if (Panel.activeMenu_) { - Panel.lastMenu_ = Panel.activeMenu_.menuMsg; + if (Panel.instance_.activeMenu_) { + Panel.instance_.lastMenu_ = Panel.instance_.activeMenu_.menuMsg; } - Panel.activeMenu_ = null; + Panel.instance_.activeMenu_ = null; } /** @@ -597,7 +619,7 @@ menu.menuBarItemElement.addEventListener( 'mouseup', Panel.onMouseUpOnMenuTitle_.bind(this, menu), false); $('menus_background').appendChild(menu.menuContainerElement); - Panel.menus_.push(menu); + Panel.instance_.menus_.push(menu); return menu; } @@ -646,18 +668,19 @@ } }; - Panel.brailleContainer_.addEventListener('mouseover', addBorders); - Panel.brailleContainer_.addEventListener('mouseout', removeBorders); - Panel.brailleContainer_.addEventListener('click', routeCursor); + Panel.instance_.brailleContainer_.addEventListener('mouseover', addBorders); + Panel.instance_.brailleContainer_.addEventListener( + 'mouseout', removeBorders); + Panel.instance_.brailleContainer_.addEventListener('click', routeCursor); // Clear the tables. - let rowCount = Panel.brailleTableElement_.rows.length; + let rowCount = Panel.instance_.brailleTableElement_.rows.length; for (let i = 0; i < rowCount; i++) { - Panel.brailleTableElement_.deleteRow(0); + Panel.instance_.brailleTableElement_.deleteRow(0); } - rowCount = Panel.brailleTableElement2_.rows.length; + rowCount = Panel.instance_.brailleTableElement2_.rows.length; for (let i = 0; i < rowCount; i++) { - Panel.brailleTableElement2_.deleteRow(0); + Panel.instance_.brailleTableElement2_.deleteRow(0); } let row1; @@ -674,13 +697,13 @@ break; } rowCount++; - row1 = Panel.brailleTableElement_.insertRow(-1); + row1 = Panel.instance_.brailleTableElement_.insertRow(-1); if (sideBySide) { // Side by side. - row2 = Panel.brailleTableElement2_.insertRow(-1); + row2 = Panel.instance_.brailleTableElement2_.insertRow(-1); } else { // Interleaved. - row2 = Panel.brailleTableElement_.insertRow(-1); + row2 = Panel.instance_.brailleTableElement_.insertRow(-1); } } @@ -706,13 +729,13 @@ break; } rowCount++; - row1 = Panel.brailleTableElement_.insertRow(-1); + row1 = Panel.instance_.brailleTableElement_.insertRow(-1); if (sideBySide) { // Side by side. - row2 = Panel.brailleTableElement2_.insertRow(-1); + row2 = Panel.instance_.brailleTableElement2_.insertRow(-1); } else { // Interleaved. - row2 = Panel.brailleTableElement_.insertRow(-1); + row2 = Panel.instance_.brailleTableElement_.insertRow(-1); } const bottomCell2 = row2.insertCell(-1); bottomCell2.id = i + '-brailleCell2'; @@ -754,13 +777,14 @@ menu.menuBarItemElement.addEventListener( 'mouseup', event => Panel.onMouseUpOnMenuTitle_(menu, event)); $('menus_background').appendChild(menu.menuContainerElement); - Panel.menus_.push(menu); - Panel.nodeMenuDictionary_[menuData.menuId] = menu; + Panel.instance_.menus_.push(menu); + Panel.instance_.nodeMenuDictionary_[menuData.menuId] = menu; } /** @param {!PanelNodeMenuItemData} itemData */ static addNodeMenuItem(itemData) { - Panel.nodeMenuDictionary_[itemData.menuId].addItemFromData(itemData); + Panel.instance_.nodeMenuDictionary_[itemData.menuId].addItemFromData( + itemData); } /** @@ -769,29 +793,33 @@ * @return {!PanelMenu} The menu just created. */ static addSearchMenu(menuMsg) { - Panel.searchMenu = new PanelSearchMenu(menuMsg); + Panel.instance_.searchMenu_ = new PanelSearchMenu(menuMsg); // Add event listerns to search bar. - Panel.searchMenu.searchBar.addEventListener( + Panel.instance_.searchMenu_.searchBar.addEventListener( 'input', Panel.onSearchBarQuery, false); - Panel.searchMenu.searchBar.addEventListener('mouseup', function(event) { - // Clicking in the panel causes us to either activate an item or close the - // menus altogether. Prevent that from happening if we click the search - // bar. - event.preventDefault(); - event.stopPropagation(); - }, false); - - $('menu-bar').appendChild(Panel.searchMenu.menuBarItemElement); - Panel.searchMenu.menuBarItemElement.addEventListener( - 'mouseover', function(event) { - Panel.activateMenu(Panel.searchMenu, false /* activateFirstItem */); + Panel.instance_.searchMenu_.searchBar.addEventListener( + 'mouseup', function(event) { + // Clicking in the panel causes us to either activate an item or close + // the menus altogether. Prevent that from happening if we click the + // search bar. + event.preventDefault(); + event.stopPropagation(); }, false); - Panel.searchMenu.menuBarItemElement.addEventListener( - 'mouseup', Panel.onMouseUpOnMenuTitle_.bind(this, Panel.searchMenu), + + $('menu-bar').appendChild(Panel.instance_.searchMenu_.menuBarItemElement); + Panel.instance_.searchMenu_.menuBarItemElement.addEventListener( + 'mouseover', function(event) { + Panel.activateMenu( + Panel.instance_.searchMenu_, false /* activateFirstItem */); + }, false); + Panel.instance_.searchMenu_.menuBarItemElement.addEventListener( + 'mouseup', + Panel.onMouseUpOnMenuTitle_.bind(this, Panel.instance_.searchMenu_), false); - $('menus_background').appendChild(Panel.searchMenu.menuContainerElement); - Panel.menus_.push(Panel.searchMenu); - return Panel.searchMenu; + $('menus_background') + .appendChild(Panel.instance_.searchMenu_.menuContainerElement); + Panel.instance_.menus_.push(Panel.instance_.searchMenu_); + return Panel.instance_.searchMenu_; } /** @@ -802,20 +830,20 @@ * first item. */ static activateMenu(menu, activateFirstItem) { - if (menu === Panel.activeMenu_) { + if (menu === Panel.instance_.activeMenu_) { return; } - if (Panel.activeMenu_) { - Panel.activeMenu_.deactivate(); - Panel.activeMenu_ = null; + if (Panel.instance_.activeMenu_) { + Panel.instance_.activeMenu_.deactivate(); + Panel.instance_.activeMenu_ = null; } - Panel.activeMenu_ = menu; + Panel.instance_.activeMenu_ = menu; Panel.pendingCallback_ = null; - if (Panel.activeMenu_) { - Panel.activeMenu_.activate(activateFirstItem); + if (Panel.instance_.activeMenu_) { + Panel.instance_.activeMenu_.activate(activateFirstItem); } } @@ -823,14 +851,14 @@ * Sets the index of the current active menu to be 0. */ static scrollToTop() { - Panel.activeMenu_.scrollToTop(); + Panel.instance_.activeMenu_.scrollToTop(); } /** * Sets the index of the current active menu to be the last index. */ static scrollToBottom() { - Panel.activeMenu_.scrollToBottom(); + Panel.instance_.activeMenu_.scrollToBottom(); } /** @@ -839,8 +867,8 @@ */ static advanceActiveMenuBy(delta) { let activeIndex = -1; - for (let i = 0; i < Panel.menus_.length; i++) { - if (Panel.activeMenu_ === Panel.menus_[i]) { + for (let i = 0; i < Panel.instance_.menus_.length; i++) { + if (Panel.instance_.activeMenu_ === Panel.instance_.menus_[i]) { activeIndex = i; break; } @@ -848,12 +876,13 @@ if (activeIndex >= 0) { activeIndex += delta; - activeIndex = (activeIndex + Panel.menus_.length) % Panel.menus_.length; + activeIndex = (activeIndex + Panel.instance_.menus_.length) % + Panel.instance_.menus_.length; } else { if (delta >= 0) { activeIndex = 0; } else { - activeIndex = Panel.menus_.length - 1; + activeIndex = Panel.instance_.menus_.length - 1; } } @@ -862,7 +891,8 @@ return; } - Panel.activateMenu(Panel.menus_[activeIndex], true /* activateFirstItem */); + Panel.activateMenu( + Panel.instance_.menus_[activeIndex], true /* activateFirstItem */); } /** @@ -872,9 +902,9 @@ * @return {number} The index of the enabled menu. -1 if not found. */ static findEnabledMenuIndex_(startIndex, delta) { - const endIndex = (delta > 0) ? Panel.menus_.length : -1; + const endIndex = (delta > 0) ? Panel.instance_.menus_.length : -1; while (startIndex !== endIndex) { - if (Panel.menus_[startIndex].enabled) { + if (Panel.instance_.menus_[startIndex].enabled) { return startIndex; } startIndex += delta; @@ -887,8 +917,8 @@ * @param {number} delta The number to add to the active menu item index. */ static advanceItemBy(delta) { - if (Panel.activeMenu_) { - Panel.activeMenu_.advanceItemBy(delta); + if (Panel.instance_.activeMenu_) { + Panel.instance_.activeMenu_.advanceItemBy(delta); } } @@ -900,7 +930,7 @@ * @param {Event} event The mouse event. */ static onMouseUp(event) { - if (!Panel.activeMenu_) { + if (!Panel.instance_.activeMenu_) { return; } @@ -915,8 +945,9 @@ target = target.parentElement; } - if (target && Panel.activeMenu_) { - Panel.pendingCallback_ = Panel.activeMenu_.getCallbackForElement(target); + if (target && Panel.instance_.activeMenu_) { + Panel.pendingCallback_ = + Panel.instance_.activeMenu_.getCallbackForElement(target); } PanelInterface.instance.closeMenusAndRestoreFocus(); } @@ -941,12 +972,12 @@ */ static onKeyDown(event) { if (event.key === 'Escape' && - Panel.mode_ === PanelMode.FULLSCREEN_TUTORIAL) { + Panel.instance_.mode_ === PanelMode.FULLSCREEN_TUTORIAL) { Panel.setMode(PanelMode.COLLAPSED); return; } - if (!Panel.activeMenu_) { + if (!Panel.instance_.activeMenu_) { return; } @@ -958,7 +989,8 @@ // If left/right arrow are pressed, we should adjust the search bar's // cursor. We only want to advance the active menu if we are at the // beginning/end of the search bar's contents. - if (Panel.searchMenu && event.target === Panel.searchMenu.searchBar) { + if (Panel.instance_.searchMenu_ && + event.target === Panel.instance_.searchMenu_.searchBar) { switch (event.key) { case 'ArrowLeft': case 'ArrowRight': @@ -1032,7 +1064,7 @@ static onClose() { // Change the url fragment to 'close', which signals the native code // to exit ChromeVox. - Panel.ownerWindow.location = + Panel.instance_.ownerWindow_.location = chrome.extension.getURL('chromevox/panel/panel.html') + '#close'; } @@ -1041,8 +1073,8 @@ * @return {Function} The callback for the current item. */ static getCallbackForCurrentItem() { - if (Panel.activeMenu_) { - return Panel.activeMenu_.getCallbackForCurrentItem(); + if (Panel.instance_.activeMenu_) { + return Panel.instance_.activeMenu_.getCallbackForCurrentItem(); } return null; } @@ -1062,7 +1094,7 @@ // Make sure we're not in full-screen mode. Panel.setMode(PanelMode.COLLAPSED); - Panel.activeMenu_ = null; + Panel.instance_.activeMenu_ = null; await BackgroundBridge.PanelBackground.waitForPanelCollapse(); @@ -1080,7 +1112,7 @@ constants.InteractionMedium.KEYBOARD; if (!$('chromevox-tutorial')) { let curriculum = null; - if (Panel.sessionState === + if (Panel.instance_.sessionState_ === chrome.loginState.SessionState.IN_OOBE_SCREEN) { // We currently support two mediums: keyboard and touch, which is why // we can decide the curriculum using a ternary statement. @@ -1092,9 +1124,9 @@ } Panel.setMode(PanelMode.FULLSCREEN_TUTORIAL); - if (Panel.tutorial && Panel.tutorial.show) { - Panel.tutorial.medium = medium; - Panel.tutorial.show(); + if (Panel.instance_.tutorial_ && Panel.instance_.tutorial_.show) { + Panel.instance_.tutorial_.medium = medium; + Panel.instance_.tutorial_.show(); } }); } @@ -1123,7 +1155,7 @@ tutorialElement.medium = medium; tutorialContainer.appendChild(tutorialElement); document.body.appendChild(tutorialContainer); - Panel.tutorial = tutorialElement; + Panel.instance_.tutorial_ = tutorialElement; // Add listeners. These are custom events fired from custom components. const backgroundPage = chrome.extension.getBackgroundPage(); @@ -1157,8 +1189,9 @@ const actions = evt.detail.actions; await BackgroundBridge.UserActionMonitor.create(actions); await BackgroundBridge.UserActionMonitor.destroy(); - if (Panel.tutorial && Panel.tutorial.showNextLesson) { - Panel.tutorial.showNextLesson(); + if (Panel.instance_.tutorial_ && + Panel.instance_.tutorial_.showNextLesson) { + Panel.instance_.tutorial_.showNextLesson(); } }); $('chromevox-tutorial') @@ -1179,7 +1212,7 @@ backgroundPage['ChromeVox']['earcons']['cancelEarcon'](earconId); }); $('chromevox-tutorial').addEventListener('readyfortesting', () => { - Panel.tutorialReadyForTesting_ = true; + Panel.instance_.tutorialReadyForTesting_ = true; }); $('chromevox-tutorial').addEventListener('openUrl', async evt => { const url = evt.detail.url; @@ -1202,18 +1235,20 @@ * @param {Event} event The input event. */ static onSearchBarQuery(event) { - if (!Panel.searchMenu) { - throw Error('Panel.searchMenu must be defined'); + if (!Panel.instance_.searchMenu_) { + throw Error('Panel.instance_.searchMenu_ must be defined'); } const query = event.target.value.toLowerCase(); - Panel.searchMenu.clear(); + Panel.instance_.searchMenu_.clear(); // Show the search results menu. - Panel.activateMenu(Panel.searchMenu, false /* activateFirstItem */); + Panel.activateMenu( + Panel.instance_.searchMenu_, false /* activateFirstItem */); // Populate. if (query) { - for (let i = 0; i < Panel.menus_.length; ++i) { - const menu = Panel.menus_[i]; - if (menu === Panel.searchMenu || menu instanceof PanelNodeMenu) { + for (let i = 0; i < Panel.instance_.menus_.length; ++i) { + const menu = Panel.instance_.menus_[i]; + if (menu === Panel.instance_.searchMenu_ || + menu instanceof PanelNodeMenu) { continue; } const items = menu.items; @@ -1229,24 +1264,25 @@ Msgs.getMsg('panel_menu_item_none').toLowerCase()) && item.enabled; if (match) { - Panel.searchMenu.copyAndAddMenuItem(item); + Panel.instance_.searchMenu_.copyAndAddMenuItem(item); } } } } - if (Panel.searchMenu.items.length === 0) { - Panel.searchMenu.addMenuItem( + if (Panel.instance_.searchMenu_.items.length === 0) { + Panel.instance_.searchMenu_.addMenuItem( Msgs.getMsg('panel_menu_item_none'), '', '', '', function() {}); } - Panel.searchMenu.activateItem(0); + Panel.instance_.searchMenu_.activateItem(0); } static onCurrentRangeChanged() { - if (Panel.mode_ === PanelMode.FULLSCREEN_TUTORIAL) { - if (Panel.tutorial && Panel.tutorial.restartNudges && - !Panel.disableRestartTutorialNudgesForTesting) { - Panel.tutorial.restartNudges(); + if (Panel.instance_.mode_ === PanelMode.FULLSCREEN_TUTORIAL) { + if (Panel.instance_.tutorial_ && + Panel.instance_.tutorial_.restartNudges && + !Panel.instance_.disableRestartTutorialNudgesForTesting_) { + Panel.instance_.tutorial_.restartNudges(); } } } @@ -1262,16 +1298,6 @@ longClick: 'force_long_click_on_current_item', }; - -/** @private {string} */ -Panel.lastMenu_ = ''; - -/** @private {!Object<!PanelNodeMenuId, !PanelNodeMenu>} */ -Panel.nodeMenuDictionary_ = {}; - -/** @public {boolean} */ -Panel.disableRestartTutorialNudgesForTesting = false; - window.addEventListener('load', async function() { await Panel.init(); @@ -1286,14 +1312,14 @@ // Save the sticky state when a user first focuses the panel. if (location.hash === '#fullscreen' || location.hash === '#focus') { - Panel.originalStickyState_ = + Panel.instance_.originalStickyState_ = await BackgroundBridge.ChromeVoxPrefs.getStickyPref(); } // If the original sticky state was on when we first entered the panel, toggle // it in in every case. (fullscreen/focus turns the state off, collapse // turns it back on). - if (Panel.originalStickyState_) { + if (Panel.instance_.originalStickyState_) { BackgroundBridge.CommandHandler.onCommand(Command.TOGGLE_STICKY_MODE); } }, false); @@ -1314,3 +1340,6 @@ BridgeConstants.Panel.TARGET, BridgeConstants.Panel.Action.ON_CURRENT_RANGE_CHANGED, () => Panel.onCurrentRangeChanged()); + +/** @private {Panel} */ +Panel.instance_;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js index e569627..12c1f03 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js
@@ -52,7 +52,7 @@ // to wait until an update has been made. Swap in our hook, wait, then // restore after. const makeAssertions = () => { - const menu = this.getPanel().activeMenu_; + const menu = this.getPanel().instance_.activeMenu_; assertEquals(menuMsg, menu.menuMsg); }; @@ -69,7 +69,7 @@ } assertActiveMenuItem(menuMsg, menuItemTitle, opt_menuItemShortcut) { - const menu = this.getPanel().activeMenu_; + const menu = this.getPanel().instance_.activeMenu_; const menuItem = menu.items_[menu.activeIndex_]; assertEquals(menuMsg, menu.menuMsg); assertEquals(menuItemTitle, menuItem.menuItemTitle); @@ -79,14 +79,14 @@ } assertActiveSearchMenuItem(menuItemTitle) { - const searchMenu = this.getPanel().searchMenu; + const searchMenu = this.getPanel().instance_.searchMenu_; const activeIndex = searchMenu.activeIndex_; const activeItem = searchMenu.items_[activeIndex]; assertEquals(menuItemTitle, activeItem.menuItemTitle); } isMenuTitleMessage(menuTitleMessage) { - const menu = this.getPanel().activeMenu_; + const menu = this.getPanel().instance_.activeMenu_; return menuTitleMessage === menu.menuMsg; }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test_base.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test_base.js index 04ee7dc..7c2d462 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test_base.js
@@ -24,9 +24,8 @@ getPanelWindow() { let panelWindow = null; while (!panelWindow) { - panelWindow = chrome.extension.getViews().find(function(view) { - return view.location.href.indexOf('chromevox/panel/panel.html') > 0; - }); + panelWindow = chrome.extension.getViews().find( + view => view.location.href.indexOf('chromevox/panel/panel.html') > 0); } return panelWindow; }
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 aac272098..2796fe7 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js
@@ -60,12 +60,11 @@ // Once the tutorial has been added to the document, we need // to wait for the lesson templates to load. const panel = this.getPanel(); - if (panel.tutorialReadyForTesting_) { + if (panel.instance_.tutorialReadyForTesting_) { resolve(); } else { - panel.tutorial.addEventListener('readyfortesting', () => { - resolve(); - }); + panel.instance_.tutorial_.addEventListener( + 'readyfortesting', () => resolve()); } observer.disconnect(); } @@ -82,7 +81,7 @@ } getTutorial() { - return this.getPanel().tutorial; + return this.getPanel().instance_.tutorial_; } get simpleDoc() { @@ -214,7 +213,7 @@ // Afterward, general hints will be given about using ChromeVox. Lastly, // we will give a hint for exiting the tutorial. AX_TEST_F('ChromeVoxTutorialTest', 'GeneralNudgesTest', async function() { - this.getPanel().disableRestartTutorialNudgesForTesting = true; + this.getPanel().instance_.disableRestartTutorialNudgesForTesting_ = true; const mockFeedback = this.createMockFeedback(); const root = await this.runWithLoadedTree(this.simpleDoc); await this.launchAndWaitForTutorial(); @@ -744,7 +743,7 @@ }); AX_TEST_F('ChromeVoxTutorialTest', 'GeneralTouchNudges', async function() { - this.getPanel().disableRestartTutorialNudgesForTesting = true; + this.getPanel().instance_.disableRestartTutorialNudgesForTesting_ = true; const mockFeedback = this.createMockFeedback(); const root = await this.runWithLoadedTree(this.simpleDoc); await this.launchAndWaitForTutorial();
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/prefs_manager.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/prefs_manager.js index c7470f0..101cfb7 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/prefs_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/prefs_manager.js
@@ -468,7 +468,7 @@ const options = /** @type {!chrome.tts.TtsOptions} */ ({}); const data = voiceSwitchingData || {}; const useEnhancedVoices = - this.enhancedNetworkVoicesEnabled_ && navigator.onLine; + this.enhancedNetworkVoicesEnabled() && navigator.onLine; if (useEnhancedVoices) { options['voiceName'] = this.enhancedVoiceName_;
diff --git a/chrome/browser/resources/chromeos/network_ui/BUILD.gn b/chrome/browser/resources/chromeos/network_ui/BUILD.gn index e2354f43..3d9c61c0 100644 --- a/chrome/browser/resources/chromeos/network_ui/BUILD.gn +++ b/chrome/browser/resources/chromeos/network_ui/BUILD.gn
@@ -6,7 +6,7 @@ import("//third_party/closure_compiler/compile_js.gni") import("//tools/grit/grit_rule.gni") import("//tools/grit/preprocess_if_expr.gni") -import("//tools/polymer/html_to_js.gni") +import("//tools/polymer/html_to_wrapper.gni") import("//ui/webui/resources/tools/generate_grd.gni") preprocess_folder = "preprocessed" @@ -33,22 +33,26 @@ out_folder = "$target_gen_dir/$preprocess_folder" out_manifest = "$target_gen_dir/$preprocess_manifest" in_files = [ + "network_logs_ui.js", + "network_metrics_ui.js", + "network_state_ui.js", "network_ui_browser_proxy.js", + "network_ui.js", "third_party/uPlot.iife.min.js", "third_party/uPlot.min.css", ] } preprocess_if_expr("preprocess_generated") { - deps = [ ":web_components" ] + deps = [ ":html_wrapper_files" ] in_folder = target_gen_dir out_folder = "$target_gen_dir/$preprocess_folder" out_manifest = "$target_gen_dir/$preprocess_gen_manifest" in_files = [ - "network_logs_ui.js", - "network_state_ui.js", - "network_ui.js", - "network_metrics_ui.js", + "network_logs_ui.html.js", + "network_state_ui.html.js", + "network_ui.html.js", + "network_metrics_ui.html.js", ] } @@ -126,11 +130,12 @@ externs_list = [ "$externs_path/chrome_send.js" ] } -html_to_js("web_components") { - js_files = [ - "network_logs_ui.js", - "network_state_ui.js", - "network_ui.js", - "network_metrics_ui.js", +html_to_wrapper("html_wrapper_files") { + in_files = [ + "network_logs_ui.html", + "network_state_ui.html", + "network_ui.html", + "network_metrics_ui.html", ] + use_js = true }
diff --git a/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js b/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js index 4b76556..6bd1b819 100644 --- a/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js +++ b/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js
@@ -9,8 +9,9 @@ import 'chrome://resources/cr_elements/cr_shared_style.css.js'; import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; -import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {getTemplate} from './network_logs_ui.html.js'; import {NetworkUIBrowserProxy, NetworkUIBrowserProxyImpl} from './network_ui_browser_proxy.js'; /** @@ -21,7 +22,7 @@ Polymer({ is: 'network-logs-ui', - _template: html`{__html_template__}`, + _template: getTemplate(), behaviors: [I18nBehavior],
diff --git a/chrome/browser/resources/chromeos/network_ui/network_metrics_ui.js b/chrome/browser/resources/chromeos/network_ui/network_metrics_ui.js index 99da00f..1f5dab7 100644 --- a/chrome/browser/resources/chromeos/network_ui/network_metrics_ui.js +++ b/chrome/browser/resources/chromeos/network_ui/network_metrics_ui.js
@@ -7,8 +7,9 @@ import 'chrome://resources/cr_elements/cr_shared_style.css.js'; import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; -import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {getTemplate} from './network_metrics_ui.html.js'; import {NetworkUIBrowserProxy, NetworkUIBrowserProxyImpl} from './network_ui_browser_proxy.js'; import {uPlot} from './third_party/uPlot.iife.min.js'; @@ -21,7 +22,7 @@ Polymer({ is: 'network-metrics-ui', - _template: html`{__html_template__}`, + _template: getTemplate(), behaviors: [I18nBehavior],
diff --git a/chrome/browser/resources/chromeos/network_ui/network_state_ui.js b/chrome/browser/resources/chromeos/network_ui/network_state_ui.js index 4a2e450..47bb093 100644 --- a/chrome/browser/resources/chromeos/network_ui/network_state_ui.js +++ b/chrome/browser/resources/chromeos/network_ui/network_state_ui.js
@@ -10,8 +10,9 @@ import {assert} from 'chrome://resources/js/assert.js'; import {CrosNetworkConfig, CrosNetworkConfigRemote, FilterType, ManagedProperties, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js'; -import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {getTemplate} from './network_state_ui.html.js'; import {NetworkUIBrowserProxy, NetworkUIBrowserProxyImpl} from './network_ui_browser_proxy.js'; /** @@ -22,7 +23,7 @@ Polymer({ is: 'network-state-ui', - _template: html`{__html_template__}`, + _template: getTemplate(), properties: {},
diff --git a/chrome/browser/resources/chromeos/network_ui/network_ui.js b/chrome/browser/resources/chromeos/network_ui/network_ui.js index d101029..7d8c02e 100644 --- a/chrome/browser/resources/chromeos/network_ui/network_ui.js +++ b/chrome/browser/resources/chromeos/network_ui/network_ui.js
@@ -17,12 +17,13 @@ import './network_logs_ui.js'; import './network_metrics_ui.js'; -import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {CrosNetworkConfig, CrosNetworkConfigRemote, StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; -import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {getTemplate} from './network_ui.html.js'; import {NetworkUIBrowserProxy, NetworkUIBrowserProxyImpl} from './network_ui_browser_proxy.js'; /** @@ -33,7 +34,7 @@ Polymer({ is: 'network-ui', - _template: html`{__html_template__}`, + _template: getTemplate(), behaviors: [I18nBehavior],
diff --git a/chrome/browser/resources/new_tab_page/logo.html b/chrome/browser/resources/new_tab_page/logo.html index 50d8b40..825e57f 100644 --- a/chrome/browser/resources/new_tab_page/logo.html +++ b/chrome/browser/resources/new_tab_page/logo.html
@@ -134,7 +134,7 @@ </div> <template is="dom-if" if="[[iframeUrl_]]" restamp> <ntp-iframe id="iframe" src="[[iframeUrl_]]" expanded$="[[expanded_]]" - allow="autoplay"> + allow="autoplay; clipboard-write"> </ntp-iframe> </template> </div>
diff --git a/chrome/browser/resources/omnibox/BUILD.gn b/chrome/browser/resources/omnibox/BUILD.gn index 2d545f21..536d25f 100644 --- a/chrome/browser/resources/omnibox/BUILD.gn +++ b/chrome/browser/resources/omnibox/BUILD.gn
@@ -27,8 +27,9 @@ ] mojo_files_deps = - [ "//chrome/browser/ui/webui/omnibox:mojo_bindings_js__generator" ] - mojo_files = [ "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/omnibox/omnibox.mojom-webui.js" ] + [ "//chrome/browser/ui/webui/omnibox:mojo_bindings_ts__generator" ] + mojo_files = + [ "$root_gen_dir/chrome/browser/ui/webui/omnibox/omnibox.mojom-webui.ts" ] ts_deps = [ "//ui/webui/resources:library",
diff --git a/chrome/browser/resources/omnibox/tsconfig_base.json b/chrome/browser/resources/omnibox/tsconfig_base.json index 362119d6..e5c5b62 100644 --- a/chrome/browser/resources/omnibox/tsconfig_base.json +++ b/chrome/browser/resources/omnibox/tsconfig_base.json
@@ -1,7 +1,6 @@ { "extends": "../../../../tools/typescript/tsconfig_base.json", "compilerOptions": { - "allowJs": true, "strictPropertyInitialization": false } }
diff --git a/chrome/browser/resources/omnibox_popup/BUILD.gn b/chrome/browser/resources/omnibox_popup/BUILD.gn new file mode 100644 index 0000000..fb8deca1 --- /dev/null +++ b/chrome/browser/resources/omnibox_popup/BUILD.gn
@@ -0,0 +1,14 @@ +# Copyright 2022 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//chrome/browser/resources/tools/build_webui.gni") + +build_webui("build") { + grd_prefix = "omnibox_popup" + static_files = [ "omnibox_popup.html" ] + non_web_component_files = [ "omnibox_popup.ts" ] + + ts_composite = true + ts_deps = [] +}
diff --git a/chrome/browser/resources/omnibox_popup/omnibox_popup.html b/chrome/browser/resources/omnibox_popup/omnibox_popup.html new file mode 100644 index 0000000..2692bfa --- /dev/null +++ b/chrome/browser/resources/omnibox_popup/omnibox_popup.html
@@ -0,0 +1,23 @@ +<!doctype html> +<html dir="$i18n{textdirection}" lang="$i18n{language}"> +<head> + <meta charset="utf-8"> + <title>Omnibox Popup</title> + <link rel="stylesheet" href="chrome://resources/css/md_colors.css"> + <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> + <style> + html { + height: 100%; + overflow: hidden; + } + + body { + height: 100%; + margin: 0; + } + </style> +</head> +<body> +</body> +<script type="module" src="omnibox_popup.js"></script> +</html>
diff --git a/ash/webui/common/resources/traffic_counters/traffic_counters_adapter.d.ts b/chrome/browser/resources/omnibox_popup/omnibox_popup.ts similarity index 91% rename from ash/webui/common/resources/traffic_counters/traffic_counters_adapter.d.ts rename to chrome/browser/resources/omnibox_popup/omnibox_popup.ts index 983fe59..b6ba896 100644 --- a/ash/webui/common/resources/traffic_counters/traffic_counters_adapter.d.ts +++ b/chrome/browser/resources/omnibox_popup/omnibox_popup.ts
@@ -1,5 +1,3 @@ // Copyright 2022 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - -export {};
diff --git a/chrome/browser/resources/omnibox_popup/tsconfig_base.json b/chrome/browser/resources/omnibox_popup/tsconfig_base.json new file mode 100644 index 0000000..362119d6 --- /dev/null +++ b/chrome/browser/resources/omnibox_popup/tsconfig_base.json
@@ -0,0 +1,7 @@ +{ + "extends": "../../../../tools/typescript/tsconfig_base.json", + "compilerOptions": { + "allowJs": true, + "strictPropertyInitialization": false + } +}
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn index 7c7d528..86689c5 100644 --- a/chrome/browser/resources/settings/BUILD.gn +++ b/chrome/browser/resources/settings/BUILD.gn
@@ -352,6 +352,7 @@ "site_settings/site_settings_prefs_browser_proxy.ts", "site_settings/website_usage_browser_proxy.ts", "site_settings_page/site_settings_page_util.ts", + "tooltip_mixin.ts", ] if (is_chromeos) {
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/bruschetta_subpage.ts b/chrome/browser/resources/settings/chromeos/crostini_page/bruschetta_subpage.ts index d4037db..c38bb7d0 100644 --- a/chrome/browser/resources/settings/chromeos/crostini_page/bruschetta_subpage.ts +++ b/chrome/browser/resources/settings/chromeos/crostini_page/bruschetta_subpage.ts
@@ -11,18 +11,15 @@ import 'chrome://resources/cr_elements/cr_link_row/cr_link_row.js'; import '../../settings_shared.css.js'; -import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {Route, Router} from '../router.js'; import {routes} from '../os_route.js'; -import {RouteOriginBehavior, RouteOriginBehaviorInterface} from '../route_origin_behavior.js'; +import {RouteOriginMixin} from '../route_origin_mixin.js'; +import {Route, Router} from '../router.js'; import {getTemplate} from './bruschetta_subpage.html.js'; -const BruschettaSubpageElementBase = - mixinBehaviors([RouteOriginBehavior], PolymerElement) as { - new (): PolymerElement & RouteOriginBehaviorInterface, - }; +const BruschettaSubpageElementBase = RouteOriginMixin(PolymerElement); class BruschettaSubpageElement extends BruschettaSubpageElementBase { static get is() { @@ -38,7 +35,7 @@ constructor() { super(); - /** RouteOriginBehavior override */ + /** RouteOriginMixin override */ this.route_ = routes.BRUSCHETTA_DETAILS; }
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.ts b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.ts index 718a00d..a527324 100644 --- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.ts +++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.ts
@@ -25,13 +25,13 @@ import {SettingsToggleButtonElement} from '../../controls/settings_toggle_button.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js'; import {PrefsMixin, PrefsMixinInterface} from '../../prefs/prefs_mixin.js'; -import {Route, Router} from '../router.js'; import {castExists} from '../assert_extras.js'; import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js'; import {TERMINA_VM_TYPE} from '../guest_os/guest_os_browser_proxy.js'; import {recordSettingChange} from '../metrics_recorder.js'; import {routes} from '../os_route.js'; -import {RouteOriginBehavior, RouteOriginBehaviorInterface} from '../route_origin_behavior.js'; +import {RouteOriginMixin, RouteOriginMixinInterface} from '../route_origin_mixin.js'; +import {Route, Router} from '../router.js'; import {CrostiniBrowserProxy, CrostiniBrowserProxyImpl, CrostiniDiskInfo} from './crostini_browser_proxy.js'; import {getTemplate} from './crostini_subpage.html.js'; @@ -48,12 +48,11 @@ mixinBehaviors( [ DeepLinkingBehavior, - RouteOriginBehavior, ], - PrefsMixin(WebUiListenerMixin(PolymerElement))) as { + RouteOriginMixin(PrefsMixin(WebUiListenerMixin(PolymerElement)))) as { new (): PolymerElement & WebUiListenerMixinInterface & - PrefsMixinInterface & DeepLinkingBehaviorInterface & - RouteOriginBehaviorInterface, + PrefsMixinInterface & RouteOriginMixinInterface & + DeepLinkingBehaviorInterface, }; class SettingsCrostiniSubpageElement extends @@ -223,7 +222,7 @@ constructor() { super(); - /** RouteOriginBehavior override */ + /** RouteOriginMixin override */ this.route_ = routes.CROSTINI_DETAILS; this.isDiskUserChosenSize_ = false;
diff --git a/chrome/browser/resources/settings/chromeos/device_page/storage.ts b/chrome/browser/resources/settings/chromeos/device_page/storage.ts index 7a925fd..9910ed6 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/storage.ts +++ b/chrome/browser/resources/settings/chromeos/device_page/storage.ts
@@ -12,13 +12,13 @@ import '../../settings_shared.css.js'; import {CrLinkRowElement} from 'chrome://resources/cr_elements/cr_link_row/cr_link_row.js'; -import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js'; +import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; -import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {Route, Router} from '../router.js'; import {routes} from '../os_route.js'; -import {RouteOriginBehavior, RouteOriginBehaviorInterface} from '../route_origin_behavior.js'; +import {RouteOriginMixin} from '../route_origin_mixin.js'; +import {Route, Router} from '../router.js'; import {DevicePageBrowserProxy, DevicePageBrowserProxyImpl, StorageSpaceState} from './device_page_browser_proxy.js'; import {getTemplate} from './storage.html.js'; @@ -40,11 +40,7 @@ } const SettingsStorageElementBase = - mixinBehaviors([RouteOriginBehavior], WebUiListenerMixin(PolymerElement)) as - { - new (): PolymerElement & WebUiListenerMixinInterface & - RouteOriginBehaviorInterface, - }; + RouteOriginMixin(WebUiListenerMixin(PolymerElement)); class SettingsStorageElement extends SettingsStorageElementBase { static get is() { @@ -101,7 +97,7 @@ constructor() { super(); - /** RouteOriginBehavior override */ + /** RouteOriginMixin override */ this.route_ = routes.STORAGE; /**
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn index f40b291..3a868ac 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
@@ -26,7 +26,6 @@ ":network_proxy_section", ":network_summary", ":network_summary_item", - ":settings_traffic_counters", ":tether_connection_dialog", ] } @@ -103,7 +102,6 @@ ":internet_page_browser_proxy", ":internet_shared_css", ":network_proxy_section", - ":settings_traffic_counters", ":tether_connection_dialog", "//ash/webui/common/resources:i18n_behavior", "//ash/webui/common/resources:web_ui_listener_behavior", @@ -313,21 +311,6 @@ ] } -js_library("settings_traffic_counters") { - deps = [ - ":internet_shared_css", - "//ash/webui/common/resources:i18n_behavior", - "//ash/webui/common/resources/network:onc_mojo", - "//ash/webui/common/resources/traffic_counters:traffic_counters", - "//ash/webui/common/resources/traffic_counters:traffic_counters_adapter", - "//chromeos/services/network_config/public/mojom:mojom_webui_js", - "//chromeos/services/network_config/public/mojom:network_types_webui_js", - "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - ] - externs_list = - [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js" ] -} - html_to_js("web_components") { js_files = [ "apn_subpage.js", @@ -344,7 +327,6 @@ "network_proxy_section.js", "network_summary_item.js", "network_summary.js", - "settings_traffic_counters.js", "tether_connection_dialog.js", ] }
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/settings_traffic_counters.js b/chrome/browser/resources/settings/chromeos/internet_page/settings_traffic_counters.ts similarity index 67% rename from chrome/browser/resources/settings/chromeos/internet_page/settings_traffic_counters.js rename to chrome/browser/resources/settings/chromeos/internet_page/settings_traffic_counters.ts index a7e0e203..7091634 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/settings_traffic_counters.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/settings_traffic_counters.ts
@@ -6,6 +6,7 @@ * @fileoverview Polymer element to show traffic counters information in * Settings UI. */ + import './internet_shared_css.js'; import 'chrome://resources/ash/common/network/network_shared.css.js'; import 'chrome://resources/cr_elements/cr_button/cr_button.js'; @@ -14,14 +15,16 @@ import 'chrome://resources/ash/common/traffic_counters/traffic_counters.js'; import {Network, TrafficCountersAdapter} from 'chrome://resources/ash/common/traffic_counters/traffic_counters_adapter.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; -import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; +import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {getTemplate} from './settings_traffic_counters.html.js'; /** - * @type {number} Default day of the month, e.g., First of January, during + * Default day of the month, e.g., First of January, during * which traffic counters are reset. */ -const kDefaultResetDay = 1; +const DEFAULT_RESET_DAY = 1; const KB = 1000; const MB = KB * 1000; @@ -32,12 +35,10 @@ /** * Returns a formatted string with the appropriate unit label and data size * fixed to two decimal values. - * @param {bigint} totalBytes - * @return {string} the appropriate unit label */ -function getDataInfoString(totalBytes) { - let unit = 'B'; - let dividend = BigInt(1); +function getDataInfoString(totalBytes: bigint): string { + let unit: string = 'B'; + let dividend = 1; if (totalBytes >= PB) { unit = 'PB'; @@ -56,27 +57,20 @@ dividend = KB; } - return (parseFloat(totalBytes) / parseFloat(dividend)).toFixed(2) + ' ' + - unit; + const numBytes = (Number(totalBytes) / dividend).toFixed(2); + return `${numBytes} ${unit}`; } -/** - * @constructor - * @extends {PolymerElement} - * @implements {I18nBehaviorInterface} - */ -const SettingsTrafficCountersElementBase = - mixinBehaviors([I18nBehavior], PolymerElement); +const SettingsTrafficCountersElementBase = I18nMixin(PolymerElement); -/** @polymer */ export class SettingsTrafficCountersElement extends SettingsTrafficCountersElementBase { static get is() { - return 'settings-traffic-counters'; + return 'settings-traffic-counters' as const; } static get template() { - return html`{__html_template__}`; + return getTemplate(); } static get properties() { @@ -84,24 +78,46 @@ /** The network GUID to display details for. */ guid: String, /** Tracks whether traffic counter info should be shown. */ - trafficCountersAvailable_: {type: Boolean, value: false}, + trafficCountersAvailable_: { + type: Boolean, + value: false, + }, /** Tracks the last reset time information. */ - date_: {type: String, value: ''}, + date_: { + type: String, + value: '', + }, /** Tracks the traffic counter information. */ - value_: {type: String, value: ''}, + value_: { + type: String, + value: '', + }, /** Tracks whether auto reset is enabled. */ - autoReset_: {type: Boolean, value: false}, + autoReset_: { + type: Boolean, + value: false, + }, /** Tracks the user specified day of reset. Default is 1. */ - resetDay_: {type: Number, value: 1}, + resetDay_: { + type: Number, + value: 1, + }, }; } + guid: string; + private autoReset_: boolean; + private date_: string; + private resetDay_: number; + private trafficCountersAdapter_: TrafficCountersAdapter; + private trafficCountersAvailable_: boolean; + private value_: string; + constructor() { super(); /** * Adapter to collect network related information. - * @private {!TrafficCountersAdapter} */ this.trafficCountersAdapter_ = new TrafficCountersAdapter(); this.load(); @@ -109,7 +125,6 @@ /** * Loads all the values needed to populate the HTML. - * @public */ load() { this.populateTrafficCountersAvailable_(); @@ -120,60 +135,56 @@ /** * Handles reset requests. - * @private */ - async onResetDataUsageClick_() { - this.trafficCountersAdapter_.resetTrafficCountersForNetwork(this.guid); + private async onResetDataUsageClick_(): Promise<void> { + await this.trafficCountersAdapter_.resetTrafficCountersForNetwork( + this.guid); this.load(); } /** * Returns the network matching |this.guid| if it can be successfully * requested. Returns null otherwise. - * @return {!Promise<?Network>} */ - async getNetworkIfAvailable_() { + private async getNetworkIfAvailable_(): Promise<Network|null> { const networks = await this.trafficCountersAdapter_ .requestTrafficCountersForActiveNetworks(); const network = networks.find(n => n.guid === this.guid); - return network === undefined ? null : network; + return network || null; } /** * Determines whether data usage should be shown. - * @private */ - async populateTrafficCountersAvailable_() { + private async populateTrafficCountersAvailable_(): Promise<void> { const result = await this.populateTrafficCountersAvailableHelper_(); this.trafficCountersAvailable_ = result; } /** * Gathers data usage visibility information for this network. - * @return {!Promise<boolean>} Whether data usage should be shown. */ - async populateTrafficCountersAvailableHelper_() { + private async populateTrafficCountersAvailableHelper_(): Promise<boolean> { if (this.guid === '') { return false; } - return (await this.getNetworkIfAvailable_()) !== null ? true : false; + + const network = await this.getNetworkIfAvailable_(); + return !!network; } /** * Determines the last reset time of the data usage. - * @private */ - async populateDate_() { + private async populateDate_(): Promise<void> { const result = await this.populateDateHelper_(); this.date_ = result; } /** * Gathers last reset time information. - * @return {!Promise<string>} Date when data usage was last reset - * @private */ - async populateDateHelper_() { + private async populateDateHelper_(): Promise<string> { const network = await this.getNetworkIfAvailable_(); if (network === null || network.friendlyDate === null) { return this.i18n('TrafficCountersDataUsageLastResetDateUnavailableLabel'); @@ -184,19 +195,16 @@ /** * Determines the data usage value. - * @private */ - async populateDataUsageValue_() { + private async populateDataUsageValue_(): Promise<void> { const result = await this.populateDataUsageValueHelper_(); this.value_ = result; } /** * Gathers the data usage value information. - * @return {!Promise<string>} Value corresponding to the data usage - * @private */ - async populateDataUsageValueHelper_() { + private async populateDataUsageValueHelper_(): Promise<string> { const network = await this.getNetworkIfAvailable_(); if (network === null) { return getDataInfoString(BigInt(0)); @@ -210,56 +218,48 @@ /** * Populates the auto reset enable and day values. - * @private */ - populateAutoResetValues_() { + private populateAutoResetValues_(): void { this.populateEnableAutoResetBoolean_(); this.populateUserSpecifiedResetDay_(); } /** * Determines whether auto reset is enabled. - * @private */ - async populateEnableAutoResetBoolean_() { + private async populateEnableAutoResetBoolean_(): Promise<void> { const result = await this.populateEnableAutoResetBooleanHelper_(); this.autoReset_ = result; } /** * Gathers auto reset enable information. - * @return {!Promise<boolean>} - * @private */ - async populateEnableAutoResetBooleanHelper_() { + private async populateEnableAutoResetBooleanHelper_(): Promise<boolean> { const network = await this.getNetworkIfAvailable_(); - return network !== null ? network.autoReset : false; + return network ? network.autoReset : false; } /** * Determines the auto reset day. - * @private */ - async populateUserSpecifiedResetDay_() { + private async populateUserSpecifiedResetDay_(): Promise<void> { const result = await this.populateUserSpecifiedResetDayHelper_(); this.resetDay_ = result; } /** * Gathers the auto reset day information. - * @return {!Promise<number>} - * @private */ - async populateUserSpecifiedResetDayHelper_() { + private async populateUserSpecifiedResetDayHelper_(): Promise<number> { const network = await this.getNetworkIfAvailable_(); - return network !== null ? network.userSpecifiedResetDay : kDefaultResetDay; + return network ? network.userSpecifiedResetDay : DEFAULT_RESET_DAY; } /** * Handles the auto reset toggle changes. - * @private */ - onAutoDataUsageResetToggle_() { + private onAutoDataUsageResetToggle_(): void { this.autoReset_ = !this.autoReset_; this.resetDay_ = 1; const day = this.autoReset_ ? {value: this.resetDay_} : null; @@ -270,9 +270,8 @@ /** * Handles day of reset changes. - * @private */ - onResetDaySelected_() { + private onResetDaySelected_(): void { if (!this.autoReset_) { return; } @@ -282,5 +281,11 @@ } } +declare global { + interface HTMLElementTagNameMap { + [SettingsTrafficCountersElement.is]: SettingsTrafficCountersElement; + } +} + customElements.define( SettingsTrafficCountersElement.is, SettingsTrafficCountersElement);
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/audio_and_captions_page.ts b/chrome/browser/resources/settings/chromeos/os_a11y_page/audio_and_captions_page.ts index 319645f..f802e165 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/audio_and_captions_page.ts +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/audio_and_captions_page.ts
@@ -26,10 +26,10 @@ import {afterNextRender, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js'; -import {Route} from '../router.js'; import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js'; import {routes} from '../os_route.js'; -import {RouteOriginBehavior, RouteOriginBehaviorImpl, RouteOriginBehaviorInterface} from '../route_origin_behavior.js'; +import {RouteOriginMixin, RouteOriginMixinInterface} from '../route_origin_mixin.js'; +import {Route} from '../router.js'; import {getTemplate} from './audio_and_captions_page.html.js'; import {AudioAndCaptionsPageBrowserProxy, AudioAndCaptionsPageBrowserProxyImpl} from './audio_and_captions_page_browser_proxy.js'; @@ -44,12 +44,11 @@ mixinBehaviors( [ DeepLinkingBehavior, - RouteOriginBehavior, ], - WebUiListenerMixin(I18nMixin(PolymerElement))) as { + RouteOriginMixin(WebUiListenerMixin(I18nMixin(PolymerElement)))) as { new (): PolymerElement & I18nMixinInterface & - WebUiListenerMixinInterface & DeepLinkingBehaviorInterface & - RouteOriginBehaviorInterface, + WebUiListenerMixinInterface & RouteOriginMixinInterface & + DeepLinkingBehaviorInterface, }; class SettingsAudioAndCaptionsPageElement extends @@ -104,7 +103,7 @@ constructor() { super(); - /** RouteOriginBehavior override */ + /** RouteOriginMixin override */ this.route_ = routes.A11Y_AUDIO_AND_CAPTIONS; this.audioAndCaptionsBrowserProxy_ = @@ -146,10 +145,10 @@ } /** - * Note: Overrides RouteOriginBehavior implementation + * Note: Overrides RouteOriginMixin implementation */ override currentRouteChanged(newRoute: Route, prevRoute?: Route) { - RouteOriginBehaviorImpl.currentRouteChanged.call(this, newRoute, prevRoute); + super.currentRouteChanged(newRoute, prevRoute); // Does not apply to this page. if (newRoute !== routes.A11Y_AUDIO_AND_CAPTIONS) {
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/cursor_and_touchpad_page.ts b/chrome/browser/resources/settings/chromeos/os_a11y_page/cursor_and_touchpad_page.ts index 6191f9b..f594901e 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/cursor_and_touchpad_page.ts +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/cursor_and_touchpad_page.ts
@@ -26,11 +26,11 @@ import {SettingsToggleButtonElement} from '../../controls/settings_toggle_button.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js'; import {PrefsMixin, PrefsMixinInterface} from '../../prefs/prefs_mixin.js'; -import {Route, Router} from '../router.js'; import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js'; import {DevicePageBrowserProxy, DevicePageBrowserProxyImpl} from '../device_page/device_page_browser_proxy.js'; import {routes} from '../os_route.js'; -import {RouteOriginBehavior, RouteOriginBehaviorImpl, RouteOriginBehaviorInterface} from '../route_origin_behavior.js'; +import {RouteOriginMixin, RouteOriginMixinInterface} from '../route_origin_mixin.js'; +import {Route, Router} from '../router.js'; import {getTemplate} from './cursor_and_touchpad_page.html.js'; import {CursorAndTouchpadPageBrowserProxy, CursorAndTouchpadPageBrowserProxyImpl} from './cursor_and_touchpad_page_browser_proxy.js'; @@ -52,12 +52,12 @@ mixinBehaviors( [ DeepLinkingBehavior, - RouteOriginBehavior, ], - PrefsMixin(WebUiListenerMixin(I18nMixin(PolymerElement)))) as { + RouteOriginMixin( + PrefsMixin(WebUiListenerMixin(I18nMixin(PolymerElement))))) as { new (): PolymerElement & I18nMixinInterface & WebUiListenerMixinInterface & PrefsMixinInterface & - DeepLinkingBehaviorInterface & RouteOriginBehaviorInterface, + RouteOriginMixinInterface & DeepLinkingBehaviorInterface, }; class SettingsCursorAndTouchpadPageElement extends @@ -264,7 +264,7 @@ constructor() { super(); - /** RouteOriginBehavior override */ + /** RouteOriginMixin override */ this.route_ = routes.A11Y_CURSOR_AND_TOUCHPAD; this.cursorAndTouchpadBrowserProxy_ = @@ -295,10 +295,10 @@ } /** - * Note: Overrides RouteOriginBehavior implementation + * Note: Overrides RouteOriginMixin implementation */ override currentRouteChanged(newRoute: Route, prevRoute?: Route) { - RouteOriginBehaviorImpl.currentRouteChanged.call(this, newRoute, prevRoute); + super.currentRouteChanged(newRoute, prevRoute); // Does not apply to this page. if (newRoute !== routes.A11Y_CURSOR_AND_TOUCHPAD) {
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.ts b/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.ts index 882a39a..081e5be 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.ts +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.ts
@@ -23,10 +23,10 @@ import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js'; -import {Route, Router} from '../router.js'; import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js'; import {routes} from '../os_route.js'; -import {RouteOriginBehavior, RouteOriginBehaviorImpl, RouteOriginBehaviorInterface} from '../route_origin_behavior.js'; +import {RouteOriginMixin, RouteOriginMixinInterface} from '../route_origin_mixin.js'; +import {Route, Router} from '../router.js'; import {getTemplate} from './display_and_magnification_page.html.js'; @@ -34,12 +34,11 @@ mixinBehaviors( [ DeepLinkingBehavior, - RouteOriginBehavior, ], - WebUiListenerMixin(I18nMixin(PolymerElement))) as { + RouteOriginMixin(WebUiListenerMixin(I18nMixin(PolymerElement)))) as { new (): PolymerElement & I18nMixinInterface & - WebUiListenerMixinInterface & DeepLinkingBehaviorInterface & - RouteOriginBehaviorInterface, + WebUiListenerMixinInterface & RouteOriginMixinInterface & + DeepLinkingBehaviorInterface, }; class SettingsDisplayAndMagnificationElement extends @@ -144,7 +143,7 @@ constructor() { super(); - /** RouteOriginBehavior override */ + /** RouteOriginMixin override */ this.route_ = routes.A11Y_DISPLAY_AND_MAGNIFICATION; } @@ -155,10 +154,10 @@ } /** - * Note: Overrides RouteOriginBehavior implementation + * Note: Overrides RouteOriginMixin implementation */ override currentRouteChanged(newRoute: Route, prevRoute?: Route) { - RouteOriginBehaviorImpl.currentRouteChanged.call(this, newRoute, prevRoute); + super.currentRouteChanged(newRoute, prevRoute); // Does not apply to this page. if (newRoute !== routes.A11Y_DISPLAY_AND_MAGNIFICATION) {
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/keyboard_and_text_input_page.ts b/chrome/browser/resources/settings/chromeos/os_a11y_page/keyboard_and_text_input_page.ts index 8fc96a7..0195389 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/keyboard_and_text_input_page.ts +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/keyboard_and_text_input_page.ts
@@ -25,11 +25,11 @@ import {SettingsToggleButtonElement} from '../../controls/settings_toggle_button.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js'; import {PrefsMixin, PrefsMixinInterface} from '../../prefs/prefs_mixin.js'; -import {Route, Router} from '../router.js'; import {cast} from '../assert_extras.js'; import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js'; import {routes} from '../os_route.js'; -import {RouteOriginBehavior, RouteOriginBehaviorImpl, RouteOriginBehaviorInterface} from '../route_origin_behavior.js'; +import {RouteOriginMixin, RouteOriginMixinInterface} from '../route_origin_mixin.js'; +import {Route, Router} from '../router.js'; import {getTemplate} from './keyboard_and_text_input_page.html.js'; import {KeyboardAndTextInputPageBrowserProxy, KeyboardAndTextInputPageBrowserProxyImpl} from './keyboard_and_text_input_page_browser_proxy.js'; @@ -46,12 +46,12 @@ mixinBehaviors( [ DeepLinkingBehavior, - RouteOriginBehavior, ], - PrefsMixin(WebUiListenerMixin(I18nMixin(PolymerElement)))) as { + RouteOriginMixin( + PrefsMixin(WebUiListenerMixin(I18nMixin(PolymerElement))))) as { new (): PolymerElement & I18nMixinInterface & WebUiListenerMixinInterface & PrefsMixinInterface & - DeepLinkingBehaviorInterface & RouteOriginBehaviorInterface, + RouteOriginMixinInterface & DeepLinkingBehaviorInterface, }; class SettingsKeyboardAndTextInputPageElement extends @@ -140,7 +140,7 @@ constructor() { super(); - /** RouteOriginBehavior override */ + /** RouteOriginMixin override */ this.route_ = routes.A11Y_KEYBOARD_AND_TEXT_INPUT; this.keyboardAndTextInputBrowserProxy_ = @@ -168,10 +168,10 @@ } /** - * Note: Overrides RouteOriginBehavior implementation + * Note: Overrides RouteOriginMixin implementation */ override currentRouteChanged(newRoute: Route, prevRoute?: Route) { - RouteOriginBehaviorImpl.currentRouteChanged.call(this, newRoute, prevRoute); + super.currentRouteChanged(newRoute, prevRoute); // Does not apply to this page. if (newRoute !== routes.A11Y_KEYBOARD_AND_TEXT_INPUT) {
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.ts b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.ts index 7070c945..3387964 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.ts +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.ts
@@ -28,10 +28,10 @@ import {SettingsToggleButtonElement} from '../../controls/settings_toggle_button.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js'; -import {Route, Router} from '../router.js'; import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js'; import {routes} from '../os_route.js'; -import {RouteOriginBehavior, RouteOriginBehaviorInterface} from '../route_origin_behavior.js'; +import {RouteOriginMixin, RouteOriginMixinInterface} from '../route_origin_mixin.js'; +import {Route, Router} from '../router.js'; import {getTemplate} from './os_a11y_page.html.js'; import {OsA11yPageBrowserProxy, OsA11yPageBrowserProxyImpl} from './os_a11y_page_browser_proxy.js'; @@ -44,10 +44,10 @@ const OsSettingsA11yPageElementBase = mixinBehaviors( - [RouteOriginBehavior, DeepLinkingBehavior], - WebUiListenerMixin(PolymerElement)) as { + [DeepLinkingBehavior], + RouteOriginMixin(WebUiListenerMixin(PolymerElement))) as { new (): PolymerElement & WebUiListenerMixinInterface & - RouteOriginBehaviorInterface & DeepLinkingBehaviorInterface, + RouteOriginMixinInterface & DeepLinkingBehaviorInterface, }; class OsSettingsA11yPageElement extends OsSettingsA11yPageElementBase { @@ -184,8 +184,10 @@ this.browserProxy_.a11yPageReady(); } - override currentRouteChanged(route: Route) { - if (route === routes.OS_ACCESSIBILITY) { + override currentRouteChanged(newRoute: Route, prevRoute?: Route) { + super.currentRouteChanged(newRoute, prevRoute); + + if (newRoute === routes.OS_ACCESSIBILITY) { this.attemptDeepLink(); } }
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/select_to_speak_subpage.ts b/chrome/browser/resources/settings/chromeos/os_a11y_page/select_to_speak_subpage.ts index b50a687..383aaa1 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/select_to_speak_subpage.ts +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/select_to_speak_subpage.ts
@@ -23,7 +23,7 @@ import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js'; import {LanguagesBrowserProxy, LanguagesBrowserProxyImpl} from '../os_languages_page/languages_browser_proxy.js'; import {routes} from '../os_route.js'; -import {RouteOriginBehavior, RouteOriginBehaviorInterface} from '../route_origin_behavior.js'; +import {RouteOriginMixin, RouteOriginMixinInterface} from '../route_origin_mixin.js'; import {Route, Router} from '../router.js'; import {getTemplate} from './select_to_speak_subpage.html.js'; @@ -79,12 +79,12 @@ mixinBehaviors( [ DeepLinkingBehavior, - RouteOriginBehavior, ], - PrefsMixin(WebUiListenerMixin(I18nMixin(PolymerElement)))) as { + RouteOriginMixin( + PrefsMixin(WebUiListenerMixin(I18nMixin(PolymerElement))))) as { new (): PolymerElement & I18nMixinInterface & WebUiListenerMixinInterface & PrefsMixinInterface & - DeepLinkingBehaviorInterface & RouteOriginBehaviorInterface, + RouteOriginMixinInterface & DeepLinkingBehaviorInterface, }; class SettingsSelectToSpeakSubpageElement extends @@ -244,7 +244,7 @@ SelectToSpeakSubpageBrowserProxyImpl.getInstance(); this.langBrowserProxy_ = LanguagesBrowserProxyImpl.getInstance(); - /** RouteOriginBehavior override */ + /** RouteOriginMixin override */ this.route_ = routes.A11Y_SELECT_TO_SPEAK; } @@ -271,7 +271,7 @@ } /** - * Note: Overrides RouteOriginBehavior implementation. + * Note: Overrides RouteOriginMixin implementation. */ override currentRouteChanged(newRoute: Route, prevRoute?: Route) { super.currentRouteChanged(newRoute, prevRoute);
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/text_to_speech_page.ts b/chrome/browser/resources/settings/chromeos/os_a11y_page/text_to_speech_page.ts index 9fc9984d..c87d29b 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/text_to_speech_page.ts +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/text_to_speech_page.ts
@@ -18,11 +18,11 @@ import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Setting} from '../../mojom-webui/setting.mojom-webui.js'; -import {Route, Router} from '../router.js'; import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js'; import {DevicePageBrowserProxy, DevicePageBrowserProxyImpl} from '../device_page/device_page_browser_proxy.js'; import {routes} from '../os_route.js'; -import {RouteOriginBehavior, RouteOriginBehaviorImpl, RouteOriginBehaviorInterface} from '../route_origin_behavior.js'; +import {RouteOriginMixin, RouteOriginMixinInterface} from '../route_origin_mixin.js'; +import {Route, Router} from '../router.js'; import {getTemplate} from './text_to_speech_page.html.js'; import {TextToSpeechPageBrowserProxy, TextToSpeechPageBrowserProxyImpl} from './text_to_speech_page_browser_proxy.js'; @@ -31,12 +31,11 @@ mixinBehaviors( [ DeepLinkingBehavior, - RouteOriginBehavior, ], - WebUiListenerMixin(I18nMixin(PolymerElement))) as { + RouteOriginMixin(WebUiListenerMixin(I18nMixin(PolymerElement)))) as { new (): PolymerElement & I18nMixinInterface & - WebUiListenerMixinInterface & DeepLinkingBehaviorInterface & - RouteOriginBehaviorInterface, + WebUiListenerMixinInterface & RouteOriginMixinInterface & + DeepLinkingBehaviorInterface, }; class SettingsTextToSpeechPageElement extends @@ -95,7 +94,7 @@ constructor() { super(); - /** RouteOriginBehavior override */ + /** RouteOriginMixin override */ this.route_ = routes.A11Y_TEXT_TO_SPEECH; this.textToSpeechBrowserProxy_ = @@ -122,10 +121,10 @@ } /** - * Note: Overrides RouteOriginBehavior implementation + * Note: Overrides RouteOriginMixin implementation */ override currentRouteChanged(newRoute: Route, prevRoute?: Route) { - RouteOriginBehaviorImpl.currentRouteChanged.call(this, newRoute, prevRoute); + super.currentRouteChanged(newRoute, prevRoute); // Does not apply to this page. if (newRoute !== routes.A11Y_TEXT_TO_SPEECH) {
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni index 7b15c67..7f19402a 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings.gni +++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -61,6 +61,7 @@ "chromeos/internet_page/esim_install_error_dialog.ts", "chromeos/internet_page/esim_remove_profile_dialog.ts", "chromeos/internet_page/esim_rename_dialog.ts", + "chromeos/internet_page/settings_traffic_counters.ts", "chromeos/kerberos_page/kerberos_accounts.ts", "chromeos/kerberos_page/kerberos_add_account_dialog.ts", "chromeos/kerberos_page/kerberos_page.ts", @@ -312,6 +313,7 @@ "chromeos/route_observer_behavior.js", "chromeos/route_observer_mixin.ts", "chromeos/route_origin_behavior.js", + "chromeos/route_origin_mixin.ts", "chromeos/router.js", "chromeos/search/combined_search_handler.ts", "chromeos/search/personalization_search_handler.ts", @@ -355,7 +357,6 @@ "chromeos/internet_page/network_proxy_section.js", "chromeos/internet_page/network_summary.js", "chromeos/internet_page/network_summary_item.js", - "chromeos/internet_page/settings_traffic_counters.js", "chromeos/internet_page/tether_connection_dialog.js", "chromeos/multidevice_page/multidevice_combined_setup_item.js", "chromeos/multidevice_page/multidevice_feature_item.js",
diff --git a/chrome/browser/resources/settings/chromeos/route_origin_mixin.ts b/chrome/browser/resources/settings/chromeos/route_origin_mixin.ts new file mode 100644 index 0000000..09f29e64 --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/route_origin_mixin.ts
@@ -0,0 +1,108 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {assertInstanceof} from 'chrome://resources/js/assert_ts.js'; +import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js'; +import {beforeNextRender, dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {castExists} from './assert_extras.js'; +import {RouteObserverMixin, RouteObserverMixinInterface} from './route_observer_mixin.js'; +import {Route, Router} from './router.js'; + +type Constructor<T> = new (...args: any[]) => T; + +export interface RouteOriginMixinInterface extends RouteObserverMixinInterface { + addFocusConfig(route: Route|undefined, value: string): void; +} + +export const RouteOriginMixin = dedupingMixin( + <T extends Constructor<PolymerElement>>(superClass: T): T& + Constructor<RouteOriginMixinInterface> => { + const superClassBase = RouteObserverMixin(superClass); + + class RouteOriginMixin extends superClassBase implements + RouteOriginMixinInterface { + static get properties() { + return { + /** + * A Map specifying which element should be focused when exiting a + * subpage. The key of the map holds a Route path, and the value + * holds either a query selector that identifies the associated + * element to focus or a function to be run when a + * neon-animation-finish event is handled. + */ + focusConfig_: { + type: Object, + value: () => new Map(), + }, + }; + } + + private focusConfig_: Map<string, string|Function>; + /** + * The route corresponding to this page. + */ + private route_: Route|undefined = undefined; + + override connectedCallback(): void { + super.connectedCallback(); + // All elements with this behavior must specify their route. + assertInstanceof( + this.route_, Route, + 'Route origin element must specify its route.'); + } + + override currentRouteChanged(newRoute: Route, prevRoute?: Route) { + // Only attempt to focus an anchor element if the most recent + // navigation was a 'pop' (backwards) navigation. + if (!Router.getInstance().lastRouteChangeWasPopstate()) { + return; + } + + // Route change does not apply to this page. + if (this.route_ !== newRoute) { + return; + } + + this.triggerFocus_(prevRoute); + } + + /** + * Adds a route path to |this.focusConfig_| if the route exists. + * Otherwise it does nothing. + * @param value A query selector leading to a button that routes + * the user to |route| if it is defined. + */ + addFocusConfig(route: Route|undefined, value: string) { + if (route) { + this.focusConfig_.set(route.path, value); + } + } + + /** + * Focuses the element for a given route by finding the associated + * query selector or calling the configured function. + */ + private triggerFocus_(route?: Route) { + if (!route) { + return; + } + + const pathConfig = this.focusConfig_.get(route.path); + if (pathConfig) { + if (typeof pathConfig === 'function') { + pathConfig(); + } else if (typeof pathConfig === 'string') { + const element = castExists( + this.shadowRoot!.querySelector<HTMLElement>(pathConfig)); + beforeNextRender(this, () => { + focusWithoutInk(element); + }); + } + } + } + } + + return RouteOriginMixin; + });
diff --git a/chrome/browser/resources/settings/lazy_load.ts b/chrome/browser/resources/settings/lazy_load.ts index d87fd6b..e1d0219 100644 --- a/chrome/browser/resources/settings/lazy_load.ts +++ b/chrome/browser/resources/settings/lazy_load.ts
@@ -198,7 +198,7 @@ export {CategorySettingExceptionsElement} from './site_settings/category_setting_exceptions.js'; export {ChooserExceptionListElement} from './site_settings/chooser_exception_list.js'; export {ChooserExceptionListEntryElement} from './site_settings/chooser_exception_list_entry.js'; -export {ChooserType, ContentSetting, ContentSettingsTypes, CookieControlsMode, NotificationSetting, SITE_EXCEPTION_WILDCARD, SiteSettingSource, SortMethod} from './site_settings/constants.js'; +export {ChooserType, ContentSetting, ContentSettingsTypes, CookieControlsMode, CookiesExceptionType, NotificationSetting, SITE_EXCEPTION_WILDCARD, SiteSettingSource, SortMethod} from './site_settings/constants.js'; export {SettingsEditExceptionDialogElement} from './site_settings/edit_exception_dialog.js'; export {AppHandlerEntry, AppProtocolEntry, HandlerEntry, ProtocolEntry, ProtocolHandlersElement} from './site_settings/protocol_handlers.js'; export {SettingsReviewNotificationPermissionsElement} from './site_settings/review_notification_permissions.js';
diff --git a/chrome/browser/resources/settings/privacy_page/cookies_page.html b/chrome/browser/resources/settings/privacy_page/cookies_page.html index 93e41c70..4e72b71 100644 --- a/chrome/browser/resources/settings/privacy_page/cookies_page.html +++ b/chrome/browser/resources/settings/privacy_page/cookies_page.html
@@ -174,21 +174,25 @@ category-subtype="[[contentSetting_.ALLOW]]" category-header="$i18n{cookiePageAllowExceptions}" read-only-list="[[exceptionListsReadOnly_]]" - search-filter="[[searchTerm]]"> + search-filter="[[searchTerm]]" + cookies-exception-type="combined"> + </site-list> </site-list> <site-list id="sessionOnlyExceptionsList" category="[[cookiesContentSettingType_]]" category-subtype="[[contentSetting_.SESSION_ONLY]]" category-header="$i18n{cookiePageSessionOnlyExceptions}" read-only-list="[[exceptionListsReadOnly_]]" - search-filter="[[searchTerm]]"> + search-filter="[[searchTerm]]" + cookies-exception-type="combined"> </site-list> <site-list id="blockExceptionsList" category="[[cookiesContentSettingType_]]" category-subtype="[[contentSetting_.BLOCK]]" category-header="$i18n{cookiePageBlockExceptions}" read-only-list="[[exceptionListsReadOnly_]]" - search-filter="[[searchTerm]]"> + search-filter="[[searchTerm]]" + cookies-exception-type="combined"> </site-list> <cr-toast id="toast"> <div id="toastText">$i18n{privacySandboxCookiesDialog}</div>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_topics_subpage.html b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_topics_subpage.html index bf29717b..2d67ab1 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_topics_subpage.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_topics_subpage.html
@@ -1,63 +1,6 @@ -<style include="cr-shared-style"> - #currentTopicsSection { - align-items: center; - display: flex; - padding: 0 var(--cr-section-padding); - } - - #currentTopicsSectionWrapper { - width: 100%; - } - - #currentTopicsHeading { - color: var(--cr-secondary-text-color); - font-size: 100%; - font-weight: 500; - margin: 0; - padding-block-start: var(--cr-section-vertical-padding); - } - - #currentTopicsDescription { - padding-block-end: var(--cr-section-vertical-padding); - } - - .no-topics { - padding-block-end: 32px; - padding-block-start: 16px; - padding-inline-start: 40px; - } -</style> - <settings-toggle-button id="topicsToggle" pref="{{prefs.privacy_sandbox.m1.topics_enabled}}" label="$i18n{topicsPageToggleLabel}" sub-label="$i18n{topicsPageToggleSubLabel}"> </settings-toggle-button> -<div id="currentTopicsSection"> - <div id="currentTopicsSectionWrapper" class="hr"> - <h2 id="currentTopicsHeading"> - $i18n{topicsPageCurrentTopicsHeading} - </h2> - <template is="dom-if" if="[[isTopicsEnabledAndLoaded_( - prefs.privacy_sandbox.m1.topics_enabled.value, isTopicsListLoaded_)]]" - restamp> - <!-- TODO(b/254413439): Add "Learn more" link. --> - <div id="currentTopicsDescription" class="cr-secondary-text" - hidden="[[isTopicsListEmpty_(topicsList_.length)]]"> - $i18n{topicsPageCurrentTopicsDescription} - </div> - <!-- TODO(b/254412594): Add Topics list. --> - <div id="currentTopicsDescriptionEmpty" - class="no-topics cr-secondary-text" - hidden="[[!isTopicsListEmpty_(topicsList_.length)]]"> - $i18n{topicsPageCurrentTopicsDescriptionEmpty} - </div> - </template> - <div id="currentTopicsDescriptionDisabled" - class="no-topics cr-secondary-text" - hidden="[[prefs.privacy_sandbox.m1.topics_enabled.value]]"> - $i18n{topicsPageCurrentTopicsDescriptionDisabled} - </div> - </div> -</div>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_topics_subpage.ts b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_topics_subpage.ts index f6d0015..1727edc0 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_topics_subpage.ts +++ b/chrome/browser/resources/settings/privacy_page/privacy_sandbox/privacy_sandbox_topics_subpage.ts
@@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'chrome://resources/cr_elements/cr_shared_style.css.js'; import '../../controls/settings_toggle_button.js'; import '../../prefs/prefs.js'; @@ -10,7 +9,6 @@ import {SettingsToggleButtonElement} from '../../controls/settings_toggle_button.js'; import {PrefsMixin} from '../../prefs/prefs_mixin.js'; -import {PrivacySandboxBrowserProxy, PrivacySandboxBrowserProxyImpl, PrivacySandboxInterest, TopicsState} from '../../privacy_sandbox/privacy_sandbox_browser_proxy.js'; import {getTemplate} from './privacy_sandbox_topics_subpage.html.js'; @@ -42,55 +40,8 @@ type: Object, notify: true, }, - - topicsList_: { - type: Array, - value() { - return []; - }, - }, - - /** - * Used to determine that the Topics list was already fetched and to - * display the current topics description only after the list is loaded, - * to avoid displaying first the description for an empty list since the - * array is empty at first when the page is loaded and switching to the - * default description once the list is fetched. - */ - isTopicsListLoaded_: { - type: Boolean, - value: false, - }, }; } - - private topicsList_: PrivacySandboxInterest[]; - private isTopicsListLoaded_: boolean; - private privacySandboxBrowserProxy_: PrivacySandboxBrowserProxy = - PrivacySandboxBrowserProxyImpl.getInstance(); - - override ready() { - super.ready(); - - this.privacySandboxBrowserProxy_.getTopicsState().then( - state => this.onTopicsStateChanged_(state)); - } - - private onTopicsStateChanged_(state: TopicsState) { - this.topicsList_ = state.topTopics.map(topic => { - return {topic, removed: false}; - }); - this.isTopicsListLoaded_ = true; - } - - private isTopicsEnabledAndLoaded_(): boolean { - return this.getPref('privacy_sandbox.m1.topics_enabled').value && - this.isTopicsListLoaded_; - } - - private isTopicsListEmpty_(): boolean { - return this.topicsList_.length === 0; - } } declare global {
diff --git a/chrome/browser/resources/settings/privacy_sandbox/app.ts b/chrome/browser/resources/settings/privacy_sandbox/app.ts index b75a8294..e4d5ae07 100644 --- a/chrome/browser/resources/settings/privacy_sandbox/app.ts +++ b/chrome/browser/resources/settings/privacy_sandbox/app.ts
@@ -15,7 +15,7 @@ // Those resources are loaded through settings.js as the privacy sandbox page // lives outside regular settings, hence can't access those resources directly // with |optimize_webui="true"|. -import {CrSettingsPrefs, HatsBrowserProxyImpl, loadTimeData, MetricsBrowserProxy, MetricsBrowserProxyImpl, PrefsMixin, SettingsToggleButtonElement, TrustSafetyInteraction} from '../settings.js'; +import {CrSettingsPrefs, HatsBrowserProxyImpl, loadTimeData, MetricsBrowserProxy, MetricsBrowserProxyImpl, PrefsMixin, SettingsToggleButtonElement, TooltipMixin, TrustSafetyInteraction} from '../settings.js'; import {getTemplate} from './app.html.js'; import {FledgeState, PrivacySandboxBrowserProxy, PrivacySandboxBrowserProxyImpl, PrivacySandboxInterest, TopicsState} from './privacy_sandbox_browser_proxy.js'; @@ -39,7 +39,7 @@ }; } -const PrivacySandboxAppElementBase = PrefsMixin(PolymerElement); +const PrivacySandboxAppElementBase = TooltipMixin(PrefsMixin(PolymerElement)); export class PrivacySandboxAppElement extends PrivacySandboxAppElementBase { static get is() { @@ -357,19 +357,7 @@ const tooltip = this.shadowRoot!.querySelector<PaperTooltipElement>( target.id === 'topicsTooltipIcon' ? '#topicsTooltip' : '#fledgeTooltip')!; - - const hide = () => { - tooltip.hide(); - target.removeEventListener('mouseleave', hide); - target.removeEventListener('blur', hide); - target.removeEventListener('click', hide); - tooltip.removeEventListener('mouseenter', hide); - }; - target.addEventListener('mouseleave', hide); - target.addEventListener('blur', hide); - target.addEventListener('click', hide); - tooltip.addEventListener('mouseenter', hide); - tooltip.show(); + this.showTooltipAtTarget(tooltip, target); } }
diff --git a/chrome/browser/resources/settings/settings.ts b/chrome/browser/resources/settings/settings.ts index 21d4f4b8..54cda32 100644 --- a/chrome/browser/resources/settings/settings.ts +++ b/chrome/browser/resources/settings/settings.ts
@@ -96,3 +96,4 @@ export {SettingsSectionElement} from './settings_page/settings_section.js'; export {SettingsUiElement} from './settings_ui/settings_ui.js'; export {SiteFaviconElement} from './site_favicon.js'; +export {TooltipMixin, TooltipMixinInterface} from './tooltip_mixin.js';
diff --git a/chrome/browser/resources/settings/site_settings/add_site_dialog.html b/chrome/browser/resources/settings/site_settings/add_site_dialog.html index faffc3d..4b2c630b 100644 --- a/chrome/browser/resources/settings/site_settings/add_site_dialog.html +++ b/chrome/browser/resources/settings/site_settings/add_site_dialog.html
@@ -17,7 +17,8 @@ $i18n{incognitoSiteOnly} </cr-checkbox> <cr-checkbox id="thirdParties" - hidden$="[[shouldHideThirdPartyCookieCheckbox_(category)]]"> + hidden$="[[shouldHideThirdPartyCookieCheckbox_(category, + cookiesExceptionType)]]"> $i18n{siteSettingsCookiesThirdPartyExceptionLabel} </cr-checkbox> </div>
diff --git a/chrome/browser/resources/settings/site_settings/add_site_dialog.ts b/chrome/browser/resources/settings/site_settings/add_site_dialog.ts index e778642..fcc7566 100644 --- a/chrome/browser/resources/settings/site_settings/add_site_dialog.ts +++ b/chrome/browser/resources/settings/site_settings/add_site_dialog.ts
@@ -23,7 +23,7 @@ import {loadTimeData} from '../i18n_setup.js'; import {getTemplate} from './add_site_dialog.html.js'; -import {ContentSetting, ContentSettingsTypes, SITE_EXCEPTION_WILDCARD} from './constants.js'; +import {ContentSetting, ContentSettingsTypes, CookiesExceptionType, SITE_EXCEPTION_WILDCARD} from './constants.js'; import {SiteSettingsMixin, SiteSettingsMixinInterface} from './site_settings_mixin.js'; export interface AddSiteDialogElement { @@ -61,6 +61,18 @@ }, /** + * Controls what kind of patterns the created cookies exception will have + * (based on the CookiesExceptionType): + * - THIRD_PARTY: Exception that will have primary pattern as wildcard + * (third-party cookie exceptions). + * - SITE_DATA: Exception that will have secondary pattern as wildcard + * (regular exceptions). + * - COMBINED: Support both pattern types and have a checkbox to control + * the mode. + */ + cookiesExceptionType: String, + + /** * The site to add an exception for. */ site_: String, @@ -76,6 +88,7 @@ hasIncognito: boolean; private site_: string; private errorMessage_: string; + cookiesExceptionType: CookiesExceptionType; override connectedCallback() { super.connectedCallback(); @@ -120,7 +133,8 @@ let primaryPattern = this.site_; let secondaryPattern = SITE_EXCEPTION_WILDCARD; - if (this.$.thirdParties.checked) { + if (this.$.thirdParties.checked || + this.cookiesExceptionType === CookiesExceptionType.THIRD_PARTY) { primaryPattern = SITE_EXCEPTION_WILDCARD; secondaryPattern = this.site_; } @@ -144,7 +158,10 @@ } private shouldHideThirdPartyCookieCheckbox_(): boolean { - return this.category !== ContentSettingsTypes.COOKIES; + // TODO(crbug.com/1378703): Remove checkbox support after feature is + // launched. + return this.cookiesExceptionType !== CookiesExceptionType.COMBINED || + this.category !== ContentSettingsTypes.COOKIES; } }
diff --git a/chrome/browser/resources/settings/site_settings/chooser_exception_list.ts b/chrome/browser/resources/settings/site_settings/chooser_exception_list.ts index 2054503f..ca12419 100644 --- a/chrome/browser/resources/settings/site_settings/chooser_exception_list.ts +++ b/chrome/browser/resources/settings/site_settings/chooser_exception_list.ts
@@ -20,6 +20,8 @@ import {PaperTooltipElement} from 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {TooltipMixin} from '../tooltip_mixin.js'; + import {getTemplate} from './chooser_exception_list.html.js'; import {ChooserType, ContentSettingsTypes} from './constants.js'; import {SiteSettingsMixin} from './site_settings_mixin.js'; @@ -31,8 +33,8 @@ }; } -const ChooserExceptionListElementBase = ListPropertyUpdateMixin( - SiteSettingsMixin(WebUiListenerMixin(I18nMixin(PolymerElement)))); +const ChooserExceptionListElementBase = TooltipMixin(ListPropertyUpdateMixin( + SiteSettingsMixin(WebUiListenerMixin(I18nMixin(PolymerElement))))); export class ChooserExceptionListElement extends ChooserExceptionListElementBase { @@ -165,23 +167,10 @@ */ private onShowTooltip_(e: CustomEvent<{target: HTMLElement, text: string}>) { this.tooltipText_ = e.detail.text; - const target = e.detail.target; // paper-tooltip normally determines the target from the |for| property, // which is a selector. Here paper-tooltip is being reused by multiple // potential targets. - this.$.tooltip.target = target; - const hide = () => { - this.$.tooltip.hide(); - target.removeEventListener('mouseleave', hide); - target.removeEventListener('blur', hide); - target.removeEventListener('click', hide); - this.$.tooltip.removeEventListener('mouseenter', hide); - }; - target.addEventListener('mouseleave', hide); - target.addEventListener('blur', hide); - target.addEventListener('click', hide); - this.$.tooltip.addEventListener('mouseenter', hide); - this.$.tooltip.show(); + this.showTooltipAtTarget(this.$.tooltip, e.detail.target); } /**
diff --git a/chrome/browser/resources/settings/site_settings/constants.ts b/chrome/browser/resources/settings/site_settings/constants.ts index 459a7668..3e33bc32 100644 --- a/chrome/browser/resources/settings/site_settings/constants.ts +++ b/chrome/browser/resources/settings/site_settings/constants.ts
@@ -176,3 +176,16 @@ * finished before updating the model for the right visual effect. */ export const MODEL_UPDATE_DELAY_MS = 300; + +/** + * Types of cookies exceptions based on the use of wildcard in the patterns: + * - THIRD_PARTY: primary pattern is wildcard (third-party exception). + * - SITE_DATA: primary pattern is set, secondary pattern is wildcard (site data + * exceptions) or is set (only possible via extensions API). + * - COMBINED: any pattern combination can be used. + */ +export enum CookiesExceptionType { + THIRD_PARTY = 'third-party', + SITE_DATA = 'site-data', + COMBINED = 'combined', +}
diff --git a/chrome/browser/resources/settings/site_settings/review_notification_permissions.ts b/chrome/browser/resources/settings/site_settings/review_notification_permissions.ts index 9844aa1..fa3a766c 100644 --- a/chrome/browser/resources/settings/site_settings/review_notification_permissions.ts +++ b/chrome/browser/resources/settings/site_settings/review_notification_permissions.ts
@@ -21,6 +21,7 @@ import {BaseMixin} from '../base_mixin.js'; import {MetricsBrowserProxy, MetricsBrowserProxyImpl, SafetyCheckNotificationsModuleInteractions} from '../metrics_browser_proxy.js'; import {MODEL_UPDATE_DELAY_MS} from '../site_settings/constants.js'; +import {TooltipMixin} from '../tooltip_mixin.js'; import {getTemplate} from './review_notification_permissions.html.js'; import {SiteSettingsMixin} from './site_settings_mixin.js'; @@ -44,7 +45,8 @@ } const SettingsReviewNotificationPermissionsElementBase = - WebUiListenerMixin(BaseMixin(SiteSettingsMixin(I18nMixin(PolymerElement)))); + TooltipMixin(WebUiListenerMixin( + BaseMixin(SiteSettingsMixin(I18nMixin(PolymerElement))))); export class SettingsReviewNotificationPermissionsElement extends SettingsReviewNotificationPermissionsElementBase { @@ -232,23 +234,9 @@ private onShowTooltip_(e: Event) { e.stopPropagation(); - const target = e.target!; const tooltip = this.shadowRoot!.querySelector('paper-tooltip'); assert(tooltip); - tooltip.target = target; - tooltip.updatePosition(); - const hide = () => { - tooltip.hide(); - target.removeEventListener('mouseleave', hide); - target.removeEventListener('blur', hide); - target.removeEventListener('click', hide); - tooltip.removeEventListener('mouseenter', hide); - }; - target.addEventListener('mouseleave', hide); - target.addEventListener('blur', hide); - target.addEventListener('click', hide); - tooltip.addEventListener('mouseenter', hide); - tooltip.show(); + this.showTooltipAtTarget(tooltip, e.target!); } private async updateNotificationPermissionReviewListExpanded_():
diff --git a/chrome/browser/resources/settings/site_settings/site_list.html b/chrome/browser/resources/settings/site_settings/site_list.html index 3556293..c34ddee 100644 --- a/chrome/browser/resources/settings/site_settings/site_list.html +++ b/chrome/browser/resources/settings/site_settings/site_list.html
@@ -51,7 +51,8 @@ on-show-action-menu="onShowActionMenu_" tabindex$="[[tabIndex]]" first$="[[!index]]" iron-list-tab-index="[[tabIndex]]" last-focused="{{lastFocused_}}" list-blurred="{{listBlurred_}}" - on-show-tooltip="onShowTooltip_" focus-row-index="[[index]]"> + on-show-tooltip="onShowTooltip_" focus-row-index="[[index]]" + cookies-exception-type="[[cookiesExceptionType]]"> </site-list-entry> </template> </iron-list> @@ -69,6 +70,7 @@ <template is="dom-if" if="[[showAddSiteDialog_]]" restamp> <add-site-dialog has-incognito="[[hasIncognito_]]" category="[[category]]" content-setting="[[categorySubtype]]" - on-close="onAddSiteDialogClosed_"> + on-close="onAddSiteDialogClosed_" + cookies-exception-type="[[cookiesExceptionType]]"> </add-site-dialog> </template>
diff --git a/chrome/browser/resources/settings/site_settings/site_list.ts b/chrome/browser/resources/settings/site_settings/site_list.ts index 7ef58634..8d856675 100644 --- a/chrome/browser/resources/settings/site_settings/site_list.ts +++ b/chrome/browser/resources/settings/site_settings/site_list.ts
@@ -20,19 +20,20 @@ import './edit_exception_dialog.js'; import './site_list_entry.js'; -import {assert} from 'chrome://resources/js/assert_ts.js'; -import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js'; import {ListPropertyUpdateMixin} from 'chrome://resources/cr_elements/list_property_update_mixin.js'; import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js'; +import {assert} from 'chrome://resources/js/assert_ts.js'; +import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js'; import {PaperTooltipElement} from 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {TooltipMixin} from '../tooltip_mixin.js'; // <if expr="chromeos_ash"> import {loadTimeData} from '../i18n_setup.js'; import {AndroidInfoBrowserProxyImpl, AndroidSmsInfo} from './android_info_browser_proxy.js'; // </if> -import {ContentSetting, ContentSettingsTypes, INVALID_CATEGORY_SUBTYPE} from './constants.js'; +import {ContentSetting, ContentSettingsTypes, CookiesExceptionType, INVALID_CATEGORY_SUBTYPE, SITE_EXCEPTION_WILDCARD} from './constants.js'; import {getTemplate} from './site_list.html.js'; import {SiteSettingsMixin} from './site_settings_mixin.js'; import {RawSiteException, SiteException, SiteSettingsPrefsBrowserProxy, SiteSettingsPrefsBrowserProxyImpl} from './site_settings_prefs_browser_proxy.js'; @@ -46,8 +47,8 @@ }; } -const SiteListElementBase = ListPropertyUpdateMixin( - SiteSettingsMixin(WebUiListenerMixin(PolymerElement))); +const SiteListElementBase = TooltipMixin(ListPropertyUpdateMixin( + SiteSettingsMixin(WebUiListenerMixin(PolymerElement)))); export class SiteListElement extends SiteListElementBase { static get is() { @@ -101,6 +102,19 @@ value: INVALID_CATEGORY_SUBTYPE, }, + /** + * Filters cookies exceptions based on the type (CookiesExceptionType): + * - THIRD_PARTY: Only show cookies exceptions that have primary pattern + * as wildcard (third-party cookies exceptions). + * - SITE_DATA: Only show cookies exceptions that have primary pattern + * set. This includes site data exceptions (secondary pattern is wildcard) + * and exceptions with both patterns set (currently possible only via + * exceptions API). + * - COMBINED: Doesn't apply any filters, will show exceptions with both + * pattern types. + */ + cookiesExceptionType: String, + hasIncognito_: Boolean, /** @@ -171,6 +185,7 @@ private listBlurred_: boolean; private tooltipText_: string; searchFilter: string; + cookiesExceptionType: CookiesExceptionType; private activeDialogAnchor_: HTMLElement|null; private browserProxy_: SiteSettingsPrefsBrowserProxy = @@ -317,25 +332,10 @@ */ private onShowTooltip_(e: CustomEvent<{target: HTMLElement, text: string}>) { this.tooltipText_ = e.detail.text; - const target = e.detail.target; // paper-tooltip normally determines the target from the |for| property, // which is a selector. Here paper-tooltip is being reused by multiple // potential targets. - const tooltip = this.$.tooltip; - tooltip.target = target; - tooltip.updatePosition(); - const hide = () => { - this.$.tooltip.hide(); - target.removeEventListener('mouseleave', hide); - target.removeEventListener('blur', hide); - target.removeEventListener('click', hide); - this.$.tooltip.removeEventListener('mouseenter', hide); - }; - target.addEventListener('mouseleave', hide); - target.addEventListener('blur', hide); - target.addEventListener('click', hide); - this.$.tooltip.addEventListener('mouseenter', hide); - this.$.tooltip.show(); + this.showTooltipAtTarget(this.$.tooltip, e.detail.target); } // <if expr="chromeos_ash"> @@ -397,8 +397,28 @@ .filter( site => site.setting !== ContentSetting.DEFAULT && site.setting === this.categorySubtype) + .filter(site => { + if (this.category !== ContentSettingsTypes.COOKIES) { + return true; + } + assert(this.cookiesExceptionType !== undefined); + switch (this.cookiesExceptionType) { + case CookiesExceptionType.THIRD_PARTY: + return site.origin === SITE_EXCEPTION_WILDCARD; + case CookiesExceptionType.SITE_DATA: + // Site data exceptions include all exceptions that + // have `origin` set. This includes site data + // exceptions and exceptions with both patterns set + // (currently possible only via exceptions API). + return site.origin !== SITE_EXCEPTION_WILDCARD; + case CookiesExceptionType.COMBINED: + // For cookies exception type COMBINED, don't apply + // any filters and show exceptions with both pattern + // types. + return true; + } + }) .map(site => this.expandSiteException(site)); - // <if expr="chromeos_ash"> sites = this.processExceptionsForAndroidSmsInfo_(sites); // </if>
diff --git a/chrome/browser/resources/settings/site_settings/site_list_entry.html b/chrome/browser/resources/settings/site_settings/site_list_entry.html index 5a2c484..41d2925 100644 --- a/chrome/browser/resources/settings/site_settings/site_list_entry.html +++ b/chrome/browser/resources/settings/site_settings/site_list_entry.html
@@ -24,7 +24,8 @@ <!-- This div must not contain extra whitespace. --> <div class="secondary" - id="siteDescription">[[computeSiteDescription_(model)]]</div> + id="siteDescription">[[computeSiteDescription_(model, + cookiesExceptionType)]]</div> </div> <template is="dom-if" if="[[allowNavigateToSiteDetail_]]"> <cr-icon-button class="subpage-arrow"
diff --git a/chrome/browser/resources/settings/site_settings/site_list_entry.ts b/chrome/browser/resources/settings/site_settings/site_list_entry.ts index 454a6c8..ff22189 100644 --- a/chrome/browser/resources/settings/site_settings/site_list_entry.ts +++ b/chrome/browser/resources/settings/site_settings/site_list_entry.ts
@@ -24,7 +24,7 @@ import {routes} from '../route.js'; import {Router} from '../router.js'; -import {ChooserType, ContentSettingsTypes, SITE_EXCEPTION_WILDCARD} from './constants.js'; +import {ChooserType, ContentSettingsTypes, CookiesExceptionType, SITE_EXCEPTION_WILDCARD} from './constants.js'; import {getTemplate} from './site_list_entry.html.js'; import {SiteSettingsMixin} from './site_settings_mixin.js'; import {SiteException} from './site_settings_prefs_browser_proxy.js'; @@ -94,6 +94,12 @@ type: Boolean, value: false, }, + + /** + * Type of cookies exceptions based on the use of wildcard in the + * patterns. See `CookiesExceptionType`. + */ + cookiesExceptionType: String, }; } @@ -103,6 +109,7 @@ private chooserObject: object; private showPolicyPrefIndicator_: boolean; private allowNavigateToSiteDetail_: boolean; + cookiesExceptionType: CookiesExceptionType; private onShowTooltip_() { const indicator = @@ -205,8 +212,12 @@ } else if (this.model.embeddingOrigin) { if (this.model.category === ContentSettingsTypes.COOKIES && this.model.origin.trim() === SITE_EXCEPTION_WILDCARD) { - description = loadTimeData.getString( - 'siteSettingsCookiesThirdPartyExceptionLabel'); + // Apply special label only if cookies exceptions are displayed in the + // mixed list. + if (this.cookiesExceptionType === CookiesExceptionType.COMBINED) { + description = loadTimeData.getString( + 'siteSettingsCookiesThirdPartyExceptionLabel'); + } } else { description = loadTimeData.getStringF( 'embeddedOnHost', this.sanitizePort(this.model.embeddingOrigin));
diff --git a/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.ts b/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.ts index 8e7a218..bf53c7cc 100644 --- a/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.ts +++ b/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.ts
@@ -22,6 +22,7 @@ import {AllSitesAction2, ContentSetting, ContentSettingsTypes, SiteSettingSource} from '../site_settings/constants.js'; import {SiteSettingsMixin, SiteSettingsMixinInterface} from '../site_settings/site_settings_mixin.js'; import {RawSiteException, RecentSitePermissions} from '../site_settings/site_settings_prefs_browser_proxy.js'; +import {TooltipMixin, TooltipMixinInterface} from '../tooltip_mixin.js'; import {getTemplate} from './recent_site_permissions.html.js'; import {getLocalizationStringForContentType} from './site_settings_page_util.js'; @@ -33,11 +34,11 @@ } const SettingsRecentSitePermissionsElementBase = - RouteObserverMixin( - SiteSettingsMixin(WebUiListenerMixin(I18nMixin(PolymerElement)))) as { + TooltipMixin(RouteObserverMixin( + SiteSettingsMixin(WebUiListenerMixin(I18nMixin(PolymerElement))))) as { new (): PolymerElement & I18nMixinInterface & WebUiListenerMixinInterface & SiteSettingsMixinInterface & - RouteObserverMixinInterface, + RouteObserverMixinInterface & TooltipMixinInterface, }; export class SettingsRecentSitePermissionsElement extends @@ -261,23 +262,7 @@ private onShowIncognitoTooltip_(e: Event) { e.stopPropagation(); - const target = e.target!; - const tooltip = this.$.tooltip; - tooltip.target = target; - tooltip.updatePosition(); - const hide = () => { - tooltip.hide(); - target.removeEventListener('mouseleave', hide); - target.removeEventListener('blur', hide); - target.removeEventListener('click', hide); - tooltip.removeEventListener('mouseenter', hide); - }; - target.addEventListener('mouseleave', hide); - target.addEventListener('blur', hide); - target.addEventListener('click', hide); - tooltip.addEventListener('mouseenter', hide); - - tooltip.show(); + this.showTooltipAtTarget(this.$.tooltip, e.target!); } /**
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts b/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts index 9594631e..b562f3f3d 100644 --- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts +++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts
@@ -16,6 +16,7 @@ import './recent_site_permissions.js'; import './unused_site_permissions.js'; +import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; @@ -25,6 +26,7 @@ import {routes} from '../route.js'; import {Router} from '../router.js'; import {ContentSettingsTypes} from '../site_settings/constants.js'; +import {SiteSettingsPermissionsBrowserProxy, SiteSettingsPermissionsBrowserProxyImpl, UnusedSitePermissions} from '../site_settings/site_settings_permissions_browser_proxy.js'; import {CategoryListItem} from './site_settings_list.js'; import {getTemplate} from './site_settings_page.html.js'; @@ -341,7 +343,10 @@ return orderedList; } -export class SettingsSiteSettingsPageElement extends PolymerElement { +const SettingsSiteSettingsPageElementBase = WebUiListenerMixin(PolymerElement); + +export class SettingsSiteSettingsPageElement extends + SettingsSiteSettingsPageElementBase { static get is() { return 'settings-site-settings-page'; } @@ -419,9 +424,13 @@ contentExpanded_: Boolean, noRecentSitePermissions_: Boolean, - // TODO(crbug.com/1345920): Also hide the element if it would be empty. showUnusedSitePermissions_: { type: Boolean, + value: false, + }, + + unusedSitePermissionsEnabled_: { + type: Boolean, value() { return loadTimeData.getBoolean( 'safetyCheckUnusedSitePermissionsEnabled'); @@ -430,12 +439,31 @@ }; } + override connectedCallback() { + super.connectedCallback(); + + this.addWebUiListener( + 'unused-permission-review-list-maybe-changed', + (sites: UnusedSitePermissions[]) => + this.onUnusedSitePermissionListChanged_(sites)); + + this.siteSettingsPermissionsBrowserProxy_ + .getRevokedUnusedSitePermissionsList() + .then( + (sites: UnusedSitePermissions[]) => + this.onUnusedSitePermissionListChanged_(sites)); + } + prefs: Object; focusConfig: FocusConfig; private permissionsExpanded_: boolean; private contentExpanded_: boolean; private noRecentSitePermissions_: boolean; private showUnusedSitePermissions_: boolean; + private unusedSitePermissionsEnabled_: boolean; + private siteSettingsPermissionsBrowserProxy_: + SiteSettingsPermissionsBrowserProxy = + SiteSettingsPermissionsBrowserProxyImpl.getInstance(); private lists_: { all: CategoryListItem[], @@ -460,6 +488,19 @@ Router.getInstance().navigateTo(routes.SITE_SETTINGS_ALL); } + private onUnusedSitePermissionListChanged_(permissions: + UnusedSitePermissions[]) { + // The unused site permissions review is shown when there are items to + // review (provided the feature is enabled). Once visible it remains that + // way to show completion info, even if the list is emptied. + if (this.showUnusedSitePermissions_) { + return; + } + + this.showUnusedSitePermissions_ = + this.unusedSitePermissionsEnabled_ && permissions.length > 0; + } + /** @return Class for the all site settings link */ private getClassForSiteSettingsAllLink_(): string { return this.noRecentSitePermissions_ ? '' : 'hr';
diff --git a/chrome/browser/resources/settings/site_settings_page/unused_site_permissions.ts b/chrome/browser/resources/settings/site_settings_page/unused_site_permissions.ts index 9433c99..9a87d7e2 100644 --- a/chrome/browser/resources/settings/site_settings_page/unused_site_permissions.ts +++ b/chrome/browser/resources/settings/site_settings_page/unused_site_permissions.ts
@@ -25,6 +25,7 @@ import {ContentSettingsTypes, MODEL_UPDATE_DELAY_MS} from '../site_settings/constants.js'; import {SiteSettingsMixin} from '../site_settings/site_settings_mixin.js'; import {SiteSettingsPermissionsBrowserProxy, SiteSettingsPermissionsBrowserProxyImpl, UnusedSitePermissions} from '../site_settings/site_settings_permissions_browser_proxy.js'; +import {TooltipMixin} from '../tooltip_mixin.js'; import {getLocalizationStringForContentType} from './site_settings_page_util.js'; import {getTemplate} from './unused_site_permissions.html.js'; @@ -43,8 +44,8 @@ visible: boolean; } -const SettingsUnusedSitePermissionsElementBase = - I18nMixin(WebUiListenerMixin(SiteSettingsMixin(PolymerElement))); +const SettingsUnusedSitePermissionsElementBase = TooltipMixin( + I18nMixin(WebUiListenerMixin(SiteSettingsMixin(PolymerElement)))); export class SettingsUnusedSitePermissionsElement extends SettingsUnusedSitePermissionsElementBase { @@ -223,23 +224,9 @@ private onShowTooltip_(e: Event) { e.stopPropagation(); - const target = e.target!; const tooltip = this.shadowRoot!.querySelector('paper-tooltip'); assert(tooltip); - tooltip.target = target; - tooltip.updatePosition(); - const hide = () => { - tooltip.hide(); - target.removeEventListener('mouseleave', hide); - target.removeEventListener('blur', hide); - target.removeEventListener('click', hide); - tooltip.removeEventListener('mouseenter', hide); - }; - target.addEventListener('mouseleave', hide); - target.addEventListener('blur', hide); - target.addEventListener('click', hide); - tooltip.addEventListener('mouseenter', hide); - tooltip.show(); + this.showTooltipAtTarget(tooltip, e.target!); } private async onSitesChanged_() {
diff --git a/chrome/browser/resources/settings/tooltip_mixin.ts b/chrome/browser/resources/settings/tooltip_mixin.ts new file mode 100644 index 0000000..6e0e50a --- /dev/null +++ b/chrome/browser/resources/settings/tooltip_mixin.ts
@@ -0,0 +1,47 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview Provides common shared tooltip behavior used in various + * settings pages. + */ + +import {PaperTooltipElement} from 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js'; +import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +type Constructor<T> = new (...args: any[]) => T; + +export interface TooltipMixinInterface { + showTooltipAtTarget(tooltip: PaperTooltipElement, target: EventTarget): void; +} + +export const TooltipMixin = dedupingMixin( + <T extends Constructor<PolymerElement>>(superClass: T): T& + Constructor<TooltipMixinInterface> => { + class TooltipMixin extends superClass { + showTooltipAtTarget(tooltip: PaperTooltipElement, target: EventTarget) { + if (!tooltip.for) { + // In the case that the tooltip and target are not associated with + // the for property, manually set the target of the tooltip and + // update its position. + tooltip.target = target; + tooltip.updatePosition(); + } + const hide = () => { + tooltip.hide(); + target.removeEventListener('mouseleave', hide); + target.removeEventListener('blur', hide); + target.removeEventListener('click', hide); + tooltip.removeEventListener('mouseenter', hide); + }; + target.addEventListener('mouseleave', hide); + target.addEventListener('blur', hide); + target.addEventListener('click', hide); + tooltip.addEventListener('mouseenter', hide); + tooltip.show(); + } + } + + return TooltipMixin; + });
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html index d6b5f741..389b293 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
@@ -95,6 +95,10 @@ text-align: center; } + .empty[guest] { + margin-top: 66px; + } + .empty-body { color: var(--cr-secondary-text-color); font-size: 13px; @@ -227,9 +231,9 @@ <div class="column" id="powerBookmarksContainer"> <cr-toolbar-search-field label="$i18n{searchBookmarks}" clear-label="$i18n{clearSearch}" on-search-changed="onSearchChanged_" - disabled="[[editing_]]"> + disabled="[[editing_]]" hidden="[[guestMode_]]"> </cr-toolbar-search-field> - <div class="label-row"> + <div class="label-row" hidden="[[guestMode_]]"> <template is="dom-repeat" items="[[labels_]]"> <button class="label" selected$="[[item.active]]" disabled="[[editing_]]" on-click="onLabelClicked_" aria-pressed="[[item.active]]"> @@ -239,7 +243,7 @@ </button> </template> </div> - <div class="heading-row"> + <div class="heading-row" hidden="[[guestMode_]]"> <button class="back-button" on-click="onBackClicked_" disabled="[[disableBackButton_(activeFolderPath_.*, editing_)]]"> <div class="icon-arrow-back" hidden="[[!activeFolderPath_.length]]"> @@ -299,12 +303,13 @@ </template> </div> <div class="footer-or-empty-state" empty$="[[!shownBookmarks_.length]]"> - <div class="empty" hidden="[[shownBookmarks_.length]]"> + <div class="empty" hidden="[[shownBookmarks_.length]]" + guest$="[[guestMode_]]"> <div class="empty-image"></div> - <div class="empty-title">$i18n{emptyTitle}</div> - <div class="empty-body">$i18n{emptyBody}</div> + <div class="empty-title">[[getEmptyTitle_()]]</div> + <div class="empty-body">[[getEmptyBody_()]]</div> </div> - <cr-button class="footer-button" hidden="[[editing_]]" + <cr-button class="footer-button" hidden="[[hideAddTabButton_(editing_)]]" on-click="onAddTabClicked_" disabled="[[!canAddCurrentUrl_(shownBookmarks_.*, activeFolderPath_.*, currentUrl_)]]">
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts index 22dbe3d..032523ba 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
@@ -116,6 +116,12 @@ type: Array, value: () => [], }, + + guestMode_: { + type: Boolean, + value: loadTimeData.getBoolean('guestMode'), + reflectToAttribute: true, + }, }; } @@ -147,6 +153,7 @@ private currentUrl_: string|undefined; private editing_: boolean; private selectedBookmarks_: chrome.bookmarks.BookmarkTreeNode[]; + private guestMode_: boolean; override connectedCallback() { super.connectedCallback(); @@ -476,9 +483,6 @@ } private canAddCurrentUrl_(): boolean { - if (!loadTimeData.getBoolean('canModifyBookmarks')) { - return false; - } const activeFolder = this.activeFolderPath_[this.activeFolderPath_.length - 1]; let unfilteredShownBookmarks: chrome.bookmarks.BookmarkTreeNode[] = []; @@ -704,10 +708,30 @@ this.bookmarksApi_.bookmarkCurrentTabInFolder(newParent!.id); } + private hideAddTabButton_() { + return this.editing_ || this.guestMode_; + } + private disableBackButton_(): boolean { return !this.activeFolderPath_.length || this.editing_; } + private getEmptyTitle_(): string { + if (this.guestMode_) { + return loadTimeData.getString('emptyTitleGuest'); + } else { + return loadTimeData.getString('emptyTitle'); + } + } + + private getEmptyBody_(): string { + if (this.guestMode_) { + return loadTimeData.getString('emptyBodyGuest'); + } else { + return loadTimeData.getString('emptyBody'); + } + } + /** * Whether the given price-tracked bookmark should display as if discounted. */
diff --git a/chrome/browser/resources/tab_search/BUILD.gn b/chrome/browser/resources/tab_search/BUILD.gn index 5c57ccd1..5aa0740 100644 --- a/chrome/browser/resources/tab_search/BUILD.gn +++ b/chrome/browser/resources/tab_search/BUILD.gn
@@ -45,13 +45,13 @@ css_files = [ "tab_group_shared_vars.css" ] mojo_files_deps = [ - "//chrome/browser/ui/webui/tab_search:mojo_bindings_js__generator", - "//chrome/browser/ui/webui/tabs:mojo_bindings_js__generator", + "//chrome/browser/ui/webui/tab_search:mojo_bindings_ts__generator", + "//chrome/browser/ui/webui/tabs:mojo_bindings_ts__generator", "//components/tab_groups/public/mojom:mojo_bindings_js__generator", ] mojo_files = [ - "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/tab_search/tab_search.mojom-webui.js", - "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/tabs/tabs.mojom-webui.js", + "$root_gen_dir/chrome/browser/ui/webui/tab_search/tab_search.mojom-webui.ts", + "$root_gen_dir/chrome/browser/ui/webui/tabs/tabs.mojom-webui.ts", "$root_gen_dir/mojom-webui/components/tab_groups/public/mojom/tab_group_types.mojom-webui.js", ]
diff --git a/chrome/browser/resources/tab_strip/BUILD.gn b/chrome/browser/resources/tab_strip/BUILD.gn index 2a0eb34..8aa2755 100644 --- a/chrome/browser/resources/tab_strip/BUILD.gn +++ b/chrome/browser/resources/tab_strip/BUILD.gn
@@ -42,12 +42,12 @@ ] mojo_files_deps = [ - "//chrome/browser/ui/webui/tab_strip:mojo_bindings_js__generator", - "//chrome/browser/ui/webui/tabs:mojo_bindings_js__generator", + "//chrome/browser/ui/webui/tab_strip:mojo_bindings_ts__generator", + "//chrome/browser/ui/webui/tabs:mojo_bindings_ts__generator", ] mojo_files = [ - "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/tab_strip/tab_strip.mojom-webui.js", - "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/tabs/tabs.mojom-webui.js", + "$root_gen_dir/chrome/browser/ui/webui/tab_strip/tab_strip.mojom-webui.ts", + "$root_gen_dir/chrome/browser/ui/webui/tabs/tabs.mojom-webui.ts", ] ts_composite = true
diff --git a/chrome/browser/resources/tab_strip/tsconfig_base.json b/chrome/browser/resources/tab_strip/tsconfig_base.json index e4b4ff4..0a20352 100644 --- a/chrome/browser/resources/tab_strip/tsconfig_base.json +++ b/chrome/browser/resources/tab_strip/tsconfig_base.json
@@ -1,7 +1,6 @@ { "extends": "../../../../tools/typescript/tsconfig_base.json", "compilerOptions": { - "allowJs": true, "noPropertyAccessFromIndexSignature": false, "noUnusedLocals": false, "strictPropertyInitialization": false
diff --git a/chrome/browser/sync_file_system/local/canned_syncable_file_system.cc b/chrome/browser/sync_file_system/local/canned_syncable_file_system.cc index 1c2e8379..55bd106 100644 --- a/chrome/browser/sync_file_system/local/canned_syncable_file_system.cc +++ b/chrome/browser/sync_file_system/local/canned_syncable_file_system.cc
@@ -266,8 +266,7 @@ file_system_context_ = FileSystemContext::Create( io_task_runner_, file_task_runner_, storage::ExternalMountPoints::CreateRefCounted(), - std::move(storage_policy), - quota_manager_.get() ? quota_manager_proxy_.get() : nullptr, + std::move(storage_policy), quota_manager_proxy_.get(), std::move(additional_backends), std::vector<storage::URLRequestAutoMountHandler>(), data_dir_.GetPath(), options);
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 0430eee..e2cac185 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -1339,6 +1339,8 @@ "tabs/saved_tab_groups/saved_tab_group_model_listener.h", "tabs/saved_tab_groups/saved_tab_group_service_factory.cc", "tabs/saved_tab_groups/saved_tab_group_service_factory.h", + "tabs/saved_tab_groups/saved_tab_group_utils.cc", + "tabs/saved_tab_groups/saved_tab_group_utils.h", "tabs/tab.h", "tabs/tab_change_type.h", "tabs/tab_group.cc", @@ -1574,6 +1576,8 @@ "webui/ntp/ntp_resource_cache.h", "webui/ntp/ntp_resource_cache_factory.cc", "webui/ntp/ntp_resource_cache_factory.h", + "webui/omnibox_popup/omnibox_popup_ui.cc", + "webui/omnibox_popup/omnibox_popup_ui.h", "webui/page_not_available_for_guest/page_not_available_for_guest_ui.cc", "webui/page_not_available_for_guest/page_not_available_for_guest_ui.h", "webui/password_manager/password_manager_ui.cc",
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 03e41979..a3f6e3a 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
@@ -29,6 +29,8 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/text/bytes_formatting.h" #include "ui/chromeos/styles/cros_styles.h" +#include "ui/chromeos/styles/cros_tokens_color_mappings.h" +#include "ui/color/color_id.h" #include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/paint_vector_icon.h" @@ -386,7 +388,7 @@ // Returns the color for the secondary text to display for the underlying // download. - absl::optional<cros_styles::ColorName> GetSecondaryTextColor() const { + absl::optional<ui::ColorId> GetSecondaryTextColorId() const { // Only in-progress download items have secondary text. if (!IsInProgress(mojo_download_item_.get())) return absl::nullopt; @@ -394,18 +396,18 @@ // In-progress download items which are being scanned have a special // secondary text treatment. if (IsScanning(mojo_download_item_.get())) - return cros_styles::ColorName::kTextColorProminent; + return cros_tokens::kTextColorProminent; // In-progress download items which are dangerous but not malicious can be // kept or discarded by the user via notification. This being the case, such // items have a special secondary text treatment. if (IsDangerous() && !MightBeMalicious()) - return cros_styles::ColorName::kTextColorWarning; + return cros_tokens::kTextColorWarning; // In-progress download items which are dangerous or insecure have a special // secondary text treatment. if (IsDangerous() || IsInsecure()) - return cros_styles::ColorName::kTextColorAlert; + return cros_tokens::kTextColorAlert; return absl::nullopt; } @@ -893,7 +895,7 @@ .SetInvalidateImage(invalidate_image) .SetText(in_progress_download->GetText()) .SetSecondaryText(in_progress_download->GetSecondaryText()) - .SetSecondaryTextColor(in_progress_download->GetSecondaryTextColor()) + .SetSecondaryTextColorId(in_progress_download->GetSecondaryTextColorId()) .SetProgress(in_progress_download->GetProgress()); }
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc index 5e4c878a..582467c 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -512,6 +512,15 @@ delete_local_card_callback); } +void ChromeAutofillClient::ConfirmSaveIBANLocally( + const IBAN& iban, + bool should_show_prompt, + LocalSaveIBANPromptCallback callback) { + NOTIMPLEMENTED(); + // TODO(crbug.com/1349109): Implement SaveIBANBubbleController to show + // prompt bubble for local save. +} + void ChromeAutofillClient::ShowWebauthnOfferDialog( WebauthnDialogCallback offer_dialog_callback) { WebauthnDialogControllerImpl::GetOrCreateForPage(
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h index b45568f..09e30ec9 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.h +++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -137,6 +137,9 @@ const std::u16string& tip_message, const std::vector<MigratableCreditCard>& migratable_credit_cards, MigrationDeleteCardCallback delete_local_card_callback) override; + void ConfirmSaveIBANLocally(const IBAN& iban, + bool should_show_prompt, + LocalSaveIBANPromptCallback callback) override; void ShowWebauthnOfferDialog( WebauthnDialogCallback offer_dialog_callback) override; void ShowWebauthnVerifyPendingDialog(
diff --git a/chrome/browser/ui/bookmarks/bookmark_utils_desktop.cc b/chrome/browser/ui/bookmarks/bookmark_utils_desktop.cc index e9c96c94..6433ee5 100644 --- a/chrome/browser/ui/bookmarks/bookmark_utils_desktop.cc +++ b/chrome/browser/ui/bookmarks/bookmark_utils_desktop.cc
@@ -379,14 +379,16 @@ TabStripModel* model_for_creation = browser->tab_strip_model(); std::vector<UrlAndId> url_and_ids; - auto get_url_and_ids = [&](const SavedTabGroupTab& saved_tab) { + for (const SavedTabGroupTab& saved_tab : saved_group->saved_tabs()) { + if (!saved_tab.url().is_valid()) + continue; + UrlAndId url_and_id; url_and_id.url = saved_tab.url(); url_and_id.id = -1; - return url_and_id; - }; - base::ranges::transform(saved_group->saved_tabs(), - std::back_inserter(url_and_ids), get_url_and_ids); + url_and_ids.push_back(std::move(url_and_id)); + } + if (url_and_ids.empty()) return; const auto opened_web_contents =
diff --git a/chrome/browser/ui/color/chrome_color_id.h b/chrome/browser/ui/color/chrome_color_id.h index 52975268..e05d560 100644 --- a/chrome/browser/ui/color/chrome_color_id.h +++ b/chrome/browser/ui/color/chrome_color_id.h
@@ -75,6 +75,7 @@ E_CPONLY(kColorExtensionMenuIconDisabled) \ E_CPONLY(kColorExtensionMenuPinButtonIcon) \ E_CPONLY(kColorExtensionMenuPinButtonIconDisabled) \ + E_CPONLY(kColorExtensionsMenuHighlightedBackground) \ E_CPONLY(kColorExtensionsToolbarControlsBackground) \ /* Eyedropper colors. */ \ E_CPONLY(kColorEyedropperBoundary) \
diff --git a/chrome/browser/ui/color/chrome_color_mixer.cc b/chrome/browser/ui/color/chrome_color_mixer.cc index bec439e..9ded2f0 100644 --- a/chrome/browser/ui/color/chrome_color_mixer.cc +++ b/chrome/browser/ui/color/chrome_color_mixer.cc
@@ -243,6 +243,8 @@ mixer[kColorExtensionMenuPinButtonIcon] = {ui::kColorAccent}; mixer[kColorExtensionMenuPinButtonIconDisabled] = ui::SetAlpha( kColorExtensionMenuPinButtonIcon, gfx::kDisabledControlAlpha); + mixer[kColorExtensionsMenuHighlightedBackground] = { + kColorToolbarBackgroundSubtleEmphasis}; mixer[kColorExtensionsToolbarControlsBackground] = { kColorToolbarBackgroundSubtleEmphasis}; mixer[kColorEyedropperBoundary] = {SK_ColorDKGRAY};
diff --git a/chrome/browser/ui/lacros/snap_controller_lacros.cc b/chrome/browser/ui/lacros/snap_controller_lacros.cc index b07f49ac..bd40598 100644 --- a/chrome/browser/ui/lacros/snap_controller_lacros.cc +++ b/chrome/browser/ui/lacros/snap_controller_lacros.cc
@@ -55,7 +55,7 @@ chromeos::SnapDirection snap, float snap_ratio) { if (auto* wayland_extension = WaylandExtensionForAuraWindow(window)) { - // TODO(crbug.com/1346780): Set `snap_ratio` for Lacros windows. - wayland_extension->CommitSnap(ToWaylandWindowSnapDirection(snap)); + wayland_extension->CommitSnap(ToWaylandWindowSnapDirection(snap), + snap_ratio); } }
diff --git a/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.cc b/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.cc index f2c34da..dac40e01 100644 --- a/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.cc +++ b/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.cc
@@ -28,7 +28,7 @@ std::unique_ptr<enterprise_connectors::FilesScanData> files_scan_data, content::WebContentsViewDelegate::DropCompletionCallback callback, const enterprise_connectors::ContentAnalysisDelegate::Data& data, - const enterprise_connectors::ContentAnalysisDelegate::Result& result) { + enterprise_connectors::ContentAnalysisDelegate::Result& result) { // If there are no negative results, proceed with just `drop_data`. bool all_text_results_allowed = !base::Contains(result.text_results, false); bool all_file_results_allowed = !base::Contains(result.paths_results, false); @@ -50,12 +50,28 @@ files_scan_data->IndexesToBlock(result.paths_results); // If every file path should be blocked, the drop is aborted, otherwise it - // continues by blocking sub-elements of the list. + // continues by blocking sub-elements of the list. When everything is blocked, + // it implies that no `result.paths_results` is allowed. if (file_indexes_to_block.size() == drop_data.filenames.size()) { + for (size_t i = 0; i < data.paths.size(); ++i) + result.paths_results[i] = false; + std::move(callback).Run(absl::nullopt); return; } + // A specific index could be blocked due to its parent folder being + // blocked and not because it got a bad verdict itself, so `result` needs + // to be updated to reflect that. + DCHECK_EQ(data.paths.size(), + files_scan_data->expanded_paths_indexes().size()); + for (size_t i = 0; i < data.paths.size(); ++i) { + int parent_index = + files_scan_data->expanded_paths_indexes().at(data.paths[i]); + if (file_indexes_to_block.count(parent_index)) + result.paths_results[i] = false; + } + std::vector<ui::FileInfo> final_filenames; for (size_t i = 0; i < drop_data.filenames.size(); ++i) { if (file_indexes_to_block.count(i))
diff --git a/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc b/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc index 853202a..bd6ba327 100644 --- a/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc +++ b/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc
@@ -91,20 +91,43 @@ bool scan_succeeds = (path.empty() && text_scan_succeeds_) || (!path.empty() && !base::Contains(failing_file_scans_, path)); - return scan_succeeds - ? FakeDelegate::SuccessfulResponse(std::move(dlp_tag)) - : FakeDelegate::DlpResponse( - enterprise_connectors::ContentAnalysisResponse:: - Result::SUCCESS, - "block_rule", - enterprise_connectors::ContentAnalysisResponse:: - Result::TriggeredRule::BLOCK); + enterprise_connectors::ContentAnalysisResponse response = + scan_succeeds + ? FakeDelegate::SuccessfulResponse(std::move(dlp_tag)) + : FakeDelegate::DlpResponse( + enterprise_connectors::ContentAnalysisResponse::Result:: + SUCCESS, + "block_rule", + enterprise_connectors::ContentAnalysisResponse::Result:: + TriggeredRule::BLOCK); + std::string request_token = + path.empty() ? "text_request_token" : path.AsUTF8Unsafe(); + response.set_request_token(request_token); + if (path.empty()) { + expected_final_actions_[request_token] = + scan_succeeds ? enterprise_connectors:: + ContentAnalysisAcknowledgement::ALLOW + : enterprise_connectors:: + ContentAnalysisAcknowledgement::BLOCK; + } else { + expected_final_actions_[request_token] = + failing_file_acks_.count(path) + ? enterprise_connectors::ContentAnalysisAcknowledgement:: + BLOCK + : enterprise_connectors::ContentAnalysisAcknowledgement:: + ALLOW; + } + return response; }); enterprise_connectors::ContentAnalysisDelegate::SetFactoryForTesting( base::BindRepeating( &enterprise_connectors::FakeContentAnalysisDelegate::Create, run_loop_->QuitClosure(), callback, "dm_token")); enterprise_connectors::ContentAnalysisDelegate::DisableUIForTesting(); + enterprise_connectors::ContentAnalysisDelegate:: + SetOnAckAllRequestsCallbackForTesting(base::BindOnce( + &ChromeWebContentsViewDelegateHandleOnPerformDrop::OnAckAllActions, + base::Unretained(this))); } // Common code for running the test cases. @@ -113,6 +136,7 @@ bool successful_text_scan, std::set<base::FilePath> successful_file_paths) { current_requests_count_ = 0; + expected_final_actions_.clear(); EnableDeepScanning(enable); SetTextScanSucceeds(successful_text_scan); @@ -154,6 +178,18 @@ failing_file_scans_ = std::move(paths); } + void SetFailingFileAcks(std::set<base::FilePath> paths) { + failing_file_acks_ = std::move(paths); + } + + void OnAckAllActions( + const std::map< + std::string, + enterprise_connectors::ContentAnalysisAcknowledgement::FinalAction>& + final_actions) { + ASSERT_EQ(final_actions, expected_final_actions_); + } + // Helpers to get text with sizes relative to the minimum required size of 100 // bytes for scans to trigger. std::string large_text() const { return std::string(100, 'a'); } @@ -171,6 +207,10 @@ int current_requests_count_ = 0; bool text_scan_succeeds_ = true; std::set<base::FilePath> failing_file_scans_; + std::set<base::FilePath> failing_file_acks_; + std::map<std::string, + enterprise_connectors::ContentAnalysisAcknowledgement::FinalAction> + expected_final_actions_; }; // When no drop data is specified, HandleOnPerformDrop() should indicate @@ -277,12 +317,15 @@ RunTest(data, /*enable=*/true, /*successful_text_scan=*/false, /*successful_file_paths*/ {path_1, path_2}); SetFailingFileScans({path_1}); + SetFailingFileAcks({path_1}); RunTest(data, /*enable=*/true, /*successful_text_scan=*/false, /*successful_file_paths*/ {path_2}); SetFailingFileScans({path_2}); + SetFailingFileAcks({path_2}); RunTest(data, /*enable=*/true, /*successful_text_scan=*/false, /*successful_file_paths*/ {path_1}); SetFailingFileScans({path_1, path_2}); + SetFailingFileAcks({path_1, path_2}); RunTest(data, /*enable=*/true, /*successful_text_scan=*/false, /*successful_file_paths*/ {}); } @@ -325,33 +368,41 @@ // If any of the files in `folder_1` fail, the entire folder is removed from // the final DropData. SetFailingFileScans({path_1}); + SetFailingFileAcks({path_1, path_2, path_3}); RunTest(data, /*enable=*/true, /*successful_text_scan=*/false, /*successful_file_paths*/ {path_4, path_5}); SetFailingFileScans({path_2}); + SetFailingFileAcks({path_1, path_2, path_3}); RunTest(data, /*enable=*/true, /*successful_text_scan=*/false, /*successful_file_paths*/ {path_4, path_5}); SetFailingFileScans({path_3}); + SetFailingFileAcks({path_1, path_2, path_3}); RunTest(data, /*enable=*/true, /*successful_text_scan=*/false, /*successful_file_paths*/ {path_4, path_5}); // The files in `folder_2` are individually in `data`, so one failing doesn't // prevent the other from being in the final result. SetFailingFileScans({path_4}); + SetFailingFileAcks({path_4}); RunTest(data, /*enable=*/true, /*successful_text_scan=*/false, /*successful_file_paths*/ {folder_1, path_5}); SetFailingFileScans({path_5}); + SetFailingFileAcks({path_5}); RunTest(data, /*enable=*/true, /*successful_text_scan=*/false, /*successful_file_paths*/ {folder_1, path_4}); // If any of the files in `folder_1` fail while the last 2 files also fail, // then there are no files at all in the final dropped data. SetFailingFileScans({path_1, path_4, path_5}); + SetFailingFileAcks({path_1, path_2, path_3, path_4, path_5}); RunTest(data, /*enable=*/true, /*successful_text_scan=*/false, /*successful_file_paths*/ {}); SetFailingFileScans({path_2, path_4, path_5}); + SetFailingFileAcks({path_1, path_2, path_3, path_4, path_5}); RunTest(data, /*enable=*/true, /*successful_text_scan=*/false, /*successful_file_paths*/ {}); SetFailingFileScans({path_3, path_4, path_5}); + SetFailingFileAcks({path_1, path_2, path_3, path_4, path_5}); RunTest(data, /*enable=*/true, /*successful_text_scan=*/false, /*successful_file_paths*/ {}); }
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.cc b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.cc index 5249987..ffd8b74 100644 --- a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.cc +++ b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.cc
@@ -10,6 +10,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h" +#include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.h" #include "chrome/browser/ui/tabs/tab_group.h" #include "chrome/browser/ui/tabs/tab_group_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" @@ -40,17 +41,9 @@ const TabStripModel* tab_strip_model = change.model; if (!model_->Contains(change.group)) return; - const TabGroup* group = tab_strip_model->group_model()->GetTabGroup(change.group); switch (change.type) { - // Called when the tabs in the group changes. - case TabGroupChange::kContentsChanged: { - // TODO(dljames): kContentsChanged will update the urls associated with - // the group stored in the model with TabGroupId change.group. - NOTIMPLEMENTED(); - return; - } // Called when a groups title or color changes case TabGroupChange::kVisualsChanged: { const tab_groups::TabGroupVisualData* visual_data = group->visual_data(); @@ -66,6 +59,7 @@ // tab group outside of the observer flow. kEditorOpened does not affect the // SavedTabGroup, and kMoved does not affect the order of the saved tab // groups. + case TabGroupChange::kContentsChanged: case TabGroupChange::kCreated: case TabGroupChange::kEditorOpened: case TabGroupChange::kMoved: { @@ -75,6 +69,59 @@ } } +void SavedTabGroupBrowserListener::TabGroupedStateChanged( + absl::optional<tab_groups::TabGroupId> new_local_group_id, + content::WebContents* contents, + int index) { + // If the webcontents is already saved then its moving saved groups. + if (web_contents_to_tab_id_map_.count(contents) > 0) { + // Remove the tab from it's old group. + base::Token local_tab_id = web_contents_to_tab_id_map_[contents]; + SavedTabGroup* old_group = model_->GetGroupContainingTab(local_tab_id); + SavedTabGroupTab* tab = old_group->GetTab(local_tab_id); + model_->RemoveTabFromGroup(old_group->saved_guid(), tab->saved_tab_guid()); + + // Remove the tab from the mapping. + web_contents_to_tab_id_map_.erase(contents); + } + + // If there's no new group then there's nothing to do since we've already + // removed from the old SavedTabGroup if the tab was saved. + if (!new_local_group_id.has_value()) + return; + + // If the group is not currently saved then there is nothing to do. + SavedTabGroup* new_saved_group = model_->Get(new_local_group_id.value()); + if (new_saved_group == nullptr) + return; + + absl::optional<int> first_tab_in_group_index_in_tabstrip = + browser_->tab_strip_model() + ->group_model() + ->GetTabGroup(new_saved_group->local_group_id().value()) + ->GetFirstTab(); + DCHECK(first_tab_in_group_index_in_tabstrip.has_value()); + + int relative_index_of_tab_in_group = + browser_->tab_strip_model()->GetIndexOfWebContents(contents) - + first_tab_in_group_index_in_tabstrip.value(); + + SavedTabGroupTab tab = + SavedTabGroupUtils::CreateSavedTabGroupTabFromWebContents( + contents, new_saved_group->saved_guid()); + + // Add the token for mapping the local web contents to the SavedTabGroupTab. + base::Token token = base::Token::CreateRandom(); + tab.SetLocalTabID(token); + + // Create a SavedTabGroupTab for the contents and store. + model_->AddTabToGroup(new_saved_group->saved_guid(), std::move(tab), + relative_index_of_tab_in_group); + + // save the contents in the mapping + web_contents_to_tab_id_map_[contents] = std::move(token); +} + SavedTabGroupModelListener::SavedTabGroupModelListener() = default; SavedTabGroupModelListener::SavedTabGroupModelListener(
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.h b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.h index d147413..e9a6808 100644 --- a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.h +++ b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_model_listener.h
@@ -26,6 +26,9 @@ // TabStripModelObserver: void OnTabGroupChanged(const TabGroupChange& change) override; + void TabGroupedStateChanged(absl::optional<tab_groups::TabGroupId> group, + content::WebContents* contents, + int index) override; Browser* browser() { return browser_; } SavedTabGroupModel* saved_tab_group_model() { return model_; }
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.cc b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.cc new file mode 100644 index 0000000..d361926 --- /dev/null +++ b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.cc
@@ -0,0 +1,18 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.h" +#include "base/guid.h" +#include "chrome/browser/favicon/favicon_utils.h" +#include "components/saved_tab_groups/saved_tab_group_tab.h" +#include "content/public/browser/web_contents.h" + +SavedTabGroupTab SavedTabGroupUtils::CreateSavedTabGroupTabFromWebContents( + content::WebContents* contents, + base::GUID saved_tab_group_id) { + SavedTabGroupTab tab(contents->GetVisibleURL(), contents->GetTitle(), + saved_tab_group_id); + tab.SetFavicon(favicon::TabFaviconFromWebContents(contents)); + return tab; +}
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.h b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.h new file mode 100644 index 0000000..d7c79519 --- /dev/null +++ b/chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.h
@@ -0,0 +1,27 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_TABS_SAVED_TAB_GROUPS_SAVED_TAB_GROUP_UTILS_H_ +#define CHROME_BROWSER_UI_TABS_SAVED_TAB_GROUPS_SAVED_TAB_GROUP_UTILS_H_ + +#include "base/guid.h" + +class SavedTabGroupTab; +namespace content { +class WebContents; +} + +class SavedTabGroupUtils { + public: + SavedTabGroupUtils() = delete; + SavedTabGroupUtils(const SavedTabGroupUtils&) = delete; + SavedTabGroupUtils& operator=(const SavedTabGroupUtils&) = delete; + + // Converts a webcontents into a SavedTabGroupTab. + static SavedTabGroupTab CreateSavedTabGroupTabFromWebContents( + content::WebContents* contents, + base::GUID saved_tab_group_id); +}; + +#endif // CHROME_BROWSER_UI_TABS_SAVED_TAB_GROUPS_SAVED_TAB_GROUP_UTILS_H_
diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc index 51470be..b441ac6 100644 --- a/chrome/browser/ui/toolbar/app_menu_model.cc +++ b/chrome/browser/ui/toolbar/app_menu_model.cc
@@ -208,11 +208,6 @@ if (base::FeatureList::IsEnabled(features::kChromeWhatsNewUI)) { AddItem(IDC_CHROME_WHATS_NEW, l10n_util::GetStringUTF16(IDS_CHROME_WHATS_NEW)); - if (base::FeatureList::IsEnabled( - features::kChromeWhatsNewInMainMenuNewBadge)) { - SetIsNewFeatureAt(GetIndexOfCommandId(IDC_CHROME_WHATS_NEW).value(), - true); - } } #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) AddItemWithStringId(IDC_HELP_PAGE_VIA_MENU, help_string_id);
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc index c1a5924..21edbf7 100644 --- a/chrome/browser/ui/ui_features.cc +++ b/chrome/browser/ui/ui_features.cc
@@ -49,13 +49,6 @@ #endif ); -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) -// Enables "new" badge for "Chrome What's New" in Main Chrome Menu | Help. -BASE_FEATURE(kChromeWhatsNewInMainMenuNewBadge, - "ChromeWhatsNewInMainMenuNewBadge", - base::FEATURE_DISABLED_BY_DEFAULT); -#endif - #if !defined(ANDROID) // Enables "Access Code Cast" UI. BASE_FEATURE(kAccessCodeCastUI,
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h index 8eedf77..5233839 100644 --- a/chrome/browser/ui/ui_features.h +++ b/chrome/browser/ui/ui_features.h
@@ -39,10 +39,6 @@ BASE_DECLARE_FEATURE(kChromeWhatsNewUI); -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) -BASE_DECLARE_FEATURE(kChromeWhatsNewInMainMenuNewBadge); -#endif - #if !defined(ANDROID) BASE_DECLARE_FEATURE(kAccessCodeCastUI); #endif
diff --git a/chrome/browser/ui/views/autofill/payments/autofill_error_dialog_view_native_views.cc b/chrome/browser/ui/views/autofill/payments/autofill_error_dialog_view_native_views.cc index f61ccf2..3342ba9 100644 --- a/chrome/browser/ui/views/autofill/payments/autofill_error_dialog_view_native_views.cc +++ b/chrome/browser/ui/views/autofill/payments/autofill_error_dialog_view_native_views.cc
@@ -75,7 +75,7 @@ auto* label = AddChildView(std::make_unique<views::Label>( controller_->GetDescription(), - ChromeTextContext::CONTEXT_DIALOG_BODY_TEXT_SMALL, STYLE_RED)); + ChromeTextContext::CONTEXT_DIALOG_BODY_TEXT_SMALL)); label->SetHorizontalAlignment(gfx::ALIGN_LEFT); label->SetMultiLine(true); return this;
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc index 0a2256ad..406c7da 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc +++ b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc
@@ -7,8 +7,11 @@ #include <memory> #include "base/functional/bind.h" +#include "base/i18n/case_conversion.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/color/chrome_color_id.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" +#include "chrome/browser/ui/views/chrome_typography.h" #include "chrome/browser/ui/views/extensions/extensions_menu_navigation_handler.h" #include "chrome/grit/generated_resources.h" #include "components/url_formatter/elide_url.h" @@ -38,6 +41,48 @@ } // namespace +class RequestsAccessSection : public views::BoxLayoutView { + public: + RequestsAccessSection(); + RequestsAccessSection(const RequestsAccessSection&) = delete; + const RequestsAccessSection& operator=(const RequestsAccessSection&) = delete; + ~RequestsAccessSection() override = default; + + private: + raw_ptr<views::View> extension_items_; +}; + +BEGIN_VIEW_BUILDER(/* No Export */, RequestsAccessSection, views::BoxLayoutView) +END_VIEW_BUILDER + +DEFINE_VIEW_BUILDER(/* No Export */, RequestsAccessSection) + +RequestsAccessSection::RequestsAccessSection() { + views::Builder<RequestsAccessSection>(this) + .SetOrientation(views::BoxLayout::Orientation::kVertical) + .SetVisible(false) + // TODO(crbug.com/1390952): After adding margins, compute radius from a + // variable or create a const variable. + .SetBackground(views::CreateThemedRoundedRectBackground( + kColorExtensionsMenuHighlightedBackground, 4)) + .AddChildren( + // Header explaining the section. + views::Builder<views::Label>() + .SetText(l10n_util::GetStringUTF16( + IDS_EXTENSIONS_MENU_REQUESTS_ACCESS_SECTION_TITLE)) + .SetTextContext(ChromeTextContext::CONTEXT_DIALOG_BODY_TEXT_SMALL) + .SetTextStyle(views::style::STYLE_EMPHASIZED) + .SetHorizontalAlignment(gfx::ALIGN_LEFT), + // Empty container for the extensions requesting access. Items will be + // populated later. + views::Builder<views::BoxLayoutView>() + .SetOrientation(views::BoxLayout::Orientation::kVertical) + .CopyAddressTo(&extension_items_)) + .BuildChildren(); + // TODO(crbug.com/1390952): Populate `extension_items_` with extensions + // requesting access. +} + ExtensionsMenuMainPageView::ExtensionsMenuMainPageView( Browser* browser, ExtensionsMenuNavigationHandler* navigation_handler) @@ -54,9 +99,11 @@ // TODO(crbug.com/1390952): Add margins after adding the menu // items, to make sure all items are aligned. .AddChildren( + // Subheader. views::Builder<views::FlexLayoutView>() .SetCrossAxisAlignment(views::LayoutAlignment::kStart) .SetProperty(views::kFlexBehaviorKey, stretch_specification) + .SetVisible(true) .AddChildren( views::Builder<views::FlexLayoutView>() .SetOrientation(views::LayoutOrientation::kVertical) @@ -85,7 +132,10 @@ views::BubbleFrameView::CreateCloseButton( base::BindRepeating( &ExtensionsMenuNavigationHandler::CloseBubble, - base::Unretained(navigation_handler_)))))) + base::Unretained(navigation_handler_))))), + // Request access section. + views::Builder<RequestsAccessSection>( + std::make_unique<RequestsAccessSection>())) .BuildChildren(); browser_->tab_strip_model()->AddObserver(this);
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 978b9cb..a11cca5 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -251,6 +251,7 @@ #include "ui/views/views_features.h" #include "ui/views/widget/native_widget.h" #include "ui/views/widget/root_view.h" +#include "ui/views/widget/sublevel_manager.h" #include "ui/views/widget/widget.h" #include "ui/views/window/dialog_delegate.h" @@ -3502,6 +3503,15 @@ overlay_widget_->Init(std::move(params)); overlay_widget_->SetNativeWindowProperty(kBrowserViewKey, this); + // Disable sublevel widget layering because in fullscreen the NSWindow of + // `overlay_widget_` is reparented to a AppKit-owned NSWindow that does not + // have an associated Widget. This will cause issues in sublevel manager + // which operates at the Widget level. + if (overlay_widget_->GetSublevelManager()) { + overlay_widget_->parent()->GetSublevelManager()->UntrackChildWidget( + overlay_widget_); + } + // Create a new TopContainerOverlayView. The tab strip, omnibox, bookmarks // etc. will be contained within this view. Right clicking on the blank space // that is not taken up by the child views should show the context menu. Set
diff --git a/chrome/browser/ui/views/payments/payment_handler_web_flow_view_controller.cc b/chrome/browser/ui/views/payments/payment_handler_web_flow_view_controller.cc index 30a0b8f..3d65640c 100644 --- a/chrome/browser/ui/views/payments/payment_handler_web_flow_view_controller.cc +++ b/chrome/browser/ui/views/payments/payment_handler_web_flow_view_controller.cc
@@ -47,6 +47,7 @@ #include "ui/views/border.h" #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/button/image_button_factory.h" +#include "ui/views/controls/highlight_path_generator.h" #include "ui/views/controls/image_view.h" #include "ui/views/controls/label.h" #include "ui/views/controls/progress_bar.h" @@ -185,6 +186,7 @@ views::Button::PressedCallback pressed_callback) : views::ImageButton(pressed_callback) { ConfigureVectorImageButton(this); + views::InstallCircleHighlightPathGenerator(this); constexpr int kCloseButtonSize = 16; SetSize(gfx::Size(kCloseButtonSize, kCloseButtonSize)); SetFocusBehavior(views::View::FocusBehavior::ALWAYS);
diff --git a/chrome/browser/ui/views/tabs/compound_tab_container.cc b/chrome/browser/ui/views/tabs/compound_tab_container.cc index a40daf90..43e1b74 100644 --- a/chrome/browser/ui/views/tabs/compound_tab_container.cc +++ b/chrome/browser/ui/views/tabs/compound_tab_container.cc
@@ -22,6 +22,7 @@ #include "ui/base/models/list_selection_model.h" #include "ui/gfx/geometry/rect_conversions.h" #include "ui/views/layout/layout_types.h" +#include "ui/views/rect_based_targeting_utils.h" #include "ui/views/view.h" #include "ui/views/view_utils.h" @@ -229,6 +230,8 @@ hover_card_controller_(hover_card_controller), scroll_contents_view_(scroll_contents_view), bounds_animator_(this) { + SetEventTargeter(std::make_unique<views::ViewTargeter>(this)); + if (!gfx::Animation::ShouldRenderRichAnimation()) bounds_animator_.SetAnimationDuration(base::TimeDelta()); } @@ -479,6 +482,9 @@ void CompoundTabContainer::HandleLongTap(ui::GestureEvent* const event) { TabContainer* const tab_container = GetTabContainerAt(event->location()); + if (!tab_container) + return; + ConvertEventToTarget(tab_container, event); tab_container->HandleLongTap(event); } @@ -654,6 +660,14 @@ unpinned_tab_container_->GetPreferredSize()); } +views::View* CompoundTabContainer::GetTooltipHandlerForPoint( + const gfx::Point& point) { + TabContainer* const sub_container = GetTabContainerAt(point); + return sub_container ? sub_container->GetTooltipHandlerForPoint( + ConvertPointToTarget(this, sub_container, point)) + : this; +} + void CompoundTabContainer::Layout() { // Pinned container gets however much space it wants. pinned_tab_container_->SetBoundsRect( @@ -726,7 +740,11 @@ BrowserRootView::DropTarget* CompoundTabContainer::GetDropTarget( gfx::Point loc_in_local_coords) { - return GetTabContainerAt(loc_in_local_coords); + NOTREACHED(); // TODO(1346023): Implement text drag and drop. + + // This might be a starting point for implementation though. + TabContainer* const tab_container = GetTabContainerAt(loc_in_local_coords); + return tab_container ? tab_container : this; } views::View* CompoundTabContainer::GetViewForDrop() { @@ -746,6 +764,22 @@ NOTREACHED(); } +views::View* CompoundTabContainer::TargetForRect(views::View* root, + const gfx::Rect& rect) { + CHECK_EQ(root, this); + + if (!views::UsePointBasedTargeting(rect)) + return views::ViewTargeterDelegate::TargetForRect(root, rect); + + const gfx::Point point(rect.CenterPoint()); + TabContainer* const sub_container = GetTabContainerAt(point); + if (sub_container == nullptr) + return this; + + return sub_container->GetEventHandlerForRect(ToEnclosingRect( + ConvertRectToTarget(this, sub_container, gfx::RectF(rect)))); +} + void CompoundTabContainer::UpdateAnimationTarget(TabSlotView* tab_slot_view, gfx::Rect target_bounds, TabPinned pinned) { @@ -858,15 +892,27 @@ TabContainer* CompoundTabContainer::GetTabContainerAt( gfx::Point point_in_local_coords) { - if (pinned_tab_container_->bounds().Contains(point_in_local_coords)) - return base::to_address(pinned_tab_container_); - if (unpinned_tab_container_->bounds().Contains(point_in_local_coords)) + const bool in_pinned = + pinned_tab_container_->bounds().Contains(point_in_local_coords); + const bool in_unpinned = + unpinned_tab_container_->bounds().Contains(point_in_local_coords); + + if (in_pinned && in_unpinned) { + const int cutoff_x = (pinned_tab_container_->bounds().right() + + unpinned_tab_container_->bounds().x()) / + 2; + if (point_in_local_coords.x() < cutoff_x) + return base::to_address(pinned_tab_container_); return base::to_address(unpinned_tab_container_); - NOTREACHED() << "point_in_local_coords " << point_in_local_coords.ToString() - << " is not in pinned at: " - << pinned_tab_container_->bounds().ToString() - << " or unpinned at: " - << unpinned_tab_container_->bounds().ToString(); + } + + if (in_pinned) + return base::to_address(pinned_tab_container_); + if (in_unpinned) + return base::to_address(unpinned_tab_container_); + + // `point_in_local_coords` might be in neither sub container if our layout is + // (transiently) stale, e.g. during window creation. return nullptr; }
diff --git a/chrome/browser/ui/views/tabs/compound_tab_container.h b/chrome/browser/ui/views/tabs/compound_tab_container.h index 77dd60d..983cb81 100644 --- a/chrome/browser/ui/views/tabs/compound_tab_container.h +++ b/chrome/browser/ui/views/tabs/compound_tab_container.h
@@ -11,6 +11,7 @@ #include "chrome/browser/ui/views/tabs/tab_container_controller.h" #include "ui/base/metadata/metadata_header_macros.h" #include "ui/gfx/geometry/point.h" +#include "ui/views/view_targeter_delegate.h" class TabHoverCardController; class TabDragContextBase; @@ -19,7 +20,8 @@ // and the unpinned tabs in the other. // Indices in the public and private API are all in overall indices, unless // specifically noted otherwise as being relative to a specific container. -class CompoundTabContainer : public TabContainer { +class CompoundTabContainer : public TabContainer, + public views::ViewTargeterDelegate { public: METADATA_HEADER(CompoundTabContainer); @@ -101,6 +103,7 @@ gfx::Size GetMinimumSize() const override; views::SizeBounds GetAvailableSize(const View* child) const override; gfx::Size CalculatePreferredSize() const override; + views::View* GetTooltipHandlerForPoint(const gfx::Point& point) override; void Layout() override; void PaintChildren(const views::PaintInfo& paint_info) override; void ChildPreferredSizeChanged(views::View* child) override; @@ -115,6 +118,9 @@ const absl::optional<BrowserRootView::DropIndex>& index) override; void HandleDragExited() override; + // views::ViewTargeterDelegate: + views::View* TargetForRect(views::View* root, const gfx::Rect& rect) override; + // Notifies this CompoundTabContainer that `tab_slot_view` must be animated to // `target_bounds`. `pinned` indicates whether these bounds are relative to // `pinned_tab_container_` or `unpinned_tab_container_`.
diff --git a/chrome/browser/ui/views/tabs/compound_tab_container_unittest.cc b/chrome/browser/ui/views/tabs/compound_tab_container_unittest.cc index da6752a..15687f7d 100644 --- a/chrome/browser/ui/views/tabs/compound_tab_container_unittest.cc +++ b/chrome/browser/ui/views/tabs/compound_tab_container_unittest.cc
@@ -577,3 +577,54 @@ tab_container_->GetAvailableSize(unpinned_container).width().value(), tab_container_->width() - pinned_container->GetPreferredSize().width()); } + +TEST_F(CompoundTabContainerTest, GetEventAndTooltipHandlerForOverlappingArea) { + Tab* const pinned_tab = AddTab(0, TabPinned::kPinned); + views::View* const pinned_container = pinned_tab->parent(); + Tab* const unpinned_tab = AddTab(1, TabPinned::kUnpinned); + views::View* const unpinned_container = unpinned_tab->parent(); + tab_container_->CompleteAnimationAndLayout(); + + // Points squarely in each tab should be handled by the tab. + EXPECT_EQ(pinned_tab, tab_container_->GetEventHandlerForPoint( + pinned_container->bounds().CenterPoint())); + LOG(ERROR) << tab_container_ + ->GetEventHandlerForPoint( + pinned_container->bounds().CenterPoint()) + ->GetClassName(); + EXPECT_EQ(pinned_tab, tab_container_->GetTooltipHandlerForPoint( + pinned_container->bounds().CenterPoint())); + EXPECT_EQ(unpinned_tab, tab_container_->GetEventHandlerForPoint( + unpinned_container->bounds().CenterPoint())); + EXPECT_EQ(unpinned_tab, tab_container_->GetTooltipHandlerForPoint( + unpinned_container->bounds().CenterPoint())); + + auto averagePoint = [](gfx::Point point, gfx::Point other) { + return gfx::Point((point.x() + other.x()) / 2, (point.y() + other.y()) / 2); + }; + + const gfx::Point pinned_container_right = + pinned_container->bounds().right_center(); + const gfx::Point unpinned_container_left = + unpinned_container->bounds().left_center(); + const gfx::Point center = + averagePoint(pinned_container_right, unpinned_container_left); + + // A point in the overlap area, but left of the tab divider between the two + // containers, should go to the pinned container. + const gfx::Point pinned_overlap_test_point = + averagePoint(center, unpinned_container_left); + EXPECT_EQ(pinned_tab, + tab_container_->GetEventHandlerForPoint(pinned_overlap_test_point)); + EXPECT_EQ(pinned_tab, tab_container_->GetTooltipHandlerForPoint( + pinned_overlap_test_point)); + + // A point in the overlap area, but right of the tab divider between the two + // containers, should go to the unpinned container. + const gfx::Point unpinned_overlap_test_point = + averagePoint(center, pinned_container_right); + EXPECT_EQ(unpinned_tab, tab_container_->GetEventHandlerForPoint( + unpinned_overlap_test_point)); + EXPECT_EQ(unpinned_tab, tab_container_->GetTooltipHandlerForPoint( + unpinned_overlap_test_point)); +}
diff --git a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc index 0e435215..5e063d8 100644 --- a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc +++ b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
@@ -6,8 +6,8 @@ #include <utility> -#include "base/callback.h" -#include "base/callback_helpers.h" +#include "base/functional/callback.h" +#include "base/functional/callback_helpers.h" #include "base/task/single_thread_task_runner.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -102,11 +102,16 @@ // In this case we clean up the OsSettings entry. web_app::OsHooksOptions options; options[OsHookType::kUninstallationViaOsSettings] = true; - provider->os_integration_manager().UninstallOsHooks( - app_id, options, - base::BindOnce([](std::unique_ptr<ScopedKeepAlive> scoped_keep_alive, - OsHooksErrors os_hooks_errors) {}, - std::move(scoped_keep_alive))); + + auto synchronize_barrier = + web_app::OsIntegrationManager::GetBarrierForSynchronize(base::BindOnce( + [](std::unique_ptr<ScopedKeepAlive> scoped_keep_alive, + OsHooksErrors os_hooks_errors) {}, + std::move(scoped_keep_alive))); + provider->os_integration_manager().UninstallOsHooks(app_id, options, + synchronize_barrier); + provider->os_integration_manager().Synchronize( + app_id, base::BindOnce(synchronize_barrier, OsHooksErrors())); } } @@ -346,6 +351,7 @@ options.os_hooks[OsHookType::kRunOnOsLogin] = locations.in_startup; os_integration_manager_->InstallOsHooks(app_id, base::DoNothing(), nullptr, options); + os_integration_manager_->Synchronize(app_id, base::DoNothing()); } bool WebAppUiManagerImpl::CanAddAppToQuickLaunchBar() const {
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index 15a333b..b0c7874 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -152,6 +152,7 @@ #include "chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h" #include "chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_ui.h" #include "chrome/browser/ui/webui/ntp/new_tab_ui.h" +#include "chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.h" #include "chrome/browser/ui/webui/page_not_available_for_guest/page_not_available_for_guest_ui.h" #include "chrome/browser/ui/webui/password_manager/password_manager_ui.h" #include "chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.h" @@ -172,6 +173,7 @@ #include "chrome/browser/ui/webui/webui_gallery/webui_gallery_ui.h" #include "chrome/browser/ui/webui/whats_new/whats_new_ui.h" #include "chrome/browser/web_applications/web_app_provider.h" +#include "components/omnibox/common/omnibox_features.h" #include "components/password_manager/core/common/password_manager_features.h" #include "media/base/media_switches.h" #endif // BUILDFLAG(IS_ANDROID) @@ -1124,6 +1126,10 @@ base::FeatureList::IsEnabled(features::kChromeWhatsNewUI)) { return &NewWebUI<WhatsNewUI>; } + if (url.host_piece() == chrome::kChromeUIOmniboxPopupHost && + base::FeatureList::IsEnabled(omnibox::kWebUIOmniboxPopup)) { + return &NewWebUI<OmniboxPopupUI>; + } if (url.host_piece() == chrome::kChromeUIMediaRouterInternalsHost && media_router::MediaRouterEnabled(profile)) { return &NewWebUI<media_router::MediaRouterInternalsUI>;
diff --git a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc index 78ce2c9..2ddb1036 100644 --- a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc +++ b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
@@ -11,7 +11,6 @@ #include "base/auto_reset.h" #include "base/bind.h" -#include "base/callback_helpers.h" #include "base/command_line.h" #include "base/containers/contains.h" #include "base/feature_list.h" @@ -55,6 +54,7 @@ #include "chrome/browser/ui/webui/ntp/new_tab_ui.h" #include "chrome/browser/web_applications/extension_status_utils.h" #include "chrome/browser/web_applications/extensions/bookmark_app_util.h" +#include "chrome/browser/web_applications/os_integration/os_integration_manager.h" #include "chrome/browser/web_applications/user_display_mode.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app_command_scheduler.h" @@ -1359,6 +1359,8 @@ // use that to compare with the results, and record if they all were // successful, instead of just shortcuts. bool error = os_hooks_errors[web_app::OsHookType::kShortcuts]; + // TODO(b/260863656): Move the metric measurement to + // ShortcutHandlingSubManager::Execute() base::UmaHistogramBoolean("Apps.Launcher.InstallLocallyShortcutsCreated", !error); web_app_provider_->install_manager().NotifyWebAppInstalledWithOsHooks(app_id); @@ -1460,9 +1462,13 @@ options.os_hooks[web_app::OsHookType::kUrlHandlers] = false; #endif + auto os_hooks_barrier = + web_app::OsIntegrationManager::GetBarrierForSynchronize( + base::BindOnce(&AppLauncherHandler::OnOsHooksInstalled, + weak_ptr_factory_.GetWeakPtr(), app_id)); + web_app_provider_->os_integration_manager().InstallOsHooks( - app_id, - base::BindOnce(&AppLauncherHandler::OnOsHooksInstalled, - weak_ptr_factory_.GetWeakPtr(), app_id), - /*web_app_info=*/nullptr, std::move(options)); + app_id, os_hooks_barrier, /*web_app_info=*/nullptr, std::move(options)); + web_app_provider_->os_integration_manager().Synchronize( + app_id, base::BindOnce(os_hooks_barrier, web_app::OsHooksErrors())); }
diff --git a/chrome/browser/ui/webui/ntp/app_launcher_handler_unittest.cc b/chrome/browser/ui/webui/ntp/app_launcher_handler_unittest.cc index ffd05d9..4bd03b2 100644 --- a/chrome/browser/ui/webui/ntp/app_launcher_handler_unittest.cc +++ b/chrome/browser/ui/webui/ntp/app_launcher_handler_unittest.cc
@@ -14,8 +14,10 @@ #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/test_extension_system.h" #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" +#include "chrome/browser/web_applications/test/web_app_test_utils.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/browser/web_applications/web_app_sync_bridge.h" +#include "chrome/common/chrome_features.h" #include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/testing_profile.h" #include "content/public/browser/web_contents.h" @@ -26,8 +28,9 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -using web_app::AppId; -using web_app::WebAppProvider; +using OsIntegrationSubManagersState = web_app::OsIntegrationSubManagersState; +using AppId = web_app::AppId; +using WebAppProvider = web_app::WebAppProvider; namespace { @@ -78,9 +81,20 @@ } // namespace -class AppLauncherHandlerTest : public BrowserWithTestWindowTest { +class AppLauncherHandlerTest + : public BrowserWithTestWindowTest, + public ::testing::WithParamInterface<OsIntegrationSubManagersState> { public: - AppLauncherHandlerTest() = default; + AppLauncherHandlerTest() { + if (GetParam() == OsIntegrationSubManagersState::kEnabled) { + scoped_feature_list_.InitWithFeaturesAndParameters( + {{features::kOsIntegrationSubManagers, {{"stage", "write_config"}}}}, + /*disabled_features=*/{}); + } else { + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/{}, {features::kOsIntegrationSubManagers}); + } + } AppLauncherHandlerTest(const AppLauncherHandlerTest&) = delete; AppLauncherHandlerTest& operator=(const AppLauncherHandlerTest&) = delete; @@ -166,11 +180,12 @@ web_app::OsIntegrationManager::ScopedSuppressForTesting os_hooks_suppress_; raw_ptr<extensions::ExtensionService> extension_service_; + base::test::ScopedFeatureList scoped_feature_list_; }; // Tests that AppLauncherHandler::HandleInstallAppLocally calls the JS method // "ntp.appAdded" for the locally installed app. -TEST_F(AppLauncherHandlerTest, HandleInstallAppLocally) { +TEST_P(AppLauncherHandlerTest, HandleInstallAppLocally) { AppId installed_app_id = InstallWebApp(/*is_locally_installed=*/false); // Initialize the web_ui instance. @@ -196,7 +211,7 @@ // Tests that AppLauncherHandler::HandleInstallAppLocally calls the JS method // "ntp.appAdded" for the all the running instances of chrome://apps page. -TEST_F(AppLauncherHandlerTest, HandleInstallAppLocally_MultipleWebUI) { +TEST_P(AppLauncherHandlerTest, HandleInstallAppLocally_MultipleWebUI) { AppId installed_app_id = InstallWebApp(/*is_locally_installed=*/false); // Initialize the first web_ui instance. @@ -234,7 +249,7 @@ } // Regression test for crbug.com/1302157. -TEST_F(AppLauncherHandlerTest, HandleClosedWhileUninstallingExtension) { +TEST_P(AppLauncherHandlerTest, HandleClosedWhileUninstallingExtension) { scoped_refptr<const extensions::Extension> extension = extensions::ExtensionBuilder("foo").Build(); extension_service_->AddExtension(extension.get()); @@ -254,3 +269,17 @@ app_launcher_handler.reset(); // No crash (in asan tester) indicates a passing score. } + +INSTANTIATE_TEST_SUITE_P( + All, + AppLauncherHandlerTest, + ::testing::Values(OsIntegrationSubManagersState::kEnabled, + OsIntegrationSubManagersState::kDisabled), + [](const ::testing::TestParamInfo<OsIntegrationSubManagersState>& info) { + switch (info.param) { + case OsIntegrationSubManagersState::kEnabled: + return "OSIntegrationSubManagers_Enabled"; + case OsIntegrationSubManagersState::kDisabled: + return "OSIntegrationSubManagers_Disabled"; + } + });
diff --git a/chrome/browser/ui/webui/omnibox/BUILD.gn b/chrome/browser/ui/webui/omnibox/BUILD.gn index 3da78562..d3fec2c 100644 --- a/chrome/browser/ui/webui/omnibox/BUILD.gn +++ b/chrome/browser/ui/webui/omnibox/BUILD.gn
@@ -7,4 +7,5 @@ mojom("mojo_bindings") { sources = [ "omnibox.mojom" ] webui_module_path = "/chrome/browser/ui/webui/omnibox" + use_typescript_sources = true }
diff --git a/chrome/browser/ui/webui/omnibox_popup/DIR_METADATA b/chrome/browser/ui/webui/omnibox_popup/DIR_METADATA new file mode 100644 index 0000000..7a9dec1 --- /dev/null +++ b/chrome/browser/ui/webui/omnibox_popup/DIR_METADATA
@@ -0,0 +1 @@ +mixins: "//components/omnibox/COMMON_METADATA"
diff --git a/chrome/browser/ui/webui/omnibox_popup/OWNERS b/chrome/browser/ui/webui/omnibox_popup/OWNERS new file mode 100644 index 0000000..5535cd2 --- /dev/null +++ b/chrome/browser/ui/webui/omnibox_popup/OWNERS
@@ -0,0 +1 @@ +file://components/omnibox/OWNERS
diff --git a/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.cc b/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.cc new file mode 100644 index 0000000..6ff1e0fd --- /dev/null +++ b/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.cc
@@ -0,0 +1,30 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.h" + +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/webui/webui_util.h" +#include "chrome/common/webui_url_constants.h" +#include "chrome/grit/omnibox_popup_resources.h" +#include "chrome/grit/omnibox_popup_resources_map.h" +#include "content/public/browser/web_ui_data_source.h" + +OmniboxPopupUI::OmniboxPopupUI(content::WebUI* web_ui) + : ui::MojoWebUIController(web_ui, /*enable_chrome_send=*/true) { + content::WebUIDataSource* source = + content::WebUIDataSource::Create(chrome::kChromeUIOmniboxPopupHost); + + webui::SetupWebUIDataSource( + source, + base::make_span(kOmniboxPopupResources, kOmniboxPopupResourcesSize), + IDR_OMNIBOX_POPUP_OMNIBOX_POPUP_HTML); + webui::EnableTrustedTypesCSP(source); + + content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source); +} + +OmniboxPopupUI::~OmniboxPopupUI() = default; + +WEB_UI_CONTROLLER_TYPE_IMPL(OmniboxPopupUI)
diff --git a/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.h b/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.h new file mode 100644 index 0000000..053d7cd --- /dev/null +++ b/chrome/browser/ui/webui/omnibox_popup/omnibox_popup_ui.h
@@ -0,0 +1,23 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_WEBUI_OMNIBOX_POPUP_OMNIBOX_POPUP_UI_H_ +#define CHROME_BROWSER_UI_WEBUI_OMNIBOX_POPUP_OMNIBOX_POPUP_UI_H_ + +#include "build/build_config.h" +#include "ui/webui/mojo_web_ui_controller.h" + +// The Web UI controller for the chrome://omnibox-popup.top-chrome. +class OmniboxPopupUI : public ui::MojoWebUIController { + public: + explicit OmniboxPopupUI(content::WebUI* web_ui); + OmniboxPopupUI(const OmniboxPopupUI&) = delete; + OmniboxPopupUI& operator=(const OmniboxPopupUI&) = delete; + ~OmniboxPopupUI() override; + + private: + WEB_UI_CONTROLLER_TYPE_DECL(); +}; + +#endif // CHROME_BROWSER_UI_WEBUI_OMNIBOX_POPUP_OMNIBOX_POPUP_UI_H_
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc index 9f3c910..94e58569 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -339,8 +339,6 @@ base::Value::Dict pdf_strings; pdf_extension_util::AddStrings( pdf_extension_util::PdfViewerContext::kPrintPreview, &pdf_strings); - pdf_extension_util::AddAdditionalData(/*enable_annotations=*/false, - &pdf_strings); source->AddLocalizedStrings(pdf_strings); }
diff --git a/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc b/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc index 2dca661..daccef3 100644 --- a/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc
@@ -58,8 +58,7 @@ void SetUp() override { EXPECT_TRUE(test_web_ui_.call_data().empty()); - base::ListValue args; - handler()->HandleInitialize(args.GetList()); + handler()->HandleInitialize(base::Value::List()); EXPECT_TRUE(handler()->IsJavascriptAllowed()); VerifyAutoOpenDownloadsChangedCallback(); test_web_ui_.ClearTrackedCalls();
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index 9811b9d3..043354f 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -1991,14 +1991,6 @@ {"topicsPageTitle", IDS_SETTINGS_TOPICS_PAGE_TITLE}, {"topicsPageToggleLabel", IDS_SETTINGS_TOPICS_PAGE_TOGGLE_LABEL}, {"topicsPageToggleSubLabel", IDS_SETTINGS_TOPICS_PAGE_TOGGLE_SUB_LABEL}, - {"topicsPageCurrentTopicsHeading", - IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_HEADING}, - {"topicsPageCurrentTopicsDescription", - IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_DESCRIPTION}, - {"topicsPageCurrentTopicsDescriptionDisabled", - IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_DESCRIPTION_DISABLED}, - {"topicsPageCurrentTopicsDescriptionEmpty", - IDS_SETTINGS_TOPICS_PAGE_CURRENT_TOPICS_DESCRIPTION_EMPTY}, {"fledgePageTitle", IDS_SETTINGS_FLEDGE_PAGE_TITLE}, {"adMeasurementPageTitle", IDS_SETTINGS_AD_MEASUREMENT_PAGE_TITLE}, {"adMeasurementPageToggleLabel",
diff --git a/chrome/browser/ui/webui/settings/site_settings_helper.cc b/chrome/browser/ui/webui/settings/site_settings_helper.cc index f73d0fc..2fcbaaa 100644 --- a/chrome/browser/ui/webui/settings/site_settings_helper.cc +++ b/chrome/browser/ui/webui/settings/site_settings_helper.cc
@@ -175,6 +175,7 @@ // PPAPI_BROKER has been deprecated. The content setting is not used or // called from UI, so we don't need a representation JS string. {ContentSettingsType::DEPRECATED_PPAPI_BROKER, nullptr}, + {ContentSettingsType::REVOKED_UNUSED_SITE_PERMISSIONS, nullptr}, }; static_assert(std::size(kContentSettingsTypeGroupNames) ==
diff --git a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_side_panel_ui.cc b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_side_panel_ui.cc index 96d4b78..8ad8f5c 100644 --- a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_side_panel_ui.cc +++ b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_side_panel_ui.cc
@@ -73,6 +73,8 @@ {"addCurrentTab", IDS_READ_LATER_ADD_CURRENT_TAB}, {"emptyTitle", IDS_BOOKMARKS_EMPTY_STATE_TITLE}, {"emptyBody", IDS_BOOKMARKS_EMPTY_STATE_BODY}, + {"emptyTitleGuest", IDS_BOOKMARKS_EMPTY_STATE_TITLE_GUEST}, + {"emptyBodyGuest", IDS_BOOKMARKS_EMPTY_STATE_BODY_GUEST}, {"searchBookmarks", IDS_BOOKMARK_MANAGER_SEARCH_BUTTON}, {"clearSearch", IDS_BOOKMARK_MANAGER_CLEAR_SEARCH}, {"selectedBookmarkCount", IDS_BOOKMARK_MANAGER_ITEMS_SELECTED}, @@ -92,8 +94,7 @@ source->AddBoolean("unifiedSidePanel", base::FeatureList::IsEnabled(features::kUnifiedSidePanel)); - source->AddBoolean("canModifyBookmarks", !profile->IsGuestSession() && - !profile->IsIncognitoProfile()); + source->AddBoolean("guestMode", profile->IsGuestSession()); bookmarks::BookmarkModel* bookmark_model = BookmarkModelFactory::GetForBrowserContext(profile);
diff --git a/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc b/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc index 20d9cec1..9851a70 100644 --- a/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc +++ b/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc
@@ -91,6 +91,8 @@ {"cancelA11yLabel", IDS_CANCEL}, {"emptyTitle", IDS_BOOKMARKS_EMPTY_STATE_TITLE}, {"emptyBody", IDS_BOOKMARKS_EMPTY_STATE_BODY}, + {"emptyTitleGuest", IDS_BOOKMARKS_EMPTY_STATE_TITLE_GUEST}, + {"emptyBodyGuest", IDS_BOOKMARKS_EMPTY_STATE_BODY_GUEST}, {"searchBookmarks", IDS_BOOKMARK_MANAGER_SEARCH_BUTTON}, {"clearSearch", IDS_BOOKMARK_MANAGER_CLEAR_SEARCH}, {"selectedBookmarkCount", IDS_BOOKMARK_MANAGER_ITEMS_SELECTED}, @@ -124,8 +126,7 @@ source->AddBoolean("unifiedSidePanel", base::FeatureList::IsEnabled(features::kUnifiedSidePanel)); - source->AddBoolean("canModifyBookmarks", !profile->IsGuestSession() && - !profile->IsIncognitoProfile()); + source->AddBoolean("guestMode", profile->IsGuestSession()); source->AddBoolean( "showPowerBookmarks",
diff --git a/chrome/browser/ui/webui/tab_search/BUILD.gn b/chrome/browser/ui/webui/tab_search/BUILD.gn index 48046ed..5d39383f 100644 --- a/chrome/browser/ui/webui/tab_search/BUILD.gn +++ b/chrome/browser/ui/webui/tab_search/BUILD.gn
@@ -15,4 +15,5 @@ "//url/mojom:url_mojom_gurl", ] webui_module_path = "/" + use_typescript_sources = true }
diff --git a/chrome/browser/ui/webui/tab_strip/BUILD.gn b/chrome/browser/ui/webui/tab_strip/BUILD.gn index bede154..2216655 100644 --- a/chrome/browser/ui/webui/tab_strip/BUILD.gn +++ b/chrome/browser/ui/webui/tab_strip/BUILD.gn
@@ -13,6 +13,7 @@ "//url/mojom:url_mojom_gurl", ] webui_module_path = "/" + use_typescript_sources = true cpp_typemaps = [ {
diff --git a/chrome/browser/ui/webui/tabs/BUILD.gn b/chrome/browser/ui/webui/tabs/BUILD.gn index 9c92e28..ca63718 100644 --- a/chrome/browser/ui/webui/tabs/BUILD.gn +++ b/chrome/browser/ui/webui/tabs/BUILD.gn
@@ -8,6 +8,7 @@ sources = [ "tabs.mojom" ] public_deps = [ "//mojo/public/mojom/base" ] webui_module_path = "/" + use_typescript_sources = true cpp_typemaps = [ {
diff --git a/chrome/browser/uid/android/BUILD.gn b/chrome/browser/uid/android/BUILD.gn index d1d5f6b6f..cf140d6 100644 --- a/chrome/browser/uid/android/BUILD.gn +++ b/chrome/browser/uid/android/BUILD.gn
@@ -12,6 +12,7 @@ "java/src/org/chromium/chrome/browser/uid/UuidBasedUniqueIdentificationGenerator.java", ] deps = [ + "//base:base_java", "//chrome/browser/preferences:java", "//chrome/browser/util:java", "//third_party/androidx:androidx_annotation_annotation_java",
diff --git a/chrome/browser/uid/android/java/src/org/chromium/chrome/browser/uid/SettingsSecureBasedIdentificationGenerator.java b/chrome/browser/uid/android/java/src/org/chromium/chrome/browser/uid/SettingsSecureBasedIdentificationGenerator.java index d7c10cd..e3a95d0c 100644 --- a/chrome/browser/uid/android/java/src/org/chromium/chrome/browser/uid/SettingsSecureBasedIdentificationGenerator.java +++ b/chrome/browser/uid/android/java/src/org/chromium/chrome/browser/uid/SettingsSecureBasedIdentificationGenerator.java
@@ -5,12 +5,12 @@ package org.chromium.chrome.browser.uid; import android.annotation.SuppressLint; -import android.content.Context; import android.provider.Settings; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import org.chromium.base.ContextUtils; import org.chromium.chrome.browser.util.HashUtil; /** @@ -19,14 +19,9 @@ */ public class SettingsSecureBasedIdentificationGenerator implements UniqueIdentificationGenerator { public static final String GENERATOR_ID = "SETTINGS_SECURE_ANDROID_ID"; - private final Context mContext; @VisibleForTesting - public SettingsSecureBasedIdentificationGenerator(Context context) { - // Since we do not know the lifetime of the given context, we get the application context - // to ensure it is always possible to use it. - mContext = context.getApplicationContext(); - } + public SettingsSecureBasedIdentificationGenerator() {} @Override public String getUniqueId(@Nullable String salt) { @@ -42,6 +37,7 @@ @SuppressLint("HardwareIds") @VisibleForTesting String getAndroidId() { - return Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.ANDROID_ID); + return Settings.Secure.getString(ContextUtils.getApplicationContext().getContentResolver(), + Settings.Secure.ANDROID_ID); } }
diff --git a/chrome/browser/uid/android/junit/src/org/chromium/chrome/browser/uid/SettingsSecureBasedIdentificationGeneratorTest.java b/chrome/browser/uid/android/junit/src/org/chromium/chrome/browser/uid/SettingsSecureBasedIdentificationGeneratorTest.java index 682aeba6..bf1a9fd 100644 --- a/chrome/browser/uid/android/junit/src/org/chromium/chrome/browser/uid/SettingsSecureBasedIdentificationGeneratorTest.java +++ b/chrome/browser/uid/android/junit/src/org/chromium/chrome/browser/uid/SettingsSecureBasedIdentificationGeneratorTest.java
@@ -6,7 +6,6 @@ import static org.mockito.Mockito.doReturn; -import androidx.test.core.app.ApplicationProvider; import androidx.test.filters.SmallTest; import org.junit.Assert; @@ -31,8 +30,7 @@ @Before public void setUp() { - mGenerator = Mockito.spy(new SettingsSecureBasedIdentificationGenerator( - ApplicationProvider.getApplicationContext())); + mGenerator = Mockito.spy(new SettingsSecureBasedIdentificationGenerator()); } @Test
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn index 8c8b1e4..9c186083 100644 --- a/chrome/browser/web_applications/BUILD.gn +++ b/chrome/browser/web_applications/BUILD.gn
@@ -104,6 +104,8 @@ "os_integration/os_integration_manager.cc", "os_integration/os_integration_manager.h", "os_integration/os_integration_sub_manager.h", + "os_integration/protocol_handling_sub_manager.cc", + "os_integration/protocol_handling_sub_manager.h", "os_integration/shortcut_handling_sub_manager.cc", "os_integration/shortcut_handling_sub_manager.h", "os_integration/url_handler_manager.cc", @@ -577,6 +579,7 @@ "isolated_web_apps/signed_web_bundle_reader_unittest.cc", "isolation_prefs_utils_unittest.cc", "os_integration/os_integration_manager_unittest.cc", + "os_integration/protocol_handling_sub_manager_unittest.cc", "os_integration/web_app_file_handler_manager_unittest.cc", "os_integration/web_app_protocol_handler_manager_unittest.cc", "os_integration/web_app_shortcut_unittest.cc",
diff --git a/chrome/browser/web_applications/commands/run_on_os_login_command.cc b/chrome/browser/web_applications/commands/run_on_os_login_command.cc index 208726a..5f97687 100644 --- a/chrome/browser/web_applications/commands/run_on_os_login_command.cc +++ b/chrome/browser/web_applications/commands/run_on_os_login_command.cc
@@ -8,8 +8,9 @@ #include <memory> #include <string> -#include "base/callback_forward.h" #include "base/containers/flat_set.h" +#include "base/functional/callback_forward.h" +#include "base/functional/callback_helpers.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram_functions.h" #include "chrome/browser/web_applications/commands/web_app_command.h" @@ -155,7 +156,13 @@ } lock_->registrar().NotifyWebAppRunOnOsLoginModeChanged(app_id_, login_mode_.value()); - UpdateRunOnOsLoginModeWithOsIntegration(); + + auto synchronize_barrier = + OsIntegrationManager::GetBarrierForSynchronize(base::BindOnce( + &RunOnOsLoginCommand::OnOsHooksSet, weak_factory_.GetWeakPtr())); + lock_->os_integration_manager().Synchronize( + app_id_, base::BindOnce(synchronize_barrier, OsHooksErrors())); + UpdateRunOnOsLoginModeWithOsIntegration(synchronize_barrier); } void RunOnOsLoginCommand::SyncRunOnOsLoginMode() { @@ -164,10 +171,17 @@ return; } login_mode_ = lock_->registrar().GetAppRunOnOsLoginMode(app_id_).value; - UpdateRunOnOsLoginModeWithOsIntegration(); + + auto synchronize_barrier = + OsIntegrationManager::GetBarrierForSynchronize(base::BindOnce( + &RunOnOsLoginCommand::OnOsHooksSet, weak_factory_.GetWeakPtr())); + lock_->os_integration_manager().Synchronize( + app_id_, base::BindOnce(synchronize_barrier, OsHooksErrors())); + UpdateRunOnOsLoginModeWithOsIntegration(synchronize_barrier); } -void RunOnOsLoginCommand::UpdateRunOnOsLoginModeWithOsIntegration() { +void RunOnOsLoginCommand::UpdateRunOnOsLoginModeWithOsIntegration( + base::RepeatingCallback<void(OsHooksErrors)> os_hooks_callback) { absl::optional<RunOnOsLoginMode> os_integration_state = lock_->registrar().GetExpectedRunOnOsLoginOsIntegrationState(app_id_); @@ -183,18 +197,14 @@ web_app::OsHooksOptions os_hooks; os_hooks[web_app::OsHookType::kRunOnOsLogin] = true; lock_->os_integration_manager().UninstallOsHooks( - app_id_, os_hooks, - base::BindOnce(&RunOnOsLoginCommand::OnOsHooksSet, - weak_factory_.GetWeakPtr())); + app_id_, os_hooks, std::move(os_hooks_callback)); } else { web_app::InstallOsHooksOptions install_options; install_options.os_hooks[web_app::OsHookType::kRunOnOsLogin] = true; install_options.reason = SHORTCUT_CREATION_AUTOMATED; lock_->os_integration_manager().InstallOsHooks( - app_id_, - base::BindOnce(&RunOnOsLoginCommand::OnOsHooksSet, - weak_factory_.GetWeakPtr()), - nullptr, std::move(install_options)); + app_id_, std::move(os_hooks_callback), nullptr, + std::move(install_options)); } }
diff --git a/chrome/browser/web_applications/commands/run_on_os_login_command.h b/chrome/browser/web_applications/commands/run_on_os_login_command.h index e1d118d..1b27d498 100644 --- a/chrome/browser/web_applications/commands/run_on_os_login_command.h +++ b/chrome/browser/web_applications/commands/run_on_os_login_command.h
@@ -8,7 +8,8 @@ #include <memory> #include <string> -#include "base/callback_forward.h" +#include "base/functional/callback_forward.h" +#include "base/functional/callback_helpers.h" #include "chrome/browser/web_applications/commands/web_app_command.h" #include "chrome/browser/web_applications/os_integration/os_integration_manager.h" #include "chrome/browser/web_applications/web_app_constants.h" @@ -72,7 +73,8 @@ // Note that this tries to avoid extra work by no-oping if the current // OS state matches what is calculated to be the desired stated. void SyncRunOnOsLoginMode(); - void UpdateRunOnOsLoginModeWithOsIntegration(); + void UpdateRunOnOsLoginModeWithOsIntegration( + base::RepeatingCallback<void(OsHooksErrors)> os_hooks_callback); void OnOsHooksSet(OsHooksErrors errors); void RecordCompletionState( RunOnOsLoginCommandCompletionState completion_state);
diff --git a/chrome/browser/web_applications/commands/run_on_os_login_command_unittest.cc b/chrome/browser/web_applications/commands/run_on_os_login_command_unittest.cc index 301744b..86c6a80 100644 --- a/chrome/browser/web_applications/commands/run_on_os_login_command_unittest.cc +++ b/chrome/browser/web_applications/commands/run_on_os_login_command_unittest.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/web_applications/commands/run_on_os_login_command.h" +#include "base/feature_list.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" #include "chrome/browser/web_applications/os_integration/os_integration_manager.h" @@ -22,6 +23,7 @@ #include "chrome/browser/web_applications/web_app_registrar.h" #include "chrome/browser/web_applications/web_app_registry_update.h" #include "chrome/browser/web_applications/web_app_sync_bridge.h" +#include "chrome/common/chrome_features.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace web_app { @@ -78,8 +80,22 @@ } // namespace -class RunOnOsLoginCommandTest : public WebAppTest { +class RunOnOsLoginCommandTest + : public WebAppTest, + public ::testing::WithParamInterface<OsIntegrationSubManagersState> { public: + RunOnOsLoginCommandTest() { + if (GetParam() == OsIntegrationSubManagersState::kEnabled) { + scoped_feature_list_.InitWithFeaturesAndParameters( + {{features::kOsIntegrationSubManagers, {{"stage", "write_config"}}}}, + /*disabled_features=*/{}); + } else { + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/{}, {features::kOsIntegrationSubManagers}); + } + } + ~RunOnOsLoginCommandTest() override = default; + void SetUp() override { WebAppTest::SetUp(); provider_ = FakeWebAppProvider::Get(profile()); @@ -113,9 +129,10 @@ private: raw_ptr<FakeOsIntegrationManager> os_integration_manager_; raw_ptr<FakeWebAppProvider> provider_; + base::test::ScopedFeatureList scoped_feature_list_; }; -TEST_F(RunOnOsLoginCommandTest, SetRunOnOsLoginModes) { +TEST_P(RunOnOsLoginCommandTest, SetRunOnOsLoginModes) { auto web_app = test::CreateWebApp(); const AppId app_id = web_app->app_id(); RegisterApp(std::move(web_app)); @@ -167,7 +184,7 @@ os_integration_manager()->num_unregister_run_on_os_login_calls()); } -TEST_F(RunOnOsLoginCommandTest, SyncRunOnOsLoginModes) { +TEST_P(RunOnOsLoginCommandTest, SyncRunOnOsLoginModes) { auto web_app_default = test::CreateWebApp(); auto web_app_default2 = test::CreateWebApp(GURL("https:/default2.example/")); auto web_app_windowed = test::CreateWebApp(GURL("https://windowed.example/")); @@ -279,7 +296,7 @@ .value()); } -TEST_F(RunOnOsLoginCommandTest, RepeatedCallsDoNotCauseRepeatedOSRegistration) { +TEST_P(RunOnOsLoginCommandTest, RepeatedCallsDoNotCauseRepeatedOSRegistration) { auto web_app = test::CreateWebApp(); const AppId app_id = web_app->app_id(); RegisterApp(std::move(web_app)); @@ -301,7 +318,7 @@ EXPECT_EQ(1u, os_integration_manager()->num_register_run_on_os_login_calls()); } -TEST_F(RunOnOsLoginCommandTest, NotRunDoesNotAtemptOSRegistration) { +TEST_P(RunOnOsLoginCommandTest, NotRunDoesNotAtemptOSRegistration) { auto web_app = test::CreateWebApp(); const AppId app_id = web_app->app_id(); RegisterApp(std::move(web_app)); @@ -319,7 +336,7 @@ os_integration_manager()->num_unregister_run_on_os_login_calls()); } -TEST_F(RunOnOsLoginCommandTest, SyncCommandAndUninstallOSHooks) { +TEST_P(RunOnOsLoginCommandTest, SyncCommandAndUninstallOSHooks) { auto web_app = test::CreateWebApp(); const AppId app_id = web_app->app_id(); RegisterApp(std::move(web_app)); @@ -341,7 +358,7 @@ os_integration_manager()->num_unregister_run_on_os_login_calls()); } -TEST_F(RunOnOsLoginCommandTest, AbortOnAppNotLocallyInstalled) { +TEST_P(RunOnOsLoginCommandTest, AbortOnAppNotLocallyInstalled) { base::HistogramTester tester; tester.ExpectBucketCount( @@ -358,7 +375,7 @@ RunOnOsLoginCommandCompletionState::kAppNotLocallyInstalled, 1); } -TEST_F(RunOnOsLoginCommandTest, +TEST_P(RunOnOsLoginCommandTest, AbortCommandOnAlreadyMatchingRunOnOsLoginState) { auto web_app = test::CreateWebApp(); const AppId app_id = web_app->app_id(); @@ -396,7 +413,7 @@ RunOnOsLoginCommandCompletionState::kRunOnOsLoginModeAlreadyMatched, 1); } -TEST_F(RunOnOsLoginCommandTest, AbortCommandOnPolicyBlockedApp) { +TEST_P(RunOnOsLoginCommandTest, AbortCommandOnPolicyBlockedApp) { auto web_app = test::CreateWebApp(GURL("https:/default.example/")); const AppId app_id = web_app->app_id(); RegisterApp(std::move(web_app)); @@ -429,7 +446,7 @@ RunOnOsLoginCommandCompletionState::kNotAllowedByPolicy, 1); } -TEST_F(RunOnOsLoginCommandTest, VerifySetWorksOnAppWithNoStateDefined) { +TEST_P(RunOnOsLoginCommandTest, VerifySetWorksOnAppWithNoStateDefined) { auto web_app = test::CreateWebApp(); const AppId app_id = web_app->app_id(); // Run on OS Login state in the web_app DB is not defined. @@ -461,7 +478,7 @@ os_integration_manager()->num_unregister_run_on_os_login_calls()); } -TEST_F(RunOnOsLoginCommandTest, VerifySyncWorksOnAppWithNoStateDefined) { +TEST_P(RunOnOsLoginCommandTest, VerifySyncWorksOnAppWithNoStateDefined) { auto web_app = test::CreateWebApp(GURL("https:/default.example/")); const AppId app_id = web_app->app_id(); { @@ -491,4 +508,18 @@ os_integration_manager()->num_unregister_run_on_os_login_calls()); } +INSTANTIATE_TEST_SUITE_P( + All, + RunOnOsLoginCommandTest, + ::testing::Values(OsIntegrationSubManagersState::kEnabled, + OsIntegrationSubManagersState::kDisabled), + [](const ::testing::TestParamInfo<OsIntegrationSubManagersState>& info) { + switch (info.param) { + case OsIntegrationSubManagersState::kEnabled: + return "OSIntegrationSubManagers_Enabled"; + case OsIntegrationSubManagersState::kDisabled: + return "OSIntegrationSubManagers_Disabled"; + } + }); + } // namespace web_app
diff --git a/chrome/browser/web_applications/commands/update_protocol_handler_approval_command.cc b/chrome/browser/web_applications/commands/update_protocol_handler_approval_command.cc index da025484..ba71f4e 100644 --- a/chrome/browser/web_applications/commands/update_protocol_handler_approval_command.cc +++ b/chrome/browser/web_applications/commands/update_protocol_handler_approval_command.cc
@@ -10,6 +10,7 @@ #include "base/containers/contains.h" #include "base/functional/bind.h" #include "base/functional/callback.h" +#include "base/functional/callback_helpers.h" #include "base/memory/ptr_util.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/web_applications/locks/app_lock.h" @@ -19,6 +20,7 @@ #include "chrome/browser/web_applications/web_app_registrar.h" #include "chrome/browser/web_applications/web_app_registry_update.h" #include "chrome/browser/web_applications/web_app_sync_bridge.h" +#include "chrome/browser/web_applications/web_app_utils.h" namespace web_app { @@ -84,6 +86,19 @@ // updated. lock_->registrar().NotifyWebAppProtocolSettingsChanged(); + os_integration_manager.Synchronize( + app_id_, + base::BindOnce(&UpdateProtocolHandlerApprovalCommand:: + OnProtocolHandlersSynchronizeComplete, + weak_factory_.GetWeakPtr(), original_protocol_handlers, + std::ref(os_integration_manager))); +} + +void UpdateProtocolHandlerApprovalCommand:: + OnProtocolHandlersSynchronizeComplete( + const std::vector<custom_handlers::ProtocolHandler>& + original_protocol_handlers, + OsIntegrationManager& os_integration_manager) { // OS protocol registration does not need to be updated. if (original_protocol_handlers == os_integration_manager.GetAppProtocolHandlers(app_id_)) {
diff --git a/chrome/browser/web_applications/commands/update_protocol_handler_approval_command.h b/chrome/browser/web_applications/commands/update_protocol_handler_approval_command.h index 2a01a59..5b305e5 100644 --- a/chrome/browser/web_applications/commands/update_protocol_handler_approval_command.h +++ b/chrome/browser/web_applications/commands/update_protocol_handler_approval_command.h
@@ -12,6 +12,7 @@ #include "base/memory/weak_ptr.h" #include "base/values.h" #include "chrome/browser/web_applications/commands/web_app_command.h" +#include "chrome/browser/web_applications/os_integration/os_integration_manager.h" #include "chrome/browser/web_applications/web_app_id.h" namespace web_app { @@ -42,6 +43,10 @@ void OnShutdown() override; private: + void OnProtocolHandlersSynchronizeComplete( + const std::vector<custom_handlers::ProtocolHandler>& + original_protocol_handlers, + OsIntegrationManager& os_integration_manager); void OnProtocolHandlersUpdated(); std::unique_ptr<AppLockDescription> lock_description_;
diff --git a/chrome/browser/web_applications/commands/update_protocol_handler_approval_command_browsertest.cc b/chrome/browser/web_applications/commands/update_protocol_handler_approval_command_browsertest.cc index 5f2f1d3..b5f7980d 100644 --- a/chrome/browser/web_applications/commands/update_protocol_handler_approval_command_browsertest.cc +++ b/chrome/browser/web_applications/commands/update_protocol_handler_approval_command_browsertest.cc
@@ -4,14 +4,17 @@ #include "base/containers/contains.h" #include "base/files/file_util.h" +#include "base/test/scoped_feature_list.h" #include "base/test/test_future.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h" #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" +#include "chrome/browser/web_applications/test/web_app_test_utils.h" #include "chrome/browser/web_applications/web_app_command_scheduler.h" #include "chrome/browser/web_applications/web_app_constants.h" #include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/common/chrome_features.h" #include "components/webapps/browser/installable/installable_metrics.h" #include "content/public/test/browser_test.h" #include "testing/gmock/include/gmock/gmock.h" @@ -27,7 +30,8 @@ const char16_t kAppName[] = u"Test App"; class UpdateProtocolHandlerApprovalCommandTest - : public WebAppControllerBrowserTest { + : public WebAppControllerBrowserTest, + public ::testing::WithParamInterface<OsIntegrationSubManagersState> { public: const GURL kTestAppUrl = GURL("https://example.com"); @@ -44,6 +48,18 @@ WebAppControllerBrowserTest::SetUpOnMainThread(); } + void SetUp() override { + WebAppControllerBrowserTest::SetUp(); + if (EnableOsIntegrationSubManager()) { + scoped_feature_list_.InitAndEnableFeatureWithParameters( + features::kOsIntegrationSubManagers, {{"stage", "write_config"}}); + } else { + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/{}, + /*disabled_features=*/{features::kOsIntegrationSubManagers}); + } + } + void TearDownOnMainThread() override { // Uninstallation of all apps is required for the shortcut override // destruction. @@ -103,12 +119,17 @@ #endif } + bool EnableOsIntegrationSubManager() { + return GetParam() == OsIntegrationSubManagersState::kEnabled; + } + private: + base::test::ScopedFeatureList scoped_feature_list_; std::unique_ptr<ShortcutOverrideForTesting::BlockingRegistration> shortcut_override_; }; -IN_PROC_BROWSER_TEST_F(UpdateProtocolHandlerApprovalCommandTest, Install) { +IN_PROC_BROWSER_TEST_P(UpdateProtocolHandlerApprovalCommandTest, Install) { apps::ProtocolHandlerInfo protocol_handler; const std::string handler_url = std::string(kTestAppUrl.spec()) + "/testing=%s"; @@ -136,7 +157,7 @@ } } -IN_PROC_BROWSER_TEST_F(UpdateProtocolHandlerApprovalCommandTest, +IN_PROC_BROWSER_TEST_P(UpdateProtocolHandlerApprovalCommandTest, ProtocolHandlersRegisteredAndAllowed) { apps::ProtocolHandlerInfo protocol_handler; const std::string handler_url = @@ -172,7 +193,7 @@ } } -IN_PROC_BROWSER_TEST_F(UpdateProtocolHandlerApprovalCommandTest, +IN_PROC_BROWSER_TEST_P(UpdateProtocolHandlerApprovalCommandTest, ProtocolHandlersDisallowed) { apps::ProtocolHandlerInfo protocol_handler; const std::string handler_url = @@ -208,7 +229,7 @@ } } -IN_PROC_BROWSER_TEST_F(UpdateProtocolHandlerApprovalCommandTest, +IN_PROC_BROWSER_TEST_P(UpdateProtocolHandlerApprovalCommandTest, ProtocolHandlersAllowedThenDisallowed) { apps::ProtocolHandlerInfo protocol_handler; const std::string handler_url = @@ -252,7 +273,7 @@ } } -IN_PROC_BROWSER_TEST_F(UpdateProtocolHandlerApprovalCommandTest, +IN_PROC_BROWSER_TEST_P(UpdateProtocolHandlerApprovalCommandTest, ProtocolHandlersDisallowedThenAllowed) { apps::ProtocolHandlerInfo protocol_handler; const std::string handler_url = @@ -298,5 +319,11 @@ } } +INSTANTIATE_TEST_SUITE_P( + All, + UpdateProtocolHandlerApprovalCommandTest, + ::testing::Values(OsIntegrationSubManagersState::kEnabled, + OsIntegrationSubManagersState::kDisabled)); + } // namespace } // namespace web_app
diff --git a/chrome/browser/web_applications/commands/web_app_uninstall_command_unittest.cc b/chrome/browser/web_applications/commands/web_app_uninstall_command_unittest.cc index 94981b7..f0ff6eb 100644 --- a/chrome/browser/web_applications/commands/web_app_uninstall_command_unittest.cc +++ b/chrome/browser/web_applications/commands/web_app_uninstall_command_unittest.cc
@@ -12,6 +12,7 @@ #include "base/test/gmock_callback_support.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" +#include "build/buildflag.h" #include "chrome/browser/web_applications/test/fake_web_app_provider.h" #include "chrome/browser/web_applications/test/mock_file_utils_wrapper.h" #include "chrome/browser/web_applications/test/mock_os_integration_manager.h" @@ -33,6 +34,10 @@ #include "testing/gtest/include/gtest/gtest.h" #include "url/origin.h" +#if BUILDFLAG(IS_WIN) +#include "base/test/gmock_callback_support.h" +#endif + namespace web_app { namespace { @@ -78,6 +83,8 @@ } OsHooksErrors result; + EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_)) + .WillOnce(base::test::RunOnceCallback<1>()); EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_)) .WillOnce(base::test::RunOnceCallback<1>(result)); @@ -111,6 +118,8 @@ } OsHooksErrors result; + EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_)) + .WillOnce(base::test::RunOnceCallback<1>()); EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_)) .WillOnce(base::test::RunOnceCallback<1>(result)); @@ -145,6 +154,8 @@ } OsHooksErrors result; + EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_)) + .WillOnce(base::test::RunOnceCallback<1>()); EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_)) .WillOnce(base::test::RunOnceCallback<1>(result)); @@ -179,6 +190,8 @@ OsHooksErrors result; result.set(true); + EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_)) + .WillOnce(base::test::RunOnceCallback<1>()); EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_)) .WillOnce(base::test::RunOnceCallback<1>(result)); @@ -207,6 +220,8 @@ WebAppManagement::kSync); AppId app_id = web_app->app_id(); + EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_)) + .Times(0); EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_)) .Times(0); @@ -239,6 +254,8 @@ update->CreateApp(std::move(web_app)); } + EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_)) + .Times(0); EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_)) .Times(0); @@ -275,6 +292,8 @@ .DoesAppIdExist(app_id)); OsHooksErrors result; + EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_)) + .WillOnce(base::test::RunOnceCallback<1>()); EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_)) .WillOnce(base::test::RunOnceCallback<1>(result)); @@ -310,6 +329,8 @@ } EXPECT_TRUE(provider()->registrar_unsafe().IsLocallyInstalled(app_id)); OsHooksErrors result; + EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_)) + .WillOnce(base::test::RunOnceCallback<1>()); EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_)) .WillOnce(base::test::RunOnceCallback<1>(result)); @@ -350,6 +371,8 @@ update->CreateApp(std::move(web_app)); } + EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_)) + .Times(0); EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_)) .Times(0); @@ -363,7 +386,7 @@ RegisterWebAppOsUninstallation(app_id, testing::_)) .Times(1); EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_)) - .Times(1); + .WillOnce(base::test::RunOnceCallback<1>()); #else EXPECT_CALL(*os_integration_manager_, RegisterWebAppOsUninstallation(app_id, testing::_)) @@ -423,6 +446,8 @@ } OsHooksErrors result; + EXPECT_CALL(*os_integration_manager_, Synchronize(app_id, testing::_)) + .WillOnce(base::test::RunOnceCallback<1>()); EXPECT_CALL(*os_integration_manager_, UninstallAllOsHooks(app_id, testing::_)) .WillOnce(base::test::RunOnceCallback<1>(result));
diff --git a/chrome/browser/web_applications/extensions/externally_managed_app_install_task_unittest.cc b/chrome/browser/web_applications/extensions/externally_managed_app_install_task_unittest.cc index 9685afb7..574228e3 100644 --- a/chrome/browser/web_applications/extensions/externally_managed_app_install_task_unittest.cc +++ b/chrome/browser/web_applications/extensions/externally_managed_app_install_task_unittest.cc
@@ -271,17 +271,35 @@ class ExternallyManagedAppInstallTaskTest : public ChromeRenderViewHostTestHarness, - public testing::WithParamInterface<bool> { + public testing::WithParamInterface<test::ExternalPrefMigrationTestCases> { public: ExternallyManagedAppInstallTaskTest() { - bool enable_migration = GetParam(); - if (enable_migration) { - scoped_feature_list_.InitWithFeatures( - {features::kUseWebAppDBInsteadOfExternalPrefs}, {}); - } else { - scoped_feature_list_.InitWithFeatures( - {}, {features::kUseWebAppDBInsteadOfExternalPrefs}); + std::vector<base::test::FeatureRef> enabled_features; + std::vector<base::test::FeatureRef> disabled_features; + + switch (GetParam()) { + case test::ExternalPrefMigrationTestCases::kDisableMigrationReadPref: + disabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + disabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; + case test::ExternalPrefMigrationTestCases::kDisableMigrationReadDB: + disabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + enabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; + case test::ExternalPrefMigrationTestCases::kEnableMigrationReadPref: + enabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + disabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; + case test::ExternalPrefMigrationTestCases::kEnableMigrationReadDB: + enabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + enabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; } + scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); } ExternallyManagedAppInstallTaskTest( @@ -991,8 +1009,14 @@ run_loop.Run(); } -INSTANTIATE_TEST_SUITE_P(All, - ExternallyManagedAppInstallTaskTest, - ::testing::Bool()); +INSTANTIATE_TEST_SUITE_P( + All, + ExternallyManagedAppInstallTaskTest, + ::testing::Values( + test::ExternalPrefMigrationTestCases::kDisableMigrationReadPref, + test::ExternalPrefMigrationTestCases::kDisableMigrationReadDB, + test::ExternalPrefMigrationTestCases::kEnableMigrationReadPref, + test::ExternalPrefMigrationTestCases::kEnableMigrationReadDB), + test::GetExternalPrefMigrationTestName); } // namespace web_app
diff --git a/chrome/browser/web_applications/externally_managed_app_manager_impl_browsertest.cc b/chrome/browser/web_applications/externally_managed_app_manager_impl_browsertest.cc index db89e0f..c09b546 100644 --- a/chrome/browser/web_applications/externally_managed_app_manager_impl_browsertest.cc +++ b/chrome/browser/web_applications/externally_managed_app_manager_impl_browsertest.cc
@@ -88,17 +88,35 @@ class ExternallyManagedBrowserTestWithPrefMigrationRead : public ExternallyManagedAppManagerImplBrowserTest, - public testing::WithParamInterface<bool> { + public testing::WithParamInterface<test::ExternalPrefMigrationTestCases> { public: ExternallyManagedBrowserTestWithPrefMigrationRead() { - bool enable_migration = GetParam(); - if (enable_migration) { - scoped_feature_list_.InitWithFeatures( - {features::kUseWebAppDBInsteadOfExternalPrefs}, {}); - } else { - scoped_feature_list_.InitWithFeatures( - {}, {features::kUseWebAppDBInsteadOfExternalPrefs}); + std::vector<base::test::FeatureRef> enabled_features; + std::vector<base::test::FeatureRef> disabled_features; + + switch (GetParam()) { + case test::ExternalPrefMigrationTestCases::kDisableMigrationReadPref: + disabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + disabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; + case test::ExternalPrefMigrationTestCases::kDisableMigrationReadDB: + disabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + enabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; + case test::ExternalPrefMigrationTestCases::kEnableMigrationReadPref: + enabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + disabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; + case test::ExternalPrefMigrationTestCases::kEnableMigrationReadDB: + enabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + enabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; } + scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); } private: @@ -667,9 +685,15 @@ ASSERT_TRUE(registrar().GetAppById(app_id)->IsPolicyInstalledApp()); } -INSTANTIATE_TEST_SUITE_P(All, - ExternallyManagedBrowserTestWithPrefMigrationRead, - ::testing::Bool()); +INSTANTIATE_TEST_SUITE_P( + All, + ExternallyManagedBrowserTestWithPrefMigrationRead, + ::testing::Values( + test::ExternalPrefMigrationTestCases::kDisableMigrationReadPref, + test::ExternalPrefMigrationTestCases::kDisableMigrationReadDB, + test::ExternalPrefMigrationTestCases::kEnableMigrationReadPref, + test::ExternalPrefMigrationTestCases::kEnableMigrationReadDB), + test::GetExternalPrefMigrationTestName); class ExternallyManagedAppManagerImplBrowserTestShortcut : public ExternallyManagedAppManagerImplBrowserTest,
diff --git a/chrome/browser/web_applications/externally_managed_app_manager_impl_unittest.cc b/chrome/browser/web_applications/externally_managed_app_manager_impl_unittest.cc index a534356..596ca26 100644 --- a/chrome/browser/web_applications/externally_managed_app_manager_impl_unittest.cc +++ b/chrome/browser/web_applications/externally_managed_app_manager_impl_unittest.cc
@@ -408,17 +408,35 @@ class ExternallyManagedAppManagerImplTest : public WebAppTest, - public testing::WithParamInterface<bool> { + public testing::WithParamInterface<test::ExternalPrefMigrationTestCases> { public: ExternallyManagedAppManagerImplTest() { - bool enable_migration = GetParam(); - if (enable_migration) { - scoped_feature_list_.InitWithFeatures( - {features::kUseWebAppDBInsteadOfExternalPrefs}, {}); - } else { - scoped_feature_list_.InitWithFeatures( - {}, {features::kUseWebAppDBInsteadOfExternalPrefs}); + std::vector<base::test::FeatureRef> enabled_features; + std::vector<base::test::FeatureRef> disabled_features; + + switch (GetParam()) { + case test::ExternalPrefMigrationTestCases::kDisableMigrationReadPref: + disabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + disabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; + case test::ExternalPrefMigrationTestCases::kDisableMigrationReadDB: + disabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + enabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; + case test::ExternalPrefMigrationTestCases::kEnableMigrationReadPref: + enabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + disabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; + case test::ExternalPrefMigrationTestCases::kEnableMigrationReadDB: + enabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + enabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; } + scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); } ExternallyManagedAppManagerImplTest( @@ -1733,8 +1751,14 @@ } } -INSTANTIATE_TEST_SUITE_P(All, - ExternallyManagedAppManagerImplTest, - ::testing::Bool()); +INSTANTIATE_TEST_SUITE_P( + All, + ExternallyManagedAppManagerImplTest, + ::testing::Values( + test::ExternalPrefMigrationTestCases::kDisableMigrationReadPref, + test::ExternalPrefMigrationTestCases::kDisableMigrationReadDB, + test::ExternalPrefMigrationTestCases::kEnableMigrationReadPref, + test::ExternalPrefMigrationTestCases::kEnableMigrationReadDB), + test::GetExternalPrefMigrationTestName); } // namespace web_app
diff --git a/chrome/browser/web_applications/externally_managed_app_manager_unittest.cc b/chrome/browser/web_applications/externally_managed_app_manager_unittest.cc index 31429c3..9388020e 100644 --- a/chrome/browser/web_applications/externally_managed_app_manager_unittest.cc +++ b/chrome/browser/web_applications/externally_managed_app_manager_unittest.cc
@@ -34,17 +34,35 @@ class ExternallyManagedAppManagerTest : public WebAppTest, - public testing::WithParamInterface<bool> { + public testing::WithParamInterface<test::ExternalPrefMigrationTestCases> { public: ExternallyManagedAppManagerTest() { - bool enable_migration = GetParam(); - if (enable_migration) { - scoped_feature_list_.InitWithFeatures( - {features::kUseWebAppDBInsteadOfExternalPrefs}, {}); - } else { - scoped_feature_list_.InitWithFeatures( - {}, {features::kUseWebAppDBInsteadOfExternalPrefs}); + std::vector<base::test::FeatureRef> enabled_features; + std::vector<base::test::FeatureRef> disabled_features; + + switch (GetParam()) { + case test::ExternalPrefMigrationTestCases::kDisableMigrationReadPref: + disabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + disabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; + case test::ExternalPrefMigrationTestCases::kDisableMigrationReadDB: + disabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + enabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; + case test::ExternalPrefMigrationTestCases::kEnableMigrationReadPref: + enabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + disabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; + case test::ExternalPrefMigrationTestCases::kEnableMigrationReadDB: + enabled_features.push_back(features::kMigrateExternalPrefsToWebAppDB); + enabled_features.push_back( + features::kUseWebAppDBInsteadOfExternalPrefs); + break; } + scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); } protected: @@ -308,14 +326,26 @@ std::vector<GURL>{android_sms_url1, android_sms_url2}); } -INSTANTIATE_TEST_SUITE_P(All, - ExternallyManagedAppManagerTestAndroidSMS, - ::testing::Values(false)); +INSTANTIATE_TEST_SUITE_P( + All, + ExternallyManagedAppManagerTestAndroidSMS, + ::testing::Values( + test::ExternalPrefMigrationTestCases::kDisableMigrationReadPref, + test::ExternalPrefMigrationTestCases::kDisableMigrationReadDB, + test::ExternalPrefMigrationTestCases::kEnableMigrationReadPref, + test::ExternalPrefMigrationTestCases::kEnableMigrationReadDB), + test::GetExternalPrefMigrationTestName); #endif -INSTANTIATE_TEST_SUITE_P(All, - ExternallyManagedAppManagerTest, - ::testing::Bool()); +INSTANTIATE_TEST_SUITE_P( + All, + ExternallyManagedAppManagerTest, + ::testing::Values( + test::ExternalPrefMigrationTestCases::kDisableMigrationReadPref, + test::ExternalPrefMigrationTestCases::kDisableMigrationReadDB, + test::ExternalPrefMigrationTestCases::kEnableMigrationReadPref, + test::ExternalPrefMigrationTestCases::kEnableMigrationReadDB), + test::GetExternalPrefMigrationTestName); } // namespace web_app
diff --git a/chrome/browser/web_applications/os_integration/os_integration_manager.cc b/chrome/browser/web_applications/os_integration/os_integration_manager.cc index 70841ac..751fcd82 100644 --- a/chrome/browser/web_applications/os_integration/os_integration_manager.cc +++ b/chrome/browser/web_applications/os_integration/os_integration_manager.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/auto_reset.h" +#include "base/barrier_callback.h" #include "base/barrier_closure.h" #include "base/callback.h" #include "base/callback_helpers.h" @@ -25,6 +26,7 @@ #include "build/chromeos_buildflags.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/os_integration/os_integration_sub_manager.h" +#include "chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.h" #include "chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.h" #include "chrome/browser/web_applications/os_integration/web_app_shortcut.h" #include "chrome/browser/web_applications/os_integration/web_app_uninstallation_via_os_settings_registration.h" @@ -65,6 +67,15 @@ features::OsIntegrationSubManagersStage::kExecuteAndWriteConfig); } +OsHooksErrors GetFinalErrorBitsetFromCollection( + std::vector<OsHooksErrors> os_hooks_errors) { + OsHooksErrors final_errors; + for (const OsHooksErrors& error : os_hooks_errors) { + final_errors = final_errors | error; + } + return final_errors; +} + } // namespace OsIntegrationManager::ScopedSuppressForTesting::ScopedSuppressForTesting() @@ -99,12 +110,6 @@ return base::BindOnce(&OsHooksBarrier::AddResult, this, type); } - base::OnceClosure CreateBarrierCallbackForSynchronize( - base::OnceClosure synchronize_callback) { - return base::BindOnce(&OsHooksBarrier::WaitForSynchronize, this, - std::move(synchronize_callback)); - } - private: friend class base::RefCounted<OsHooksBarrier>; @@ -119,11 +124,6 @@ errors_[type] = result == Result::kError ? true : false; } - void WaitForSynchronize(base::OnceClosure synchronize_callback) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - std::move(synchronize_callback).Run(); - } - OsHooksErrors errors_; InstallOsHooksCallback callback_; }; @@ -134,12 +134,6 @@ InstallOsHooksOptions& InstallOsHooksOptions::operator=( const InstallOsHooksOptions& other) = default; -void OsIntegrationManager::SetSynchronizeCompleteCallbackForTesting( - base::OnceClosure synchronize_complete_callback) { - synchronize_complete_callback_for_testing_ = // IN-TEST - std::move(synchronize_complete_callback); -} - OsIntegrationManager::OsIntegrationManager( Profile* profile, std::unique_ptr<WebAppShortcutManager> shortcut_manager, @@ -154,6 +148,26 @@ OsIntegrationManager::~OsIntegrationManager() = default; +// static +base::RepeatingCallback<void(OsHooksErrors)> +OsIntegrationManager::GetBarrierForSynchronize( + AnyOsHooksErrorCallback errors_callback) { + // There are always 2 barriers, one for the normal OS Hook call and one for + // Synchronize(). + int num_barriers = 2; + + auto barrier_callback_for_synchronize = base::BarrierCallback<OsHooksErrors>( + num_barriers, + base::BindOnce( + [](AnyOsHooksErrorCallback callback, + std::vector<OsHooksErrors> combined_errors) { + std::move(callback).Run( + GetFinalErrorBitsetFromCollection(combined_errors)); + }, + std::move(errors_callback))); + return barrier_callback_for_synchronize; +} + void OsIntegrationManager::SetSubsystems(WebAppSyncBridge* sync_bridge, WebAppRegistrar* registrar, WebAppUiManager* ui_manager, @@ -170,10 +184,13 @@ if (url_handler_manager_) url_handler_manager_->SetSubsystems(registrar); + sub_managers_.clear(); auto shortcut_handling_sub_manager = - std::make_unique<ShortcutHandlingSubManager>(profile_, *icon_manager, - *registrar); + std::make_unique<ShortcutHandlingSubManager>(*icon_manager, *registrar); + auto protocol_handling_sub_manager = + std::make_unique<ProtocolHandlingSubManager>(*registrar); sub_managers_.push_back(std::move(shortcut_handling_sub_manager)); + sub_managers_.push_back(std::move(protocol_handling_sub_manager)); } void OsIntegrationManager::Start() { @@ -194,11 +211,6 @@ void OsIntegrationManager::Synchronize(const AppId& app_id, base::OnceClosure callback) { - if (synchronize_complete_callback_for_testing_) { // IN-TEST - callback = std::move(callback).Then( - std::move(synchronize_complete_callback_for_testing_)); // IN-TEST - } - if (!AreOsIntegrationSubManagersEnabled()) { std::move(callback).Run(); return; @@ -272,9 +284,6 @@ } #endif - Synchronize(app_id, - barrier->CreateBarrierCallbackForSynchronize(base::DoNothing())); - // TODO(ortuno): Make adding a shortcut to the applications menu independent // from adding a shortcut to desktop. if (options.os_hooks[OsHookType::kShortcuts]) { @@ -309,9 +318,6 @@ scoped_refptr<OsHooksBarrier> barrier = base::MakeRefCounted<OsHooksBarrier>( os_hooks_errors, std::move(callback)); - Synchronize(app_id, - barrier->CreateBarrierCallbackForSynchronize(base::DoNothing())); - if (os_hooks[OsHookType::kShortcutsMenu]) { bool success = UnregisterShortcutsMenu( app_id, @@ -372,9 +378,6 @@ scoped_refptr<OsHooksBarrier> barrier = base::MakeRefCounted<OsHooksBarrier>( os_hooks_errors, std::move(callback)); - Synchronize(app_id, - barrier->CreateBarrierCallbackForSynchronize(base::DoNothing())); - UpdateFileHandlers(app_id, file_handlers_need_os_update, base::BindOnce(barrier->CreateBarrierCallbackForType( OsHookType::kFileHandlers)));
diff --git a/chrome/browser/web_applications/os_integration/os_integration_manager.h b/chrome/browser/web_applications/os_integration/os_integration_manager.h index be1009f..ffea2b58 100644 --- a/chrome/browser/web_applications/os_integration/os_integration_manager.h +++ b/chrome/browser/web_applications/os_integration/os_integration_manager.h
@@ -94,11 +94,6 @@ base::AutoReset<bool> scope_; }; - // Sets a |callback| for testing code to get notified whenever a Synchronize() - // has completed executing and the new states has been written to the DB. - void SetSynchronizeCompleteCallbackForTesting( - base::OnceClosure synchronize_complete_callback); - explicit OsIntegrationManager( Profile* profile, std::unique_ptr<WebAppShortcutManager> shortcut_manager, @@ -107,6 +102,11 @@ std::unique_ptr<UrlHandlerManager> url_handler_manager); ~OsIntegrationManager() override; + using AnyOsHooksErrorCallback = + base::OnceCallback<void(OsHooksErrors os_hooks_errors)>; + static base::RepeatingCallback<void(OsHooksErrors)> GetBarrierForSynchronize( + AnyOsHooksErrorCallback errors_callback); + virtual void SetSubsystems(WebAppSyncBridge* sync_bridge, WebAppRegistrar* registrar, WebAppUiManager* ui_manager, @@ -336,7 +336,6 @@ std::unique_ptr<UrlHandlerManager> url_handler_manager_; std::vector<std::unique_ptr<OsIntegrationSubManager>> sub_managers_; - base::OnceClosure synchronize_complete_callback_for_testing_; base::ScopedObservation<WebAppRegistrar, AppRegistrarObserver> registrar_observation_{this};
diff --git a/chrome/browser/web_applications/os_integration/os_integration_manager_unittest.cc b/chrome/browser/web_applications/os_integration/os_integration_manager_unittest.cc index bebbbe1..f498c39 100644 --- a/chrome/browser/web_applications/os_integration/os_integration_manager_unittest.cc +++ b/chrome/browser/web_applications/os_integration/os_integration_manager_unittest.cc
@@ -80,7 +80,6 @@ testing::StrictMock<MockOsIntegrationManager> manager; EXPECT_CALL(manager, MacAppShimOnAppInstalledForProfile(app_id)).Times(1); - EXPECT_CALL(manager, Synchronize(app_id, testing::_)).Times(1); EXPECT_CALL(manager, CreateShortcuts(app_id, false, SHORTCUT_CREATION_AUTOMATED, testing::_)) .WillOnce(base::test::RunOnceCallback<3>(true)); @@ -109,7 +108,6 @@ // added here. testing::StrictMock<MockOsIntegrationManager> manager; EXPECT_CALL(manager, MacAppShimOnAppInstalledForProfile(app_id)).Times(1); - EXPECT_CALL(manager, Synchronize(app_id, testing::_)).Times(1); EXPECT_CALL(manager, CreateShortcuts(app_id, true, SHORTCUT_CREATION_BY_USER, testing::_)) .WillOnce(base::test::RunOnceCallback<3>(true)); @@ -162,7 +160,6 @@ .AppendASCII("_crx_test"); testing::StrictMock<MockOsIntegrationManager> manager; - EXPECT_CALL(manager, Synchronize(app_id, testing::_)).Times(1); EXPECT_CALL(manager, BuildShortcutInfo(app_id)) .WillOnce( testing::Return(testing::ByMove(CreateTestShorcutInfo(app_id))));
diff --git a/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.cc b/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.cc new file mode 100644 index 0000000..2cadcf1 --- /dev/null +++ b/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.cc
@@ -0,0 +1,84 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.h" + +#include <memory> +#include <utility> + +#include "base/containers/contains.h" +#include "base/functional/callback_forward.h" +#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h" +#include "chrome/browser/web_applications/web_app.h" +#include "chrome/browser/web_applications/web_app_registrar.h" +#include "components/services/app_service/public/cpp/protocol_handler_info.h" + +#if BUILDFLAG(IS_WIN) +#include "base/win/windows_version.h" +#endif + +namespace web_app { + +ProtocolHandlingSubManager::ProtocolHandlingSubManager( + WebAppRegistrar& registrar) + : registrar_(registrar) {} + +ProtocolHandlingSubManager::~ProtocolHandlingSubManager() = default; + +void ProtocolHandlingSubManager::Configure( + const AppId& app_id, + proto::WebAppOsIntegrationState& desired_state, + base::OnceClosure configure_done) { + // Disable protocol handler unregistration on Win7 due to bad interactions + // between preinstalled app scenarios and the need for elevation to unregister + // protocol handlers on that platform. See crbug.com/1224327 for context. +#if BUILDFLAG(IS_WIN) + if (base::win::GetVersion() == base::win::Version::WIN7) { + std::move(configure_done).Run(); + return; + } +#endif + + DCHECK_EQ(desired_state.manifest_protocol_handlers_states().size(), 0); + + if (!registrar_->IsLocallyInstalled(app_id)) { + std::move(configure_done).Run(); + return; + } + + desired_state.clear_manifest_protocol_handlers_states(); + + const WebApp* web_app = registrar_->GetAppById(app_id); + if (!web_app) { + std::move(configure_done).Run(); + return; + } + + for (const auto& protocol_handler : web_app->protocol_handlers()) { + if (base::Contains(web_app->disallowed_launch_protocols(), + protocol_handler.protocol)) { + continue; + } + + proto::WebAppProtocolHandler* protocol_handler_state = + desired_state.add_manifest_protocol_handlers_states(); + protocol_handler_state->set_protocol(protocol_handler.protocol); + protocol_handler_state->set_url(protocol_handler.url.spec()); + } + std::move(configure_done).Run(); +} + +void ProtocolHandlingSubManager::Start() {} + +void ProtocolHandlingSubManager::Shutdown() {} + +void ProtocolHandlingSubManager::Execute( + const AppId& app_id, + const proto::WebAppOsIntegrationState& desired_state, + const absl::optional<proto::WebAppOsIntegrationState>& current_state, + base::OnceClosure callback) { + NOTREACHED() << "Not yet implemented"; +} + +} // namespace web_app
diff --git a/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.h b/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.h new file mode 100644 index 0000000..4a403ba --- /dev/null +++ b/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager.h
@@ -0,0 +1,42 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_WEB_APPLICATIONS_OS_INTEGRATION_PROTOCOL_HANDLING_SUB_MANAGER_H_ +#define CHROME_BROWSER_WEB_APPLICATIONS_OS_INTEGRATION_PROTOCOL_HANDLING_SUB_MANAGER_H_ + +#include "base/functional/callback_forward.h" +#include "base/memory/raw_ref.h" +#include "base/memory/weak_ptr.h" +#include "chrome/browser/web_applications/os_integration/os_integration_sub_manager.h" +#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h" +#include "chrome/browser/web_applications/web_app_id.h" + +namespace web_app { + +class WebAppRegistrar; + +class ProtocolHandlingSubManager : public OsIntegrationSubManager { + public: + explicit ProtocolHandlingSubManager(WebAppRegistrar& registrar); + ~ProtocolHandlingSubManager() override; + void Start() override; + void Shutdown() override; + void Configure(const AppId& app_id, + proto::WebAppOsIntegrationState& desired_state, + base::OnceClosure configure_done) override; + void Execute( + const AppId& app_id, + const proto::WebAppOsIntegrationState& desired_state, + const absl::optional<proto::WebAppOsIntegrationState>& current_state, + base::OnceClosure callback) override; + + private: + const raw_ref<WebAppRegistrar> registrar_; + + base::WeakPtrFactory<ProtocolHandlingSubManager> weak_ptr_factory_{this}; +}; + +} // namespace web_app + +#endif // CHROME_BROWSER_WEB_APPLICATIONS_OS_INTEGRATION_PROTOCOL_HANDLING_SUB_MANAGER_H_
diff --git a/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager_unittest.cc b/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager_unittest.cc new file mode 100644 index 0000000..612d567 --- /dev/null +++ b/chrome/browser/web_applications/os_integration/protocol_handling_sub_manager_unittest.cc
@@ -0,0 +1,243 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <memory> +#include <utility> +#include <vector> + +#include "base/files/file_util.h" +#include "base/run_loop.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/test_future.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/web_applications/os_integration/os_integration_manager.h" +#include "chrome/browser/web_applications/os_integration/web_app_file_handler_manager.h" +#include "chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.h" +#include "chrome/browser/web_applications/os_integration/web_app_shortcut.h" +#include "chrome/browser/web_applications/os_integration/web_app_shortcut_manager.h" +#include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h" +#include "chrome/browser/web_applications/test/fake_web_app_provider.h" +#include "chrome/browser/web_applications/test/web_app_install_test_utils.h" +#include "chrome/browser/web_applications/test/web_app_test.h" +#include "chrome/browser/web_applications/test/web_app_test_utils.h" +#include "chrome/browser/web_applications/web_app_command_scheduler.h" +#include "chrome/browser/web_applications/web_app_install_finalizer.h" +#include "chrome/browser/web_applications/web_app_install_info.h" +#include "chrome/browser/web_applications/web_app_install_params.h" +#include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/common/chrome_features.h" +#include "components/services/app_service/public/cpp/protocol_handler_info.h" +#include "components/webapps/browser/install_result_code.h" +#include "components/webapps/browser/uninstall_result_code.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace web_app { + +using ::testing::Eq; + +namespace { + +class ProtocolHandlingSubManagerTest + : public WebAppTest, + public ::testing::WithParamInterface<OsIntegrationSubManagersState> { + public: + const GURL kWebAppUrl = GURL("https://example.com/path/index.html"); + + ProtocolHandlingSubManagerTest() = default; + ~ProtocolHandlingSubManagerTest() override = default; + + void SetUp() override { + WebAppTest::SetUp(); + { + base::ScopedAllowBlockingForTesting allow_blocking; + shortcut_override_ = + ShortcutOverrideForTesting::OverrideForTesting(base::GetHomeDir()); + } + + if (EnableOsIntegrationSubManager()) { + scoped_feature_list_.InitAndEnableFeatureWithParameters( + features::kOsIntegrationSubManagers, {{"stage", "write_config"}}); + } else { + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/{}, + /*disabled_features=*/{features::kOsIntegrationSubManagers}); + } + + provider_ = FakeWebAppProvider::Get(profile()); + + auto file_handler_manager = + std::make_unique<WebAppFileHandlerManager>(profile()); + auto protocol_handler_manager = + std::make_unique<WebAppProtocolHandlerManager>(profile()); + auto shortcut_manager = std::make_unique<WebAppShortcutManager>( + profile(), /*icon_manager=*/nullptr, file_handler_manager.get(), + protocol_handler_manager.get()); + auto os_integration_manager = std::make_unique<OsIntegrationManager>( + profile(), std::move(shortcut_manager), std::move(file_handler_manager), + std::move(protocol_handler_manager), /*url_handler_manager=*/nullptr); + + provider_->SetOsIntegrationManager(std::move(os_integration_manager)); + test::AwaitStartWebAppProviderAndSubsystems(profile()); + } + + void TearDown() override { + // Blocking required due to file operations in the shortcut override + // destructor. + base::ScopedAllowBlockingForTesting allow_blocking; + shortcut_override_.reset(); + WebAppTest::TearDown(); + } + + web_app::AppId InstallWebAppWithProtocolHandlers( + const std::vector<apps::ProtocolHandlerInfo>& protocol_handlers) { + std::unique_ptr<WebAppInstallInfo> info = + std::make_unique<WebAppInstallInfo>(); + info->start_url = kWebAppUrl; + info->title = u"Test App"; + info->user_display_mode = web_app::UserDisplayMode::kStandalone; + info->protocol_handlers = protocol_handlers; + base::test::TestFuture<const AppId&, webapps::InstallResultCode> result; + // InstallFromInfoWithParams is used instead of InstallFromInfo, because + // InstallFromInfo doesn't register OS integration. + provider().scheduler().InstallFromInfoWithParams( + std::move(info), /*overwrite_existing_manifest_fields=*/true, + webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON, + result.GetCallback(), WebAppInstallParams()); + bool success = result.Wait(); + EXPECT_TRUE(success); + if (!success) + return AppId(); + EXPECT_EQ(result.Get<webapps::InstallResultCode>(), + webapps::InstallResultCode::kSuccessNewInstall); + return result.Get<AppId>(); + } + + void UninstallWebApp(const AppId& app_id) { + base::test::TestFuture<webapps::UninstallResultCode> uninstall_future; + provider_->install_finalizer().UninstallWebApp( + app_id, webapps::WebappUninstallSource::kAppsPage, + uninstall_future.GetCallback()); + EXPECT_THAT(uninstall_future.Get(), + testing::Eq(webapps::UninstallResultCode::kSuccess)); + } + + bool EnableOsIntegrationSubManager() { + return GetParam() == OsIntegrationSubManagersState::kEnabled; + } + + protected: + WebAppProvider& provider() { return *provider_; } + + private: + raw_ptr<FakeWebAppProvider> provider_; + base::test::ScopedFeatureList scoped_feature_list_; + std::unique_ptr<ShortcutOverrideForTesting::BlockingRegistration> + shortcut_override_; +}; + +TEST_P(ProtocolHandlingSubManagerTest, ConfigureOnlyProtocolHandler) { + apps::ProtocolHandlerInfo protocol_handler; + const std::string handler_url = + std::string(kWebAppUrl.spec()) + "/testing=%s"; + protocol_handler.url = GURL(handler_url); + protocol_handler.protocol = "web+test"; + + const AppId app_id = InstallWebAppWithProtocolHandlers({protocol_handler}); + + auto state = provider().registrar().GetAppCurrentOsIntegrationState(app_id); + if (EnableOsIntegrationSubManager()) { + ASSERT_TRUE(state.has_value()); + const proto::WebAppOsIntegrationState& os_integration_state = state.value(); + + ASSERT_THAT(os_integration_state.manifest_protocol_handlers_states_size(), + testing::Eq(1)); + + const proto::WebAppProtocolHandler& protocol_handler_state = + os_integration_state.manifest_protocol_handlers_states(0); + + ASSERT_THAT(protocol_handler_state.protocol(), + testing::Eq(protocol_handler.protocol)); + ASSERT_THAT(protocol_handler_state.url(), testing::Eq(handler_url)); + } else { + ASSERT_FALSE(state.has_value()); + } + + UninstallWebApp(app_id); +} + +TEST_P(ProtocolHandlingSubManagerTest, UninstalledAppDoesNotConfigure) { + apps::ProtocolHandlerInfo protocol_handler; + const std::string handler_url = + std::string(kWebAppUrl.spec()) + "/testing=%s"; + protocol_handler.url = GURL(handler_url); + protocol_handler.protocol = "web+test"; + + const AppId app_id = InstallWebAppWithProtocolHandlers({protocol_handler}); + UninstallWebApp(app_id); + + auto state = provider().registrar().GetAppCurrentOsIntegrationState(app_id); + ASSERT_FALSE(state.has_value()); +} + +TEST_P(ProtocolHandlingSubManagerTest, ConfigureProtocolHandlerDisallowed) { + apps::ProtocolHandlerInfo protocol_handler1; + const std::string handler_url1 = + std::string(kWebAppUrl.spec()) + "/testing=%s"; + protocol_handler1.url = GURL(handler_url1); + protocol_handler1.protocol = "web+test"; + + apps::ProtocolHandlerInfo protocol_handler2; + const std::string handler_url2 = + std::string(kWebAppUrl.spec()) + "/testing_protocol=%s"; + protocol_handler2.url = GURL(handler_url2); + protocol_handler2.protocol = "web+test+protocol"; + + const AppId app_id = + InstallWebAppWithProtocolHandlers({protocol_handler1, protocol_handler2}); + { + base::test::TestFuture<void> disallowed_future; + provider().scheduler().UpdateProtocolHandlerUserApproval( + app_id, "web+test", /*allowed=*/false, disallowed_future.GetCallback()); + EXPECT_TRUE(disallowed_future.Wait()); + } + + auto state = provider().registrar().GetAppCurrentOsIntegrationState(app_id); + if (EnableOsIntegrationSubManager()) { + ASSERT_TRUE(state.has_value()); + const proto::WebAppOsIntegrationState& os_integration_state = state.value(); + + ASSERT_THAT(os_integration_state.manifest_protocol_handlers_states_size(), + testing::Eq(1)); + + const proto::WebAppProtocolHandler& protocol_handler_state = + os_integration_state.manifest_protocol_handlers_states(0); + + ASSERT_THAT(protocol_handler_state.protocol(), + testing::Eq(protocol_handler2.protocol)); + ASSERT_THAT(protocol_handler_state.url(), testing::Eq(handler_url2)); + } else { + ASSERT_FALSE(state.has_value()); + } + + UninstallWebApp(app_id); +} + +INSTANTIATE_TEST_SUITE_P( + All, + ProtocolHandlingSubManagerTest, + ::testing::Values(OsIntegrationSubManagersState::kEnabled, + OsIntegrationSubManagersState::kDisabled), + [](const ::testing::TestParamInfo<OsIntegrationSubManagersState>& info) { + switch (info.param) { + case OsIntegrationSubManagersState::kEnabled: + return "OSIntegrationSubManagers_Enabled"; + case OsIntegrationSubManagersState::kDisabled: + return "OSIntegrationSubManagers_Disabled"; + } + }); + +} // namespace + +} // namespace web_app
diff --git a/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.cc b/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.cc index afadff9..dcdd879 100644 --- a/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.cc +++ b/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.cc
@@ -10,7 +10,6 @@ #include "base/containers/flat_map.h" #include "base/functional/bind.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app_constants.h" @@ -23,10 +22,9 @@ namespace web_app { ShortcutHandlingSubManager::ShortcutHandlingSubManager( - Profile* profile, WebAppIconManager& icon_manager, WebAppRegistrar& registrar) - : profile_(profile), icon_manager_(icon_manager), registrar_(registrar) {} + : icon_manager_(icon_manager), registrar_(registrar) {} ShortcutHandlingSubManager::~ShortcutHandlingSubManager() = default;
diff --git a/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.h b/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.h index 3d20b999..cc139bf 100644 --- a/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.h +++ b/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager.h
@@ -16,8 +16,6 @@ #include "chrome/browser/web_applications/web_app_install_info.h" #include "third_party/skia/include/core/SkBitmap.h" -class Profile; - namespace web_app { class WebAppIconManager; @@ -25,8 +23,7 @@ class ShortcutHandlingSubManager : public OsIntegrationSubManager { public: - ShortcutHandlingSubManager(Profile* profile, - WebAppIconManager& icon_manager, + ShortcutHandlingSubManager(WebAppIconManager& icon_manager, WebAppRegistrar& registrar); ~ShortcutHandlingSubManager() override; void Start() override; @@ -45,7 +42,6 @@ base::OnceClosure configure_done, base::flat_map<SquareSizePx, base::Time> time_map); - const raw_ptr<Profile> profile_; const raw_ref<WebAppIconManager> icon_manager_; const raw_ref<WebAppRegistrar> registrar_;
diff --git a/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager_browsertest.cc b/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager_browsertest.cc index f5ca383..d282f57f 100644 --- a/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager_browsertest.cc +++ b/chrome/browser/web_applications/os_integration/shortcut_handling_sub_manager_browsertest.cc
@@ -15,7 +15,6 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h" #include "chrome/browser/web_applications/commands/fetch_manifest_and_install_command.h" -#include "chrome/browser/web_applications/os_integration/os_integration_manager.h" #include "chrome/browser/web_applications/test/web_app_test_utils.h" #include "chrome/browser/web_applications/web_app_command_manager.h" #include "chrome/browser/web_applications/web_app_command_scheduler.h" @@ -36,14 +35,6 @@ namespace { -// This is an enum so that the enabling of write_config_and_execute can -// also be tested when implemented. -enum class OsIntegrationSubManagersState { - kEnabled = 0, - kDisabled = 1, - kMaxValue = kDisabled -}; - class ShortcutHandlingSubManagerBrowserTest : public WebAppControllerBrowserTest, public ::testing::WithParamInterface<OsIntegrationSubManagersState> { @@ -119,11 +110,7 @@ "/banners/" "manifest_test_page.html"); - base::test::TestFuture<void> sync_future; - provider().os_integration_manager().SetSynchronizeCompleteCallbackForTesting( - sync_future.GetCallback()); const AppId& app_id = LoadUrlAndInstallApp(test_url); - EXPECT_TRUE(sync_future.Wait()); auto state = provider().registrar_unsafe().GetAppCurrentOsIntegrationState(app_id); @@ -158,12 +145,7 @@ "manifest_test_page.html"); const AppId& app_id = LoadUrlAndInstallApp(test_url); - base::test::TestFuture<void> sync_future; - provider().os_integration_manager().SetSynchronizeCompleteCallbackForTesting( - sync_future.GetCallback()); UninstallAppAndCleanData(app_id); - EXPECT_TRUE(sync_future.Wait()); - auto state = provider().registrar_unsafe().GetAppCurrentOsIntegrationState(app_id); EXPECT_FALSE(state.has_value()); @@ -173,7 +155,15 @@ All, ShortcutHandlingSubManagerBrowserTest, ::testing::Values(OsIntegrationSubManagersState::kEnabled, - OsIntegrationSubManagersState::kDisabled)); + OsIntegrationSubManagersState::kDisabled), + [](const ::testing::TestParamInfo<OsIntegrationSubManagersState>& info) { + switch (info.param) { + case OsIntegrationSubManagersState::kEnabled: + return "OSIntegrationSubManagers_Enabled"; + case OsIntegrationSubManagersState::kDisabled: + return "OSIntegrationSubManagers_Disabled"; + } + }); } // namespace
diff --git a/chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.cc b/chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.cc index d3407d2..0ec6ce2c 100644 --- a/chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.cc +++ b/chrome/browser/web_applications/os_integration/web_app_protocol_handler_manager.cc
@@ -133,6 +133,7 @@ std::move(callback).Run(Result::kOk); return; } + const std::vector<apps::ProtocolHandlerInfo> handlers = GetAppProtocolHandlerInfos(app_id); RegisterProtocolHandlersWithOs(app_id,
diff --git a/chrome/browser/web_applications/os_integration/web_app_shortcut_win.cc b/chrome/browser/web_applications/os_integration/web_app_shortcut_win.cc index 1e785a1b..d24291ce 100644 --- a/chrome/browser/web_applications/os_integration/web_app_shortcut_win.cc +++ b/chrome/browser/web_applications/os_integration/web_app_shortcut_win.cc
@@ -422,6 +422,15 @@ return; } + // Calling UnpinShortcuts in unit-tests currently crashes the test, so skip it + // for now using the shortcut override mechanism. + if (web_app::GetShortcutOverrideForTesting()) { + DeleteShortcuts(all_shortcuts, std::move(result_callback)); + return; + } + + // TODO(crbug.com/1400425): Figure out how to make this call not crash & + // incorporate unpin / pin methods in unit-tests. shell_integration::win::UnpinShortcuts( all_shortcuts, base::BindOnce(&DeleteShortcuts, all_shortcuts, std::move(result_callback))); @@ -565,8 +574,15 @@ std::vector<base::FilePath> shortcut_paths = GetShortcutPaths(creation_locations); - bool pin_to_taskbar = - creation_locations.in_quick_launch_bar && CanPinShortcutToTaskbar(); + bool pin_to_taskbar = false; + // PinShortcutToTaskbar in unit-tests are not preferred as unpinning causes + // crashes, so use the shortcut override for testing to not pin to taskbar. + // TODO(crbug.com/1400425): Figure out how to make this call not crash & + // incorporate unpin / pin methods in unit-tests. + if (!shortcut_override) { + pin_to_taskbar = + creation_locations.in_quick_launch_bar && CanPinShortcutToTaskbar(); + } // Create/update the shortcut in the web app path for the "Pin To Taskbar" // option in Win7 and Win10 versions that support pinning. We use the web app
diff --git a/chrome/browser/web_applications/proto/web_app_os_integration_state.proto b/chrome/browser/web_applications/proto/web_app_os_integration_state.proto index 068a24e4..ef14c21f 100644 --- a/chrome/browser/web_applications/proto/web_app_os_integration_state.proto +++ b/chrome/browser/web_applications/proto/web_app_os_integration_state.proto
@@ -20,9 +20,15 @@ repeated ShortcutIconData icon_data_any = 3; } +message WebAppProtocolHandler { + optional string protocol = 1; + optional string url = 2; +} + // Represents all the common OS Integration states to be stored in the web_app // DB that matches the values in the OS. message WebAppOsIntegrationState { optional ShortcutState shortcut_states = 1; + repeated WebAppProtocolHandler manifest_protocol_handlers_states = 2; // Add data states for other OS integration hooks here. } \ No newline at end of file
diff --git a/chrome/browser/web_applications/test/web_app_test_utils.h b/chrome/browser/web_applications/test/web_app_test_utils.h index fb222afd..f29083fd 100644 --- a/chrome/browser/web_applications/test/web_app_test_utils.h +++ b/chrome/browser/web_applications/test/web_app_test_utils.h
@@ -33,6 +33,13 @@ class WebApp; +// Intended to be used for parameterizing tests that involve OS integration. +enum class OsIntegrationSubManagersState { + kEnabled = 0, + kDisabled = 1, + kMaxValue = kDisabled +}; + namespace test { enum class ExternalPrefMigrationTestCases {
diff --git a/chrome/browser/web_applications/web_app_install_finalizer.cc b/chrome/browser/web_applications/web_app_install_finalizer.cc index 219469df..7ec1f16 100644 --- a/chrome/browser/web_applications/web_app_install_finalizer.cc +++ b/chrome/browser/web_applications/web_app_install_finalizer.cc
@@ -6,13 +6,13 @@ #include <map> #include <utility> -#include <vector> +#include "base/barrier_callback.h" #include "base/bind.h" -#include "base/callback.h" -#include "base/callback_helpers.h" #include "base/containers/contains.h" #include "base/containers/flat_set.h" +#include "base/functional/callback.h" +#include "base/functional/callback_helpers.h" #include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" @@ -26,6 +26,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/commands/web_app_uninstall_command.h" #include "chrome/browser/web_applications/isolation_prefs_utils.h" +#include "chrome/browser/web_applications/os_integration/os_integration_manager.h" #include "chrome/browser/web_applications/os_integration/web_app_shortcuts_menu.h" #include "chrome/browser/web_applications/policy/web_app_policy_manager.h" #include "chrome/browser/web_applications/user_display_mode.h" @@ -543,12 +544,15 @@ break; } + auto os_hooks_barrier = + OsIntegrationManager::GetBarrierForSynchronize(base::BindOnce( + &WebAppInstallFinalizer::OnInstallHooksFinished, + weak_ptr_factory_.GetWeakPtr(), std::move(callback), app_id)); + os_integration_manager_->InstallOsHooks( - app_id, - base::BindOnce(&WebAppInstallFinalizer::OnInstallHooksFinished, - weak_ptr_factory_.GetWeakPtr(), std::move(callback), - app_id), - /*web_app_info=*/nullptr, hooks_options); + app_id, os_hooks_barrier, /*web_app_info=*/nullptr, hooks_options); + os_integration_manager_->Synchronize( + app_id, base::BindOnce(os_hooks_barrier, OsHooksErrors())); } void WebAppInstallFinalizer::OnInstallHooksFinished( @@ -592,17 +596,23 @@ return; } - if (ShouldUpdateOsHooks(app_id)) { - os_integration_manager_->UpdateOsHooks( - app_id, old_name, file_handlers_need_os_update, web_app_info, - base::BindOnce(&WebAppInstallFinalizer::OnUpdateHooksFinished, - weak_ptr_factory_.GetWeakPtr(), std::move(callback), - app_id, old_name)); - } else { + if (!ShouldUpdateOsHooks(app_id)) { std::move(callback).Run( app_id, webapps::InstallResultCode::kSuccessAlreadyInstalled, OsHooksErrors()); + return; } + + auto os_hooks_barrier = OsIntegrationManager::GetBarrierForSynchronize( + base::BindOnce(&WebAppInstallFinalizer::OnUpdateHooksFinished, + weak_ptr_factory_.GetWeakPtr(), std::move(callback), + app_id, old_name)); + + os_integration_manager_->UpdateOsHooks(app_id, old_name, + file_handlers_need_os_update, + web_app_info, os_hooks_barrier); + os_integration_manager_->Synchronize( + app_id, base::BindOnce(os_hooks_barrier, OsHooksErrors())); } void WebAppInstallFinalizer::OnUpdateHooksFinished( @@ -611,7 +621,6 @@ std::string old_name, OsHooksErrors os_hooks_errors) { install_manager_->NotifyWebAppManifestUpdated(app_id, old_name); - std::move(callback).Run( app_id, os_hooks_errors.any()
diff --git a/chrome/browser/web_applications/web_app_install_finalizer_unittest.cc b/chrome/browser/web_applications/web_app_install_finalizer_unittest.cc index f53c72a..1c7f8375 100644 --- a/chrome/browser/web_applications/web_app_install_finalizer_unittest.cc +++ b/chrome/browser/web_applications/web_app_install_finalizer_unittest.cc
@@ -22,6 +22,7 @@ #include "chrome/browser/web_applications/test/fake_web_app_provider.h" #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" #include "chrome/browser/web_applications/test/web_app_test.h" +#include "chrome/browser/web_applications/test/web_app_test_utils.h" #include "chrome/browser/web_applications/web_app_constants.h" #include "chrome/browser/web_applications/web_app_helpers.h" #include "chrome/browser/web_applications/web_app_install_info.h" @@ -30,6 +31,7 @@ #include "chrome/browser/web_applications/web_app_install_utils.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/browser/web_applications/web_app_registrar.h" +#include "chrome/common/chrome_features.h" #include "chrome/test/base/testing_profile.h" #include "components/services/app_service/public/cpp/file_handler.h" #include "components/webapps/browser/install_result_code.h" @@ -74,11 +76,21 @@ install_manager_observation_{this}; }; -class WebAppInstallFinalizerUnitTest : public WebAppTest { +class WebAppInstallFinalizerUnitTest + : public WebAppTest, + public ::testing::WithParamInterface<OsIntegrationSubManagersState> { public: WebAppInstallFinalizerUnitTest() { - scoped_feature_list_.InitWithFeatures({blink::features::kFileHandlingAPI}, - {}); + if (GetParam() == OsIntegrationSubManagersState::kEnabled) { + scoped_feature_list_.InitWithFeaturesAndParameters( + {{blink::features::kFileHandlingAPI, {}}, + {features::kOsIntegrationSubManagers, {{"stage", "write_config"}}}}, + /*disabled_features=*/{}); + } else { + scoped_feature_list_.InitWithFeatures( + {blink::features::kFileHandlingAPI}, + {features::kOsIntegrationSubManagers}); + } } WebAppInstallFinalizerUnitTest(const WebAppInstallFinalizerUnitTest&) = delete; @@ -152,7 +164,7 @@ base::test::ScopedFeatureList scoped_feature_list_; }; -TEST_F(WebAppInstallFinalizerUnitTest, BasicInstallSucceeds) { +TEST_P(WebAppInstallFinalizerUnitTest, BasicInstallSucceeds) { auto info = std::make_unique<WebAppInstallInfo>(); info->start_url = GURL("https://foo.example"); info->title = u"Foo Title"; @@ -167,7 +179,7 @@ EXPECT_EQ(0u, os_integration_manager().num_register_run_on_os_login_calls()); } -TEST_F(WebAppInstallFinalizerUnitTest, ConcurrentInstallSucceeds) { +TEST_P(WebAppInstallFinalizerUnitTest, ConcurrentInstallSucceeds) { auto info1 = std::make_unique<WebAppInstallInfo>(); info1->start_url = GURL("https://foo1.example"); info1->title = u"Foo1 Title"; @@ -225,7 +237,7 @@ EXPECT_TRUE(callback2_called); } -TEST_F(WebAppInstallFinalizerUnitTest, InstallStoresLatestWebAppInstallSource) { +TEST_P(WebAppInstallFinalizerUnitTest, InstallStoresLatestWebAppInstallSource) { auto info = std::make_unique<WebAppInstallInfo>(); info->start_url = GURL("https://foo.example"); info->title = u"Foo Title"; @@ -239,7 +251,7 @@ *registrar().GetAppInstallSourceForMetrics(result.installed_app_id)); } -TEST_F(WebAppInstallFinalizerUnitTest, OnWebAppManifestUpdatedTriggered) { +TEST_P(WebAppInstallFinalizerUnitTest, OnWebAppManifestUpdatedTriggered) { auto info = std::make_unique<WebAppInstallInfo>(); info->start_url = GURL("https://foo.example"); info->title = u"Foo Title"; @@ -256,7 +268,7 @@ EXPECT_TRUE(install_manager_observer_->web_app_manifest_updated_called()); } -TEST_F(WebAppInstallFinalizerUnitTest, InstallNoDesktopShortcut) { +TEST_P(WebAppInstallFinalizerUnitTest, InstallNoDesktopShortcut) { auto info = std::make_unique<WebAppInstallInfo>(); info->start_url = GURL("https://foo.example"); info->title = u"Foo Title"; @@ -276,7 +288,7 @@ os_integration_manager().num_add_app_to_quick_launch_bar_calls()); } -TEST_F(WebAppInstallFinalizerUnitTest, InstallNoQuickLaunchBarShortcut) { +TEST_P(WebAppInstallFinalizerUnitTest, InstallNoQuickLaunchBarShortcut) { auto info = std::make_unique<WebAppInstallInfo>(); info->start_url = GURL("https://foo.example"); info->title = u"Foo Title"; @@ -296,7 +308,7 @@ os_integration_manager().num_add_app_to_quick_launch_bar_calls()); } -TEST_F(WebAppInstallFinalizerUnitTest, +TEST_P(WebAppInstallFinalizerUnitTest, InstallNoDesktopShortcutAndNoQuickLaunchBarShortcut) { auto info = std::make_unique<WebAppInstallInfo>(); info->start_url = GURL("https://foo.example"); @@ -318,7 +330,7 @@ os_integration_manager().num_add_app_to_quick_launch_bar_calls()); } -TEST_F(WebAppInstallFinalizerUnitTest, InstallNoCreateOsShorcuts) { +TEST_P(WebAppInstallFinalizerUnitTest, InstallNoCreateOsShorcuts) { auto info = std::make_unique<WebAppInstallInfo>(); info->start_url = GURL("https://foo.example"); info->title = u"Foo Title"; @@ -338,7 +350,7 @@ EXPECT_EQ(0u, os_integration_manager().num_create_shortcuts_calls()); } -TEST_F(WebAppInstallFinalizerUnitTest, +TEST_P(WebAppInstallFinalizerUnitTest, InstallOsHooksEnabledForUserInstalledApps) { auto info = std::make_unique<WebAppInstallInfo>(); info->start_url = GURL("https://foo.example"); @@ -355,7 +367,7 @@ EXPECT_EQ(1u, os_integration_manager().num_create_file_handlers_calls()); } -TEST_F(WebAppInstallFinalizerUnitTest, InstallOsHooksDisabledForDefaultApps) { +TEST_P(WebAppInstallFinalizerUnitTest, InstallOsHooksDisabledForDefaultApps) { auto info = std::make_unique<WebAppInstallInfo>(); info->start_url = GURL("https://foo.example"); info->title = u"Foo Title"; @@ -400,7 +412,7 @@ #endif // BUILDFLAG(IS_CHROMEOS) } -TEST_F(WebAppInstallFinalizerUnitTest, InstallUrlSetInWebAppDB) { +TEST_P(WebAppInstallFinalizerUnitTest, InstallUrlSetInWebAppDB) { auto info = std::make_unique<WebAppInstallInfo>(); info->start_url = GURL("https://foo.example"); info->title = u"Foo Title"; @@ -424,7 +436,7 @@ *it->second.install_urls.begin()); } -TEST_F(WebAppInstallFinalizerUnitTest, IsolationDataSetInWebAppDB) { +TEST_P(WebAppInstallFinalizerUnitTest, IsolationDataSetInWebAppDB) { WebAppInstallInfo info; info.start_url = GURL("https://foo.example"); info.title = u"Foo Title"; @@ -445,4 +457,18 @@ EXPECT_EQ(isolation_data, installed_app->isolation_data()); } +INSTANTIATE_TEST_SUITE_P( + All, + WebAppInstallFinalizerUnitTest, + ::testing::Values(OsIntegrationSubManagersState::kEnabled, + OsIntegrationSubManagersState::kDisabled), + [](const ::testing::TestParamInfo<OsIntegrationSubManagersState>& info) { + switch (info.param) { + case OsIntegrationSubManagersState::kEnabled: + return "OSIntegrationSubManagers_Enabled"; + case OsIntegrationSubManagersState::kDisabled: + return "OSIntegrationSubManagers_Disabled"; + } + }); + } // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_install_utils.cc b/chrome/browser/web_applications/web_app_install_utils.cc index 4afbedff..e685e4e8 100644 --- a/chrome/browser/web_applications/web_app_install_utils.cc +++ b/chrome/browser/web_applications/web_app_install_utils.cc
@@ -23,6 +23,7 @@ #include "base/containers/flat_set.h" #include "base/containers/flat_tree.h" #include "base/feature_list.h" +#include "base/functional/callback_helpers.h" #include "base/logging.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_base.h" @@ -941,8 +942,12 @@ if (!user_installable_before_uninstall && user_installable_after_uninstall) { InstallOsHooksOptions options; options.os_hooks[OsHookType::kUninstallationViaOsSettings] = true; - os_integration_manager.InstallOsHooks( - web_app->app_id(), std::move(callback), nullptr, options); + auto os_hooks_barrier = + OsIntegrationManager::GetBarrierForSynchronize(std::move(callback)); + os_integration_manager.InstallOsHooks(web_app->app_id(), os_hooks_barrier, + nullptr, options); + os_integration_manager.Synchronize( + web_app->app_id(), base::BindOnce(os_hooks_barrier, OsHooksErrors())); return; } #endif @@ -966,6 +971,7 @@ options[OsHookType::kUninstallationViaOsSettings] = true; os_integration_manager.UninstallOsHooks(web_app->app_id(), options, base::DoNothing()); + os_integration_manager.Synchronize(web_app->app_id(), base::DoNothing()); } #endif }
diff --git a/chrome/browser/web_applications/web_app_install_utils_unittest.cc b/chrome/browser/web_applications/web_app_install_utils_unittest.cc index 4fb29ab..814a1bf 100644 --- a/chrome/browser/web_applications/web_app_install_utils_unittest.cc +++ b/chrome/browser/web_applications/web_app_install_utils_unittest.cc
@@ -54,6 +54,7 @@ #if BUILDFLAG(IS_WIN) #include "base/test/bind.h" +#include "base/test/gmock_callback_support.h" #include "chrome/browser/web_applications/test/mock_os_integration_manager.h" #include "chrome/common/chrome_features.h" #include "components/webapps/browser/installable/installable_metrics.h" @@ -1420,7 +1421,8 @@ EXPECT_CALL(manager, MacAppShimOnAppInstalledForProfile(app_id)).Times(1); EXPECT_CALL(manager, RegisterWebAppOsUninstallation(app_id, testing::_)) .Times(1); - EXPECT_CALL(manager, Synchronize(app_id, testing::_)).Times(1); + EXPECT_CALL(manager, Synchronize(app_id, testing::_)) + .WillOnce(base::test::RunOnceCallback<1>()); // Scenario 1. auto web_app = std::make_unique<WebApp>(app_id);
diff --git a/chrome/browser/web_applications/web_app_uninstall_job.cc b/chrome/browser/web_applications/web_app_uninstall_job.cc index 4932be0..04661cd 100644 --- a/chrome/browser/web_applications/web_app_uninstall_job.cc +++ b/chrome/browser/web_applications/web_app_uninstall_job.cc
@@ -10,6 +10,7 @@ #include "base/memory/ptr_util.h" #include "base/metrics/histogram_functions.h" #include "chrome/browser/web_applications/isolation_prefs_utils.h" +#include "chrome/browser/web_applications/os_integration/os_integration_manager.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app_icon_manager.h" #include "chrome/browser/web_applications/web_app_install_finalizer.h" @@ -86,9 +87,13 @@ RemoveAppIsolationState(&profile_prefs, app_origin); - os_integration_manager.UninstallAllOsHooks( - app_id_, base::BindOnce(&WebAppUninstallJob::OnOsHooksUninstalled, - weak_ptr_factory_.GetWeakPtr())); + auto synchronize_barrier = OsIntegrationManager::GetBarrierForSynchronize( + base::BindOnce(&WebAppUninstallJob::OnOsHooksUninstalled, + weak_ptr_factory_.GetWeakPtr())); + os_integration_manager.UninstallAllOsHooks(app_id_, synchronize_barrier); + os_integration_manager.Synchronize( + app_id_, base::BindOnce(synchronize_barrier, OsHooksErrors())); + icon_manager.DeleteData(app_id_, base::BindOnce(&WebAppUninstallJob::OnIconDataDeleted, weak_ptr_factory_.GetWeakPtr()));
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc index 9b0f02a..0d2a017 100644 --- a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc +++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
@@ -659,8 +659,12 @@ void ChromeAuthenticatorRequestDelegate::ConfigureCable( const url::Origin& origin, device::CableRequestType request_type, + absl::optional<device::ResidentKeyRequirement> resident_key_requirement, base::span<const device::CableDiscoveryData> pairings_from_extension, device::FidoDiscoveryFactory* discovery_factory) { + DCHECK(request_type == device::CableRequestType::kGetAssertion || + resident_key_requirement.has_value()); + phone_names_.clear(); phone_public_keys_.clear(); @@ -750,6 +754,12 @@ (!cable_extension_permitted || (!cable_extension_provided && request_type == device::CableRequestType::kGetAssertion) || + ((request_type == device::CableRequestType::kMakeCredential || + request_type == + device::CableRequestType::kDiscoverableMakeCredential) && + resident_key_requirement.has_value() && + resident_key_requirement.value() != + device::ResidentKeyRequirement::kDiscouraged) || base::FeatureList::IsEnabled(device::kWebAuthCableExtensionAnywhere)); absl::optional<std::array<uint8_t, device::cablev2::kQRKeySize>>
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate.h b/chrome/browser/webauthn/chrome_authenticator_request_delegate.h index a47462ce..fd8de3c 100644 --- a/chrome/browser/webauthn/chrome_authenticator_request_delegate.h +++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate.h
@@ -173,6 +173,7 @@ void ConfigureCable( const url::Origin& origin, device::CableRequestType request_type, + absl::optional<device::ResidentKeyRequirement> resident_key_requirement, base::span<const device::CableDiscoveryData> pairings_from_extension, device::FidoDiscoveryFactory* discovery_factory) override; void SelectAccount(
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc b/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc index 32650d78..8967b05 100644 --- a/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc +++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate_unittest.cc
@@ -207,12 +207,14 @@ const char* origin; std::vector<device::CableDiscoveryData> extensions; device::CableRequestType request_type; + absl::optional<device::ResidentKeyRequirement> resident_key_requirement; Result expected_result; } kTests[] = { { "https://example.com", {}, device::CableRequestType::kGetAssertion, + absl::nullopt, Result::k3rdParty, }, { @@ -220,6 +222,7 @@ "https://example.com", {v1_extension}, device::CableRequestType::kGetAssertion, + absl::nullopt, Result::k3rdParty, }, { @@ -227,6 +230,7 @@ "https://example.com", {v2_extension}, device::CableRequestType::kGetAssertion, + absl::nullopt, Result::k3rdParty, }, { @@ -235,25 +239,45 @@ "https://accounts.google.com", {}, device::CableRequestType::kGetAssertion, + absl::nullopt, Result::k3rdParty, }, { - // ... but not for registration. + // ... but not for non-discoverable registration. "https://accounts.google.com", {}, device::CableRequestType::kMakeCredential, + device::ResidentKeyRequirement::kDiscouraged, Result::kNone, }, { + // ... but yes for rk=preferred + "https://accounts.google.com", + {}, + device::CableRequestType::kMakeCredential, + device::ResidentKeyRequirement::kPreferred, + Result::k3rdParty, + }, + { + // ... or rk=required. + "https://accounts.google.com", + {}, + device::CableRequestType::kDiscoverableMakeCredential, + device::ResidentKeyRequirement::kRequired, + Result::k3rdParty, + }, + { "https://accounts.google.com", {v1_extension}, device::CableRequestType::kGetAssertion, + absl::nullopt, NONE_ON_LINUX(Result::kV1), }, { "https://accounts.google.com", {v2_extension}, device::CableRequestType::kGetAssertion, + absl::nullopt, Result::kServerLink, }, }; @@ -268,8 +292,8 @@ delegate.SetRelyingPartyId(/*rp_id=*/"example.com"); delegate.SetPassEmptyUsbDeviceManagerForTesting(true); delegate.ConfigureCable(url::Origin::Create(GURL(test.origin)), - test.request_type, test.extensions, - &discovery_factory); + test.request_type, test.resident_key_requirement, + test.extensions, &discovery_factory); switch (test.expected_result) { case Result::kNone:
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 25da7b3d..c8154be9 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1670932793-9ed8f62fbaebb0a80dec16554a5b5fe50857243f.profdata +chrome-mac-main-1670954391-d06bb5a099f888151fd8b17baedee93ef5c3800a.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index b9fcfb86..2a13e17 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1670911113-3705680ffb97b516000d2aaf1c32d8521b347e7f.profdata +chrome-win32-main-1670932793-dd1d6e7c75945405027f18c4e4856263458728fa.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 45210cdb..fa9fd8a 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1670921383-cc708cef991f2e311fc9a845be6cf88ae485cde4.profdata +chrome-win64-main-1670932793-1d5e6d4462bbfd958bef451e3f3b7a9e000cf580.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni index c4178b3..6b478cb 100644 --- a/chrome/chrome_paks.gni +++ b/chrome/chrome_paks.gni
@@ -159,6 +159,7 @@ "$root_gen_dir/chrome/new_tab_page_instant_resources.pak", "$root_gen_dir/chrome/new_tab_page_resources.pak", "$root_gen_dir/chrome/new_tab_page_third_party_resources.pak", + "$root_gen_dir/chrome/omnibox_popup_resources.pak", "$root_gen_dir/chrome/password_manager_resources.pak", "$root_gen_dir/chrome/privacy_sandbox_resources.pak", "$root_gen_dir/chrome/profile_internals_resources.pak", @@ -193,6 +194,7 @@ "//chrome/browser/resources/new_tab_page:resources", "//chrome/browser/resources/new_tab_page_instant:resources", "//chrome/browser/resources/new_tab_page_third_party:resources", + "//chrome/browser/resources/omnibox_popup:resources", "//chrome/browser/resources/password_manager:resources", "//chrome/browser/resources/privacy_sandbox:resources", "//chrome/browser/resources/profile_internals:resources",
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc index 30a1ebca..9fa559cf 100644 --- a/chrome/common/webui_url_constants.cc +++ b/chrome/common/webui_url_constants.cc
@@ -271,6 +271,8 @@ "user-notes-side-panel.top-chrome"; const char kChromeUIUserNotesSidePanelURL[] = "chrome://user-notes-side-panel.top-chrome/"; +const char kChromeUIOmniboxPopupHost[] = "omnibox-popup.top-chrome"; +const char kChromeUIOmniboxPopupURL[] = "chrome://omnibox-popup.top-chrome/"; const char kChromeUIWebAppInternalsHost[] = "web-app-internals"; const char kChromeUIWebUITestHost[] = "webui-test"; #endif
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h index f793e65..735a687 100644 --- a/chrome/common/webui_url_constants.h +++ b/chrome/common/webui_url_constants.h
@@ -144,6 +144,8 @@ extern const char kChromeUINewTabURL[]; extern const char kChromeUIOfflineInternalsHost[]; extern const char kChromeUIOmniboxHost[]; +extern const char kChromeUIOmniboxPopupHost[]; +extern const char kChromeUIOmniboxPopupURL[]; extern const char kChromeUIOmniboxURL[]; #if BUILDFLAG(IS_CHROMEOS) extern const char kChromeUIAppDisabledURL[];
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index e6a2bd6..2c60a00 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -6701,6 +6701,8 @@ "../browser/hid/hid_chooser_context_unittest.cc", "../browser/hid/hid_connection_tracker_unittest.cc", "../browser/hid/hid_policy_allowed_devices_unittest.cc", + "../browser/hid/hid_system_tray_icon_unittest.cc", + "../browser/hid/hid_system_tray_icon_unittest.h", "../browser/importer/profile_writer_unittest.cc", "../browser/lifetime/application_lifetime_unittest.cc", "../browser/lookalikes/lookalike_url_navigation_throttle_unittest.cc", @@ -7274,6 +7276,10 @@ } } + if (!is_android && !is_chromeos) { + sources += [ "../browser/hid/hid_status_icon_unittest.cc" ] + } + if (is_chromeos) { sources += [ "../browser/apps/intent_helper/metrics/intent_handling_metrics_unittest.cc", @@ -7283,6 +7289,7 @@ "../browser/chromeos/arc/open_with_menu_unittest.cc", "../browser/download/notification/download_item_notification_unittest.cc", "../browser/extensions/api/document_scan/document_scan_api_unittest.cc", + "../browser/hid/hid_pinned_notification_unittest.cc", "../browser/media/platform_verification_chromeos_unittest.cc", "../browser/policy/system_features_disable_list_policy_handler_unittest.cc", "../browser/speech/tts_crosapi_util_unittest.cc", @@ -8052,6 +8059,7 @@ "../browser/extensions/site_permissions_helper_unittest.cc", "../browser/extensions/standard_management_policy_provider_unittest.cc", "../browser/extensions/tab_helper_unittest.cc", + "../browser/extensions/unpacked_installer_unittest.cc", "../browser/extensions/update_install_gate_unittest.cc", "../browser/extensions/updater/extension_update_client_command_line_config_policy_unittest.cc", "../browser/extensions/updater/extension_updater_unittest.cc",
diff --git a/chrome/test/base/testing_browser_process.cc b/chrome/test/base/testing_browser_process.cc index 50e0e84..b5691c9 100644 --- a/chrome/test/base/testing_browser_process.cc +++ b/chrome/test/base/testing_browser_process.cc
@@ -26,6 +26,7 @@ #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/resource_coordinator/resource_coordinator_parts.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" +#include "chrome/browser/status_icons/status_tray.h" #include "chrome/common/chrome_paths.h" #include "chrome/test/base/testing_browser_process_platform_part.h" #include "components/network_time/network_time_tracker.h" @@ -63,9 +64,14 @@ #if !BUILDFLAG(IS_ANDROID) #include "chrome/browser/hid/hid_policy_allowed_devices.h" +#if BUILDFLAG(IS_CHROMEOS) +#include "chrome/browser/hid/hid_pinned_notification.h" +#else +#include "chrome/browser/hid/hid_status_icon.h" +#endif // BUILDFLAG(IS_CHROMEOS) #include "chrome/browser/serial/serial_policy_allowed_ports.h" #include "components/keep_alive_registry/keep_alive_registry.h" -#endif +#endif // !BUILDFLAG(IS_ANDROID) #if BUILDFLAG(IS_CHROMEOS_ASH) #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" @@ -148,7 +154,12 @@ #if !BUILDFLAG(IS_ANDROID) KeepAliveRegistry::GetInstance()->SetIsShuttingDown(false); -#endif +#if BUILDFLAG(IS_CHROMEOS) + hid_system_tray_icon_ = std::make_unique<HidPinnedNotification>(); +#else + hid_system_tray_icon_ = std::make_unique<HidStatusIcon>(); +#endif // BUILDFLAG(IS_CHROMEOS) +#endif // !BUILDFLAG(IS_ANDROID) } void TestingBrowserProcess::FlushLocalStateAndReply(base::OnceClosure reply) { @@ -277,7 +288,7 @@ #endif StatusTray* TestingBrowserProcess::status_tray() { - return nullptr; + return status_tray_.get(); } safe_browsing::SafeBrowsingService* @@ -455,6 +466,10 @@ } return hid_policy_allowed_devices_.get(); } + +HidSystemTrayIcon* TestingBrowserProcess::hid_system_tray_icon() { + return hid_system_tray_icon_.get(); +} #endif BuildState* TestingBrowserProcess::GetBuildState() { @@ -541,6 +556,18 @@ is_shutting_down_ = is_shutting_down; } +void TestingBrowserProcess::SetStatusTray( + std::unique_ptr<StatusTray> status_tray) { + status_tray_ = std::move(status_tray); +} + +#if !BUILDFLAG(IS_ANDROID) +void TestingBrowserProcess::SetHidSystemTrayIcon( + std::unique_ptr<HidSystemTrayIcon> hid_system_tray_icon) { + hid_system_tray_icon_ = std::move(hid_system_tray_icon); +} +#endif + /////////////////////////////////////////////////////////////////////////////// TestingBrowserProcessInitializer::TestingBrowserProcessInitializer() {
diff --git a/chrome/test/base/testing_browser_process.h b/chrome/test/base/testing_browser_process.h index 6bdda6c..c14a4811 100644 --- a/chrome/test/base/testing_browser_process.h +++ b/chrome/test/base/testing_browser_process.h
@@ -145,6 +145,7 @@ #if !BUILDFLAG(IS_ANDROID) SerialPolicyAllowedPorts* serial_policy_allowed_ports() override; HidPolicyAllowedDevices* hid_policy_allowed_devices() override; + HidSystemTrayIcon* hid_system_tray_icon() override; #endif BuildState* GetBuildState() override; breadcrumbs::BreadcrumbPersistentStorageManager* @@ -168,6 +169,11 @@ void SetShuttingDown(bool is_shutting_down); void ShutdownBrowserPolicyConnector(); TestingBrowserProcessPlatformPart* GetTestPlatformPart(); + void SetStatusTray(std::unique_ptr<StatusTray> status_tray); +#if !BUILDFLAG(IS_ANDROID) + void SetHidSystemTrayIcon( + std::unique_ptr<HidSystemTrayIcon> hid_system_tray_icon); +#endif private: // See CreateInstance() and DestoryInstance() above. @@ -233,8 +239,11 @@ #if !BUILDFLAG(IS_ANDROID) std::unique_ptr<SerialPolicyAllowedPorts> serial_policy_allowed_ports_; std::unique_ptr<HidPolicyAllowedDevices> hid_policy_allowed_devices_; + std::unique_ptr<HidSystemTrayIcon> hid_system_tray_icon_; BuildState build_state_; #endif + + std::unique_ptr<StatusTray> status_tray_; }; // RAII (resource acquisition is initialization) for TestingBrowserProcess.
diff --git a/chrome/test/chromedriver/chrome/chrome_finder.cc b/chrome/test/chromedriver/chrome/chrome_finder.cc index 5ecf7567..df53e63 100644 --- a/chrome/test/chromedriver/chrome/chrome_finder.cc +++ b/chrome/test/chromedriver/chrome/chrome_finder.cc
@@ -49,6 +49,10 @@ installation_locations[i].Append(L"Google\\Chrome\\Application")); } for (size_t i = 0; i < installation_locations.size(); ++i) { + locations->push_back(installation_locations[i].Append( + L"Google\\Chrome for Testing\\Application")); + } + for (size_t i = 0; i < installation_locations.size(); ++i) { locations->push_back( installation_locations[i].Append(L"Chromium\\Application")); }
diff --git a/chrome/test/chromedriver/chrome/chrome_impl.cc b/chrome/test/chromedriver/chrome/chrome_impl.cc index 442a9c6..57babd2 100644 --- a/chrome/test/chromedriver/chrome/chrome_impl.cc +++ b/chrome/test/chromedriver/chrome/chrome_impl.cc
@@ -173,13 +173,13 @@ params.Set("url", "about:blank"); params.Set("newWindow", type == WindowType::kWindow); params.Set("background", true); - base::Value result; + base::Value::Dict result; status = devtools_websocket_client_->SendCommandAndGetResult( "Target.createTarget", params, &result); if (status.IsError()) return status; - const std::string* target_id_str = result.FindStringKey("targetId"); + const std::string* target_id_str = result.FindString("targetId"); if (!target_id_str) return Status(kUnknownError, "no targetId from createTarget"); *window_handle = *target_id_str; @@ -193,7 +193,7 @@ std::string session_id; { base::Value::Dict params; - base::Value result; + base::Value::Dict result; params.Set("targetId", id); params.Set("flatten", true); status = devtools_websocket_client_->SendCommandAndGetResult( @@ -202,7 +202,7 @@ return status; } - std::string* session_id_ptr = result.GetDict().FindString("sessionId"); + std::string* session_id_ptr = result.FindString("sessionId"); if (session_id_ptr == nullptr) { return Status(kUnknownError, @@ -290,13 +290,13 @@ Status ChromeImpl::GetWindow(const std::string& target_id, Window* window) { base::Value::Dict params; params.Set("targetId", target_id); - base::Value result; + base::Value::Dict result; Status status = devtools_websocket_client_->SendCommandAndGetResult( "Browser.getWindowForTarget", params, &result); if (status.IsError()) return status; - return ParseWindow(result, window); + return ParseWindow(base::Value(std::move(result)), window); } Status ChromeImpl::GetWindowRect(const std::string& target_id, @@ -385,13 +385,13 @@ Status ChromeImpl::GetWindowBounds(int window_id, Window* window) { base::Value::Dict params; params.Set("windowId", window_id); - base::Value result; + base::Value::Dict result; Status status = devtools_websocket_client_->SendCommandAndGetResult( "Browser.getWindowBounds", params, &result); if (status.IsError()) return status; - return ParseWindowBounds(result, window); + return ParseWindowBounds(base::Value(std::move(result)), window); } Status ChromeImpl::SetWindowBounds(Window* window, @@ -540,17 +540,13 @@ Status status{kOk}; base::Value::Dict params; - base::Value result; + base::Value::Dict result; status = devtools_websocket_client_->SendCommandAndGetResult( "Target.getTargets", params, &result); if (status.IsError()) { return status; } - if (!result.is_dict()) { - return Status(kUnknownError, - "result of call to Target.getTargets is not a map"); - } - base::Value* target_infos = result.GetDict().Find("targetInfos"); + base::Value* target_infos = result.Find("targetInfos"); if (!target_infos) { return Status( kUnknownError,
diff --git a/chrome/test/chromedriver/chrome/console_logger_unittest.cc b/chrome/test/chromedriver/chrome/console_logger_unittest.cc index d9e0edf8..de7857f 100644 --- a/chrome/test/chromedriver/chrome/console_logger_unittest.cc +++ b/chrome/test/chromedriver/chrome/console_logger_unittest.cc
@@ -46,9 +46,8 @@ Status SendCommandAndGetResult(const std::string& method, const base::Value::Dict& params, - base::Value* result) override { + base::Value::Dict* result) override { sent_command_queue_.push(method); - *result = base::Value(base::Value::Type::DICTIONARY); return Status(kOk); }
diff --git a/chrome/test/chromedriver/chrome/devtools_client.h b/chrome/test/chromedriver/chrome/devtools_client.h index 7c15d4be..6a2cd97 100644 --- a/chrome/test/chromedriver/chrome/devtools_client.h +++ b/chrome/test/chromedriver/chrome/devtools_client.h
@@ -66,17 +66,15 @@ virtual Status SendAsyncCommand(const std::string& method, const base::Value::Dict& params) = 0; - // A base::Value(base::Value::Type::DICTIONARY) gets assigned to |result|. virtual Status SendCommandAndGetResult(const std::string& method, const base::Value::Dict& params, - base::Value* result) = 0; + base::Value::Dict* result) = 0; - // A base::Value(base::Value::Type::DICTIONARY) gets assigned to |result|. virtual Status SendCommandAndGetResultWithTimeout( const std::string& method, const base::Value::Dict& params, const Timeout* timeout, - base::Value* result) = 0; + base::Value::Dict* result) = 0; virtual Status SendCommandAndIgnoreResponse( const std::string& method,
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl.cc b/chrome/test/chromedriver/chrome/devtools_client_impl.cc index a294503..fef6678 100644 --- a/chrome/test/chromedriver/chrome/devtools_client_impl.cc +++ b/chrome/test/chromedriver/chrome/devtools_client_impl.cc
@@ -20,6 +20,7 @@ #include "base/strings/stringprintf.h" #include "base/threading/platform_thread.h" #include "base/time/time.h" +#include "base/types/optional_util.h" #include "chrome/test/chromedriver/chrome/devtools_event_listener.h" #include "chrome/test/chromedriver/chrome/javascript_dialog_manager.h" #include "chrome/test/chromedriver/chrome/log.h" @@ -298,9 +299,6 @@ "BiDi tunnel is already set up in this client"}; } Status status{kOk}; - // TODO(https://crbug.com/chromedriver/4295#c1): implement the proper solution - // by waiting for the initial page navigation to be finished. - base::PlatformThread::Sleep(base::Milliseconds(200)); // Page clients have target_id coinciding with id std::string target_id = id_; { @@ -581,14 +579,14 @@ const std::string& method, const base::Value::Dict& params, const Timeout* timeout) { - base::Value result; + base::Value::Dict result; return SendCommandInternal(method, params, session_id_, &result, true, true, 0, timeout); } Status DevToolsClientImpl::SendAsyncCommand(const std::string& method, const base::Value::Dict& params) { - base::Value result; + base::Value::Dict result; return SendCommandInternal(method, params, session_id_, &result, false, false, 0, nullptr); } @@ -596,7 +594,7 @@ Status DevToolsClientImpl::SendCommandAndGetResult( const std::string& method, const base::Value::Dict& params, - base::Value* result) { + base::Value::Dict* result) { return SendCommandAndGetResultWithTimeout(method, params, nullptr, result); } @@ -604,15 +602,13 @@ const std::string& method, const base::Value::Dict& params, const Timeout* timeout, - base::Value* result) { - base::Value intermediate_result; + base::Value::Dict* result) { + base::Value::Dict intermediate_result; Status status = SendCommandInternal(method, params, session_id_, &intermediate_result, true, true, 0, timeout); if (status.IsError()) return status; - if (!intermediate_result.is_dict()) - return Status(kUnknownError, "inspector response missing result"); *result = std::move(intermediate_result); return Status(kOk); } @@ -766,7 +762,7 @@ Status DevToolsClientImpl::SendCommandInternal(const std::string& method, const base::Value::Dict& params, const std::string& session_id, - base::Value* result, + base::Value::Dict* result, bool expect_response, bool wait_for_response, const int client_command_id, @@ -864,8 +860,6 @@ } } else { CHECK(!wait_for_response); - if (result) - *result = base::Value(base::Value::Type::DICTIONARY); } return Status(kOk); } @@ -1006,7 +1000,7 @@ // see chromedriver/log_replay/devtools_log_reader.cc. VLOG(1) << "DevTools WebSocket Event: " << event.method << ::SessionId(session_id_) << " " << id_ << " " - << FormatValueForDisplay(*event.params); + << FormatValueForDisplay(base::Value(event.params->Clone())); } Status status{kOk}; @@ -1017,8 +1011,7 @@ // provide such a guarantee. // Therefore we perform this nullptr check here. if (event.params) { - status = - IsBidiMessage(event.method, event.params->GetDict(), &is_bidi_message); + status = IsBidiMessage(event.method, *event.params, &is_bidi_message); if (status.IsError()) { return status; } @@ -1029,8 +1022,7 @@ // awaiting for the notification that the mapper was successfully launched. // Such event is intended for the infrastructural purposes. // We consume it and remember the fact that BiDiMapper is up and running. - if (event.params->GetDict() - .FindBoolByDottedPath("payload.launched") + if (event.params->FindBoolByDottedPath("payload.launched") .value_or(false)) { bidi_server_is_launched_ = true; return Status{kOk}; @@ -1084,7 +1076,7 @@ if (iter != response_info_map_.end()) method = iter->second->method; if (response.result) - result = FormatValueForDisplay(*response.result); + result = FormatValueForDisplay(base::Value(response.result->Clone())); else result = response.error; // Note: ChromeDriver log-replay depends on the format of this logging. @@ -1120,8 +1112,7 @@ response_info->response.id = response.id; response_info->response.error = response.error; if (response.result) { - response_info->response.result = base::DictionaryValue::From( - base::Value::ToUniquePtrValue(response.result->Clone())); + response_info->response.result = response.result->Clone(); } } @@ -1152,7 +1143,7 @@ while (unnotified_event_listeners_.size()) { DevToolsEventListener* listener = unnotified_event_listeners_.front(); unnotified_event_listeners_.pop_front(); - const base::Value::Dict& dict = unnotified_event_->params->GetDict(); + const base::Value::Dict& dict = *unnotified_event_->params; Status status = listener->OnEvent(this, unnotified_event_->method, dict); if (status.IsError()) { unnotified_event_listeners_.clear(); @@ -1169,7 +1160,7 @@ unnotified_cmd_response_listeners_.pop_front(); Status status = listener->OnCommandSuccess( this, unnotified_cmd_response_info_->method, - unnotified_cmd_response_info_->response.result.get(), + base::OptionalToPtr(unnotified_cmd_response_info_->response.result), unnotified_cmd_response_info_->command_timeout); if (status.IsError()) return status; @@ -1252,11 +1243,9 @@ base::Value::Dict* cdp_params = payload_params->FindDict("cdpParams"); if (cdp_params) { - event->params = - base::DictionaryValue::From(base::Value::ToUniquePtrValue( - base::Value(std::move(*cdp_params)))); + event->params = std::move(*cdp_params); } else { - event->params = std::make_unique<base::DictionaryValue>(); + event->params = base::Value::Dict(); } return true; } else { // CDP command response @@ -1281,14 +1270,11 @@ // So, if neither "error" nor "result" keys are present, just provide // a blank result dictionary. if (cdp_result) { - command_response->result = - base::DictionaryValue::From(base::Value::ToUniquePtrValue( - base::Value(std::move(*cdp_result)))); + command_response->result = std::move(*cdp_result); } else if (cdp_error) { base::JSONWriter::Write(*cdp_error, &command_response->error); } else { - command_response->result = - std::make_unique<base::DictionaryValue>(); + command_response->result = base::Value::Dict(); } return true; } @@ -1310,10 +1296,9 @@ *type = kEventMessageType; event->method = *method; if (params) { - event->params = base::DictionaryValue::From( - base::Value::ToUniquePtrValue(base::Value(params->Clone()))); + event->params = params->Clone(); } else { - event->params = std::make_unique<base::DictionaryValue>(); + event->params = base::Value::Dict(); } return true; } else if (id_value->is_int()) { @@ -1325,13 +1310,12 @@ // So, if neither "error" nor "result" keys are present, just provide // a blank result dictionary. if (base::Value::Dict* unscoped_result = message_dict->FindDict("result")) { - command_response->result = base::DictionaryValue::From( - base::Value::ToUniquePtrValue(base::Value(unscoped_result->Clone()))); + command_response->result = std::move(*unscoped_result); } else if (base::Value::Dict* unscoped_error = message_dict->FindDict("error")) { base::JSONWriter::Write(*unscoped_error, &command_response->error); } else { - command_response->result = std::make_unique<base::DictionaryValue>(); + command_response->result = base::Value::Dict(); } return true; }
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl.h b/chrome/test/chromedriver/chrome/devtools_client_impl.h index 5967f71..05f53e8 100644 --- a/chrome/test/chromedriver/chrome/devtools_client_impl.h +++ b/chrome/test/chromedriver/chrome/devtools_client_impl.h
@@ -18,6 +18,7 @@ #include "chrome/test/chromedriver/chrome/devtools_client.h" #include "chrome/test/chromedriver/net/sync_websocket_factory.h" #include "chrome/test/chromedriver/net/timeout.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" namespace internal { @@ -31,7 +32,7 @@ InspectorEvent(); ~InspectorEvent(); std::string method; - std::unique_ptr<base::DictionaryValue> params; + absl::optional<base::Value::Dict> params; }; struct InspectorCommandResponse { @@ -39,7 +40,7 @@ ~InspectorCommandResponse(); int id; std::string error; - std::unique_ptr<base::DictionaryValue> result; + absl::optional<base::Value::Dict> result; }; } // namespace internal @@ -140,11 +141,11 @@ const base::Value::Dict& params) override; Status SendCommandAndGetResult(const std::string& method, const base::Value::Dict& params, - base::Value* result) override; + base::Value::Dict* result) override; Status SendCommandAndGetResultWithTimeout(const std::string& method, const base::Value::Dict& params, const Timeout* timeout, - base::Value* result) override; + base::Value::Dict* result) override; Status SendCommandAndIgnoreResponse(const std::string& method, const base::Value::Dict& params) override; @@ -198,7 +199,7 @@ Status SendCommandInternal(const std::string& method, const base::Value::Dict& params, const std::string& session_id, - base::Value* result, + base::Value::Dict* result, bool expect_response, bool wait_for_response, int client_command_id,
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc b/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc index 37440ea..54ce28da 100644 --- a/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc +++ b/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc
@@ -360,11 +360,11 @@ ASSERT_EQ(kOk, client.Connect().code()); base::Value::Dict params; params.Set("param", 1); - base::Value result; + base::Value::Dict result; Status status = client.SendCommandAndGetResult("method", params, &result); ASSERT_EQ(kOk, status.code()); std::string json; - base::JSONWriter::Write(result, &json); + base::JSONWriter::Write(base::Value(std::move(result)), &json); ASSERT_STREQ("{\"param\":1}", json.c_str()); } @@ -608,7 +608,7 @@ *type = internal::kCommandResponseMessageType; session_id->clear(); command_response->id = expected_id; - command_response->result = std::make_unique<base::DictionaryValue>(); + command_response->result = base::Value::Dict(); return true; } @@ -621,7 +621,7 @@ *type = internal::kCommandResponseMessageType; session_id->clear(); command_response->id = expected_id; - command_response->result = std::make_unique<base::DictionaryValue>(); + command_response->result = base::Value::Dict(); return false; } @@ -634,7 +634,7 @@ *type = internal::kCommandResponseMessageType; session_id->clear(); command_response->id = expected_id + 100; - command_response->result = std::make_unique<base::DictionaryValue>(); + command_response->result = base::Value::Dict(); return true; } @@ -654,8 +654,8 @@ } else { *type = internal::kCommandResponseMessageType; command_response->id = expected_id; - command_response->result = std::make_unique<base::DictionaryValue>(); - command_response->result->GetDict().Set("key", 2); + command_response->result = base::Value::Dict(); + command_response->result->Set("key", 2); } *first = false; return true; @@ -706,13 +706,13 @@ if (*first) { *type = internal::kEventMessageType; event->method = "method"; - event->params = std::make_unique<base::DictionaryValue>(); - event->params->GetDict().Set("key", 1); + event->params = base::Value::Dict(); + event->params->Set("key", 1); } else { *type = internal::kCommandResponseMessageType; command_response->id = expected_id; - command_response->result = std::make_unique<base::DictionaryValue>(); - command_response->result->GetDict().Set("key", 2); + command_response->result = base::Value::Dict(); + command_response->result->Set("key", 2); } *first = false; return true; @@ -726,8 +726,8 @@ internal::InspectorCommandResponse* command_response) { *type = internal::kEventMessageType; event->method = "method"; - event->params = std::make_unique<base::DictionaryValue>(); - event->params->GetDict().Set("key", 1); + event->params = base::Value::Dict(); + event->params->Set("key", 1); return true; } @@ -748,8 +748,8 @@ client->SendCommand("method", params); *type = internal::kEventMessageType; event->method = "method"; - event->params = std::make_unique<base::DictionaryValue>(); - event->params->GetDict().Set("key", 1); + event->params = base::Value::Dict(); + event->params->Set("key", 1); return true; case 1: command_response->id = expected_id - 1; @@ -761,8 +761,8 @@ break; } *type = internal::kCommandResponseMessageType; - command_response->result = std::make_unique<base::DictionaryValue>(); - command_response->result->GetDict().Set("key", key); + command_response->result = base::Value::Dict(); + command_response->result->Set("key", key); return true; } @@ -850,10 +850,9 @@ client.SetParserFuncForTesting( base::BindRepeating(&ReturnEventThenResponse, &first)); base::Value::Dict params; - base::Value result; + base::Value::Dict result; ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk()); - ASSERT_TRUE(result.is_dict()); - absl::optional<int> key = result.GetDict().FindInt("key"); + absl::optional<int> key = result.FindInt("key"); ASSERT_TRUE(key); ASSERT_EQ(2, key.value()); } @@ -885,7 +884,6 @@ "{\"method\":\"method\"}", 0, &session_id, &type, &event, &response)); ASSERT_EQ(internal::kEventMessageType, type); ASSERT_STREQ("method", event.method.c_str()); - ASSERT_TRUE(event.params->is_dict()); } TEST(ParseInspectorMessage, EventNoParamsWithSessionId) { @@ -898,7 +896,6 @@ &type, &event, &response)); ASSERT_EQ(internal::kEventMessageType, type); ASSERT_STREQ("method", event.method.c_str()); - ASSERT_TRUE(event.params->is_dict()); EXPECT_EQ("B221AF2", session_id); } @@ -912,7 +909,7 @@ 0, &session_id, &type, &event, &response)); ASSERT_EQ(internal::kEventMessageType, type); ASSERT_STREQ("method", event.method.c_str()); - int key = event.params->GetDict().FindInt("key").value_or(-1); + int key = event.params->FindInt("key").value_or(-1); ASSERT_EQ(100, key); EXPECT_EQ("AB3A", session_id); } @@ -928,7 +925,7 @@ ASSERT_TRUE( internal::ParseInspectorMessage("{\"id\":1,\"sessionId\":\"AB2AF3C\"}", 0, &session_id, &type, &event, &response)); - ASSERT_TRUE(response.result->DictEmpty()); + ASSERT_TRUE(response.result->empty()); EXPECT_EQ("AB2AF3C", session_id); } @@ -956,7 +953,7 @@ ASSERT_EQ(internal::kCommandResponseMessageType, type); ASSERT_EQ(1, response.id); ASSERT_FALSE(response.error.length()); - int key = response.result->GetDict().FindInt("key").value_or(-1); + int key = response.result->FindInt("key").value_or(-1); ASSERT_EQ(1, key); } @@ -1036,7 +1033,7 @@ EXPECT_EQ("ABC", session_id); EXPECT_EQ("event", event.method); ASSERT_TRUE(event.params); - EXPECT_THAT(event.params->GetDict().FindString("data"), Pointee(Eq("hello"))); + EXPECT_THAT(event.params->FindString("data"), Pointee(Eq("hello"))); } TEST(ParseInspectorMessage, TunneledCdpEventNoCdpSession) { @@ -1065,7 +1062,7 @@ EXPECT_EQ("", session_id); EXPECT_EQ("event", event.method); ASSERT_TRUE(event.params); - EXPECT_THAT(event.params->GetDict().FindString("data"), Pointee(Eq("hello"))); + EXPECT_THAT(event.params->FindString("data"), Pointee(Eq("hello"))); } TEST(ParseInspectorMessage, TunneledCdpEventNoCdpParams) { @@ -1155,8 +1152,7 @@ EXPECT_EQ("ABC", session_id); EXPECT_EQ(11, response.id); ASSERT_TRUE(response.result); - EXPECT_THAT(response.result->GetDict().FindString("data"), - Pointee(Eq("hola"))); + EXPECT_THAT(response.result->FindString("data"), Pointee(Eq("hola"))); } TEST(ParseInspectorMessage, TunneledCdpResponseNoSession) { @@ -1181,8 +1177,7 @@ EXPECT_EQ("", session_id); EXPECT_EQ(11, response.id); ASSERT_TRUE(response.result); - EXPECT_THAT(response.result->GetDict().FindString("data"), - Pointee(Eq("hola"))); + EXPECT_THAT(response.result->FindString("data"), Pointee(Eq("hola"))); } TEST(ParseInspectorMessage, TunneledCdpResponseNoId) { @@ -1384,10 +1379,9 @@ base::BindRepeating(&ReturnOutOfOrderResponses, &recurse_count, &client)); base::Value::Dict params; params.Set("param", 1); - base::Value result; + base::Value::Dict result; ASSERT_TRUE(client.SendCommandAndGetResult("method", params, &result).IsOk()); - ASSERT_TRUE(result.is_dict()); - absl::optional<int> key = result.GetDict().FindInt("key"); + absl::optional<int> key = result.FindInt("key"); ASSERT_TRUE(key); ASSERT_EQ(2, key.value()); } @@ -1850,7 +1844,7 @@ Status OnCommandSuccess(DevToolsClient* client, const std::string& method, - const base::DictionaryValue* result, + const base::Value::Dict* result, const Timeout& command_timeout) override { msgs_.push_back(method); if (!callback_.is_null()) @@ -2154,18 +2148,14 @@ base::Value::Dict params; params.Set("ping", ping_); - base::Value result; + base::Value::Dict result; event_handled_ = true; Status status = client_->SendCommandAndGetResult("method", params, &result); EXPECT_EQ(kOk, status.code()); if (!status.IsOk()) { return status; } - EXPECT_TRUE(result.is_dict()); - if (!result.is_dict()) { - return Status{kUnknownError, "result is not a dictionary"}; - } - absl::optional<int> pong = result.GetDict().FindInt("pong"); + absl::optional<int> pong = result.FindInt("pong"); EXPECT_TRUE(pong); if (pong) { pong_ = *pong; @@ -2279,20 +2269,18 @@ { base::Value::Dict params; params.Set("ping", 2); - base::Value result; + base::Value::Dict result; ASSERT_TRUE(StatusOk( red_client.SendCommandAndGetResult("method", params, &result))); - ASSERT_TRUE(result.is_dict()); - EXPECT_EQ(result.GetDict().FindInt("pong").value_or(-1), 2); + EXPECT_EQ(result.FindInt("pong").value_or(-1), 2); } { base::Value::Dict params; params.Set("ping", 3); - base::Value result; + base::Value::Dict result; ASSERT_TRUE(StatusOk( blue_client.SendCommandAndGetResult("method", params, &result))); - ASSERT_TRUE(result.is_dict()); - EXPECT_EQ(result.GetDict().FindInt("pong").value_or(-1), 3); + EXPECT_EQ(result.FindInt("pong").value_or(-1), 3); } } @@ -2314,11 +2302,10 @@ { base::Value::Dict params; params.Set("ping", 12); - base::Value result; + base::Value::Dict result; ASSERT_TRUE(StatusOk( red_client.SendCommandAndGetResult("method", params, &result))); - ASSERT_TRUE(result.is_dict()); - EXPECT_EQ(result.GetDict().FindInt("pong").value_or(-1), 12); + EXPECT_EQ(result.FindInt("pong").value_or(-1), 12); } EXPECT_EQ(71, blue_listener.Ping()); @@ -2737,12 +2724,11 @@ { base::Value::Dict params; params.Set("wrapped-ping", 13); - base::Value result; + base::Value::Dict result; ASSERT_TRUE(StatusOk( page_client.SendCommandAndGetResult("method", params, &result))); EXPECT_EQ(wrapped_counter, 1); - ASSERT_TRUE(result.is_dict()); - EXPECT_EQ(result.GetDict().FindInt("wrapped-pong").value_or(-1), 13); + EXPECT_EQ(result.FindInt("wrapped-pong").value_or(-1), 13); } } @@ -2964,7 +2950,7 @@ ASSERT_TRUE(StatusOk(mapper_client.AppointAsBidiServerForTesting())); ASSERT_TRUE( StatusOk(page_client.SetTunnelSessionId(mapper_client.SessionId()))); - base::Value result; + base::Value::Dict result; page_client.SendCommandAndGetResult("method", base::Value::Dict(), &result); ASSERT_EQ(static_cast<size_t>(0), mapper_bidi_listener.payload_list.size());
diff --git a/chrome/test/chromedriver/chrome/devtools_event_listener.cc b/chrome/test/chromedriver/chrome/devtools_event_listener.cc index 7527057..3a91e40 100644 --- a/chrome/test/chromedriver/chrome/devtools_event_listener.cc +++ b/chrome/test/chromedriver/chrome/devtools_event_listener.cc
@@ -22,11 +22,10 @@ return Status(kOk); } -Status DevToolsEventListener::OnCommandSuccess( - DevToolsClient* client, - const std::string& method, - const base::DictionaryValue* result, - const Timeout& command_timeout) { +Status DevToolsEventListener::OnCommandSuccess(DevToolsClient* client, + const std::string& method, + const base::Value::Dict* result, + const Timeout& command_timeout) { return Status(kOk); }
diff --git a/chrome/test/chromedriver/chrome/devtools_event_listener.h b/chrome/test/chromedriver/chrome/devtools_event_listener.h index 01acd5d7..ae53f806 100644 --- a/chrome/test/chromedriver/chrome/devtools_event_listener.h +++ b/chrome/test/chromedriver/chrome/devtools_event_listener.h
@@ -32,7 +32,7 @@ // Called when a command success response is received. virtual Status OnCommandSuccess(DevToolsClient* client, const std::string& method, - const base::DictionaryValue* result, + const base::Value::Dict* result, const Timeout& command_timeout); // True if the listener should be added to the browser-wide |DevToolsClient|
diff --git a/chrome/test/chromedriver/chrome/javascript_dialog_manager_unittest.cc b/chrome/test/chromedriver/chrome/javascript_dialog_manager_unittest.cc index 2d8ea16..3fded8f 100644 --- a/chrome/test/chromedriver/chrome/javascript_dialog_manager_unittest.cc +++ b/chrome/test/chromedriver/chrome/javascript_dialog_manager_unittest.cc
@@ -97,7 +97,7 @@ // Overridden from StubDevToolsClient: Status SendCommandAndGetResult(const std::string& method, const base::Value::Dict& params, - base::Value* result) override { + base::Value::Dict* result) override { while (closing_count_ > 0) { Status status = listener_->OnEvent(this, "Page.javascriptDialogClosed", base::Value::Dict()); @@ -105,7 +105,6 @@ return status; closing_count_--; } - *result = base::Value(base::Value::Type::DICTIONARY); return Status(kOk); } void AddListener(DevToolsEventListener* listener) override {
diff --git a/chrome/test/chromedriver/chrome/navigation_tracker.cc b/chrome/test/chromedriver/chrome/navigation_tracker.cc index b403f59..b626392d 100644 --- a/chrome/test/chromedriver/chrome/navigation_tracker.cc +++ b/chrome/test/chromedriver/chrome/navigation_tracker.cc
@@ -121,7 +121,7 @@ // (see crbug.com/524079). base::Value::Dict params; params.Set("expression", "1"); - base::Value result; + base::Value::Dict result; Status status = client_->SendCommandAndGetResultWithTimeout( "Runtime.evaluate", params, timeout, &result); if (status.code() == kDisconnected) { @@ -148,7 +148,8 @@ *is_pending = true; return Status(kOk); } - if (status.IsError() || result.FindIntPath("result.value").value_or(0) != 1) { + if (status.IsError() || + result.FindIntByDottedPath("result.value").value_or(0) != 1) { return MakeNavigationCheckFailedStatus(status); } @@ -165,8 +166,8 @@ "DOM.getDocument", empty_params, timeout, &result); if (status.IsError()) return MakeNavigationCheckFailedStatus(status); - std::string* base_url = result.FindStringPath("root.baseURL"); - std::string* doc_url = result.FindStringPath("root.documentURL"); + std::string* base_url = result.FindStringByDottedPath("root.baseURL"); + std::string* doc_url = result.FindStringByDottedPath("root.documentURL"); if (!base_url || !doc_url) return MakeNavigationCheckFailedStatus(status); @@ -198,12 +199,12 @@ bool* exists) { base::Value::Dict params; params.Set("expression", "typeof(getWindowInfo)"); - base::Value result; + base::Value::Dict result; Status status = client_->SendCommandAndGetResultWithTimeout( "Runtime.evaluate", params, timeout, &result); if (status.IsError()) return MakeNavigationCheckFailedStatus(status); - std::string* type = result.FindStringPath("result.value"); + std::string* type = result.FindStringByDottedPath("result.value"); if (!type) return MakeNavigationCheckFailedStatus(status); *exists = *type == "function"; @@ -316,7 +317,7 @@ *loading_state_ = kUnknown; base::Value::Dict params; params.Set("expression", "document.URL"); - base::Value result_dict; + base::Value::Dict result_dict; Status status(kOk); for (int attempt = 0; attempt < 3; attempt++) { status = client_->SendCommandAndGetResultWithTimeout( @@ -329,7 +330,7 @@ if (status.IsError()) return MakeNavigationCheckFailedStatus(status); - std::string* url = result_dict.FindStringPath("result.value"); + std::string* url = result_dict.FindStringByDottedPath("result.value"); if (!url) return MakeNavigationCheckFailedStatus(status); if (GetLoadingState() == kUnknown && url->empty()) @@ -399,12 +400,3 @@ frame_to_state_map_.clear(); SetCurrentFrameInvalid(); } - -Status NavigationTracker::OnCommandSuccess(DevToolsClient* client, - const std::string& method, - const base::DictionaryValue* result, - const Timeout& command_timeout) { - const base::Value::Dict* dict = result->GetIfDict(); - DCHECK(dict); - return OnCommandSuccess(client, method, dict, command_timeout); -}
diff --git a/chrome/test/chromedriver/chrome/navigation_tracker.h b/chrome/test/chromedriver/chrome/navigation_tracker.h index 55ba98d..3dc797fe 100644 --- a/chrome/test/chromedriver/chrome/navigation_tracker.h +++ b/chrome/test/chromedriver/chrome/navigation_tracker.h
@@ -61,12 +61,8 @@ const base::Value::Dict& params) override; Status OnCommandSuccess(DevToolsClient* client, const std::string& method, - const base::DictionaryValue* result, - const Timeout& command_timeout) override; - Status OnCommandSuccess(DevToolsClient* client, - const std::string& method, const base::Value::Dict* result, - const Timeout& command_timeout); + const Timeout& command_timeout) override; private: Status UpdateCurrentLoadingState();
diff --git a/chrome/test/chromedriver/chrome/navigation_tracker_unittest.cc b/chrome/test/chromedriver/chrome/navigation_tracker_unittest.cc index 12e9e4c..866d742c 100644 --- a/chrome/test/chromedriver/chrome/navigation_tracker_unittest.cc +++ b/chrome/test/chromedriver/chrome/navigation_tracker_unittest.cc
@@ -44,27 +44,23 @@ Status SendCommandAndGetResult(const std::string& method, const base::Value::Dict& params, - base::Value* result) override { + base::Value::Dict* result) override { if (method == "DOM.getDocument") { - base::Value::Dict result_dict; if (has_empty_base_url_) { - result_dict.SetByDottedPath("root.baseURL", "about:blank"); - result_dict.SetByDottedPath("root.documentURL", "http://test"); + result->SetByDottedPath("root.baseURL", "about:blank"); + result->SetByDottedPath("root.documentURL", "http://test"); } else { - result_dict.SetByDottedPath("root.baseURL", "http://test"); - result_dict.SetByDottedPath("root.documentURL", "http://test"); + result->SetByDottedPath("root.baseURL", "http://test"); + result->SetByDottedPath("root.documentURL", "http://test"); } - *result = base::Value(std::move(result_dict)); return Status(kOk); } else if (method == "Runtime.evaluate") { const std::string* expression = params.FindString("expression"); if (expression) { - base::Value::Dict result_dict; if (*expression == "1") - result_dict.SetByDottedPath("result.value", 1); + result->SetByDottedPath("result.value", 1); else if (*expression == "document.readyState") - result_dict.SetByDottedPath("result.value", "loading"); - *result = base::Value(std::move(result_dict)); + result->SetByDottedPath("result.value", "loading"); return Status(kOk); } } @@ -78,9 +74,7 @@ } } - base::Value result_dict(base::Value::Type::DICTIONARY); - result_dict.GetDict().SetByDottedPath("result.value", is_loading_); - *result = std::move(result_dict); + result->SetByDottedPath("result.value", is_loading_); return Status(kOk); } @@ -397,16 +391,13 @@ Status SendCommandAndGetResult(const std::string& method, const base::Value::Dict& params, - base::Value* result) override { + base::Value::Dict* result) override { if (!is_dom_getDocument_requested_ && method == "DOM.getDocument") { is_dom_getDocument_requested_ = true; - base::Value result_dict(base::Value::Type::DICTIONARY); - result_dict.GetDict().SetByDottedPath("root.baseURL", "http://test"); - *result = std::move(result_dict); + result->SetByDottedPath("root.baseURL", "http://test"); return Status(kOk); } EXPECT_STREQ("Runtime.evaluate", method.c_str()); - *result = base::Value(base::Value::Type::DICTIONARY); return Status(kUnknownError, "failed to eval script"); } @@ -581,8 +572,7 @@ Status SendCommandAndGetResult(const std::string& method, const base::Value::Dict& params, - base::Value* result) override { - *result = base::Value(base::Value::Type::DICTIONARY); + base::Value::Dict* result) override { return Status(kUnknownError, "Inspected target navigated or closed"); } };
diff --git a/chrome/test/chromedriver/chrome/network_conditions_override_manager.cc b/chrome/test/chromedriver/chrome/network_conditions_override_manager.cc index 4a88a16..8e873735 100644 --- a/chrome/test/chromedriver/chrome/network_conditions_override_manager.cc +++ b/chrome/test/chromedriver/chrome/network_conditions_override_manager.cc
@@ -58,10 +58,10 @@ if (status.IsError()) return status; - base::Value result{base::Value::Type::DICT}; + base::Value::Dict result; status = client_->SendCommandAndGetResult( "Network.canEmulateNetworkConditions", empty_params, &result); - absl::optional<bool> can = result.GetDict().FindBool("result"); + absl::optional<bool> can = result.FindBool("result"); if (status.IsError() || !can) return Status(kUnknownError, "unable to detect if chrome can emulate network conditions", status);
diff --git a/chrome/test/chromedriver/chrome/recorder_devtools_client.cc b/chrome/test/chromedriver/chrome/recorder_devtools_client.cc index 10eeb9f..ec510799 100644 --- a/chrome/test/chromedriver/chrome/recorder_devtools_client.cc +++ b/chrome/test/chromedriver/chrome/recorder_devtools_client.cc
@@ -15,13 +15,12 @@ Status RecorderDevToolsClient::SendCommandAndGetResult( const std::string& method, const base::Value::Dict& params, - base::Value* result) { + base::Value::Dict* result) { commands_.emplace_back(method, params.Clone()); // For any tests that directly call SendCommandAndGetResults, we'll just // always return { "result": true }. Currently only used when testing // "canEmulateNetworkConditions". - *result = base::Value(base::Value::Type::DICTIONARY); - result->SetBoolKey("result", true); + result->Set("result", true); return Status(kOk); }
diff --git a/chrome/test/chromedriver/chrome/recorder_devtools_client.h b/chrome/test/chromedriver/chrome/recorder_devtools_client.h index 3da72780..ac47742 100644 --- a/chrome/test/chromedriver/chrome/recorder_devtools_client.h +++ b/chrome/test/chromedriver/chrome/recorder_devtools_client.h
@@ -40,7 +40,7 @@ // Overridden from StubDevToolsClient: Status SendCommandAndGetResult(const std::string& method, const base::Value::Dict& params, - base::Value* result) override; + base::Value::Dict* result) override; std::vector<Command> commands_; };
diff --git a/chrome/test/chromedriver/chrome/stub_devtools_client.cc b/chrome/test/chromedriver/chrome/stub_devtools_client.cc index f238d090..37d53cf 100644 --- a/chrome/test/chromedriver/chrome/stub_devtools_client.cc +++ b/chrome/test/chromedriver/chrome/stub_devtools_client.cc
@@ -59,7 +59,7 @@ Status StubDevToolsClient::SendCommand(const std::string& method, const base::Value::Dict& params) { - base::Value result; + base::Value::Dict result; return SendCommandAndGetResult(method, params, &result); } @@ -85,8 +85,7 @@ Status StubDevToolsClient::SendCommandAndGetResult( const std::string& method, const base::Value::Dict& params, - base::Value* result) { - *result = base::Value(base::Value::Type::DICTIONARY); + base::Value::Dict* result) { return Status(kOk); } @@ -94,7 +93,7 @@ const std::string& method, const base::Value::Dict& params, const Timeout* timeout, - base::Value* result) { + base::Value::Dict* result) { return SendCommandAndGetResult(method, params, result); }
diff --git a/chrome/test/chromedriver/chrome/stub_devtools_client.h b/chrome/test/chromedriver/chrome/stub_devtools_client.h index c36438c..17184db 100644 --- a/chrome/test/chromedriver/chrome/stub_devtools_client.h +++ b/chrome/test/chromedriver/chrome/stub_devtools_client.h
@@ -42,11 +42,11 @@ const base::Value::Dict& params) override; Status SendCommandAndGetResult(const std::string& method, const base::Value::Dict& params, - base::Value* result) override; + base::Value::Dict* result) override; Status SendCommandAndGetResultWithTimeout(const std::string& method, const base::Value::Dict& params, const Timeout* timeout, - base::Value* result) override; + base::Value::Dict* result) override; Status SendCommandAndIgnoreResponse(const std::string& method, const base::Value::Dict& params) override; void AddListener(DevToolsEventListener* listener) override;
diff --git a/chrome/test/chromedriver/chrome/web_view_impl.cc b/chrome/test/chromedriver/chrome/web_view_impl.cc index 2d63e02..4e60594 100644 --- a/chrome/test/chromedriver/chrome/web_view_impl.cc +++ b/chrome/test/chromedriver/chrome/web_view_impl.cc
@@ -145,21 +145,19 @@ } } -std::unique_ptr<base::DictionaryValue> GenerateTouchPoint( - const TouchEvent& event) { - std::unique_ptr<base::DictionaryValue> point(new base::DictionaryValue()); - base::Value::Dict& dict = point->GetDict(); - dict.Set("x", event.x); - dict.Set("y", event.y); - dict.Set("radiusX", event.radiusX); - dict.Set("radiusY", event.radiusY); - dict.Set("rotationAngle", event.rotationAngle); - dict.Set("force", event.force); - dict.Set("tangentialPressure", event.tangentialPressure); - dict.Set("tiltX", event.tiltX); - dict.Set("tiltY", event.tiltY); - dict.Set("twist", event.twist); - dict.Set("id", event.id); +base::Value::Dict GenerateTouchPoint(const TouchEvent& event) { + base::Value::Dict point; + point.Set("x", event.x); + point.Set("y", event.y); + point.Set("radiusX", event.radiusX); + point.Set("radiusY", event.radiusY); + point.Set("rotationAngle", event.rotationAngle); + point.Set("force", event.force); + point.Set("tangentialPressure", event.tangentialPressure); + point.Set("tiltX", event.tiltX); + point.Set("tiltY", event.tiltY); + point.Set("twist", event.twist); + point.Set("id", event.id); return point; } @@ -195,7 +193,7 @@ base::Value* result_node) { DCHECK(result_node); base::Value::Dict params; - base::Value cmd_result; + base::Value::Dict cmd_result; params.Set("objectId", object_id); params.Set("depth", depth); params.Set("pierce", pierce); @@ -206,9 +204,7 @@ return status; } - DCHECK(cmd_result.is_dict()); - - base::Value* node = cmd_result.GetDict().Find("node"); + base::Value* node = cmd_result.Find("node"); if (!node || !node->is_dict()) { return Status(kUnknownError, "DOM.describeNode missing dictionary 'node'"); } @@ -224,10 +220,8 @@ std::string* frame_id) { DCHECK(frame_id); DCHECK(found_node); - base::DictionaryValue cmd_result; Status status{kOk}; - base::Value node; status = DescribeNode(client, object_id, 0, false, &node); @@ -368,15 +362,15 @@ Status WebViewImpl::GetUrl(std::string* url) { base::Value::Dict params; - base::DictionaryValue result; + base::Value::Dict result; Status status = client_->SendCommandAndGetResult("Page.getNavigationHistory", params, &result); if (status.IsError()) return status; - absl::optional<int> current_index = result.GetDict().FindInt("currentIndex"); + absl::optional<int> current_index = result.FindInt("currentIndex"); if (!current_index) return Status(kUnknownError, "navigation history missing currentIndex"); - base::Value::List* entries = result.GetDict().FindList("entries"); + base::Value::List* entries = result.FindList("entries"); if (!entries) return Status(kUnknownError, "navigation history missing entries"); if (static_cast<int>(entries->size()) <= *current_index || @@ -453,28 +447,27 @@ const std::string& cmd, const base::Value::Dict& params, std::unique_ptr<base::Value>* value) { - std::unique_ptr<base::DictionaryValue> result = - std::make_unique<base::DictionaryValue>(); - Status status = client_->SendCommandAndGetResult(cmd, params, result.get()); + base::Value::Dict result; + Status status = client_->SendCommandAndGetResult(cmd, params, &result); if (status.IsError()) return status; - *value = std::move(result); + *value = std::make_unique<base::Value>(std::move(result)); return Status(kOk); } Status WebViewImpl::TraverseHistory(int delta, const Timeout* timeout) { base::Value::Dict params; - base::DictionaryValue result; + base::Value::Dict result; Status status = client_->SendCommandAndGetResult("Page.getNavigationHistory", params, &result); if (status.IsError()) return status; - absl::optional<int> current_index = result.GetDict().FindInt("currentIndex"); + absl::optional<int> current_index = result.FindInt("currentIndex"); if (!current_index) return Status(kUnknownError, "DevTools didn't return currentIndex"); - base::Value::List* entries = result.GetDict().FindList("entries"); + base::Value::List* entries = result.FindList("entries"); if (!entries) return Status(kUnknownError, "DevTools didn't return entries"); @@ -729,8 +722,8 @@ base::Value::List point_list; Status status(kOk); if (type == "touchStart" || type == "touchMove") { - std::unique_ptr<base::DictionaryValue> point = GenerateTouchPoint(event); - point_list.Append(base::Value::FromUniquePtrValue(std::move(point))); + base::Value::Dict point = GenerateTouchPoint(event); + point_list.Append(std::move(point)); } params.Set("touchPoints", std::move(point_list)); if (async_dispatch_events) { @@ -773,8 +766,7 @@ if (type == "touchCancel") continue; - point_list.Append( - base::Value::FromUniquePtrValue(GenerateTouchPoint(event))); + point_list.Append(GenerateTouchPoint(event)); params.Set("touchPoints", std::move(point_list)); if (async_dispatch_events || touch_count < events.size()) { @@ -883,7 +875,7 @@ Status WebViewImpl::GetCookies(base::Value* cookies, const std::string& current_page_url) { base::Value::Dict params; - base::DictionaryValue result; + base::Value::Dict result; if (browser_info_->browser_name != "webview") { base::Value::List url_list; @@ -900,10 +892,10 @@ return status; } - base::Value* const cookies_tmp = result.FindListKey("cookies"); + base::Value::List* const cookies_tmp = result.FindList("cookies"); if (!cookies_tmp) return Status(kUnknownError, "DevTools didn't return cookies"); - *cookies = cookies_tmp->Clone(); + *cookies = base::Value(std::move(*cookies_tmp)); return Status(kOk); } @@ -943,12 +935,12 @@ if (expiry >= 0) params.Set("expires", expiry); - base::DictionaryValue result; + base::Value::Dict result; Status status = client_->SendCommandAndGetResult("Network.setCookie", params, &result); if (status.IsError()) return Status(kUnableToSetCookie); - if (!result.FindBoolKey("success").value_or(false)) + if (!result.FindBool("success").value_or(false)) return Status(kUnableToSetCookie); return Status(kOk); } @@ -1027,14 +1019,16 @@ Status WebViewImpl::CaptureScreenshot(std::string* screenshot, const base::Value::Dict& params) { - base::DictionaryValue result; + base::Value::Dict result; Timeout timeout(base::Seconds(10)); Status status = client_->SendCommandAndGetResultWithTimeout( "Page.captureScreenshot", params, &timeout, &result); if (status.IsError()) return status; - if (!result.GetString("data", screenshot)) + std::string* data = result.FindString("data"); + if (!data) return Status(kUnknownError, "expected string 'data' in response"); + *screenshot = std::move(*data); return Status(kOk); } @@ -1045,7 +1039,7 @@ return Status(kUnknownError, "PrintToPDF is only supported in headless mode"); } - base::DictionaryValue result; + base::Value::Dict result; Timeout timeout(base::Seconds(10)); Status status = client_->SendCommandAndGetResultWithTimeout( "Page.printToPDF", params, &timeout, &result); @@ -1055,8 +1049,10 @@ } return status; } - if (!result.GetString("data", pdf)) + std::string* data = result.FindString("data"); + if (!data) return Status(kUnknownError, "expected string 'data' in response"); + *pdf = std::move(*data); return Status(kOk); } @@ -1110,21 +1106,24 @@ // Convert the node_id to a Runtime.RemoteObject std::string inner_remote_object_id; { - base::DictionaryValue cmd_result; + base::Value::Dict cmd_result; base::Value::Dict params; params.Set("backendNodeId", backend_node_id); status = client_->SendCommandAndGetResult("DOM.resolveNode", params, &cmd_result); if (status.IsError()) return status; - if (!cmd_result.GetString("object.objectId", &inner_remote_object_id)) + std::string* object_id = + cmd_result.FindStringByDottedPath("object.objectId"); + if (!object_id) return Status(kUnknownError, "DevTools didn't return objectId"); + inner_remote_object_id = std::move(*object_id); } // figure out how many files there are absl::optional<int> number_of_files; { - base::DictionaryValue cmd_result; + base::Value::Dict cmd_result; base::Value::Dict params; params.Set("functionDeclaration", "function() { return this.files.length }"); @@ -1133,7 +1132,7 @@ params, &cmd_result); if (status.IsError()) return status; - number_of_files = cmd_result.FindIntPath("result.value"); + number_of_files = cmd_result.FindIntByDottedPath("result.value"); if (!number_of_files) return Status(kUnknownError, "DevTools didn't return value"); } @@ -1142,7 +1141,7 @@ for (int i = 0; i < *number_of_files; i++) { std::string file_object_id; { - base::DictionaryValue cmd_result; + base::Value::Dict cmd_result; base::Value::Dict params; params.Set("functionDeclaration", "function() { return this.files[" + std::to_string(i) + "] }"); @@ -1152,24 +1151,27 @@ params, &cmd_result); if (status.IsError()) return status; - if (!cmd_result.GetString("result.objectId", &file_object_id)) + std::string* object_id = + cmd_result.FindStringByDottedPath("result.objectId"); + if (!object_id) return Status(kUnknownError, "DevTools didn't return objectId"); + file_object_id = std::move(*object_id); } // Now convert each RemoteObject into the full path { base::Value::Dict params; params.Set("objectId", file_object_id); - base::DictionaryValue get_file_info_result; + base::Value::Dict get_file_info_result; status = client_->SendCommandAndGetResult("DOM.getFileInfo", params, &get_file_info_result); if (status.IsError()) return status; // Add the full path to the file_list - std::string full_path; - if (!get_file_info_result.GetString("path", &full_path)) + std::string* full_path = get_file_info_result.FindString("path"); + if (!full_path) return Status(kUnknownError, "DevTools didn't return path"); - file_list.Append(full_path); + file_list.Append(std::move(*full_path)); } } } @@ -1228,11 +1230,10 @@ Status WebViewImpl::EndProfile(std::unique_ptr<base::Value>* profile_data) { base::Value::Dict params; - std::unique_ptr<base::DictionaryValue> profile_result = - std::make_unique<base::DictionaryValue>(); + base::Value::Dict profile_result; Status status = client_->SendCommandAndGetResult("Profiler.stop", params, - profile_result.get()); + &profile_result); if (status.IsError()) { Status disable_profile_status = StopProfileInternal(); @@ -1241,7 +1242,7 @@ return status; } - *profile_data = std::move(profile_result); + *profile_data = std::make_unique<base::Value>(std::move(profile_result)); return status; } @@ -1470,7 +1471,7 @@ } params.Set("returnByValue", return_type == ReturnByValue); params.Set("awaitPromise", await_promise); - base::Value cmd_result; + base::Value::Dict cmd_result; Timeout local_timeout(timeout); Status status = client->SendCommandAndGetResultWithTimeout( @@ -1478,18 +1479,17 @@ if (status.IsError()) return status; - base::Value::Dict* cmd_dict = cmd_result.GetIfDict(); - if (cmd_dict && cmd_dict->contains("exceptionDetails")) { + if (cmd_result.contains("exceptionDetails")) { std::string description = "unknown"; if (const std::string* maybe_description = - cmd_dict->FindStringByDottedPath("result.description")) { + cmd_result.FindStringByDottedPath("result.description")) { description = *maybe_description; } return Status(kUnknownError, "Runtime.evaluate threw exception: " + description); } - base::Value::Dict* unscoped_result = cmd_dict->FindDict("result"); + base::Value::Dict* unscoped_result = cmd_result.FindDict("result"); if (!unscoped_result) return Status(kUnknownError, "evaluate missing dictionary 'result'"); result = std::move(*unscoped_result); @@ -1608,7 +1608,7 @@ RemoteObjectReleaseGuard release_guard(client, element_id); - base::DictionaryValue cmd_result; + base::Value::Dict cmd_result; { base::Value::Dict params; params.Set("objectId", element_id); @@ -1618,9 +1618,7 @@ if (status.IsError()) return status; - DCHECK(cmd_result.is_dict()); - - base::Value* node = cmd_result.GetDict().Find("node"); + base::Value* node = cmd_result.Find("node"); if (!node || !node->is_dict()) { return Status(kUnknownError, "Dom.describeNode missing dictionary 'node'"); }
diff --git a/chrome/test/chromedriver/chrome/web_view_impl_unittest.cc b/chrome/test/chromedriver/chrome/web_view_impl_unittest.cc index 7a7d9267..e125aaa7 100644 --- a/chrome/test/chromedriver/chrome/web_view_impl_unittest.cc +++ b/chrome/test/chromedriver/chrome/web_view_impl_unittest.cc
@@ -41,10 +41,10 @@ // Overridden from DevToolsClient: Status SendCommandAndGetResult(const std::string& method, const base::Value::Dict& params, - base::Value* result) override { + base::Value::Dict* result) override { if (status_.IsError()) return status_; - *result = base::Value(result_.Clone()); + *result = result_.Clone(); return Status(kOk); }
diff --git a/chrome/test/chromedriver/commands.cc b/chrome/test/chromedriver/commands.cc index b5613ff..dc7a79d7 100644 --- a/chrome/test/chromedriver/commands.cc +++ b/chrome/test/chromedriver/commands.cc
@@ -39,24 +39,23 @@ // W3C defined data: // ChromeDriver doesn't have a preset limit on number of active sessions, // so we are always ready. - base::DictionaryValue info; - info.GetDict().Set("ready", true); - info.GetDict().Set("message", - base::StringPrintf("%s ready for new sessions.", - kChromeDriverProductShortName)); + base::Value::Dict info; + info.Set("ready", true); + info.Set("message", base::StringPrintf("%s ready for new sessions.", + kChromeDriverProductShortName)); // ChromeDriver specific data: - base::DictionaryValue build; - build.GetDict().Set("version", kChromeDriverVersion); - info.SetKey("build", std::move(build)); + base::Value::Dict build; + build.Set("version", kChromeDriverVersion); + info.Set("build", std::move(build)); - base::DictionaryValue os; - os.GetDict().Set("name", base::SysInfo::OperatingSystemName()); - os.GetDict().Set("version", base::SysInfo::OperatingSystemVersion()); - os.GetDict().Set("arch", base::SysInfo::OperatingSystemArchitecture()); - info.SetKey("os", std::move(os)); + base::Value::Dict os; + os.Set("name", base::SysInfo::OperatingSystemName()); + os.Set("version", base::SysInfo::OperatingSystemVersion()); + os.Set("arch", base::SysInfo::OperatingSystemArchitecture()); + info.Set("os", std::move(os)); - callback.Run(Status(kOk), base::Value::ToUniquePtrValue(std::move(info)), + callback.Run(Status(kOk), std::make_unique<base::Value>(std::move(info)), std::string(), kW3CDefault); }
diff --git a/chrome/test/chromedriver/element_commands.cc b/chrome/test/chromedriver/element_commands.cc index f00e5c2..74fe9f3e 100644 --- a/chrome/test/chromedriver/element_commands.cc +++ b/chrome/test/chromedriver/element_commands.cc
@@ -994,12 +994,12 @@ if (!maybe_width.has_value()) return Status(kUnknownError, "width is missing in element size"); - base::DictionaryValue ret; - ret.SetDoubleKey("x", maybe_x.value()); - ret.SetDoubleKey("y", maybe_y.value()); - ret.SetDoubleKey("width", maybe_width.value()); - ret.SetDoubleKey("height", maybe_height.value()); - *value = base::Value::ToUniquePtrValue(ret.Clone()); + base::Value::Dict ret; + ret.Set("x", maybe_x.value()); + ret.Set("y", maybe_y.value()); + ret.Set("width", maybe_width.value()); + ret.Set("height", maybe_height.value()); + *value = std::make_unique<base::Value>(std::move(ret)); return Status(kOk); } @@ -1015,7 +1015,7 @@ session, web_view, element_id, &offset, &location); if (status.IsError()) return status; - *value = CreateValueFrom(location); + *value = std::make_unique<base::Value>(CreateValueFrom(location)); return Status(kOk); }
diff --git a/chrome/test/chromedriver/element_util.cc b/chrome/test/chromedriver/element_util.cc index 70fdc4b..d15a400 100644 --- a/chrome/test/chromedriver/element_util.cc +++ b/chrome/test/chromedriver/element_util.cc
@@ -92,12 +92,12 @@ return true; } -std::unique_ptr<base::DictionaryValue> CreateValueFrom(const WebRect& rect) { - std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); - dict->SetIntKey("left", rect.X()); - dict->SetIntKey("top", rect.Y()); - dict->SetIntKey("width", rect.Width()); - dict->SetIntKey("height", rect.Height()); +base::Value::Dict CreateValueFrom(const WebRect& rect) { + base::Value::Dict dict; + dict.Set("left", static_cast<int>(rect.X())); + dict.Set("top", static_cast<int>(rect.Y())); + dict.Set("width", static_cast<int>(rect.Width())); + dict.Set("height", static_cast<int>(rect.Height())); return dict; } @@ -120,7 +120,7 @@ return status; base::Value::List args; args.Append(CreateElement(element_id)); - args.Append(base::Value::FromUniquePtrValue(CreateValueFrom(location))); + args.Append(CreateValueFrom(location)); std::unique_ptr<base::Value> result; status = CallAtomsJs( frame, web_view, webdriver::atoms::IS_ELEMENT_CLICKABLE, @@ -162,7 +162,7 @@ base::Value::List args; args.Append(CreateElement(element_id)); args.Append(center); - args.Append(base::Value::FromUniquePtrValue(CreateValueFrom(region))); + args.Append(CreateValueFrom(region)); std::unique_ptr<base::Value> result; status = web_view->CallFunction( frame, webdriver::atoms::asString(webdriver::atoms::GET_LOCATION_IN_VIEW), @@ -349,10 +349,10 @@ return CreateElementCommon(kShadowRootKey, shadow_root_id); } -std::unique_ptr<base::DictionaryValue> CreateValueFrom(const WebPoint& point) { - std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); - dict->SetIntKey("x", point.x); - dict->SetIntKey("y", point.y); +base::Value::Dict CreateValueFrom(const WebPoint& point) { + base::Value::Dict dict; + dict.Set("x", static_cast<int>(point.x)); + dict.Set("y", static_cast<int>(point.y)); return dict; }
diff --git a/chrome/test/chromedriver/element_util.h b/chrome/test/chromedriver/element_util.h index c8b2800..9d3df43 100644 --- a/chrome/test/chromedriver/element_util.h +++ b/chrome/test/chromedriver/element_util.h
@@ -19,7 +19,7 @@ base::Value CreateElement(const std::string& element_id); -std::unique_ptr<base::DictionaryValue> CreateValueFrom(const WebPoint& point); +base::Value::Dict CreateValueFrom(const WebPoint& point); Status CheckElement(const std::string& element_id);
diff --git a/chrome/test/chromedriver/performance_logger_unittest.cc b/chrome/test/chromedriver/performance_logger_unittest.cc index afc81b0..a35876d4 100644 --- a/chrome/test/chromedriver/performance_logger_unittest.cc +++ b/chrome/test/chromedriver/performance_logger_unittest.cc
@@ -64,11 +64,10 @@ Status SendCommandAndGetResult(const std::string& method, const base::Value::Dict& params, - base::Value* result) override { + base::Value::Dict* result) override { auto dict = std::make_unique<base::Value::Dict>(params.Clone()); sent_commands_.push_back( std::make_unique<DevToolsCommand>(method, dict.release())); - *result = base::Value(base::Value::Type::DICTIONARY); return Status(kOk); }
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc index 81bd2040..b794191 100644 --- a/chrome/test/chromedriver/session_commands.cc +++ b/chrome/test/chromedriver/session_commands.cc
@@ -153,108 +153,106 @@ namespace { -// Creates a JSON object (represented by base::DictionaryValue) that contains +// Creates a JSON object (represented by base::Value::Dict) that contains // the capabilities, for returning to the client app as the result of New // Session command. -std::unique_ptr<base::Value::Dict> CreateCapabilities( - Session* session, - const Capabilities& capabilities, - const base::DictionaryValue& desired_caps) { - auto caps = std::make_unique<base::Value::Dict>(); +base::Value::Dict CreateCapabilities(Session* session, + const Capabilities& capabilities, + const base::Value::Dict& desired_caps) { + base::Value::Dict caps; // Capabilities defined by W3C. Some of these capabilities have different // names in legacy mode. - caps->Set("browserName", base::ToLowerASCII(kBrowserShortName)); - caps->Set(session->w3c_compliant ? "browserVersion" : "version", - session->chrome->GetBrowserInfo()->browser_version); + caps.Set("browserName", base::ToLowerASCII(kBrowserShortName)); + caps.Set(session->w3c_compliant ? "browserVersion" : "version", + session->chrome->GetBrowserInfo()->browser_version); std::string os_name = session->chrome->GetOperatingSystemName(); if (os_name.find("Windows") != std::string::npos) os_name = "Windows"; if (session->w3c_compliant) { - caps->Set("platformName", base::ToLowerASCII(os_name)); + caps.Set("platformName", base::ToLowerASCII(os_name)); } else { - caps->Set("platform", os_name); + caps.Set("platform", os_name); } - caps->Set("pageLoadStrategy", session->chrome->page_load_strategy()); - caps->Set("acceptInsecureCerts", capabilities.accept_insecure_certs); + caps.Set("pageLoadStrategy", session->chrome->page_load_strategy()); + caps.Set("acceptInsecureCerts", capabilities.accept_insecure_certs); - const base::Value* proxy = desired_caps.FindKey("proxy"); + const base::Value* proxy = desired_caps.Find("proxy"); if (proxy == nullptr || proxy->is_none()) - caps->Set("proxy", base::Value(base::Value::Type::DICTIONARY)); + caps.Set("proxy", base::Value::Dict()); else - caps->Set("proxy", proxy->Clone()); + caps.Set("proxy", proxy->Clone()); // add setWindowRect based on whether we are desktop/android/remote if (capabilities.IsAndroid() || capabilities.IsRemoteBrowser()) { - caps->Set("setWindowRect", false); + caps.Set("setWindowRect", false); } else { - caps->Set("setWindowRect", true); + caps.Set("setWindowRect", true); } if (session->script_timeout == base::TimeDelta::Max()) { - caps->SetByDottedPath("timeouts.script", base::Value()); + caps.SetByDottedPath("timeouts.script", base::Value()); } else { - SetSafeInt(*caps, "timeouts.script", + SetSafeInt(caps, "timeouts.script", session->script_timeout.InMilliseconds()); } - SetSafeInt(*caps, "timeouts.pageLoad", + SetSafeInt(caps, "timeouts.pageLoad", session->page_load_timeout.InMilliseconds()); - SetSafeInt(*caps, "timeouts.implicit", + SetSafeInt(caps, "timeouts.implicit", session->implicit_wait.InMilliseconds()); - caps->Set("strictFileInteractability", session->strict_file_interactability); - caps->Set(session->w3c_compliant ? "unhandledPromptBehavior" - : "unexpectedAlertBehaviour", - session->unhandled_prompt_behavior); + caps.Set("strictFileInteractability", session->strict_file_interactability); + caps.Set(session->w3c_compliant ? "unhandledPromptBehavior" + : "unexpectedAlertBehaviour", + session->unhandled_prompt_behavior); // Extensions defined by the W3C. // See https://w3c.github.io/webauthn/#sctn-automation-webdriver-capability - caps->Set("webauthn:virtualAuthenticators", !capabilities.IsAndroid()); - caps->Set("webauthn:extension:largeBlob", !capabilities.IsAndroid()); - caps->Set("webauthn:extension:credBlob", !capabilities.IsAndroid()); + caps.Set("webauthn:virtualAuthenticators", !capabilities.IsAndroid()); + caps.Set("webauthn:extension:largeBlob", !capabilities.IsAndroid()); + caps.Set("webauthn:extension:credBlob", !capabilities.IsAndroid()); // Chrome-specific extensions. const std::string chrome_driver_version_key = base::StringPrintf( "%s.%sVersion", base::ToLowerASCII(kBrowserShortName).c_str(), base::ToLowerASCII(kChromeDriverProductShortName).c_str()); - caps->SetByDottedPath(chrome_driver_version_key, kChromeDriverVersion); + caps.SetByDottedPath(chrome_driver_version_key, kChromeDriverVersion); const std::string debugger_address_key = base::StringPrintf("%s.debuggerAddress", kChromeDriverOptionsKeyPrefixed); - caps->SetByDottedPath(debugger_address_key, session->chrome->GetBrowserInfo() - ->debugger_endpoint.Address() - .ToString()); + caps.SetByDottedPath(debugger_address_key, session->chrome->GetBrowserInfo() + ->debugger_endpoint.Address() + .ToString()); ChromeDesktopImpl* desktop = nullptr; Status status = session->chrome->GetAsDesktop(&desktop); if (status.IsOk()) { const std::string user_data_key = base::StringPrintf( "%s.userDataDir", base::ToLowerASCII(kBrowserShortName).c_str()); - caps->SetByDottedPath( + caps.SetByDottedPath( user_data_key, desktop->command().GetSwitchValuePath("user-data-dir").AsUTF8Unsafe()); - caps->Set("networkConnectionEnabled", - desktop->IsNetworkConnectionEnabled()); + caps.Set("networkConnectionEnabled", desktop->IsNetworkConnectionEnabled()); } // Legacy capabilities. if (!session->w3c_compliant) { - caps->Set("javascriptEnabled", true); - caps->Set("takesScreenshot", true); - caps->Set("takesHeapSnapshot", true); - caps->Set("handlesAlerts", true); - caps->Set("databaseEnabled", false); - caps->Set("locationContextEnabled", true); - caps->Set("mobileEmulationEnabled", - session->chrome->IsMobileEmulationEnabled()); - caps->Set("browserConnectionEnabled", false); - caps->Set("cssSelectorsEnabled", true); - caps->Set("webStorageEnabled", true); - caps->Set("rotatable", false); - caps->Set("acceptSslCerts", capabilities.accept_insecure_certs); - caps->Set("nativeEvents", true); - caps->Set("hasTouchScreen", session->chrome->HasTouchScreen()); + caps.Set("javascriptEnabled", true); + caps.Set("takesScreenshot", true); + caps.Set("takesHeapSnapshot", true); + caps.Set("handlesAlerts", true); + caps.Set("databaseEnabled", false); + caps.Set("locationContextEnabled", true); + caps.Set("mobileEmulationEnabled", + session->chrome->IsMobileEmulationEnabled()); + caps.Set("browserConnectionEnabled", false); + caps.Set("cssSelectorsEnabled", true); + caps.Set("webStorageEnabled", true); + caps.Set("rotatable", false); + caps.Set("acceptSslCerts", capabilities.accept_insecure_certs); + caps.Set("nativeEvents", true); + caps.Set("hasTouchScreen", session->chrome->HasTouchScreen()); } if (session->webSocketUrl) { - caps->Set("webSocketUrl", - "ws://" + session->host + "/session/" + session->id); + caps.Set("webSocketUrl", + "ws://" + session->host + "/session/" + session->id); } return caps; @@ -285,12 +283,12 @@ Session* session, const base::Value::Dict& params, std::unique_ptr<base::Value>* value) { - const base::DictionaryValue* desired_caps; - base::DictionaryValue merged_caps; + const base::Value::Dict* desired_caps; + base::Value::Dict merged_caps; Capabilities capabilities; - Status status = internal::ConfigureSession(session, params, &desired_caps, - &merged_caps, &capabilities); + Status status = internal::ConfigureSession(session, params, desired_caps, + merged_caps, &capabilities); if (status.IsError()) return status; @@ -344,8 +342,8 @@ if (status.IsError()) return status; session->detach = capabilities.detach; - session->capabilities = - CreateCapabilities(session, capabilities, *desired_caps); + session->capabilities = std::make_unique<base::Value::Dict>( + CreateCapabilities(session, capabilities, *desired_caps)); status = internal::ConfigureHeadlessSession(session, capabilities); if (status.IsError()) @@ -371,6 +369,15 @@ return status; session->bidi_mapper_web_view_id = session->window; + // Wait until the default page navigation is over to prevent the mapper + // from begin evicted by the navigation. + status = web_view->WaitForPendingNavigations( + session->GetCurrentFrameId(), Timeout(session->page_load_timeout), + true); + if (status.IsError()) { + return status; + } + status = web_view->StartBidiServer(kMapperScript); if (status.IsError()) { return status; @@ -404,28 +411,26 @@ Status ConfigureSession(Session* session, const base::Value::Dict& params, - const base::DictionaryValue** desired_caps, - base::DictionaryValue* merged_caps, + const base::Value::Dict*& desired_caps, + base::Value::Dict& merged_caps, Capabilities* capabilities) { session->driver_log = std::make_unique<WebDriverLog>(WebDriverLog::kDriverType, Log::kAll); session->w3c_compliant = GetW3CSetting(params); if (session->w3c_compliant) { - Status status = ProcessCapabilities(params, merged_caps->GetDict()); + Status status = ProcessCapabilities(params, merged_caps); if (status.IsError()) return status; - *desired_caps = merged_caps; + desired_caps = &merged_caps; } else { - const base::Value* caps = params.Find("desiredCapabilities"); - if (!caps || !caps->is_dict()) + const base::Value::Dict* caps = params.FindDict("desiredCapabilities"); + if (!caps) return Status(kSessionNotCreated, "Missing or invalid capabilities"); - - *desired_caps = static_cast<const base::DictionaryValue*>(caps); + desired_caps = caps; } - Status status = - capabilities->Parse((*desired_caps)->GetDict(), session->w3c_compliant); + Status status = capabilities->Parse(*desired_caps, session->w3c_compliant); if (status.IsError()) return status;
diff --git a/chrome/test/chromedriver/session_commands.h b/chrome/test/chromedriver/session_commands.h index 528205c8..124748e 100644 --- a/chrome/test/chromedriver/session_commands.h +++ b/chrome/test/chromedriver/session_commands.h
@@ -175,10 +175,12 @@ Status ConfigureHeadlessSession(Session* session, const Capabilities& capabilities); +// On return `desired_caps` either points at `merged_caps`, or points to some +// field in `params`. Status ConfigureSession(Session* session, const base::Value::Dict& params, - const base::DictionaryValue** desired_caps, - base::DictionaryValue* merged_caps, + const base::Value::Dict*& desired_caps, + base::Value::Dict& merged_caps, Capabilities* capabilities); } // namespace internal
diff --git a/chrome/test/chromedriver/session_commands_unittest.cc b/chrome/test/chromedriver/session_commands_unittest.cc index 4e9ecc2..90bdd50e 100644 --- a/chrome/test/chromedriver/session_commands_unittest.cc +++ b/chrome/test/chromedriver/session_commands_unittest.cc
@@ -593,15 +593,14 @@ base::Value::Dict* params_in = value.GetIfDict(); ASSERT_TRUE(params_in); - const base::DictionaryValue* desired_caps_out; - base::DictionaryValue merged_out; + const base::Value::Dict* desired_caps_out = nullptr; + base::Value::Dict merged_out; Capabilities capabilities_out; Status status = internal::ConfigureSession( - &session, *params_in, &desired_caps_out, &merged_out, &capabilities_out); + &session, *params_in, desired_caps_out, merged_out, &capabilities_out); ASSERT_EQ(kOk, status.code()) << status.message(); // Verify out parameters have been set - ASSERT_TRUE(desired_caps_out->is_dict()); - ASSERT_TRUE(merged_out.is_dict()); + ASSERT_NE(desired_caps_out, nullptr); ASSERT_TRUE(capabilities_out.logging_prefs["driver"]); // Verify session settings are correct ASSERT_EQ(kAccept, session.unhandled_prompt_behavior); @@ -627,15 +626,14 @@ .value(); const base::Value::Dict* params_in = value.GetIfDict(); ASSERT_TRUE(params_in); - const base::DictionaryValue* desired_caps_out; - base::DictionaryValue merged_out; + const base::Value::Dict* desired_caps_out = nullptr; + base::Value::Dict merged_out; Capabilities capabilities_out; Status status = internal::ConfigureSession( - &session, *params_in, &desired_caps_out, &merged_out, &capabilities_out); + &session, *params_in, desired_caps_out, merged_out, &capabilities_out); ASSERT_EQ(kOk, status.code()) << status.message(); - ASSERT_TRUE(desired_caps_out->is_dict()); - ASSERT_TRUE(merged_out.is_dict()); + ASSERT_NE(desired_caps_out, nullptr); // Testing specific values could be fragile, but want to verify they are set ASSERT_EQ(base::Seconds(0), session.implicit_wait); ASSERT_EQ(base::Seconds(300), session.page_load_timeout); @@ -663,14 +661,14 @@ .value(); const base::Value::Dict* params_in = value.GetIfDict(); ASSERT_TRUE(params_in); - const base::DictionaryValue* desired_caps_out; - base::DictionaryValue merged_out; + const base::Value::Dict* desired_caps_out = nullptr; + base::Value::Dict merged_out; Capabilities capabilities_out; Status status = internal::ConfigureSession( - &session, *params_in, &desired_caps_out, &merged_out, &capabilities_out); + &session, *params_in, desired_caps_out, merged_out, &capabilities_out); ASSERT_EQ(kOk, status.code()) << status.message(); - ASSERT_TRUE(desired_caps_out->is_dict()); + ASSERT_NE(desired_caps_out, nullptr); // legacy values: ASSERT_EQ(kIgnore, session.unhandled_prompt_behavior); }
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py index 8ae5abd8..a8957645 100755 --- a/chrome/test/chromedriver/test/run_py_tests.py +++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -96,8 +96,6 @@ 'ChromeSwitchesCapabilityTest.*', 'ChromeExtensionsCapabilityTest.*', 'MobileEmulationCapabilityTest.*', - # Flaky https://bugs.chromium.org/p/chromium/issues/detail?id=1378464 - 'BidiTest.*', ]
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/search_page_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/search_page_test.js index 1e24ad2..a3043a1 100644 --- a/chrome/test/data/webui/chromeos/os_feedback_ui/search_page_test.js +++ b/chrome/test/data/webui/chromeos/os_feedback_ui/search_page_test.js
@@ -13,7 +13,7 @@ import {assertEquals, assertFalse, assertNotEquals, assertTrue} from 'chrome://webui-test/chromeos/chai_assert.js'; import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; -import {eventToPromise} from '../test_util.js'; +import {eventToPromise, isVisible} from '../test_util.js'; export function searchPageTestSuite() { /** @type {?SearchPageElement} */ @@ -214,7 +214,7 @@ 'Whenever I try to open ANY file (MS or otherwise) I get a notice ' + 'that says “checking to find Microsoft 365 Subscription” I have ' + 'Office on my PC, but not on my Chromebook. How do I run Word Online ' + - 'on a Chromebook? '; + 'on a Chromebook?'; textAreaElement.value = longTextNoResult; textAreaElement.dispatchEvent(new Event('input')); await flushTasks(); @@ -366,7 +366,7 @@ const errorMsg = getElement('#emptyErrorContainer'); // Verify that the error message is hidden in the beginning. - assertTrue(errorMsg.hidden); + assertFalse(isVisible(errorMsg)); const textInput = getElement('#descriptionText'); assertTrue(textInput.value.length === 0); @@ -376,18 +376,30 @@ const buttonContinue = getElement('#buttonContinue'); buttonContinue.click(); - // Verify that the message is not hidden now. - assertFalse(errorMsg.hidden); - assertEquals('Description is required', errorMsg.textContent.trim()); + // Verify that the message is visible now. + assertTrue(isVisible(errorMsg)); + assertEquals('Description is required', errorMsg.textContent.trim()); // Verify that the textarea received focus again. assertEquals(getDeepActiveElement(), textInput); + // Now enter some spaces. The error message should still be visible. + textInput.value = ' '; + textInput.dispatchEvent(new Event('input')); + + assertTrue(isVisible(errorMsg)); + // Now enter some text. The error message should be hidden again. textInput.value = 'hello'; textInput.dispatchEvent(new Event('input')); - assertTrue(errorMsg.hidden); + assertFalse(isVisible(errorMsg)); + + // Verify that all whitespace input is treated as empty. + textInput.value = ' '; + buttonContinue.click(); + assertTrue(isVisible(errorMsg)); + assertEquals(getDeepActiveElement(), textInput); }); /**
diff --git a/chrome/test/data/webui/new_tab_page/lens_upload_dialog_test.ts b/chrome/test/data/webui/new_tab_page/lens_upload_dialog_test.ts index e5da2824..3647608 100644 --- a/chrome/test/data/webui/new_tab_page/lens_upload_dialog_test.ts +++ b/chrome/test/data/webui/new_tab_page/lens_upload_dialog_test.ts
@@ -269,16 +269,17 @@ assertEquals(url, submittedUrl); }); - test('dragenter event should transition to dragging state', async () => { - // Arrange. - uploadDialog.openDialog(); - await waitAfterNextRender(uploadDialog); - // Act. - uploadDialog.$.dragDropArea.dispatchEvent(new DragEvent('dragenter')); - await waitAfterNextRender(uploadDialog); - // Assert. - assertTrue(uploadDialog.hasAttribute('is-dragging_')); - }); + // TODO (crbug/1399340): De-flake this test. + // test('dragenter event should transition to dragging state', async () => { + // // Arrange. + // uploadDialog.openDialog(); + // await waitAfterNextRender(uploadDialog); + // // Act. + // uploadDialog.$.dragDropArea.dispatchEvent(new DragEvent('dragenter')); + // await waitAfterNextRender(uploadDialog); + // // Assert. + // assertTrue(uploadDialog.hasAttribute('is-dragging_')); + // }); test( 'dragenter then dragleave event should transition to normal state',
diff --git a/chrome/test/data/webui/settings/BUILD.gn b/chrome/test/data/webui/settings/BUILD.gn index 3bdbb327..f0b811f 100644 --- a/chrome/test/data/webui/settings/BUILD.gn +++ b/chrome/test/data/webui/settings/BUILD.gn
@@ -7,95 +7,62 @@ import("//tools/typescript/ts_library.gni") import("//ui/webui/resources/tools/generate_grd.gni") -# Test files that contain // <if expr> and therefore require preprocessing. -preprocessed_files = [ - "about_page_tests.ts", - "appearance_page_test.ts", - "autofill_page_test.ts", - "battery_page_test.ts", - "clear_browsing_data_test.ts", - "cookies_page_test.ts", - "downloads_page_test.ts", - "password_check_test.ts", - "password_edit_dialog_test.ts", - "password_view_test.ts", - "people_page_test.ts", - "people_page_sync_page_test.ts", - "performance_page_test.ts", - "personalization_options_test.ts", - "privacy_page_test.ts", - "route_tests.ts", - "secure_dns_test.ts", - "security_page_test.ts", - "settings_menu_test.ts", - "settings_toggle_button_tests.ts", - "site_list_entry_tests.ts", - "sync_account_control_test.ts", - "test_about_page_browser_proxy.ts", - "test_lifetime_browser_proxy.ts", - "test_privacy_page_browser_proxy.ts", - "test_security_keys_browser_proxy.ts", - "test_sync_browser_proxy.ts", -] - -if (is_mac) { - preprocessed_files += [ "passkey_edit_dialog_test.ts" ] -} - -if (!is_chromeos_ash) { - preprocessed_files += [ - "test_languages_browser_proxy.ts", - "spell_check_page_tests.ts", - "languages_page_metrics_test_browser.ts", - "languages_tests.ts", - "translate_page_metrics_test_browser.ts", - "spell_check_page_metrics_test_browser.ts", - ] -} - -# Test files that do not require preprocessing. If adding // <if expr> to any -# file below, move it to the list above. -non_preprocessed_files = [ +files = [ "a11y/about_a11y_test.ts", "a11y/accessibility_a11y_test.ts", "a11y/basic_a11y_test.ts", "a11y/manage_profile_a11y_test.ts", "a11y/passwords_a11y_test.ts", "a11y/sign_out_a11y_test.ts", + "about_page_tests.ts", "advanced_page_test.ts", "all_sites_tests.ts", "appearance_fonts_page_test.ts", + "appearance_page_test.ts", + "autofill_page_test.ts", "autofill_section_test.ts", "avatar_icon_test.ts", "basic_page_test.ts", + "battery_page_test.ts", "category_default_setting_tests.ts", "category_setting_exceptions_tests.ts", "checkbox_tests.ts", "chooser_exception_list_entry_tests.ts", "chooser_exception_list_tests.ts", + "clear_browsing_data_test.ts", "collapse_radio_button_tests.ts", "controlled_button_tests.ts", "controlled_radio_button_tests.ts", + "cookies_page_test.ts", "do_not_track_toggle_test.ts", + "downloads_page_test.ts", "dropdown_menu_tests.ts", "extension_controlled_indicator_tests.ts", "fake_settings_private.ts", "help_page_test.ts", "idle_load_tests.ts", "on_startup_page_tests.ts", + "password_check_test.ts", + "password_edit_dialog_test.ts", "passwords_and_autofill_fake_data.ts", "passwords_device_section_test.ts", "passwords_export_dialog_test.ts", "passwords_import_dialog_test.ts", "passwords_section_test.ts", + "password_view_test.ts", "payments_section_interactive_test.ts", "payments_section_test.ts", "people_page_sync_controls_test.ts", "people_page_sync_page_interactive_test.ts", + "people_page_sync_page_test.ts", + "people_page_test.ts", + "performance_page_test.ts", + "personalization_options_test.ts", "prefs_test_cases.ts", "prefs_tests.ts", "pref_util_tests.ts", "privacy_guide_page_test.ts", + "privacy_page_test.ts", "privacy_sandbox_page_test.ts", "privacy_sandbox_test.ts", "protocol_handlers_tests.ts", @@ -104,6 +71,7 @@ "reset_profile_banner_test.ts", "review_notification_permissions_interactive_ui_test.ts", "review_notification_permissions_test.ts", + "route_tests.ts", "safety_check_page_test.ts", "safety_check_permissions_test.ts", "safety_check_test_utils.ts", @@ -111,107 +79,121 @@ "search_page_test.ts", "search_settings_test.ts", "secure_dns_interactive_test.ts", + "secure_dns_test.ts", "security_keys_bio_enrollment_test.ts", "security_keys_credential_management_test.ts", "security_keys_reset_dialog_test.ts", "security_keys_set_pin_dialog_test.ts", "security_keys_test_util.ts", "security_keys_phones_subpage_test.ts", + "security_page_test.ts", "settings_animated_pages_test.ts", "settings_category_default_radio_group_tests.ts", "settings_main_test.ts", "settings_menu_interactive_ui_test.ts", + "settings_menu_test.ts", "settings_page_test_util.ts", "settings_performance_menu_test.ts", "settings_slider_tests.ts", "settings_subpage_test.ts", + "settings_toggle_button_tests.ts", "settings_ui_tests.ts", "site_details_permission_tests.ts", "site_details_tests.ts", "site_entry_tests.ts", "site_favicon_test.ts", + "site_list_entry_tests.ts", "site_list_tests.ts", "site_settings_page_test.ts", "startup_urls_page_test.ts", + "sync_account_control_test.ts", "sync_test_util.ts", "tab_discard_exception_dialog_test.ts", + "test_about_page_browser_proxy.ts", "test_clear_browsing_data_browser_proxy.ts", "test_extension_control_browser_proxy.ts", "test_hats_browser_proxy.ts", + "test_lifetime_browser_proxy.ts", "test_metrics_browser_proxy.ts", "test_open_window_proxy.ts", "test_password_manager_proxy.ts", "test_performance_browser_proxy.ts", "test_performance_metrics_proxy.ts", + "test_privacy_page_browser_proxy.ts", "test_profile_info_browser_proxy.ts", "test_reset_browser_proxy.ts", "test_search_engines_browser_proxy.ts", + "test_security_keys_browser_proxy.ts", "test_site_settings_permissions_browser_proxy.ts", "test_site_settings_prefs_browser_proxy.ts", + "test_sync_browser_proxy.ts", "test_util.ts", "unused_site_permissions_test.ts", "zoom_levels_tests.ts", ] -if (!is_chromeos) { - non_preprocessed_files += [ - "default_browser_test.ts", - "import_data_dialog_test.ts", - "system_page_tests.ts", - ] -} else { - non_preprocessed_files += [ "passwords_section_test_cros.ts" ] -} - -if (!is_mac && !is_chromeos_ash) { - non_preprocessed_files += [ "edit_dictionary_page_test.ts" ] -} - if (is_chromeos_ash) { - non_preprocessed_files += [ + files += [ "people_page_test_cros.ts", "site_list_tests_cros.ts", "test_android_info_browser_proxy.ts", ] } else { - non_preprocessed_files += [ + files += [ "fake_language_settings_private.ts", - "translate_page_tests.ts", + "languages_page_metrics_test_browser.ts", "languages_page_tests.ts", + "languages_tests.ts", "metrics_reporting_tests.ts", "people_page_manage_profile_test.ts", "relaunch_confirmation_dialog_test.ts", + "spell_check_page_metrics_test_browser.ts", + "spell_check_page_tests.ts", + "test_languages_browser_proxy.ts", "test_languages_settings_metrics_proxy.ts", + "translate_page_metrics_test_browser.ts", + "translate_page_tests.ts", ] } -if (is_win || is_mac) { - non_preprocessed_files += [ "passkeys_subpage_test.ts" ] +if (is_chromeos) { + files += [ "passwords_section_test_cros.ts" ] +} else { + files += [ + "default_browser_test.ts", + "import_data_dialog_test.ts", + "system_page_tests.ts", + ] } -if (is_win) { - if (is_chrome_branded) { - non_preprocessed_files += [ - "chrome_cleanup_page_test.ts", - "incompatible_applications_page_test.ts", - "safety_check_chrome_cleaner_test.ts", - "test_chrome_cleanup_proxy.ts", - ] - } +if (is_mac) { + files += [ "passkey_edit_dialog_test.ts" ] +} + +if (!is_mac && !is_chromeos_ash) { + files += [ "edit_dictionary_page_test.ts" ] +} + +if (is_win || is_mac) { + files += [ "passkeys_subpage_test.ts" ] +} + +if (is_win && is_chrome_branded) { + files += [ + "chrome_cleanup_page_test.ts", + "incompatible_applications_page_test.ts", + "safety_check_chrome_cleaner_test.ts", + "test_chrome_cleanup_proxy.ts", + ] } preprocessed_folder = "$target_gen_dir/preprocessed" preprocess_if_expr("preprocess") { defines = chrome_grit_defines - in_folder = "./" + in_folder = "." out_folder = preprocessed_folder - in_files = preprocessed_files -} - -copy("copy") { - sources = non_preprocessed_files - outputs = [ "$preprocessed_folder/{{source_target_relative}}" ] + in_files = files } ts_library("build_ts") { @@ -226,7 +208,7 @@ rebase_path("$root_gen_dir/chrome/test/data/webui/tsc/*", target_gen_dir), ] - in_files = preprocessed_files + non_preprocessed_files + in_files = files definitions = [ "//tools/typescript/definitions/autofill_private.d.ts", "//tools/typescript/definitions/chrome_send.d.ts", @@ -245,10 +227,7 @@ "//chrome/browser/resources/settings:build_ts", ] - extra_deps = [ - ":copy", - ":preprocess", - ] + extra_deps = [ ":preprocess" ] } generate_grd("build_grdp") {
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js index 37a487a..5d1bc166 100644 --- a/chrome/test/data/webui/settings/cr_settings_browsertest.js +++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -381,11 +381,17 @@ }); // TODO(crbug.com/929455): When the bug is fixed, merge -// SiteListEmbargoedOrigin into SiteList +// SiteListEmbargoedOrigin into SiteList. TEST_F('CrSettingsSiteListTest', 'SiteListEmbargoedOrigin', function() { runMochaSuite('SiteListEmbargoedOrigin'); }); +// TODO(crbug.com/929455): When the bug is fixed, merge +// SiteListCookiesExceptionTypes into SiteList. +TEST_F('CrSettingsSiteListTest', 'SiteListCookiesExceptionTypes', function() { + runMochaSuite('SiteListCookiesExceptionTypes'); +}); + TEST_F('CrSettingsSiteListTest', 'EditExceptionDialog', function() { runMochaSuite('EditExceptionDialog'); }); @@ -852,6 +858,7 @@ return { enabled: [ 'privacy_sandbox::kPrivacySandboxSettings4', + 'content_settings::features::kSafetyCheckUnusedSitePermissions', ], }; } @@ -867,6 +874,18 @@ mocha.run(); }); +TEST_F( + 'CrSettingsSiteSettingsPageTest', 'UnusedSitePermissionsReview', + function() { + mocha.run(); + }); + +TEST_F( + 'CrSettingsSiteSettingsPageTest', 'UnusedSitePermissionsReviewDisabled', + function() { + mocha.run(); + }); + [['AppearanceFontsPage', 'appearance_fonts_page_test.js'], [ 'SettingsCategoryDefaultRadioGroup',
diff --git a/chrome/test/data/webui/settings/privacy_sandbox_page_test.ts b/chrome/test/data/webui/settings/privacy_sandbox_page_test.ts index 6e68ed2..b0a7dbb 100644 --- a/chrome/test/data/webui/settings/privacy_sandbox_page_test.ts +++ b/chrome/test/data/webui/settings/privacy_sandbox_page_test.ts
@@ -9,7 +9,7 @@ import {CrSettingsPrefs, Router, routes, SettingsPrefsElement} from 'chrome://settings/settings.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; -import {isChildVisible, isVisible} from 'chrome://webui-test/test_util.js'; +import {isVisible} from 'chrome://webui-test/test_util.js'; suite('PrivacySandboxPageTests', function() { let page: SettingsPrivacySandboxPageElement; @@ -145,9 +145,6 @@ assertEquals( loadTimeData.getString('topicsPageToggleSubLabel'), page.$.topicsToggle.subLabel); - assertFalse(isChildVisible(page, '#currentTopicsDescription')); - assertFalse(isChildVisible(page, '#currentTopicsDescriptionEmpty')); - assertTrue(isChildVisible(page, '#currentTopicsDescriptionDisabled')); page.$.topicsToggle.click(); await flushTasks(); @@ -157,12 +154,6 @@ loadTimeData.getString('topicsPageToggleSubLabel'), page.$.topicsToggle.subLabel); assertTrue(!!page.getPref('privacy_sandbox.m1.topics_enabled.value')); - // TODO(crbug.com/1378703): Test for `#currentTopicsDescription` and - // `#currentTopicsDescriptionEmpty` separately. - assertTrue( - isChildVisible(page, '#currentTopicsDescription') || - isChildVisible(page, '#currentTopicsDescriptionEmpty')); - assertFalse(isChildVisible(page, '#currentTopicsDescriptionDisabled')); }); test('disableTopicsToggle', async function() { @@ -173,12 +164,6 @@ assertEquals( loadTimeData.getString('topicsPageToggleSubLabel'), page.$.topicsToggle.subLabel); - // TODO(crbug.com/1378703): Test for `#currentTopicsDescription` and - // `#currentTopicsDescriptionEmpty` separately. - assertTrue( - isChildVisible(page, '#currentTopicsDescription') || - isChildVisible(page, '#currentTopicsDescriptionEmpty')); - assertFalse(isChildVisible(page, '#currentTopicsDescriptionDisabled')); page.$.topicsToggle.click(); await flushTasks(); @@ -188,9 +173,6 @@ loadTimeData.getString('topicsPageToggleSubLabel'), page.$.topicsToggle.subLabel); assertFalse(!!page.getPref('privacy_sandbox.m1.topics_enabled.value')); - assertFalse(isChildVisible(page, '#currentTopicsDescription')); - assertFalse(isChildVisible(page, '#currentTopicsDescriptionEmpty')); - assertTrue(isChildVisible(page, '#currentTopicsDescriptionDisabled')); }); });
diff --git a/chrome/test/data/webui/settings/site_list_entry_tests.ts b/chrome/test/data/webui/settings/site_list_entry_tests.ts index 2a588c6..c71b977f 100644 --- a/chrome/test/data/webui/settings/site_list_entry_tests.ts +++ b/chrome/test/data/webui/settings/site_list_entry_tests.ts
@@ -9,7 +9,7 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {ContentSetting, ContentSettingsTypes, SiteListEntryElement, SiteSettingsPrefsBrowserProxyImpl} from 'chrome://settings/lazy_load.js'; +import {ContentSetting, ContentSettingsTypes, CookiesExceptionType, SITE_EXCEPTION_WILDCARD, SiteListEntryElement, SiteSettingsPrefsBrowserProxyImpl} from 'chrome://settings/lazy_load.js'; import {Router, routes} from 'chrome://settings/settings.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {eventToPromise} from 'chrome://webui-test/test_util.js'; @@ -163,4 +163,74 @@ routes.SITE_SETTINGS_SITE_DETAILS.path, Router.getInstance().getCurrentRoute().path); }); + + // Verify that third-party exceptions in a combined list have an additional + // description. + test('third-party exception in a combined exceptions list', function() { + testElement.model = { + category: ContentSettingsTypes.COOKIES, + controlledBy: chrome.settingsPrivate.ControlledBy.OWNER, + displayName: '', + embeddingOrigin: 'http://example.com', + enforcement: null, + incognito: false, + isEmbargoed: false, + origin: SITE_EXCEPTION_WILDCARD, + setting: ContentSetting.DEFAULT, + }; + testElement.cookiesExceptionType = CookiesExceptionType.COMBINED; + flush(); + const siteDescription = testElement.$$('#siteDescription')!; + assertEquals( + loadTimeData.getString('siteSettingsCookiesThirdPartyExceptionLabel'), + siteDescription.textContent); + }); + + // Verify that third-party exceptions in a third-party exceptions list don't + // have an additional description. + test('third-party exception in a third-party exceptions list', function() { + testElement.model = { + category: ContentSettingsTypes.COOKIES, + controlledBy: chrome.settingsPrivate.ControlledBy.OWNER, + displayName: '', + embeddingOrigin: 'http://example.com', + enforcement: null, + incognito: false, + isEmbargoed: false, + origin: SITE_EXCEPTION_WILDCARD, + setting: ContentSetting.DEFAULT, + }; + testElement.cookiesExceptionType = CookiesExceptionType.THIRD_PARTY; + flush(); + const siteDescription = testElement.$$('#siteDescription')!; + assertEquals('', siteDescription.textContent); + }); + + // Verify that exceptions with both patterns have proper description for both + // lists. + test('cookies exception with both patterns set', function() { + testElement.model = { + category: ContentSettingsTypes.COOKIES, + controlledBy: chrome.settingsPrivate.ControlledBy.OWNER, + displayName: '', + embeddingOrigin: 'http://example1.com', + enforcement: null, + incognito: false, + isEmbargoed: false, + origin: 'http://example2.com', + setting: ContentSetting.DEFAULT, + }; + testElement.cookiesExceptionType = CookiesExceptionType.COMBINED; + flush(); + const siteDescription = testElement.$$('#siteDescription')!; + assertEquals( + loadTimeData.getStringF('embeddedOnHost', 'http://example1.com'), + siteDescription.textContent); + + testElement.cookiesExceptionType = CookiesExceptionType.THIRD_PARTY; + flush(); + assertEquals( + loadTimeData.getStringF('embeddedOnHost', 'http://example1.com'), + siteDescription.textContent); + }); });
diff --git a/chrome/test/data/webui/settings/site_list_tests.ts b/chrome/test/data/webui/settings/site_list_tests.ts index 1a208ff..1964645 100644 --- a/chrome/test/data/webui/settings/site_list_tests.ts +++ b/chrome/test/data/webui/settings/site_list_tests.ts
@@ -7,7 +7,7 @@ // clang-format off import {webUIListenerCallback} from 'chrome://resources/js/cr.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {AddSiteDialogElement, ContentSetting, ContentSettingsTypes, SettingsEditExceptionDialogElement, SITE_EXCEPTION_WILDCARD, SiteException, SiteListElement, SiteSettingSource, SiteSettingsPrefsBrowserProxyImpl} from 'chrome://settings/lazy_load.js'; +import {AddSiteDialogElement, CookiesExceptionType, ContentSetting, ContentSettingsTypes, SettingsEditExceptionDialogElement, SITE_EXCEPTION_WILDCARD, SiteException, SiteListElement, SiteSettingSource, SiteSettingsPrefsBrowserProxyImpl} from 'chrome://settings/lazy_load.js'; import {CrSettingsPrefs, loadTimeData, Router} from 'chrome://settings/settings.js'; import {assertEquals, assertFalse, assertNotEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {eventToPromise} from 'chrome://webui-test/test_util.js'; @@ -91,6 +91,14 @@ */ let prefsIsolatedWebApp: SiteSettingsPref; + +/** + * An example pref with mixed cookies exception types: 2 exceptions with primary + * pattern wildcard, 2 exceptions with secondary pattern wildcard and 1 + * exception with both patterns set. + */ +let prefsMixedCookiesExceptionTypes: SiteSettingsPref; + /** * Creates all the test |SiteSettingsPref|s that are needed for the tests in * this file. They are populated after test setup in order to access the @@ -286,6 +294,30 @@ }), ]), ]); + + prefsMixedCookiesExceptionTypes = createSiteSettingsPrefs([], [ + createContentSettingTypeToValuePair( + ContentSettingsTypes.COOKIES, + [ + createRawSiteException('http://foo-block.com', { + embeddingOrigin: '', + setting: ContentSetting.BLOCK, + }), + createRawSiteException('http://foo-allow.com', { + embeddingOrigin: '', + }), + createRawSiteException(SITE_EXCEPTION_WILDCARD, { + embeddingOrigin: 'http://3pc-block.com', + setting: ContentSetting.BLOCK, + }), + createRawSiteException(SITE_EXCEPTION_WILDCARD, { + embeddingOrigin: 'http://3pc-allow.com', + }), + createRawSiteException('http://mixed-primary-allow.com', { + embeddingOrigin: 'http://mixed-secondary-allow.com', + }), + ]), + ]); } suite('SiteListEmbargoedOrigin', function() { @@ -361,7 +393,97 @@ }); }); +suite('SiteListCookiesExceptionTypes', function() { + /** + * A site list element created before each test. + */ + let testElement: SiteListElement; + /** + * The mock proxy object to use during test. + */ + let browserProxy: TestSiteSettingsPrefsBrowserProxy; + + suiteSetup(function() { + CrSettingsPrefs.setInitialized(); + }); + + suiteTeardown(function() { + CrSettingsPrefs.resetForTesting(); + }); + + // Initialize a site-list before each test. + setup(function() { + populateTestExceptions(); + + browserProxy = new TestSiteSettingsPrefsBrowserProxy(); + SiteSettingsPrefsBrowserProxyImpl.setInstance(browserProxy); + document.body.innerHTML = window.trustedTypes!.emptyHTML; + testElement = document.createElement('site-list'); + testElement.searchFilter = ''; + document.body.appendChild(testElement); + }); + + /** + * Configures the test element for a particular category. + * @param category The category to set up. + * @param subtype Type of list to use. + * @param prefs The prefs to use. + */ + function setUpCategory( + category: ContentSettingsTypes, subtype: ContentSetting, + prefs: SiteSettingsPref) { + browserProxy.setPrefs(prefs); + testElement.categorySubtype = subtype; + testElement.category = category; + } + + test('only shows third party cookies exceptions', function() { + testElement.cookiesExceptionType = CookiesExceptionType.THIRD_PARTY; + setUpCategory( + ContentSettingsTypes.COOKIES, ContentSetting.ALLOW, + prefsMixedCookiesExceptionTypes); + return browserProxy.whenCalled('getExceptionList').then(() => { + assertEquals(1, testElement.sites.length); + assertEquals( + testElement.sites[0]!.embeddingOrigin, 'http://3pc-allow.com'); + }); + }); + + test('only shows site data cookies exceptions', function() { + testElement.cookiesExceptionType = CookiesExceptionType.SITE_DATA; + setUpCategory( + ContentSettingsTypes.COOKIES, ContentSetting.ALLOW, + prefsMixedCookiesExceptionTypes); + return browserProxy.whenCalled('getExceptionList').then(() => { + assertEquals(2, testElement.sites.length); + assertEquals(testElement.sites[0]!.origin, 'http://foo-allow.com'); + assertEquals( + testElement.sites[1]!.origin, 'http://mixed-primary-allow.com'); + assertEquals( + testElement.sites[1]!.embeddingOrigin, + 'http://mixed-secondary-allow.com'); + }); + }); + + test('shows all cookies exceptions', function() { + testElement.cookiesExceptionType = CookiesExceptionType.COMBINED; + setUpCategory( + ContentSettingsTypes.COOKIES, ContentSetting.ALLOW, + prefsMixedCookiesExceptionTypes); + return browserProxy.whenCalled('getExceptionList').then(() => { + assertEquals(3, testElement.sites.length); + assertEquals(testElement.sites[0]!.origin, 'http://foo-allow.com'); + assertEquals( + testElement.sites[1]!.embeddingOrigin, 'http://3pc-allow.com'); + assertEquals( + testElement.sites[2]!.origin, 'http://mixed-primary-allow.com'); + assertEquals( + testElement.sites[2]!.embeddingOrigin, + 'http://mixed-secondary-allow.com'); + }); + }); +}); suite('SiteList', function() { /** @@ -1149,6 +1271,22 @@ let dialog: AddSiteDialogElement; let browserProxy: TestSiteSettingsPrefsBrowserProxy; + async function inputText(expectedPattern: string) { + const actionButton = dialog.$.add; + assertTrue(!!actionButton); + assertTrue(actionButton.disabled); + + const input = dialog.shadowRoot!.querySelector('cr-input'); + input!.value = expectedPattern; + input!.dispatchEvent( + new CustomEvent('input', {bubbles: true, composed: true})); + + const [pattern, _category] = + await browserProxy.whenCalled('isPatternValidForType'); + assertEquals(expectedPattern, pattern); + assertFalse(actionButton.disabled); + } + setup(function() { populateTestExceptions(); @@ -1201,4 +1339,70 @@ assertTrue(actionButton.disabled); assertTrue(input!.invalid); }); + + test( + 'add cookie exception for combined cookie exception type', + async function() { + dialog.set('category', ContentSettingsTypes.COOKIES); + dialog.set('cookiesExceptionType', CookiesExceptionType.COMBINED); + flush(); + // Cookie exceptions that support all wildcard patterns (both primary + // and secondary) have a checkbox to control the type of exception. + assertFalse(dialog.$.thirdParties.hidden); + assertFalse(dialog.$.thirdParties.checked); + + // Enter a pattern and click the button. + const expectedPattern = 'foo-bar.com'; + await inputText(expectedPattern); + dialog.$.add.click(); + + // The created exception has secondary pattern wildcard by default + // (created site data cookie exception). + const [primaryPattern, secondaryPattern] = + await browserProxy.whenCalled('setCategoryPermissionForPattern'); + assertEquals(primaryPattern, expectedPattern); + assertEquals(secondaryPattern, SITE_EXCEPTION_WILDCARD); + }); + + test('add third party cookie exception', async function() { + dialog.set('category', ContentSettingsTypes.COOKIES); + dialog.set('cookiesExceptionType', CookiesExceptionType.THIRD_PARTY); + flush(); + // Third party cookies exceptions don't need checkbox to control the + // exception mode. Exceptions with primary pattern wildcard are created. + assertTrue(dialog.$.thirdParties.hidden); + + // Enter a pattern and click the button. + const expectedPattern = 'foo-bar.com'; + await inputText(expectedPattern); + dialog.$.add.click(); + + // The created exception has primary pattern wildcard (third party + // exception). + const [primaryPattern, secondaryPattern] = + await browserProxy.whenCalled('setCategoryPermissionForPattern'); + assertEquals(primaryPattern, SITE_EXCEPTION_WILDCARD); + assertEquals(secondaryPattern, expectedPattern); + }); + + test('add site data cookie exception', async function() { + dialog.set('category', ContentSettingsTypes.COOKIES); + dialog.set('cookiesExceptionType', CookiesExceptionType.SITE_DATA); + flush(); + // Site data cookie exceptions don't need checkbox to control the exception + // mode. Exceptions with secondary pattern wildcard are created. + assertTrue(dialog.$.thirdParties.hidden); + + // Enter a pattern and click the button. + const expectedPattern = 'foo-bar.com'; + await inputText(expectedPattern); + dialog.$.add.click(); + + // The created exception has secondary pattern wildcard (site data + // exception). + const [primaryPattern, secondaryPattern] = + await browserProxy.whenCalled('setCategoryPermissionForPattern'); + assertEquals(primaryPattern, expectedPattern); + assertEquals(secondaryPattern, SITE_EXCEPTION_WILDCARD); + }); });
diff --git a/chrome/test/data/webui/settings/site_settings_page_test.ts b/chrome/test/data/webui/settings/site_settings_page_test.ts index 1810ea2d..b2763f0 100644 --- a/chrome/test/data/webui/settings/site_settings_page_test.ts +++ b/chrome/test/data/webui/settings/site_settings_page_test.ts
@@ -6,12 +6,13 @@ import {webUIListenerCallback} from 'chrome://resources/js/cr.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {ContentSetting, defaultSettingLabel, NotificationSetting, SettingsSiteSettingsPageElement, SiteSettingsPrefsBrowserProxyImpl} from 'chrome://settings/lazy_load.js'; +import {ContentSetting, ContentSettingsTypes, defaultSettingLabel, NotificationSetting, SettingsSiteSettingsPageElement, SiteSettingsPermissionsBrowserProxyImpl, SiteSettingsPrefsBrowserProxyImpl} from 'chrome://settings/lazy_load.js'; import {CrLinkRowElement} from 'chrome://settings/settings.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {isChildVisible} from 'chrome://webui-test/test_util.js'; import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; +import {TestSiteSettingsPermissionsBrowserProxy} from './test_site_settings_permissions_browser_proxy.js'; import {TestSiteSettingsPrefsBrowserProxy} from './test_site_settings_prefs_browser_proxy.js'; // clang-format on @@ -149,3 +150,95 @@ page.shadowRoot!.querySelector('#advancedContentList')!, '#site-data')); }); }); + +const unusedSitePermissionMockData = [{ + origin: 'www.example.com', + permissions: [ContentSettingsTypes.CAMERA], +}]; + +suite('UnusedSitePermissionsReview', function() { + let page: SettingsSiteSettingsPageElement; + let siteSettingsPermissionsBrowserProxy: + TestSiteSettingsPermissionsBrowserProxy; + + setup(function() { + siteSettingsPermissionsBrowserProxy = + new TestSiteSettingsPermissionsBrowserProxy(); + SiteSettingsPermissionsBrowserProxyImpl.setInstance( + siteSettingsPermissionsBrowserProxy); + document.body.innerHTML = window.trustedTypes!.emptyHTML; + }); + + test('VisibilityWithChangingPermissionList', async function() { + // The element is not visible when there is nothing to review. + siteSettingsPermissionsBrowserProxy.setUnusedSitePermissions([]); + page = document.createElement('settings-site-settings-page'); + document.body.appendChild(page); + await flushTasks(); + assertFalse(isChildVisible(page, 'settings-unused-site-permissions')); + + // The element becomes visible if the list of permissions is no longer + // empty. + webUIListenerCallback( + 'unused-permission-review-list-maybe-changed', + unusedSitePermissionMockData); + await flushTasks(); + assertTrue(isChildVisible(page, 'settings-unused-site-permissions')); + + // Once visible, it remains visible regardless of list length. + webUIListenerCallback('unused-permission-review-list-maybe-changed', []); + await flushTasks(); + assertTrue(isChildVisible(page, 'settings-unused-site-permissions')); + + webUIListenerCallback( + 'unused-permission-review-list-maybe-changed', + unusedSitePermissionMockData); + await flushTasks(); + assertTrue(isChildVisible(page, 'settings-unused-site-permissions')); + }); +}); + +/** + * If feature is not enabled, the UI should not be shown regardless of whether + * there would be unused site permissions for the user to review. + * + * TODO(crbug/1345920): Remove after crbug/1345920 launched. + */ +suite('UnusedSitePermissionsReviewDisabled', function() { + let page: SettingsSiteSettingsPageElement; + let siteSettingsPermissionsBrowserProxy: + TestSiteSettingsPermissionsBrowserProxy; + + suiteSetup(function() { + loadTimeData.overrideValues({ + safetyCheckUnusedSitePermissionsEnabled: false, + }); + }); + + setup(function() { + siteSettingsPermissionsBrowserProxy = + new TestSiteSettingsPermissionsBrowserProxy(); + SiteSettingsPermissionsBrowserProxyImpl.setInstance( + siteSettingsPermissionsBrowserProxy); + document.body.innerHTML = window.trustedTypes!.emptyHTML; + }); + + test('InvisibleWhenFeatureDisabled', async function() { + siteSettingsPermissionsBrowserProxy.setUnusedSitePermissions([]); + page = document.createElement('settings-site-settings-page'); + document.body.appendChild(page); + await flushTasks(); + + assertFalse(isChildVisible(page, 'settings-unused-site-permissions')); + }); + + test('InvisibleWhenFeatureDisabledWithItemsToReview', async function() { + siteSettingsPermissionsBrowserProxy.setUnusedSitePermissions( + unusedSitePermissionMockData); + page = document.createElement('settings-site-settings-page'); + document.body.appendChild(page); + await flushTasks(); + + assertFalse(isChildVisible(page, 'settings-unused-site-permissions')); + }); +});
diff --git a/chrome/updater/OWNERS b/chrome/updater/OWNERS index cc0f1e9..4c181ed 100644 --- a/chrome/updater/OWNERS +++ b/chrome/updater/OWNERS
@@ -1,4 +1,5 @@ ganesh@chromium.org +noahrose@google.com sorin@chromium.org waffles@chromium.org xiaolingbao@chromium.org
diff --git a/chromeos/crosapi/mojom/BUILD.gn b/chromeos/crosapi/mojom/BUILD.gn index 01f3488..627edc2 100644 --- a/chromeos/crosapi/mojom/BUILD.gn +++ b/chromeos/crosapi/mojom/BUILD.gn
@@ -64,6 +64,7 @@ "login_state.mojom", "message_center.mojom", "metrics_reporting.mojom", + "multi_capture_service.mojom", "native_theme.mojom", "network_change.mojom", "network_settings_service.mojom",
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom index ed0d6e5..5851eed 100644 --- a/chromeos/crosapi/mojom/crosapi.mojom +++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -60,6 +60,7 @@ import "chromeos/crosapi/mojom/policy_service.mojom"; import "chromeos/crosapi/mojom/message_center.mojom"; import "chromeos/crosapi/mojom/metrics_reporting.mojom"; +import "chromeos/crosapi/mojom/multi_capture_service.mojom"; import "chromeos/crosapi/mojom/native_theme.mojom"; import "chromeos/crosapi/mojom/network_change.mojom"; import "chromeos/crosapi/mojom/networking_attributes.mojom"; @@ -131,8 +132,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: 99 -// Next method id: 103 +// Next version: 101 +// Next method id: 105 [Stable, Uuid="8b79c34f-2bf8-4499-979a-b17cac522c1e", RenamedFrom="crosapi.mojom.AshChromeService"] interface Crosapi { @@ -426,6 +427,11 @@ [MinVersion=8] BindMetricsReporting@13(pending_receiver<MetricsReporting> receiver); + // Binds the MultiCaptureService interface that handles multi capture related + // usage indicators and notifications. + [MinVersion=100] + BindMultiCaptureService@104(pending_receiver<MultiCaptureService> receiver); + // Binds the NetworkChange interface for getting network change notification. [MinVersion=88] BindNetworkChange@92(pending_receiver<NetworkChange> receiver);
diff --git a/chromeos/crosapi/mojom/multi_capture_service.mojom b/chromeos/crosapi/mojom/multi_capture_service.mojom new file mode 100644 index 0000000..b5dc632 --- /dev/null +++ b/chromeos/crosapi/mojom/multi_capture_service.mojom
@@ -0,0 +1,25 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module crosapi.mojom; + +// Interacts with the media capture API. Implemented in ash-chrome. This +// interface is used to show multi capture related usage indicators and +// notifications. +// Next version: 1 +// Next method id: 2 +[Stable, Uuid="6ea59fc6-65e0-11ed-a200-7be727846002"] +interface MultiCaptureService { + // Called when a new multi capture (identified by a unique label) + // is started. The parameters are a unique label and the host that + // triggered the capture. + MultiCaptureStarted@0(string label, string host); + + // Called when an existing multi capture (identified by a unique label) is + // stopped. A multi capture is considered to be stopped when the capture + // for all used devices is stopped / finished. + // MultiCaptureStopped will only be called after MultiCaptureStarted was + // called before with the same label. + MultiCaptureStopped@1(string label); +};
diff --git a/chromeos/lacros/lacros_service.cc b/chromeos/lacros/lacros_service.cc index 322959e..9968dc1b 100644 --- a/chromeos/lacros/lacros_service.cc +++ b/chromeos/lacros/lacros_service.cc
@@ -67,6 +67,7 @@ #include "chromeos/crosapi/mojom/login_state.mojom.h" #include "chromeos/crosapi/mojom/message_center.mojom.h" #include "chromeos/crosapi/mojom/metrics_reporting.mojom.h" +#include "chromeos/crosapi/mojom/multi_capture_service.mojom.h" #include "chromeos/crosapi/mojom/network_change.mojom.h" #include "chromeos/crosapi/mojom/network_settings_service.mojom.h" #include "chromeos/crosapi/mojom/networking_attributes.mojom.h" @@ -401,6 +402,10 @@ &crosapi::mojom::Crosapi::BindMessageCenter, Crosapi::MethodMinVersions::kBindMessageCenterMinVersion>(); ConstructRemote< + crosapi::mojom::MultiCaptureService, + &crosapi::mojom::Crosapi::BindMultiCaptureService, + Crosapi::MethodMinVersions::kBindMultiCaptureServiceMinVersion>(); + ConstructRemote< crosapi::mojom::NativeThemeService, &crosapi::mojom::Crosapi::BindNativeThemeService, Crosapi::MethodMinVersions::kBindNativeThemeServiceMinVersion>(); @@ -608,6 +613,13 @@ Crosapi::MethodMinVersions::kBindMetricsReportingMinVersion; } +bool LacrosService::IsMultiCaptureServiceAvailable() const { + absl::optional<uint32_t> version = CrosapiVersion(); + return version && + version.value() >= + Crosapi::MethodMinVersions::kBindMultiCaptureServiceMinVersion; +} + bool LacrosService::IsSensorHalClientAvailable() const { absl::optional<uint32_t> version = CrosapiVersion(); return version &&
diff --git a/chromeos/lacros/lacros_service.h b/chromeos/lacros/lacros_service.h index a59b922..d63dba5a 100644 --- a/chromeos/lacros/lacros_service.h +++ b/chromeos/lacros/lacros_service.h
@@ -25,6 +25,7 @@ #include "chromeos/crosapi/mojom/account_manager.mojom.h" #include "chromeos/crosapi/mojom/crosapi.mojom.h" #include "chromeos/crosapi/mojom/device_attributes.mojom.h" +#include "chromeos/crosapi/mojom/multi_capture_service.mojom.h" #include "chromeos/crosapi/mojom/structured_metrics_service.mojom.h" #include "chromeos/crosapi/mojom/video_capture.mojom.h" #include "chromeos/lacros/lacros_service_never_blocking_state.h" @@ -119,6 +120,7 @@ bool IsMediaSessionAudioFocusDebugAvailable() const; bool IsMediaSessionControllerAvailable() const; bool IsMetricsReportingAvailable() const; + bool IsMultiCaptureServiceAvailable() const; bool IsSensorHalClientAvailable() const; bool IsStableVideoDecoderFactoryAvailable() const;
diff --git a/components/autofill/PRESUBMIT.py b/components/autofill/PRESUBMIT.py index b798f2b..a165545 100644 --- a/components/autofill/PRESUBMIT.py +++ b/components/autofill/PRESUBMIT.py
@@ -10,6 +10,18 @@ USE_PYTHON3 = True +def IsComponentsAutofillFile(f, name_suffix): + # The exact path can change. Only check the containing folder. + return (f.LocalPath().startswith('components/autofill/') and + f.LocalPath().endswith(name_suffix)) + +def AnyAffectedFileMatches(input_api, matcher): + return any(matcher(f) for f in input_api.change.AffectedTestableFiles()) + +def IsComponentsAutofillFileAffected(input_api, name_suffix): + return AnyAffectedFileMatches( + input_api, lambda f: IsComponentsAutofillFile(f, name_suffix)) + def _CheckNoBaseTimeCalls(input_api, output_api): """Checks that no files call base::Time::Now() or base::TimeTicks::Now().""" pattern = input_api.re.compile( @@ -71,8 +83,7 @@ return False for f in input_api.AffectedSourceFiles(input_api.FilterSourceFile): - if (f.LocalPath().startswith('components/autofill/') and - f.LocalPath().endswith('features.cc')): + if IsComponentsAutofillFile(f, 'features.cc'): contents = input_api.ReadFile(f) mismatches = [(constant, feature) for (constant, feature) in pattern.findall(contents) @@ -94,19 +105,10 @@ 'android_webview/common/ProductionSupportedFlagList.java') _GENERATE_FLAG_LABELS_PY = 'android_webview/tools/generate_flag_labels.py' - def is_autofill_features_file(f): - return (f.LocalPath().startswith('components/autofill/') and - f.LocalPath().endswith('features.cc')) - - def is_webview_features_file(f): - return f.LocalPath() == _PRODUCTION_SUPPORT_FILE - - def any_file_matches(matcher): - return any(matcher(f) for f in input_api.change.AffectedTestableFiles()) - warnings = [] - if (any_file_matches(is_autofill_features_file) - and not any_file_matches(is_webview_features_file)): + if (IsComponentsAutofillFileAffected(input_api, 'features.cc') and + not AnyAffectedFileMatches( + input_api, lambda f: f.LocalPath() == _PRODUCTION_SUPPORT_FILE)): warnings += [ output_api.PresubmitPromptWarning(( 'You may need to modify {} and run {} and follow its '+ @@ -119,13 +121,7 @@ def _CheckModificationOfLegacyRegexPatterns(input_api, output_api): """Reminds to update internal regex patterns when legacy ones are modified.""" - def is_legacy_patterns_file(f): - return (f.LocalPath().startswith("components/autofill/") and - f.LocalPath().endswith("legacy_regex_patterns.json")) - - if any( - is_legacy_patterns_file(f) - for f in input_api.change.AffectedTestableFiles()): + if IsComponentsAutofillFileAffected(input_api, "legacy_regex_patterns.json"): return [ output_api.PresubmitPromptWarning( "You may need to modify the parsing patterns in src-internal. " + @@ -135,6 +131,20 @@ return [] +def _CheckModificationOfFormAutofillUtil(input_api, output_api): + """Reminds to keep form_autofill_util.cc and the iOS counterpart in sync.""" + + if (IsComponentsAutofillFileAffected(input_api, "fill.js") != + IsComponentsAutofillFileAffected(input_api, "form_autofill_util.cc")): + return [ + output_api.PresubmitPromptWarning( + 'Form extraction/label inference has a separate iOS ' + + 'implementation in components/autofill/ios/form_util/resources/' + + 'fill.js. Try to keep it in sync with form_autofill_util.cc.') + ] + + return [] + def _CommonChecks(input_api, output_api): """Checks common to both upload and commit.""" results = [] @@ -143,6 +153,7 @@ results.extend(_CheckFeatureNames(input_api, output_api)) results.extend(_CheckWebViewExposedExperiments(input_api, output_api)) results.extend(_CheckModificationOfLegacyRegexPatterns(input_api, output_api)) + results.extend(_CheckModificationOfFormAutofillUtil(input_api, output_api)) return results def CheckChangeOnUpload(input_api, output_api):
diff --git a/components/autofill/core/browser/autofill_client.h b/components/autofill/core/browser/autofill_client.h index 4ce5422..e4d1e84 100644 --- a/components/autofill/core/browser/autofill_client.h +++ b/components/autofill/core/browser/autofill_client.h
@@ -77,6 +77,7 @@ class CreditCardOtpAuthenticator; class FormDataImporter; class FormStructure; +class IBAN; class IBANManager; class LogManager; class MigratableCreditCard; @@ -314,6 +315,14 @@ typedef base::RepeatingCallback<void(const std::string&)> MigrationDeleteCardCallback; + // Callback to run after local IBAN save is offered. The callback runs with + // `user_decision` indicating whether the prompt was accepted, declined, + // or ignored. `nickname` is optionally provided by the user when IBAN local + // save is offered, and can be nullopt. + using LocalSaveIBANPromptCallback = + base::OnceCallback<void(SaveIBANOfferUserDecision user_decision, + const absl::optional<std::u16string>& nickname)>; + // Callback to run if the OK button or the cancel button in a // Webauthn dialog is clicked. typedef base::RepeatingCallback<void(WebauthnDialogCallbackType)> @@ -499,6 +508,13 @@ const std::vector<MigratableCreditCard>& migratable_credit_cards, MigrationDeleteCardCallback delete_local_card_callback) = 0; + // Runs `callback` once the user makes a decision with respect to the + // offer-to-save prompt. On desktop, shows the offer-to-save bubble if + // `should_show_prompt` is true; otherwise only shows the omnibox icon. + virtual void ConfirmSaveIBANLocally(const IBAN& iban, + bool should_show_prompt, + LocalSaveIBANPromptCallback callback) = 0; + // TODO(crbug.com/991037): Find a way to merge these two functions. Shouldn't // use WebauthnDialogState as that state is a purely UI state (should not be // accessible for managers?), and some of the states |KInactive| may be
diff --git a/components/autofill/core/browser/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/browser_autofill_manager_unittest.cc index 22d5d8db..88eb5f53 100644 --- a/components/autofill/core/browser/browser_autofill_manager_unittest.cc +++ b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
@@ -426,7 +426,7 @@ std::make_unique<autofill::TestFormDataImporter>( &autofill_client_, payments_client_, std::unique_ptr<CreditCardSaveManager>(credit_card_save_manager), - &personal_data(), "en-US"); + /*iban_save_manager=*/nullptr, &personal_data(), "en-US"); test_form_data_importer_ = test_form_data_importer.get(); autofill_client_.set_test_form_data_importer( std::move(test_form_data_importer));
diff --git a/components/autofill/core/browser/form_data_importer.cc b/components/autofill/core/browser/form_data_importer.cc index 46c7b7d8..dca75de 100644 --- a/components/autofill/core/browser/form_data_importer.cc +++ b/components/autofill/core/browser/form_data_importer.cc
@@ -149,6 +149,10 @@ std::make_unique<AddressProfileSaveManager>(client, personal_data_manager)), #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) + iban_save_manager_( + base::FeatureList::IsEnabled(features::kAutofillFillIbanFields) + ? std::make_unique<IBANSaveManager>(client) + : nullptr), local_card_migration_manager_( std::make_unique<LocalCardMigrationManager>(client, payments_client, @@ -207,11 +211,18 @@ credit_card_save_manager_->IsCreditCardUploadEnabled()); fetched_card_instrument_id_.reset(); + bool iban_prompt_potentially_shown = false; + if (imported_data.iban_import_candidate.has_value() && + payment_methods_autofill_enabled) { + iban_prompt_potentially_shown = + ProcessIBANImportCandidate(*imported_data.iban_import_candidate); + } + // If a prompt for credit cards or IBANs is potentially shown, do not allow // for a second address profile import dialog. ProcessAddressProfileImportCandidates( imported_data.address_profile_import_candidates, - !cc_prompt_potentially_shown); + !cc_prompt_potentially_shown && !iban_prompt_potentially_shown); } bool FormDataImporter::ComplementCountry( @@ -683,9 +694,12 @@ const std::vector<FormDataImporter::AddressProfileImportCandidate>& address_profile_import_candidates, bool allow_prompt) { - // At this point, no credit card prompt was shown. Initiate the import of - // addresses is possible. int imported_profiles = 0; + + // `allow_prompt` is true if no credit card or IBAN prompt was shown. If it is + // true, we know there is no UI currently displaying, so we can display UI to + // import addresses. If it is false, we should not display UI to import + // addresses due to a possible dialog or bubble conflict. if (allow_prompt) { for (const auto& candidate : address_profile_import_candidates) { // First try to import a single complete profile. @@ -796,6 +810,19 @@ return false; } +bool FormDataImporter::ProcessIBANImportCandidate( + const IBAN& iban_import_candidate) { + if (!iban_save_manager_) + return false; + + if (iban_import_candidate.record_type() == IBAN::NEW_IBAN) { + return iban_save_manager_->AttemptToOfferIBANLocalSave( + iban_import_candidate); + } + + return false; +} + absl::optional<CreditCard> FormDataImporter::ImportCreditCard( const FormStructure& form) { // The candidate for credit card import. There are many ways for the candidate @@ -899,12 +926,13 @@ if (candidate_iban.value().empty()) return absl::nullopt; - bool found_existing_iban = base::ranges::any_of( + bool found_existing_local_iban = base::ranges::any_of( personal_data_manager_->GetLocalIBANs(), [&](const auto& iban) { return iban->value() == candidate_iban.value(); }); - if (found_existing_iban) { + // TODO(crbug.com/1349109): Return nullopt if it is not `NEW_IBAN`. + if (found_existing_local_iban) { // Don't offer to update existing local IBANs. Users can go to the payment // methods settings page to update local IBANs if desired. candidate_iban.set_record_type(IBAN::LOCAL_IBAN);
diff --git a/components/autofill/core/browser/form_data_importer.h b/components/autofill/core/browser/form_data_importer.h index b34b9d0a..5e9a8d6 100644 --- a/components/autofill/core/browser/form_data_importer.h +++ b/components/autofill/core/browser/form_data_importer.h
@@ -18,6 +18,7 @@ #include "components/autofill/core/browser/form_data_importer_utils.h" #include "components/autofill/core/browser/form_structure.h" #include "components/autofill/core/browser/payments/credit_card_save_manager.h" +#include "components/autofill/core/browser/payments/iban_save_manager.h" #include "components/autofill/core/browser/payments/local_card_migration_manager.h" #include "components/autofill/core/browser/payments/payments_client.h" #include "components/autofill/core/browser/payments/upi_vpa_save_manager.h" @@ -82,6 +83,9 @@ ExtractCreditCardFromFormResult ExtractCreditCardFromForm( const FormStructure& form); + // Tries to initiate the saving of `iban_import_candidate` if applicable. + bool ProcessIBANImportCandidate(const IBAN& iban_import_candidate); + // Cache the last four of the fetched virtual card so we don't offer saving // them. void CacheFetchedVirtualCard(const std::u16string& last_four); @@ -133,7 +137,10 @@ } #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) - // Exposed for testing. + void set_iban_save_manager_for_testing( + std::unique_ptr<IBANSaveManager> iban_save_manager) { + iban_save_manager_ = std::move(iban_save_manager); + } void set_local_card_migration_manager_for_testing( std::unique_ptr<LocalCardMigrationManager> local_card_migration_manager) { local_card_migration_manager_ = std::move(local_card_migration_manager); @@ -318,6 +325,9 @@ // Responsible for managing address profiles save flows. std::unique_ptr<AddressProfileSaveManager> address_profile_save_manager_; + // Responsible for managing IBAN save flows. + std::unique_ptr<IBANSaveManager> iban_save_manager_; + #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) // Responsible for migrating locally saved credit cards to Google Pay. std::unique_ptr<LocalCardMigrationManager> local_card_migration_manager_;
diff --git a/components/autofill/core/browser/form_data_importer_unittest.cc b/components/autofill/core/browser/form_data_importer_unittest.cc index 6ce30a7..a921a42 100644 --- a/components/autofill/core/browser/form_data_importer_unittest.cc +++ b/components/autofill/core/browser/form_data_importer_unittest.cc
@@ -12,6 +12,7 @@ #include <map> #include <memory> #include <string> +#include <tuple> #include <utility> #include <vector> @@ -35,6 +36,7 @@ #include "components/autofill/core/browser/field_types.h" #include "components/autofill/core/browser/form_structure.h" #include "components/autofill/core/browser/metrics/autofill_metrics.h" +#include "components/autofill/core/browser/payments/iban_save_strike_database.h" #include "components/autofill/core/browser/payments/test_virtual_card_enrollment_manager.h" #include "components/autofill/core/browser/personal_data_manager.h" #include "components/autofill/core/browser/personal_data_manager_observer.h" @@ -547,6 +549,8 @@ autofill_database_service_->Init(base::NullCallback()); autofill_client_ = std::make_unique<TestAutofillClient>(); + autofill_client_->set_test_strike_database( + std::make_unique<TestStrikeDatabase>()); test::DisableSystemServices(prefs_.get()); // This will also initialize the `form_data_importer()`. @@ -657,7 +661,7 @@ const FormStructure& form, bool profile_autofill_enabled, bool payment_methods_autofill_enabled) { - auto imported_data = form_data_importer().ImportFormData( + ImportFormDataResult imported_data = form_data_importer().ImportFormData( form, profile_autofill_enabled, payment_methods_autofill_enabled); form_data_importer().ProcessAddressProfileImportCandidates( imported_data.address_profile_import_candidates); @@ -671,6 +675,20 @@ /*payment_methods_autofill_enabled=*/true); } + // Convenience wrapper that calls `FormDataImporter::ImportFormData()` and + // subsequently processes the candidates for IBAN import candidate. + // Returns the result of `FormDataImporter::ProcessIBANImportCandidate()`. + bool ImportFormDataAndProcessIBANCandidates( + const FormStructure& form, + bool profile_autofill_enabled, + bool payment_methods_autofill_enabled) { + ImportFormDataResult imported_data = form_data_importer().ImportFormData( + form, profile_autofill_enabled, payment_methods_autofill_enabled); + return imported_data.iban_import_candidate && + form_data_importer().ProcessIBANImportCandidate( + imported_data.iban_import_candidate.value()); + } + void ImportAddressProfilesAndVerifyExpectation( const FormStructure& form, const std::vector<AutofillProfile>& expected_profiles) { @@ -741,9 +759,16 @@ base::test::ScopedFeatureList scoped_feature_list_; }; -class FormDataImporterTest : public FormDataImporterTestBase, - public testing::Test, - public testing::WithParamInterface<bool> { +// Parameters of the FormDataImporterTest fixture. +using AutofillEnableSupportForApartmentNumbers = bool; +using AutofillFillIbanFields = bool; + +class FormDataImporterTest + : public FormDataImporterTestBase, + public testing::Test, + public testing::WithParamInterface< + std::tuple<AutofillEnableSupportForApartmentNumbers, + AutofillFillIbanFields>> { public: using ImportFormDataResult = FormDataImporter::ImportFormDataResult; @@ -756,19 +781,18 @@ void TearDown() override { TearDownHelper(); } void InitializeFeatures() { - support_for_apartment_numbers_ = GetParam(); - - // Enable all those features by default. std::vector<base::test::FeatureRef> enabled_features; std::vector<base::test::FeatureRef> disabled_features; + // Always enable parsing IBAN fields from the form. + enabled_features.push_back(features::kAutofillParseIBANFields); - (support_for_apartment_numbers_ ? enabled_features : disabled_features) + (std::get<0>(GetParam()) ? enabled_features : disabled_features) .push_back(features::kAutofillEnableSupportForApartmentNumbers); + (std::get<1>(GetParam()) ? enabled_features : disabled_features) + .push_back(features::kAutofillFillIbanFields); scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); } - - bool support_for_apartment_numbers_; }; TEST_P(FormDataImporterTest, ComplementCountry) { @@ -3260,9 +3284,6 @@ #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) TEST_P(FormDataImporterTest, ImportFormData_ImportIbanRecordType_NoIban) { - base::test::ScopedFeatureList multistep_import_feature; - multistep_import_feature.InitAndEnableFeature( - features::kAutofillParseIBANFields); // Simulate a form submission with no IBAN. FormData form; form.url = GURL("https://www.foo.com"); @@ -3277,11 +3298,6 @@ TEST_P(FormDataImporterTest, ImportFormData_ImportIbanRecordType_IbanAutofill_NewIban) { - base::test::ScopedFeatureList multistep_import_feature; - multistep_import_feature.InitWithFeatures( - /*enabled_features=*/{features::kAutofillParseIBANFields, - features::kAutofillFillIbanFields}, - /*disabled_features=*/{}); // Simulate a form submission with a new IBAN. FormData form; form.url = GURL("https://www.foo.com"); @@ -3293,40 +3309,16 @@ auto imported_data = ImportFormDataAndProcessAddressCandidates( form_structure, /*profile_autofill_enabled=*/true, /*payment_methods_autofill_enabled=*/true); - ASSERT_TRUE(imported_data.iban_import_candidate); - ASSERT_TRUE(imported_data.iban_import_candidate->record_type() == - IBAN::NEW_IBAN); -} - -TEST_P( - FormDataImporterTest, - ImportFormData_ImportIbanRecordType_IbanAutofill_NewIban_DoesNotImportIfFlagOff) { - base::test::ScopedFeatureList multistep_import_feature; - multistep_import_feature.InitWithFeatures( - /*enabled_features=*/{features::kAutofillParseIBANFields}, - /*disabled_features=*/{features::kAutofillFillIbanFields}); - // Simulate a form submission with a new IBAN. - FormData form; - form.url = GURL("https://www.foo.com"); - - AddIBANForm(&form, kIbanValue); - - FormStructure form_structure(form); - form_structure.DetermineHeuristicTypes(nullptr, nullptr); - auto imported_data = - - ImportFormDataAndProcessAddressCandidates( - form_structure, /*profile_autofill_enabled=*/true, - /*payment_methods_autofill_enabled=*/true); - ASSERT_FALSE(imported_data.iban_import_candidate); + if (base::FeatureList::IsEnabled(features::kAutofillFillIbanFields)) { + ASSERT_TRUE(imported_data.iban_import_candidate); + ASSERT_TRUE(imported_data.iban_import_candidate->record_type() == + IBAN::NEW_IBAN); + } else { + ASSERT_FALSE(imported_data.iban_import_candidate); + } } TEST_P(FormDataImporterTest, ImportFormData_ImportIbanRecordType_LocalIban) { - base::test::ScopedFeatureList multistep_import_feature; - multistep_import_feature.InitWithFeatures( - /*enabled_features=*/{features::kAutofillParseIBANFields, - features::kAutofillFillIbanFields}, - /*disabled_features=*/{}); IBAN iban; iban.set_value(u"IE12 BOFI 9000 0112 3456 78"); personal_data_manager_->AddIBAN(iban); @@ -3348,40 +3340,15 @@ auto imported_data = ImportFormDataAndProcessAddressCandidates( form_structure, /*profile_autofill_enabled=*/true, /*payment_methods_autofill_enabled=*/true); - ASSERT_TRUE(imported_data.iban_import_candidate); - ASSERT_TRUE(imported_data.iban_import_candidate->record_type() == - IBAN::LOCAL_IBAN); + if (base::FeatureList::IsEnabled(features::kAutofillFillIbanFields)) { + ASSERT_TRUE(imported_data.iban_import_candidate); + ASSERT_TRUE(imported_data.iban_import_candidate->record_type() == + IBAN::LOCAL_IBAN); + } else { + ASSERT_FALSE(imported_data.iban_import_candidate); + } } -TEST_P(FormDataImporterTest, - ImportFormData_ImportIbanRecordType_LocalIban_DoesNotImportIfFlagOff) { - base::test::ScopedFeatureList multistep_import_feature; - multistep_import_feature.InitWithFeatures( - /*enabled_features=*/{features::kAutofillParseIBANFields}, - /*disabled_features=*/{features::kAutofillFillIbanFields}); - IBAN iban; - iban.set_value(u"IE12 BOFI 9000 0112 3456 78"); - personal_data_manager_->AddIBAN(iban); - - WaitForOnPersonalDataChanged(); - - const std::vector<IBAN*>& results = personal_data_manager_->GetLocalIBANs(); - ASSERT_EQ(1U, results.size()); - EXPECT_THAT(*results[0], ComparesEqual(iban)); - - // Simulate a form submission with the same IBAN. - FormData form; - form.url = GURL("https://www.foo.com"); - - AddIBANForm(&form, kIbanValue); - - FormStructure form_structure(form); - form_structure.DetermineHeuristicTypes(nullptr, nullptr); - auto imported_data = ImportFormDataAndProcessAddressCandidates( - form_structure, /*profile_autofill_enabled=*/true, - /*payment_methods_autofill_enabled=*/true); - ASSERT_FALSE(imported_data.iban_import_candidate); -} #endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) // Test that a form with both address and credit card sections imports only the @@ -4495,9 +4462,115 @@ EXPECT_FALSE(associations->last_credit_card_form_submitted); } -// Runs the suite with the feature `kAutofillEnableSupportForApartmentNumbers` -// enabled and disabled. -INSTANTIATE_TEST_SUITE_P(, FormDataImporterTest, testing::Bool()); +#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) +TEST_P(FormDataImporterTest, + ProcessIBANImportCandidate_ShouldOfferLocalSave_NewIBAN) { + IBAN iban_import_candidate = test::GetIBAN(); + iban_import_candidate.set_record_type(IBAN::NEW_IBAN); + + EXPECT_EQ( + base::FeatureList::IsEnabled(features::kAutofillFillIbanFields), + form_data_importer().ProcessIBANImportCandidate(iban_import_candidate)); +} + +TEST_P(FormDataImporterTest, ImportFormData_ProcessIBANImportCandidate_NoIban) { + // Simulate a form submission with a new IBAN. + FormData form; + form.url = GURL("https://www.foo.com"); + + AddIBANForm(&form, ""); + + FormStructure form_structure(form); + form_structure.DetermineHeuristicTypes(nullptr, nullptr); + + ASSERT_FALSE(ImportFormDataAndProcessIBANCandidates( + form_structure, /*profile_autofill_enabled=*/true, + /*payment_methods_autofill_enabled=*/true)); +} + +TEST_P( + FormDataImporterTest, + ImportFormData_ProcessIBANImportCandidate_PaymentMethodsSettingDisabled) { + // Simulate a form submission with a new IBAN. + FormData form; + form.url = GURL("https://www.foo.com"); + + AddIBANForm(&form, kIbanValue); + + FormStructure form_structure(form); + form_structure.DetermineHeuristicTypes(nullptr, nullptr); + + ASSERT_FALSE(ImportFormDataAndProcessIBANCandidates( + form_structure, /*profile_autofill_enabled=*/true, + /*payment_methods_autofill_enabled=*/false)); +} + +TEST_P(FormDataImporterTest, + ImportFormData_ProcessIBANImportCandidate_NewIban) { + // Simulate a form submission with a new IBAN. + FormData form; + form.url = GURL("https://www.foo.com"); + + AddIBANForm(&form, kIbanValue); + + FormStructure form_structure(form); + form_structure.DetermineHeuristicTypes(nullptr, nullptr); + + ASSERT_EQ(base::FeatureList::IsEnabled(features::kAutofillFillIbanFields), + ImportFormDataAndProcessIBANCandidates( + form_structure, /*profile_autofill_enabled=*/true, + /*payment_methods_autofill_enabled=*/true)); +} + +TEST_P(FormDataImporterTest, + ImportFormData_ProcessIBANImportCandidate_LocalIban) { + IBAN iban; + iban.set_value(base::UTF8ToUTF16(std::string(kIbanValue))); + personal_data_manager_->AddIBAN(iban); + + WaitForOnPersonalDataChanged(); + // Simulate a form submission with a new IBAN. + FormData form; + form.url = GURL("https://www.foo.com"); + + AddIBANForm(&form, kIbanValue); + + FormStructure form_structure(form); + form_structure.DetermineHeuristicTypes(nullptr, nullptr); + + ASSERT_FALSE(ImportFormDataAndProcessIBANCandidates( + form_structure, /*profile_autofill_enabled=*/true, + /*payment_methods_autofill_enabled=*/true)); +} + +TEST_P(FormDataImporterTest, + ImportFormData_ProcessIBANImportCandidate_MaxStrikes) { + IBANSaveStrikeDatabase iban_save_strike_database = + IBANSaveStrikeDatabase(autofill_client_->GetStrikeDatabase()); + + iban_save_strike_database.AddStrikes( + iban_save_strike_database.GetMaxStrikesLimit(), kIbanValue); + + // Simulate a form submission with a new IBAN. + FormData form; + form.url = GURL("https://www.foo.com"); + + AddIBANForm(&form, kIbanValue); + + FormStructure form_structure(form); + form_structure.DetermineHeuristicTypes(nullptr, nullptr); + + ASSERT_FALSE(ImportFormDataAndProcessIBANCandidates( + form_structure, /*profile_autofill_enabled=*/true, + /*payment_methods_autofill_enabled=*/true)); +} +#endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) + +// Runs the suite with the features `kAutofillEnableSupportForApartmentNumbers` +// and `kAutofillFillIbanFields` enabled and disabled. +INSTANTIATE_TEST_SUITE_P(, + FormDataImporterTest, + testing::Combine(testing::Bool(), testing::Bool())); class FormDataImporterNonParameterizedTest : public FormDataImporterTestBase, public testing::Test {
diff --git a/components/autofill/core/browser/metrics/autofill_metrics_test_base.cc b/components/autofill/core/browser/metrics/autofill_metrics_test_base.cc index 3d94a89..fe844cd 100644 --- a/components/autofill/core/browser/metrics/autofill_metrics_test_base.cc +++ b/components/autofill/core/browser/metrics/autofill_metrics_test_base.cc
@@ -62,7 +62,8 @@ autofill_client_->set_test_form_data_importer( std::make_unique<TestFormDataImporter>( autofill_client_.get(), payments_client, - std::move(credit_card_save_manager), &personal_data(), "en-US")); + std::move(credit_card_save_manager), + /*iban_save_manager=*/nullptr, &personal_data(), "en-US")); autofill_client_->set_autofill_offer_manager( std::make_unique<AutofillOfferManager>( &personal_data(), /*coupon_service_delegate=*/nullptr));
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc index 575a5407..ac1630be 100644 --- a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc +++ b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
@@ -210,7 +210,7 @@ new TestFormDataImporter( &autofill_client_, payments_client_, std::unique_ptr<CreditCardSaveManager>(credit_card_save_manager_), - &personal_data(), "en-US"); + /*iban_save_manager=*/nullptr, &personal_data(), "en-US"); autofill_client_.set_test_form_data_importer( std::unique_ptr<TestFormDataImporter>(test_form_data_importer)); autofill_client_.GetStrikeDatabase();
diff --git a/components/autofill/core/browser/payments/iban_save_manager.cc b/components/autofill/core/browser/payments/iban_save_manager.cc index 7cda1476..d1511f1a 100644 --- a/components/autofill/core/browser/payments/iban_save_manager.cc +++ b/components/autofill/core/browser/payments/iban_save_manager.cc
@@ -11,32 +11,31 @@ namespace autofill { IBANSaveManager::IBANSaveManager(AutofillClient* client) - : personal_data_manager_(client->GetPersonalDataManager()), + : client_(client), iban_save_strike_database_(std::make_unique<IBANSaveStrikeDatabase>( client->GetStrikeDatabase())) {} IBANSaveManager::~IBANSaveManager() = default; bool IBANSaveManager::AttemptToOfferIBANLocalSave( - const absl::optional<IBAN>& iban_import_candidate) { - if (!iban_import_candidate || personal_data_manager_->IsOffTheRecord()) + const IBAN& iban_import_candidate) { +#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) + if (client_->GetPersonalDataManager()->IsOffTheRecord()) return false; -#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) - // TODO(crbug.com/1349109): Display the IBAN save prompt, and pass in a - // callback to OnUserDidDecideOnLocalSave() that will be called when the user - // makes a decision on the IBAN save prompt. // If the max strikes limit has been reached, do not show the IBAN save // prompt. - if (iban_save_strike_database_->ShouldBlockFeature( - base::UTF16ToUTF8((*iban_import_candidate).value()))) { - return false; - } + show_save_prompt_ = !iban_save_strike_database_->ShouldBlockFeature( + base::UTF16ToUTF8(iban_import_candidate.value())); - // No conditions to abort offering IBAN save early were met, so show the IBAN - // save prompt. - iban_save_candidate_ = iban_import_candidate.value(); - return true; + iban_save_candidate_ = iban_import_candidate; + // If `show_save_prompt_`'s value is false, desktop builds will still offer + // save in the omnibox without popping-up the bubble. + client_->ConfirmSaveIBANLocally( + iban_save_candidate_, show_save_prompt_, + base::BindOnce(&IBANSaveManager::OnUserDidDecideOnLocalSave, + weak_ptr_factory_.GetWeakPtr())); + return show_save_prompt_; #else // IBAN save prompts do not currently exist on mobile. return false; @@ -59,7 +58,8 @@ // the strike count starts over with respect to re-saving it. iban_save_strike_database_->ClearStrikes( base::UTF16ToUTF8(iban_save_candidate_.value())); - personal_data_manager_->OnAcceptedLocalIBANSave(iban_save_candidate_); + client_->GetPersonalDataManager()->OnAcceptedLocalIBANSave( + iban_save_candidate_); break; case AutofillClient::SaveIBANOfferUserDecision::kIgnored: case AutofillClient::SaveIBANOfferUserDecision::kDeclined:
diff --git a/components/autofill/core/browser/payments/iban_save_manager.h b/components/autofill/core/browser/payments/iban_save_manager.h index 4d722ff..d984e15 100644 --- a/components/autofill/core/browser/payments/iban_save_manager.h +++ b/components/autofill/core/browser/payments/iban_save_manager.h
@@ -14,7 +14,6 @@ namespace autofill { class IBANSaveStrikeDatabase; -class PersonalDataManager; // Decides whether an IBAN local save should be offered and handles the workflow // for local saves. @@ -25,10 +24,13 @@ IBANSaveManager& operator=(const IBANSaveManager&) = delete; virtual ~IBANSaveManager(); - // Checks that all requirements for offering local IBAN save are fulfilled, - // and if they are, offers local IBAN save. - bool AttemptToOfferIBANLocalSave( - const absl::optional<IBAN>& iban_import_candidate); + // Checks that all requirements for offering local IBAN save are fulfilled. + // Returns true if the save prompt was shown, and false otherwise. + // Note that on desktop if this returns false, the show save prompt will not + // be popped up but the omnibox icon still will be shown so the user can + // trigger the save prompt manually. + [[nodiscard]] bool AttemptToOfferIBANLocalSave( + const IBAN& iban_import_candidate); void OnUserDidDecideOnLocalSaveForTesting( AutofillClient::SaveIBANOfferUserDecision user_decision, @@ -44,15 +46,19 @@ AutofillClient::SaveIBANOfferUserDecision user_decision, const absl::optional<std::u16string>& nickname = absl::nullopt); - // The personal data manager, used to save and load IBAN data to/from the - // web database. - // Weak reference, should outlive this object. - raw_ptr<PersonalDataManager> personal_data_manager_; + // Returns the IBANSaveStrikeDatabase for `client_`. + IBANSaveStrikeDatabase* GetIBANSaveStrikeDatabase(); // The IBAN to be saved if local IBAN save is accepted. It will be set if // imported IBAN is not empty. IBAN iban_save_candidate_; + // True if the offer-to-save bubble should pop-up, false if not. + bool show_save_prompt_ = false; + + // The associated autofill client. Weak reference. + const raw_ptr<AutofillClient> client_; + // StrikeDatabase used to check whether to offer to save the IBAN or not. std::unique_ptr<IBANSaveStrikeDatabase> iban_save_strike_database_;
diff --git a/components/autofill/core/browser/payments/iban_save_manager_unittest.cc b/components/autofill/core/browser/payments/iban_save_manager_unittest.cc index fe8fc06..cf30ae1 100644 --- a/components/autofill/core/browser/payments/iban_save_manager_unittest.cc +++ b/components/autofill/core/browser/payments/iban_save_manager_unittest.cc
@@ -18,6 +18,10 @@ namespace autofill { +#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) +constexpr char kIbanValue[] = "DE91 1000 0000 0123 4567 89"; +#endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) + class IBANSaveManagerTest : public testing::Test { public: IBANSaveManagerTest() { @@ -39,12 +43,7 @@ iban_save_manager_ = std::make_unique<IBANSaveManager>(&autofill_client_); } - void OnUserDidDecideOnLocalSave( - AutofillClient::SaveIBANOfferUserDecision user_decision, - const absl::optional<std::u16string>& nickname = absl::nullopt) { - iban_save_manager_->OnUserDidDecideOnLocalSaveForTesting(user_decision, - nickname); - } + IBANSaveManager& GetIBANSaveManager() { return *iban_save_manager_; } protected: TestPersonalDataManager& personal_data() { @@ -62,34 +61,28 @@ }; #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) -TEST_F(IBANSaveManagerTest, AttemptToOfferIBANLocalSave_validIBAN) { +TEST_F(IBANSaveManagerTest, AttemptToOfferIBANLocalSave_ValidIBAN) { IBAN iban(base::GenerateGUID()); - iban.set_value(u"DE91 1000 0000 0123 4567 89"); + iban.set_value(base::UTF8ToUTF16(std::string(kIbanValue))); - EXPECT_TRUE(iban_save_manager_->AttemptToOfferIBANLocalSave(iban)); -} - -TEST_F(IBANSaveManagerTest, AttemptToOfferIBANLocalSave_NoIBAN) { - EXPECT_FALSE(iban_save_manager_->AttemptToOfferIBANLocalSave(absl::nullopt)); + EXPECT_TRUE(GetIBANSaveManager().AttemptToOfferIBANLocalSave(iban)); } TEST_F(IBANSaveManagerTest, AttemptToOfferIBANLocalSave_IsOffTheRecord) { personal_data().set_is_off_the_record_for_testing(true); - IBAN iban(base::GenerateGUID()); - iban.set_value(u"DE91 1000 0000 0123 4567 89"); + iban.set_value(base::UTF8ToUTF16(std::string(kIbanValue))); - EXPECT_FALSE(iban_save_manager_->AttemptToOfferIBANLocalSave(iban)); + EXPECT_FALSE(GetIBANSaveManager().AttemptToOfferIBANLocalSave(iban)); } TEST_F(IBANSaveManagerTest, OnUserDidDecideOnLocalSave_Accepted) { IBAN iban(base::GenerateGUID()); - std::u16string value = u"DE91 1000 0000 0123 4567 89"; - iban.set_value(value); + iban.set_value(base::UTF8ToUTF16(std::string(kIbanValue))); - EXPECT_TRUE(iban_save_manager_->AttemptToOfferIBANLocalSave(iban)); + EXPECT_TRUE(GetIBANSaveManager().AttemptToOfferIBANLocalSave(iban)); - OnUserDidDecideOnLocalSave( + GetIBANSaveManager().OnUserDidDecideOnLocalSaveForTesting( AutofillClient::SaveIBANOfferUserDecision::kAccepted, u" My teacher's IBAN "); const std::vector<IBAN*> ibans = personal_data().GetLocalIBANs(); @@ -97,18 +90,17 @@ // Verify IBAN has been successfully updated with the new nickname on accept. EXPECT_EQ(ibans.size(), 1U); EXPECT_EQ(ibans[0]->nickname(), u"My teacher's IBAN"); - EXPECT_EQ(ibans[0]->value(), value); + EXPECT_EQ(ibans[0]->value(), base::UTF8ToUTF16(std::string(kIbanValue))); } TEST_F(IBANSaveManagerTest, OnUserDidDecideOnLocalSave_Declined) { IBAN iban(base::GenerateGUID()); - std::u16string value = u"DE91 1000 0000 0123 4567 89"; - iban.set_value(value); + iban.set_value(base::UTF8ToUTF16(std::string(kIbanValue))); EXPECT_TRUE(iban_save_manager_->AttemptToOfferIBANLocalSave(iban)); EXPECT_TRUE(personal_data().GetLocalIBANs().empty()); - OnUserDidDecideOnLocalSave( + GetIBANSaveManager().OnUserDidDecideOnLocalSaveForTesting( AutofillClient::SaveIBANOfferUserDecision::kDeclined); const std::vector<IBAN*> ibans = personal_data().GetLocalIBANs(); @@ -117,13 +109,12 @@ TEST_F(IBANSaveManagerTest, OnUserDidDecideOnLocalSave_Ignored) { IBAN iban(base::GenerateGUID()); - std::u16string value = u"DE91 1000 0000 0123 4567 89"; - iban.set_value(value); + iban.set_value(base::UTF8ToUTF16(std::string(kIbanValue))); EXPECT_TRUE(iban_save_manager_->AttemptToOfferIBANLocalSave(iban)); EXPECT_TRUE(personal_data().GetLocalIBANs().empty()); - OnUserDidDecideOnLocalSave( + GetIBANSaveManager().OnUserDidDecideOnLocalSaveForTesting( AutofillClient::SaveIBANOfferUserDecision::kIgnored); const std::vector<IBAN*> ibans = personal_data().GetLocalIBANs(); @@ -132,103 +123,95 @@ TEST_F(IBANSaveManagerTest, LocallySaveIBAN_NotEnoughStrikesShouldOfferToSave) { IBAN iban(base::GenerateGUID()); - const std::u16string iban_value = u"DE91 1000 0000 0123 4567 89"; - iban.set_value(iban_value); + iban.set_value(base::UTF8ToUTF16(std::string(kIbanValue))); IBANSaveStrikeDatabase iban_save_strike_database = IBANSaveStrikeDatabase(strike_database_); + iban_save_strike_database.AddStrike(kIbanValue); - iban_save_strike_database.AddStrike(base::UTF16ToUTF8(iban_value)); - - // Verify `iban_value` has been successfully added to the strike database. - EXPECT_EQ( - 1, iban_save_strike_database.GetStrikes(base::UTF16ToUTF8(iban_value))); - EXPECT_TRUE(iban_save_manager_->AttemptToOfferIBANLocalSave(iban)); + // Verify `kIbanValue` has been successfully added to the strike database. + EXPECT_EQ(1, iban_save_strike_database.GetStrikes(kIbanValue)); + EXPECT_TRUE(GetIBANSaveManager().AttemptToOfferIBANLocalSave(iban)); } TEST_F(IBANSaveManagerTest, LocallySaveIBAN_MaxStrikesShouldNotOfferToSave) { IBAN iban(base::GenerateGUID()); - const std::u16string iban_value = u"DE91 1000 0000 0123 4567 89"; - iban.set_value(iban_value); + iban.set_value(base::UTF8ToUTF16(std::string(kIbanValue))); IBANSaveStrikeDatabase iban_save_strike_database = IBANSaveStrikeDatabase(strike_database_); + iban_save_strike_database.AddStrikes( + iban_save_strike_database.GetMaxStrikesLimit(), kIbanValue); - for (int i = 0; i < iban_save_strike_database.GetMaxStrikesLimit(); ++i) { - iban_save_strike_database.AddStrike(base::UTF16ToUTF8(iban_value)); - } - EXPECT_EQ( - iban_save_strike_database.GetMaxStrikesLimit(), - iban_save_strike_database.GetStrikes(base::UTF16ToUTF8(iban_value))); - - EXPECT_FALSE(iban_save_manager_->AttemptToOfferIBANLocalSave(iban)); + EXPECT_EQ(iban_save_strike_database.GetMaxStrikesLimit(), + iban_save_strike_database.GetStrikes(kIbanValue)); + EXPECT_FALSE(GetIBANSaveManager().AttemptToOfferIBANLocalSave(iban)); } TEST_F(IBANSaveManagerTest, OnUserDidDecideOnLocalSave_Accepted_ClearsStrikes) { IBAN iban(base::GenerateGUID()); - const std::u16string iban_value = u"DE91 1000 0000 0123 4567 89"; - iban.set_value(iban_value); - iban_save_manager_->AttemptToOfferIBANLocalSave(iban); + iban.set_value(base::UTF8ToUTF16(std::string(kIbanValue))); + EXPECT_TRUE(GetIBANSaveManager().AttemptToOfferIBANLocalSave(iban)); IBANSaveStrikeDatabase iban_save_strike_database = IBANSaveStrikeDatabase(strike_database_); + iban_save_strike_database.AddStrike(kIbanValue); - iban_save_strike_database.AddStrike(base::UTF16ToUTF8(iban_value)); - - // Verify `iban_value` has been successfully added to the strike database. - EXPECT_EQ( - 1, iban_save_strike_database.GetStrikes(base::UTF16ToUTF8(iban_value))); - OnUserDidDecideOnLocalSave( + // Verify `kIbanValue` has been successfully added to the strike database. + EXPECT_EQ(1, iban_save_strike_database.GetStrikes(kIbanValue)); + GetIBANSaveManager().OnUserDidDecideOnLocalSaveForTesting( AutofillClient::SaveIBANOfferUserDecision::kAccepted, u"My teacher's IBAN"); - // Verify `iban_value` has been cleared in the strike database. - EXPECT_EQ( - 0, iban_save_strike_database.GetStrikes(base::UTF16ToUTF8(iban_value))); + // Verify `kIbanValue` has been cleared in the strike database. + EXPECT_EQ(0, iban_save_strike_database.GetStrikes(kIbanValue)); } TEST_F(IBANSaveManagerTest, OnUserDidDecideOnLocalSave_Declined_AddsStrike) { IBAN iban(base::GenerateGUID()); - const std::u16string iban_value = u"DE91 1000 0000 0123 4567 89"; - iban.set_value(iban_value); - iban_save_manager_->AttemptToOfferIBANLocalSave(iban); + iban.set_value(base::UTF8ToUTF16(std::string(kIbanValue))); + EXPECT_TRUE(GetIBANSaveManager().AttemptToOfferIBANLocalSave(iban)); IBANSaveStrikeDatabase iban_save_strike_database = IBANSaveStrikeDatabase(strike_database_); - // Verify `iban_value` has been successfully added to the strike database. - EXPECT_EQ( - 0, iban_save_strike_database.GetStrikes(base::UTF16ToUTF8(iban_value))); + // Verify `kIbanValue` has been successfully added to the strike database. + EXPECT_EQ(0, iban_save_strike_database.GetStrikes(kIbanValue)); - OnUserDidDecideOnLocalSave( + GetIBANSaveManager().OnUserDidDecideOnLocalSaveForTesting( AutofillClient::SaveIBANOfferUserDecision::kDeclined, u"My teacher's IBAN"); - // Verify `iban_value` has been added to the strike database. - EXPECT_EQ( - 1, iban_save_strike_database.GetStrikes(base::UTF16ToUTF8(iban_value))); + // Verify `kIbanValue` has been added to the strike database. + EXPECT_EQ(1, iban_save_strike_database.GetStrikes(kIbanValue)); } TEST_F(IBANSaveManagerTest, OnUserDidDecideOnLocalSave_Ignored_AddsStrike) { IBAN iban(base::GenerateGUID()); - const std::u16string iban_value = u"DE91 1000 0000 0123 4567 89"; - iban.set_value(iban_value); - iban_save_manager_->AttemptToOfferIBANLocalSave(iban); + iban.set_value(base::UTF8ToUTF16(std::string(kIbanValue))); + + EXPECT_TRUE(GetIBANSaveManager().AttemptToOfferIBANLocalSave(iban)); IBANSaveStrikeDatabase iban_save_strike_database = IBANSaveStrikeDatabase(strike_database_); - // Verify `iban_value` has been successfully added to the strike database. - EXPECT_EQ( - 0, iban_save_strike_database.GetStrikes(base::UTF16ToUTF8(iban_value))); + // Verify `kIbanValue` has been successfully added to the strike database. + EXPECT_EQ(0, iban_save_strike_database.GetStrikes(kIbanValue)); - OnUserDidDecideOnLocalSave( + GetIBANSaveManager().OnUserDidDecideOnLocalSaveForTesting( AutofillClient::SaveIBANOfferUserDecision::kDeclined, u"My teacher's IBAN"); - // Verify `iban_value` has been added to the strike database. - EXPECT_EQ( - 1, iban_save_strike_database.GetStrikes(base::UTF16ToUTF8(iban_value))); + // Verify `kIbanValue` has been added to the strike database. + EXPECT_EQ(1, iban_save_strike_database.GetStrikes(kIbanValue)); +} + +TEST_F(IBANSaveManagerTest, LocallySaveIBAN_AttemptToOfferIBANLocalSave) { + IBAN iban(base::GenerateGUID()); + iban.set_value(base::UTF8ToUTF16(std::string(kIbanValue))); + + EXPECT_TRUE(GetIBANSaveManager().AttemptToOfferIBANLocalSave(iban)); + EXPECT_TRUE(autofill_client_.ConfirmSaveIBANLocallyWasCalled()); } #endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
diff --git a/components/autofill/core/browser/payments/local_card_migration_manager_unittest.cc b/components/autofill/core/browser/payments/local_card_migration_manager_unittest.cc index 7c49898..68890fa 100644 --- a/components/autofill/core/browser/payments/local_card_migration_manager_unittest.cc +++ b/components/autofill/core/browser/payments/local_card_migration_manager_unittest.cc
@@ -91,7 +91,7 @@ new TestFormDataImporter( &autofill_client_, payments_client_, std::unique_ptr<CreditCardSaveManager>(credit_card_save_manager_), - &personal_data(), "en-US", + /*iban_save_manager=*/nullptr, &personal_data(), "en-US", std::unique_ptr<LocalCardMigrationManager>( local_card_migration_manager_)); autofill_client_.set_test_form_data_importer(
diff --git a/components/autofill/core/browser/test_autofill_client.cc b/components/autofill/core/browser/test_autofill_client.cc index 565356f..3104267 100644 --- a/components/autofill/core/browser/test_autofill_client.cc +++ b/components/autofill/core/browser/test_autofill_client.cc
@@ -205,6 +205,15 @@ const std::u16string& tip_message, const std::vector<MigratableCreditCard>& migratable_credit_cards, MigrationDeleteCardCallback delete_local_card_callback) {} + +void TestAutofillClient::ConfirmSaveIBANLocally( + const IBAN& iban, + bool should_show_prompt, + LocalSaveIBANPromptCallback callback) { + confirm_save_iban_locally_called_ = true; + offer_to_save_iban_bubble_was_shown_ = should_show_prompt; +} + void TestAutofillClient::ShowWebauthnOfferDialog( WebauthnDialogCallback offer_dialog_callback) {}
diff --git a/components/autofill/core/browser/test_autofill_client.h b/components/autofill/core/browser/test_autofill_client.h index 36b5969d..f083c80 100644 --- a/components/autofill/core/browser/test_autofill_client.h +++ b/components/autofill/core/browser/test_autofill_client.h
@@ -117,6 +117,9 @@ const std::u16string& tip_message, const std::vector<MigratableCreditCard>& migratable_credit_cards, MigrationDeleteCardCallback delete_local_card_callback) override; + void ConfirmSaveIBANLocally(const IBAN& iban, + bool should_show_prompt, + LocalSaveIBANPromptCallback callback) override; void ShowWebauthnOfferDialog( WebauthnDialogCallback offer_dialog_callback) override; void ShowWebauthnVerifyPendingDialog( @@ -278,10 +281,23 @@ should_save_autofill_profiles_ = value; } + void Reset() { + confirm_save_iban_locally_called_ = false; + offer_to_save_iban_bubble_was_shown_ = false; + } + bool ConfirmSaveCardLocallyWasCalled() { return confirm_save_credit_card_locally_called_; } + bool ConfirmSaveIBANLocallyWasCalled() { + return confirm_save_iban_locally_called_; + } + + bool offer_to_save_iban_bubble_was_shown() { + return offer_to_save_iban_bubble_was_shown_; + } + bool get_offer_to_save_credit_card_bubble_was_shown() { return offer_to_save_credit_card_bubble_was_shown_.value(); } @@ -376,6 +392,8 @@ bool confirm_save_credit_card_locally_called_ = false; + bool confirm_save_iban_locally_called_ = false; + bool virtual_card_error_dialog_shown_ = false; // Context parameters that are used to display an error dialog during card @@ -396,9 +414,13 @@ version_info::Channel channel_for_testing_ = version_info::Channel::UNKNOWN; - // Populated if local save or upload was offered. + // Populated if credit card local save or upload was offered. absl::optional<SaveCreditCardOptions> save_credit_card_options_; + // Populated if IBAN save was offered. True if bubble was shown, false + // otherwise. + bool offer_to_save_iban_bubble_was_shown_ = false; + std::vector<std::string> migration_card_selection_; // A mock translate driver which provides the language state.
diff --git a/components/autofill/core/browser/test_form_data_importer.cc b/components/autofill/core/browser/test_form_data_importer.cc index 405ac66..9191874a 100644 --- a/components/autofill/core/browser/test_form_data_importer.cc +++ b/components/autofill/core/browser/test_form_data_importer.cc
@@ -11,6 +11,7 @@ AutofillClient* client, payments::PaymentsClient* payments_client, std::unique_ptr<CreditCardSaveManager> credit_card_save_manager, + std::unique_ptr<IBANSaveManager> iban_save_manager, PersonalDataManager* personal_data_manager, const std::string& app_locale, std::unique_ptr<LocalCardMigrationManager> local_card_migration_manager) @@ -20,6 +21,7 @@ app_locale) { set_credit_card_save_manager_for_testing(std::move(credit_card_save_manager)); #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) + set_iban_save_manager_for_testing(std::move(iban_save_manager)); set_local_card_migration_manager_for_testing( std::move(local_card_migration_manager)); #endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
diff --git a/components/autofill/core/browser/test_form_data_importer.h b/components/autofill/core/browser/test_form_data_importer.h index 072b244..9b01311b 100644 --- a/components/autofill/core/browser/test_form_data_importer.h +++ b/components/autofill/core/browser/test_form_data_importer.h
@@ -18,6 +18,7 @@ AutofillClient* client, payments::PaymentsClient* payments_client, std::unique_ptr<CreditCardSaveManager> credit_card_save_manager, + std::unique_ptr<IBANSaveManager> iban_save_manager, PersonalDataManager* personal_data_manager, const std::string& app_locale, std::unique_ptr<LocalCardMigrationManager> local_card_migration_manager =
diff --git a/components/browser_ui/widget/android/java/res/anim/menu_enter_from_bottom_left.xml b/components/browser_ui/widget/android/java/res/anim/menu_enter_from_bottom_left.xml index 517ac6b..709ece0 100644 --- a/components/browser_ui/widget/android/java/res/anim/menu_enter_from_bottom_left.xml +++ b/components/browser_ui/widget/android/java/res/anim/menu_enter_from_bottom_left.xml
@@ -6,20 +6,20 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> -<scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" - android:fromXScale="0" - android:toXScale="1" - android:fromYScale="0" - android:toYScale="1" - android:pivotX="@fraction/menu_start_animation_pivot_x" - android:pivotY="5%" - android:duration="200" /> -<alpha android:interpolator="@android:anim/linear_interpolator" - android:fromAlpha="0" android:toAlpha="1" - android:duration="200" /> -<translate android:interpolator="@android:anim/accelerate_decelerate_interpolator" - android:fromYDelta="@dimen/menu_negative_software_vertical_offset" - android:toYDelta="0" - android:toXDelta="0" - android:duration="200" /> + <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" + android:fromXScale="0" + android:toXScale="1" + android:fromYScale="0" + android:toYScale="1" + android:pivotX="@fraction/menu_start_animation_pivot_x" + android:pivotY="100%" + android:duration="200" /> + <alpha android:interpolator="@android:anim/linear_interpolator" + android:fromAlpha="0" android:toAlpha="1" + android:duration="200" /> + <translate android:interpolator="@android:anim/accelerate_decelerate_interpolator" + android:fromYDelta="@dimen/menu_negative_software_vertical_offset" + android:toYDelta="0" + android:toXDelta="0" + android:duration="200" /> </set> \ No newline at end of file
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/chips/ChipView.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/chips/ChipView.java index 1a4ac25..462bd1b3 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/chips/ChipView.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/chips/ChipView.java
@@ -63,6 +63,7 @@ private ViewGroup mEndIconWrapper; private AppCompatTextView mSecondaryText; + private int mMaxWidth = Integer.MAX_VALUE; /** Constructor for applying a theme overlay. */ public ChipView(Context context, @StyleRes int themeOverlay) { @@ -387,4 +388,55 @@ public @Px int getCornerRadius() { return mCornerRadius; } + + /** + * TODO (crbug.com/1376691): Set a constant minimum width for the chips. The chips must always + * display some text. + * Sets the maximum width of the chip. This is achieved by resizing the + * primary text view. The primary text is either truncated or completely removed depending on + * the space available after all other chip contents are accounted for. After the primary text + * gets removed, the secondary text is truncated. Note: This method can cause additional + * measure/layout passes and could impact performance. + * @param maxWidth of the chip in px. + */ + public void setMaxWidth(int maxWidth) { + mMaxWidth = maxWidth; + } + + /** + * Another approach is to override the {@link LinearLayout#onLayout()} which doesn't require an + * additional measure pass at the end. Performance wise they are comparable. + */ + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + // If the chip width exceeds the maximum allowed size, resize the contents to respect the + // width constraint. + if (getMeasuredWidth() > mMaxWidth) { + int newPrimaryTextWidth = mMaxWidth - getPaddingLeft() - getPaddingRight() + - ((mStartIcon != null && mStartIcon.getVisibility() != GONE) + ? mStartIcon.getMeasuredWidth() + : 0) + - ((mSecondaryText != null && mSecondaryText.getVisibility() != GONE) + ? mSecondaryText.getMeasuredWidth() + : 0); + // TODO (crbug.com/1376691): The primary text must be at least a few pixels wide, else + // only the ellipses will be visible. + // If there is space for displaying the {@link mPrimaryText}, adjust it's size, and add + // trailing ellipses. If not, check if the secondary text exists. If it does, remove the + // primary text, else do not width constrain the chip. The chip should ALWAYS display + // some text. + if (newPrimaryTextWidth > 0) { + mPrimaryText.setMaxWidth(newPrimaryTextWidth); + mPrimaryText.setEllipsize(TextUtils.TruncateAt.END); + } else if (mSecondaryText != null && mSecondaryText.getVisibility() != GONE) { + mPrimaryText.setVisibility(GONE); + } else { + return; + } + super.onMeasure( + MeasureSpec.makeMeasureSpec(mMaxWidth, MeasureSpec.EXACTLY), heightMeasureSpec); + } + } }
diff --git a/components/cdm/browser/media_drm_storage_impl.cc b/components/cdm/browser/media_drm_storage_impl.cc index f596977e..272a286 100644 --- a/components/cdm/browser/media_drm_storage_impl.cc +++ b/components/cdm/browser/media_drm_storage_impl.cc
@@ -331,14 +331,14 @@ // 2. Removes the origin data if all of the sessions are removed. // 3. Returns a list of origin IDs to unprovision. std::vector<base::UnguessableToken> ClearMatchingLicenseData( - base::Value* storage_dict, + base::Value::Dict& storage_dict, base::Time start, base::Time end, const base::RepeatingCallback<bool(const GURL&)>& filter) { std::vector<std::string> origins_to_delete; std::vector<base::UnguessableToken> origin_ids_to_unprovision; - for (const auto key_value : storage_dict->DictItems()) { + for (const auto key_value : storage_dict) { const std::string& origin_str = key_value.first; if (filter && !filter.Run(GURL(origin_str))) @@ -383,7 +383,7 @@ // Remove origin data. for (const auto& origin_str : origins_to_delete) - storage_dict->RemoveKey(origin_str); + storage_dict.Remove(origin_str); return origin_ids_to_unprovision; } @@ -547,8 +547,8 @@ // Save the origin ID in the preference as long as it is not null. if (origin_id) { - DictionaryPrefUpdate update(pref_service, prefs::kMediaDrmStorage); - CreateOriginDictAndReturnSessionsDict(update->GetDict(), origin, + ScopedDictPrefUpdate update(pref_service, prefs::kMediaDrmStorage); + CreateOriginDictAndReturnSessionsDict(update.Get(), origin, origin_id.value()); } @@ -662,7 +662,7 @@ base::OnceClosure complete_cb) { DVLOG(1) << __func__ << ": Clear licenses [" << start << ", " << end << "]"; - DictionaryPrefUpdate update(pref_service, prefs::kMediaDrmStorage); + ScopedDictPrefUpdate update(pref_service, prefs::kMediaDrmStorage); std::vector<base::UnguessableToken> no_license_origin_ids = ClearMatchingLicenseData(update.Get(), start, end, filter); @@ -784,13 +784,12 @@ return; } - DictionaryPrefUpdate update(pref_service_, prefs::kMediaDrmStorage); - base::Value::Dict& storage_dict = update->GetDict(); + ScopedDictPrefUpdate update(pref_service_, prefs::kMediaDrmStorage); // Update origin dict once origin provisioning completes. There may be // orphaned session info from a previous provisioning. Clear them by // recreating the dicts. - CreateOriginDictAndReturnSessionsDict(storage_dict, origin(), + CreateOriginDictAndReturnSessionsDict(update.Get(), origin(), origin_id_.value()); std::move(callback).Run(true); } @@ -815,8 +814,8 @@ return; } - DictionaryPrefUpdate update(pref_service_, prefs::kMediaDrmStorage); - base::Value::Dict& storage_dict = update->GetDict(); + ScopedDictPrefUpdate update(pref_service_, prefs::kMediaDrmStorage); + base::Value::Dict& storage_dict = update.Get(); base::Value::Dict* sessions_dict = GetSessionsDictFromStorageDict(storage_dict, origin().Serialize()); @@ -912,10 +911,10 @@ return; } - DictionaryPrefUpdate update(pref_service_, prefs::kMediaDrmStorage); + ScopedDictPrefUpdate update(pref_service_, prefs::kMediaDrmStorage); base::Value::Dict* sessions_dict = - GetSessionsDictFromStorageDict(update->GetDict(), origin().Serialize()); + GetSessionsDictFromStorageDict(update.Get(), origin().Serialize()); if (!sessions_dict) { std::move(callback).Run(true);
diff --git a/components/client_hints/browser/client_hints.cc b/components/client_hints/browser/client_hints.cc index 608ca57..5ecdfbb 100644 --- a/components/client_hints/browser/client_hints.cc +++ b/components/client_hints/browser/client_hints.cc
@@ -9,8 +9,6 @@ #include "base/command_line.h" #include "base/feature_list.h" #include "base/json/json_reader.h" -#include "base/metrics/histogram_functions.h" -#include "base/time/time.h" #include "components/client_hints/browser/client_hints.h" #include "components/client_hints/common/client_hints.h" #include "components/client_hints/common/switches.h" @@ -181,7 +179,7 @@ return; } - const base::TimeTicks start_time = base::TimeTicks::Now(); + const auto& persistence_started = base::TimeTicks::Now(); base::Value::List client_hints_list; client_hints_list.reserve(client_hints.size()); @@ -204,12 +202,8 @@ primary_url, GURL(), ContentSettingsType::CLIENT_HINTS, base::Value(std::move(client_hints_dictionary)), {base::Time(), session_model}); - - // Record the time spent getting the client hints. - base::TimeDelta duration = base::TimeTicks::Now() - start_time; - base::UmaHistogramTimes("ClientHints.StoreLatency", duration); - base::UmaHistogramExactLinear("ClientHints.UpdateEventCount", 1, 2); - base::UmaHistogramCounts100("ClientHints.UpdateSize", client_hints.size()); + network::LogClientHintsPersistenceMetrics(persistence_started, + client_hints.size()); } void ClientHints::SetAdditionalClientHints(
diff --git a/components/content_settings/core/browser/website_settings_registry.cc b/components/content_settings/core/browser/website_settings_registry.cc index 6ca5b4c3..7d48085 100644 --- a/components/content_settings/core/browser/website_settings_registry.cc +++ b/components/content_settings/core/browser/website_settings_registry.cc
@@ -273,6 +273,11 @@ WebsiteSettingsInfo::NOT_LOSSY, WebsiteSettingsInfo::GENERIC_SINGLE_ORIGIN_SCOPE, ALL_PLATFORMS, WebsiteSettingsInfo::DONT_INHERIT_IN_INCOGNITO); + Register(ContentSettingsType::REVOKED_UNUSED_SITE_PERMISSIONS, + "unused-site-permissions", base::Value(), + WebsiteSettingsInfo::UNSYNCABLE, WebsiteSettingsInfo::NOT_LOSSY, + WebsiteSettingsInfo::GENERIC_SINGLE_ORIGIN_SCOPE, DESKTOP, + WebsiteSettingsInfo::DONT_INHERIT_IN_INCOGNITO); } } // namespace content_settings
diff --git a/components/content_settings/core/common/content_settings.cc b/components/content_settings/core/common/content_settings.cc index 7c1b5b6..f516737a 100644 --- a/components/content_settings/core/common/content_settings.cc +++ b/components/content_settings/core/common/content_settings.cc
@@ -111,6 +111,7 @@ {ContentSettingsType::PRIVATE_NETWORK_CHOOSER_DATA, 90}, {ContentSettingsType::FEDERATED_IDENTITY_IDENTITY_PROVIDER_SIGNIN_STATUS, 91}, + {ContentSettingsType::REVOKED_UNUSED_SITE_PERMISSIONS, 92}, }; void FilterRulesForType(ContentSettingsForOneType& settings,
diff --git a/components/content_settings/core/common/content_settings_types.h b/components/content_settings/core/common/content_settings_types.h index b4dbe53..6b01fc49 100644 --- a/components/content_settings/core/common/content_settings_types.h +++ b/components/content_settings/core/common/content_settings_types.h
@@ -302,6 +302,11 @@ // HTTP header. FEDERATED_IDENTITY_IDENTITY_PROVIDER_SIGNIN_STATUS, + // Website setting which is used for UnusedSitePermissionsService to + // store revoked permissions of unused sites from unused site permissions + // feature. + REVOKED_UNUSED_SITE_PERMISSIONS, + NUM_TYPES, };
diff --git a/components/exo/wayland/zaura_shell.cc b/components/exo/wayland/zaura_shell.cc index 9d57224..52282b1 100644 --- a/components/exo/wayland/zaura_shell.cc +++ b/components/exo/wayland/zaura_shell.cc
@@ -51,6 +51,8 @@ #include "ui/display/manager/display_manager.h" #include "ui/display/manager/display_manager_util.h" #include "ui/display/screen.h" +#include "ui/views/corewm/tooltip_controller.h" +#include "ui/views/widget/tooltip_manager.h" #include "ui/views/widget/widget.h" #include "ui/wm/core/coordinate_conversion.h" #include "ui/wm/public/activation_client.h" @@ -679,12 +681,16 @@ const base::TimeDelta& show_delay, const base::TimeDelta& hide_delay) { tooltip_text_ = base::UTF8ToUTF16(text); - wm::SetTooltipText(surface_->window(), &tooltip_text_); - wm::SetTooltipId(surface_->window(), surface_); + auto* window = surface_->window(); + wm::SetTooltipText(window, &tooltip_text_); + wm::SetTooltipId(window, surface_); + ash::Shell::Get()->tooltip_controller()->UpdateTooltip(window); } void AuraSurface::HideTooltip() { tooltip_text_ = std::u16string(); + auto* window = surface_->window(); + ash::Shell::Get()->tooltip_controller()->UpdateTooltip(window); } chromeos::OrientationType OrientationLock(uint32_t orientation_lock) { @@ -1057,6 +1063,7 @@ // |wayland_simple_client| 1352584, 1358908, + 1400226, }; // Implements aura shell interface and monitors workspace state needed
diff --git a/components/omnibox/browser/search_suggestion_parser.cc b/components/omnibox/browser/search_suggestion_parser.cc index e92e207..71c2dc2c 100644 --- a/components/omnibox/browser/search_suggestion_parser.cc +++ b/components/omnibox/browser/search_suggestion_parser.cc
@@ -36,6 +36,7 @@ #include "net/http/http_response_headers.h" #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/public/mojom/url_response_head.mojom.h" +#include "third_party/omnibox_proto/entity_info.pb.h" #include "ui/base/device_form_factor.h" #include "url/url_constants.h" @@ -166,6 +167,29 @@ } } +// Decodes a proto object from its serialized Base64 string representation. +template <typename T> +bool DecodeProtoFromBase64(const std::string* encoded_data, T& result_proto) { + if (!encoded_data || encoded_data->empty()) { + return false; + } + + std::string decoded_data; + if (!base::Base64Decode(*encoded_data, &decoded_data)) { + return false; + } + + if (decoded_data.empty()) { + return false; + } + + if (!result_proto.ParseFromString(decoded_data)) { + return false; + } + + return true; +} + } // namespace omnibox::SuggestSubtype SuggestSubtypeForNumber(int value) { @@ -615,13 +639,8 @@ } const auto* groups_info_string = extras.FindStringKey("google:groupsinfo"); - std::string groups_info_decoded; - if (groups_info_string && !groups_info_string->empty() && - base::Base64Decode(*groups_info_string, &groups_info_decoded) && - !groups_info_decoded.empty()) { - groups_info_parsed_from_proto = - groups_info.ParseFromString(groups_info_decoded); - } + groups_info_parsed_from_proto = DecodeProtoFromBase64<omnibox::GroupsInfo>( + groups_info_string, groups_info); const base::Value* header_texts = extras.FindDictKey("google:headertexts"); if (!groups_info_parsed_from_proto && header_texts) { @@ -783,25 +802,41 @@ std::string additional_query_params; std::string entity_id; absl::optional<int> suggestion_group_id; + omnibox::EntityInfo entity_info; if (suggestion_details && suggestion_details->GetList()[index].is_dict() && !suggestion_details->GetList()[index].DictEmpty()) { const base::Value& suggestion_detail = suggestion_details->GetList()[index]; - match_contents = - base::UTF8ToUTF16(FindStringKeyOrEmpty(suggestion_detail, "t")); + + const auto* entity_info_string = + suggestion_detail.FindStringKey("google:entityinfo"); + + // Extract data from proto field, but fall back to individual JSON + // fields if necessary. + if (!DecodeProtoFromBase64<omnibox::EntityInfo>(entity_info_string, + entity_info)) { + entity_info.set_name(FindStringKeyOrEmpty(suggestion_detail, "t")); + entity_info.set_annotation( + FindStringKeyOrEmpty(suggestion_detail, "a")); + entity_info.set_dominant_color( + FindStringKeyOrEmpty(suggestion_detail, "dc")); + entity_info.set_image_url( + FindStringKeyOrEmpty(suggestion_detail, "i")); + entity_info.set_entity_id( + FindStringKeyOrEmpty(suggestion_detail, "zae")); + entity_info.set_suggest_search_parameters( + FindStringKeyOrEmpty(suggestion_detail, "q")); + } + + match_contents = base::UTF8ToUTF16(entity_info.name()); if (match_contents.empty()) { match_contents = suggestion; } + match_contents_prefix = base::UTF8ToUTF16(FindStringKeyOrEmpty(suggestion_detail, "mp")); - annotation = - base::UTF8ToUTF16(FindStringKeyOrEmpty(suggestion_detail, "a")); - image_dominant_color = FindStringKeyOrEmpty(suggestion_detail, "dc"); - image_url = FindStringKeyOrEmpty(suggestion_detail, "i"); - additional_query_params = FindStringKeyOrEmpty(suggestion_detail, "q"); - entity_id = FindStringKeyOrEmpty(suggestion_detail, "zae"); // Suggestion group Id. suggestion_group_id = suggestion_detail.FindIntKey("zl"); @@ -828,10 +863,11 @@ results->suggest_results.push_back(SuggestResult( suggestion, match_type, subtypes[index], base::CollapseWhitespace(match_contents, false), - match_contents_prefix, annotation, additional_query_params, entity_id, - deletion_url, image_dominant_color, image_url, is_keyword_result, - relevance, relevances != nullptr, should_prefetch, should_prerender, - trimmed_input)); + match_contents_prefix, base::UTF8ToUTF16(entity_info.annotation()), + entity_info.suggest_search_parameters(), entity_info.entity_id(), + deletion_url, entity_info.dominant_color(), entity_info.image_url(), + is_keyword_result, relevance, relevances != nullptr, should_prefetch, + should_prerender, trimmed_input)); if (answer_parsed_successfully) { results->suggest_results.back().SetAnswer(answer);
diff --git a/components/omnibox/browser/search_suggestion_parser_unittest.cc b/components/omnibox/browser/search_suggestion_parser_unittest.cc index 3fd61470..6e4d12a 100644 --- a/components/omnibox/browser/search_suggestion_parser_unittest.cc +++ b/components/omnibox/browser/search_suggestion_parser_unittest.cc
@@ -12,10 +12,21 @@ #include "components/omnibox/browser/test_scheme_classifier.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/omnibox_proto/entity_info.pb.h" namespace { -std::string SerializeGroupsInfo(const omnibox::GroupsInfo& groups_info) { +std::string SerializeAndEncodeEntityInfo( + const omnibox::EntityInfo& entity_info) { + std::string serialized_entity_info; + entity_info.SerializeToString(&serialized_entity_info); + std::string encoded_entity_info; + base::Base64Encode(serialized_entity_info, &encoded_entity_info); + return encoded_entity_info; +} + +std::string SerializeAndEncodeGroupsInfo( + const omnibox::GroupsInfo& groups_info) { std::string serialized_groups_info; groups_info.SerializeToString(&serialized_groups_info); std::string encoded_groups_info; @@ -740,6 +751,96 @@ } } +TEST(SearchSuggestionParserTest, ParseSuggestionEntityInfo) { + TestSchemeClassifier scheme_classifier; + AutocompleteInput input(u"the m", metrics::OmniboxEventProto::NTP_REALBOX, + scheme_classifier); + + std::string json_data = R"([ + "the m", + ["the menu", "the menu", "the midnight club"], + ["", "", ""], + [], + { + "google:clientdata": { + "bpc": false, + "tlw": false + }, + "google:suggestdetail": [ + {}, + { + "a": "2022 film", + "dc": "#424242", + "i": "https://encrypted-tbn0.gstatic.com/images?q=the+menu", + "q": "gs_ssp=eJzj4tVP1zc0LCwoKssryyg3YPTiKMlIVchNzSsFAGrSCGQ", + "t": "The Menu", + "zae": "/g/11qprvnvhw" + }, + { + "a": "Thriller series", + "dc": "#283e75", + "i": "https://encrypted-tbn0.gstatic.com/images?q=the+midnight+club", + "q": "gs_ssp=eJzj4tVP1zc0zMqrNCvJNkwyYPQSLMlIVcjNTMnLTM8oUUjOKU0CALmyCz8", + "t": "The Midnight Club", + "zae": "/g/11jny6tk1b" + } + ], + "google:suggestrelevance": [701, 700, 553], + "google:suggestsubtypes": [ + [512, 433, 131, 355], + [131, 433, 512], + [512, 433] + ], + "google:suggesttype": ["QUERY", "ENTITY", "ENTITY"], + "google:verbatimrelevance": 851 + }])"; + + absl::optional<base::Value> root_val = base::JSONReader::Read(json_data); + ASSERT_TRUE(root_val); + + SearchSuggestionParser::Results results; + ASSERT_TRUE(SearchSuggestionParser::ParseSuggestResults( + *root_val, input, scheme_classifier, /*default_result_relevance=*/400, + /*is_keyword_result=*/false, &results)); + + ASSERT_EQ(3U, results.suggest_results.size()); + + // For each suggestion, verify that the JSON fields were correctly parsed. + ASSERT_EQ(u"the menu", results.suggest_results[0].suggestion()); + ASSERT_EQ(u"", results.suggest_results[0].annotation()); + ASSERT_EQ("", results.suggest_results[0].image_dominant_color()); + ASSERT_EQ("", results.suggest_results[0].image_url().spec()); + ASSERT_EQ("", results.suggest_results[0].additional_query_params()); + // Empty "t" value from server results in suggestion being used instead. + ASSERT_EQ(u"the menu", results.suggest_results[0].match_contents()); + ASSERT_EQ("", results.suggest_results[0].entity_id()); + + ASSERT_EQ(u"the menu", results.suggest_results[1].suggestion()); + ASSERT_EQ(u"2022 film", results.suggest_results[1].annotation()); + ASSERT_EQ("#424242", results.suggest_results[1].image_dominant_color()); + ASSERT_EQ( + "https://encrypted-tbn0.gstatic.com/" + "images?q=the+menu", + results.suggest_results[1].image_url().spec()); + ASSERT_EQ("gs_ssp=eJzj4tVP1zc0LCwoKssryyg3YPTiKMlIVchNzSsFAGrSCGQ", + results.suggest_results[1].additional_query_params()); + ASSERT_EQ(u"The Menu", results.suggest_results[1].match_contents()); + ASSERT_EQ("/g/11qprvnvhw", results.suggest_results[1].entity_id()); + + ASSERT_EQ(u"the midnight club", results.suggest_results[2].suggestion()); + ASSERT_EQ(u"Thriller series", results.suggest_results[2].annotation()); + ASSERT_EQ("#283e75", results.suggest_results[2].image_dominant_color()); + ASSERT_EQ( + "https://encrypted-tbn0.gstatic.com/" + "images?q=the+midnight+club", + results.suggest_results[2].image_url().spec()); + ASSERT_EQ( + "gs_ssp=eJzj4tVP1zc0zMqrNCvJNkwyYPQSLMlIVcjNTMnLTM8oUUjOKU0CALmyCz8", + results.suggest_results[2].additional_query_params()); + ASSERT_EQ(u"The Midnight Club", results.suggest_results[2].match_contents()); + ASSERT_EQ("/g/11jny6tk1b", results.suggest_results[2].entity_id()); +} + TEST(SearchSuggestionParserTest, ParseSuggestionGroupInfo_FromProto) { TestSchemeClassifier scheme_classifier; AutocompleteInput input(u"", metrics::OmniboxEventProto::NTP_REALBOX, @@ -774,7 +875,7 @@ "h":[10000, "10001"] }, "google:groupsinfo": ")" + - SerializeGroupsInfo(groups_info) + R"(", + SerializeAndEncodeGroupsInfo(groups_info) + R"(", "google:suggestdetail":[ { }, @@ -865,7 +966,7 @@ "h":[10000, "10001"] }, "google:groupsinfo": ")" + - SerializeGroupsInfo(groups_info) + R"(", + SerializeAndEncodeGroupsInfo(groups_info) + R"(", "google:suggestdetail":[ { }, @@ -984,7 +1085,7 @@ "tlw":false }, "google:groupsinfo": ")" + - SerializeGroupsInfo(groups_info) + R"(", + SerializeAndEncodeGroupsInfo(groups_info) + R"(", "google:suggestdetail":[ { "zl":10000 @@ -1119,6 +1220,209 @@ } } +TEST(SearchSuggestionParserTest, ParseSuggestionEntityInfo_FromProto) { + TestSchemeClassifier scheme_classifier; + AutocompleteInput input(u"the m", metrics::OmniboxEventProto::NTP_REALBOX, + scheme_classifier); + + // Parse EntityInfo data from properly encoded (base64) proto field. + { + omnibox::EntityInfo first_entity_info; + first_entity_info.set_annotation("2022 film"); + first_entity_info.set_dominant_color("#424242"); + first_entity_info.set_image_url( + "https://encrypted-tbn0.gstatic.com/" + "images?q=the+menu"); + first_entity_info.set_suggest_search_parameters( + "gs_ssp=eJzj4tVP1zc0LCwoKssryyg3YPTiKMlIVchNzSsFAGrSCGQ"); + first_entity_info.set_name("The Menu"); + first_entity_info.set_entity_id("/g/11qprvnvhw"); + + omnibox::EntityInfo second_entity_info; + second_entity_info.set_annotation("Thriller series"); + second_entity_info.set_dominant_color("#283e75"); + second_entity_info.set_image_url( + "https://encrypted-tbn0.gstatic.com/" + "images?q=the+midnight+club"); + second_entity_info.set_suggest_search_parameters( + "gs_ssp=eJzj4tVP1zc0zMqrNCvJNkwyYPQSLMlIVcjNTMnLTM8oUUjOKU0CALmyCz8"); + second_entity_info.set_name("The Midnight Club"); + second_entity_info.set_entity_id("/g/11jny6tk1b"); + + std::string json_data = R"([ + "the m", + ["the menu", "the menu", "the midnight club"], + ["", "", ""], + [], + { + "google:clientdata": { + "bpc": false, + "tlw": false + }, + "google:suggestdetail": [ + {}, + { + "google:entityinfo": ")" + + SerializeAndEncodeEntityInfo(first_entity_info) + + R"(" + }, + { + "google:entityinfo": ")" + + SerializeAndEncodeEntityInfo(second_entity_info) + + R"(" + } + ], + "google:suggestrelevance": [701, 700, 553], + "google:suggestsubtypes": [ + [512, 433, 131, 355], + [131, 433, 512], + [512, 433] + ], + "google:suggesttype": ["QUERY", "ENTITY", "ENTITY"], + "google:verbatimrelevance": 851 + }])"; + + absl::optional<base::Value> root_val = base::JSONReader::Read(json_data); + ASSERT_TRUE(root_val); + + SearchSuggestionParser::Results results; + ASSERT_TRUE(SearchSuggestionParser::ParseSuggestResults( + *root_val, input, scheme_classifier, /*default_result_relevance=*/400, + /*is_keyword_result=*/false, &results)); + + ASSERT_EQ(3U, results.suggest_results.size()); + + // For each suggestion, verify that the JSON fields were correctly parsed. + ASSERT_EQ(u"the menu", results.suggest_results[0].suggestion()); + ASSERT_EQ(u"", results.suggest_results[0].annotation()); + ASSERT_EQ("", results.suggest_results[0].image_dominant_color()); + ASSERT_EQ("", results.suggest_results[0].image_url().spec()); + ASSERT_EQ("", results.suggest_results[0].additional_query_params()); + // Empty "t" value from server results in suggestion being used instead. + ASSERT_EQ(u"the menu", results.suggest_results[0].match_contents()); + ASSERT_EQ("", results.suggest_results[0].entity_id()); + + ASSERT_EQ(u"the menu", results.suggest_results[1].suggestion()); + ASSERT_EQ(base::UTF8ToUTF16(first_entity_info.annotation()), + results.suggest_results[1].annotation()); + ASSERT_EQ(first_entity_info.dominant_color(), + results.suggest_results[1].image_dominant_color()); + ASSERT_EQ(first_entity_info.image_url(), + results.suggest_results[1].image_url().spec()); + ASSERT_EQ(first_entity_info.suggest_search_parameters(), + results.suggest_results[1].additional_query_params()); + ASSERT_EQ(base::UTF8ToUTF16(first_entity_info.name()), + results.suggest_results[1].match_contents()); + ASSERT_EQ(first_entity_info.entity_id(), + results.suggest_results[1].entity_id()); + + ASSERT_EQ(u"the midnight club", results.suggest_results[2].suggestion()); + ASSERT_EQ(base::UTF8ToUTF16(second_entity_info.annotation()), + results.suggest_results[2].annotation()); + ASSERT_EQ(second_entity_info.dominant_color(), + results.suggest_results[2].image_dominant_color()); + ASSERT_EQ(second_entity_info.image_url(), + results.suggest_results[2].image_url().spec()); + ASSERT_EQ(second_entity_info.suggest_search_parameters(), + results.suggest_results[2].additional_query_params()); + ASSERT_EQ(base::UTF8ToUTF16(second_entity_info.name()), + results.suggest_results[2].match_contents()); + ASSERT_EQ(second_entity_info.entity_id(), + results.suggest_results[2].entity_id()); + } + + // If possible, fall back to individual JSON fields when attempting to parse + // EntityInfo data from garbled proto field. + { + std::string json_data = R"([ + "the m", + ["the menu", "the menu", "the midnight club"], + ["", "", ""], + [], + { + "google:clientdata": { + "bpc": false, + "tlw": false + }, + "google:suggestdetail": [ + {}, + { + "google:entityinfo": "<< invalid format >>", + "a": "2022 film", + "dc": "#424242", + "i": "https://encrypted-tbn0.gstatic.com/images?q=the+menu", + "q": "gs_ssp=eJzj4tVP1zc0LCwoKssryyg3YPTiKMlIVchNzSsFAGrSCGQ", + "t": "The Menu", + "zae": "/g/11qprvnvhw" + }, + { + "google:entityinfo": "<< invalid format >>", + "a": "Thriller series", + "dc": "#283e75", + "i": "https://encrypted-tbn0.gstatic.com/images?q=the+midnight+club", + "q": "gs_ssp=eJzj4tVP1zc0zMqrNCvJNkwyYPQSLMlIVcjNTMnLTM8oUUjOKU0CALmyCz8", + "t": "The Midnight Club", + "zae": "/g/11jny6tk1b" + } + ], + "google:suggestrelevance": [701, 700, 553], + "google:suggestsubtypes": [ + [512, 433, 131, 355], + [131, 433, 512], + [512, 433] + ], + "google:suggesttype": ["QUERY", "ENTITY", "ENTITY"], + "google:verbatimrelevance": 851 + }])"; + + absl::optional<base::Value> root_val = base::JSONReader::Read(json_data); + ASSERT_TRUE(root_val); + + SearchSuggestionParser::Results results; + ASSERT_TRUE(SearchSuggestionParser::ParseSuggestResults( + *root_val, input, scheme_classifier, /*default_result_relevance=*/400, + /*is_keyword_result=*/false, &results)); + + ASSERT_EQ(3U, results.suggest_results.size()); + + // For each suggestion, verify that the JSON fields were correctly parsed. + ASSERT_EQ(u"the menu", results.suggest_results[0].suggestion()); + ASSERT_EQ(u"", results.suggest_results[0].annotation()); + ASSERT_EQ("", results.suggest_results[0].image_dominant_color()); + ASSERT_EQ("", results.suggest_results[0].image_url().spec()); + ASSERT_EQ("", results.suggest_results[0].additional_query_params()); + // Empty "t" value from server results in suggestion being used instead. + ASSERT_EQ(u"the menu", results.suggest_results[0].match_contents()); + ASSERT_EQ("", results.suggest_results[0].entity_id()); + + ASSERT_EQ(u"the menu", results.suggest_results[1].suggestion()); + ASSERT_EQ(u"2022 film", results.suggest_results[1].annotation()); + ASSERT_EQ("#424242", results.suggest_results[1].image_dominant_color()); + ASSERT_EQ( + "https://encrypted-tbn0.gstatic.com/" + "images?q=the+menu", + results.suggest_results[1].image_url().spec()); + ASSERT_EQ("gs_ssp=eJzj4tVP1zc0LCwoKssryyg3YPTiKMlIVchNzSsFAGrSCGQ", + results.suggest_results[1].additional_query_params()); + ASSERT_EQ(u"The Menu", results.suggest_results[1].match_contents()); + ASSERT_EQ("/g/11qprvnvhw", results.suggest_results[1].entity_id()); + + ASSERT_EQ(u"the midnight club", results.suggest_results[2].suggestion()); + ASSERT_EQ(u"Thriller series", results.suggest_results[2].annotation()); + ASSERT_EQ("#283e75", results.suggest_results[2].image_dominant_color()); + ASSERT_EQ( + "https://encrypted-tbn0.gstatic.com/" + "images?q=the+midnight+club", + results.suggest_results[2].image_url().spec()); + ASSERT_EQ( + "gs_ssp=eJzj4tVP1zc0zMqrNCvJNkwyYPQSLMlIVcjNTMnLTM8oUUjOKU0CALmyCz8", + results.suggest_results[2].additional_query_params()); + ASSERT_EQ(u"The Midnight Club", + results.suggest_results[2].match_contents()); + ASSERT_EQ("/g/11jny6tk1b", results.suggest_results[2].entity_id()); + } +} + TEST(SearchSuggestionParserTest, ParseValidSubtypes) { std::string json_data = R"([ "",
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc index c98ef7b..656b440 100644 --- a/components/omnibox/common/omnibox_features.cc +++ b/components/omnibox/common/omnibox_features.cc
@@ -448,6 +448,11 @@ "OmniboxUniformRowHeight", base::FEATURE_DISABLED_BY_DEFAULT); +// If enabled, shows the omnibox suggestions popup in WebUI. +BASE_FEATURE(kWebUIOmniboxPopup, + "WebUIOmniboxPopup", + base::FEATURE_DISABLED_BY_DEFAULT); + // When enabled, use Assistant for omnibox voice query recognition instead of // Android's built-in voice recognition service. Only works on Android. BASE_FEATURE(kOmniboxAssistantVoiceSearch,
diff --git a/components/omnibox/common/omnibox_features.h b/components/omnibox/common/omnibox_features.h index 827b901..2184afb3 100644 --- a/components/omnibox/common/omnibox_features.h +++ b/components/omnibox/common/omnibox_features.h
@@ -103,6 +103,7 @@ BASE_DECLARE_FEATURE(kOmniboxMostVisitedTilesAddRecycledViewPool); BASE_DECLARE_FEATURE(kOmniboxMostVisitedTilesFadingOnTablet); BASE_DECLARE_FEATURE(kUniformRowHeight); +BASE_DECLARE_FEATURE(kWebUIOmniboxPopup); // Omnibox UI - these affect the UI or function of the location bar (not the // popup).
diff --git a/components/password_manager/core/browser/credential_manager_impl.cc b/components/password_manager/core/browser/credential_manager_impl.cc index 649248f..47b1855 100644 --- a/components/password_manager/core/browser/credential_manager_impl.cc +++ b/components/password_manager/core/browser/credential_manager_impl.cc
@@ -54,8 +54,7 @@ // Check whether a stored password credential was leaked. if (credential.type == CredentialType::CREDENTIAL_TYPE_PASSWORD) { - leak_delegate_.StartLeakCheck( - *form, /*submitted_form_was_likely_signup_form=*/false); + leak_delegate_.StartLeakCheck(*form); } std::string signon_realm = origin.GetURL().spec();
diff --git a/components/password_manager/core/browser/leak_detection_delegate.cc b/components/password_manager/core/browser/leak_detection_delegate.cc index 4a476bf2..e54b6373 100644 --- a/components/password_manager/core/browser/leak_detection_delegate.cc +++ b/components/password_manager/core/browser/leak_detection_delegate.cc
@@ -45,11 +45,7 @@ LeakDetectionDelegate::~LeakDetectionDelegate() = default; -// TODO(crbug.com/1386065): Delete `submitted_form_was_likely_signup_form` param -// as part of APC deprecation. -void LeakDetectionDelegate::StartLeakCheck( - const PasswordForm& credentials, - bool submitted_form_was_likely_signup_form) { +void LeakDetectionDelegate::StartLeakCheck(const PasswordForm& credentials) { if (client_->IsIncognito()) return; @@ -61,8 +57,6 @@ DCHECK(!credentials.password_value.empty()); - is_likely_signup_form_ = submitted_form_was_likely_signup_form; - leak_check_ = leak_factory_->TryCreateLeakCheck( this, client_->GetIdentityManager(), client_->GetURLLoaderFactory(), client_->GetChannel());
diff --git a/components/password_manager/core/browser/leak_detection_delegate.h b/components/password_manager/core/browser/leak_detection_delegate.h index ebcd02d9..7f452f6 100644 --- a/components/password_manager/core/browser/leak_detection_delegate.h +++ b/components/password_manager/core/browser/leak_detection_delegate.h
@@ -44,11 +44,7 @@ LeakDetectionCheck* leak_check() const { return leak_check_.get(); } #endif // defined(UNIT_TEST) - // Starts a leak check for `credentials`. Note that - // `submitted_form_was_likely_signup_form` is typically derived from a - // different PasswordForm instance! - void StartLeakCheck(const PasswordForm& credentials, - bool submitted_form_was_likely_signup_form); + void StartLeakCheck(const PasswordForm& credentials); private: // LeakDetectionDelegateInterface: @@ -77,11 +73,6 @@ // Current leak check-up being performed in the background. std::unique_ptr<LeakDetectionCheck> leak_check_; - // TODO(crbug.com/1386065): Delete `is_likely_signup_form_` as part of APC - // deprecation. Whether the form that was submitted was (likely) a signup - // form. - bool is_likely_signup_form_ = false; - // Timer measuring the time it takes from StartLeakCheck() until a call to // OnLeakDetectionDone() with is_leaked = true. std::unique_ptr<base::ElapsedTimer> is_leaked_timer_;
diff --git a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc index e25e74067..b35feb8 100644 --- a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc +++ b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc
@@ -191,8 +191,7 @@ const PasswordForm form = CreateTestForm(); EXPECT_CALL(client(), IsIncognito).WillOnce(Return(true)); EXPECT_CALL(factory(), TryCreateLeakCheck).Times(0); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_FALSE(delegate().leak_check()); } @@ -202,8 +201,7 @@ EXPECT_CALL(factory(), TryCreateLeakCheck).Times(0); const PasswordForm form = CreateTestForm(); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_FALSE(delegate().leak_check()); } @@ -213,8 +211,7 @@ form.username_value.clear(); EXPECT_CALL(factory(), TryCreateLeakCheck).Times(0); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_FALSE(delegate().leak_check()); } @@ -228,8 +225,7 @@ Start(form.url, form.username_value, form.password_value)); EXPECT_CALL(factory(), TryCreateLeakCheck(&delegate(), _, _, _)) .WillOnce(Return(ByMove(std::move(check_instance)))); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_TRUE(delegate().leak_check()); } @@ -240,8 +236,7 @@ EXPECT_CALL(client(), IsIncognito).WillOnce(Return(false)); auto check_instance = std::make_unique<MockLeakDetectionCheck>(); EXPECT_CALL(factory(), TryCreateLeakCheck).Times(0); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_FALSE(delegate().leak_check()); } @@ -256,8 +251,7 @@ Start(form.url, form.username_value, form.password_value)); EXPECT_CALL(factory(), TryCreateLeakCheck(&delegate(), _, _, _)) .WillOnce(Return(ByMove(std::move(check_instance)))); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_TRUE(delegate().leak_check()); EXPECT_TRUE(CanStartLeakCheck(*pref_service())); @@ -273,8 +267,7 @@ Start(form.url, form.username_value, form.password_value)); EXPECT_CALL(factory(), TryCreateLeakCheck(&delegate(), _, _, _)) .WillOnce(Return(ByMove(std::move(check_instance)))); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_TRUE(delegate().leak_check()); EXPECT_TRUE(CanStartLeakCheck(*pref_service())); @@ -287,8 +280,7 @@ EXPECT_CALL(client(), IsIncognito).WillOnce(Return(false)); auto check_instance = std::make_unique<MockLeakDetectionCheck>(); EXPECT_CALL(factory(), TryCreateLeakCheck).Times(0); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_FALSE(delegate().leak_check()); EXPECT_FALSE(CanStartLeakCheck(*pref_service())); @@ -301,8 +293,7 @@ EXPECT_CALL(client(), IsIncognito).WillOnce(Return(false)); EXPECT_CALL(factory(), TryCreateLeakCheck).Times(0); auto check_instance = std::make_unique<MockLeakDetectionCheck>(); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_FALSE(delegate().leak_check()); EXPECT_FALSE(CanStartLeakCheck(*pref_service())); @@ -316,8 +307,7 @@ EXPECT_CALL(factory(), TryCreateLeakCheck) .WillOnce( Return(ByMove(std::make_unique<NiceMock<MockLeakDetectionCheck>>()))); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_CALL(client(), NotifyUserCredentialsWereLeaked).Times(0); delegate_interface->OnLeakDetectionDone( @@ -349,8 +339,7 @@ EXPECT_CALL(factory(), TryCreateLeakCheck) .WillOnce( Return(ByMove(std::make_unique<NiceMock<MockLeakDetectionCheck>>()))); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_CALL(client(), NotifyUserCredentialsWereLeaked( @@ -374,8 +363,7 @@ EXPECT_CALL(factory(), TryCreateLeakCheck) .WillOnce( Return(ByMove(std::make_unique<NiceMock<MockLeakDetectionCheck>>()))); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_CALL(client(), NotifyUserCredentialsWereLeaked( @@ -401,8 +389,7 @@ EXPECT_CALL(factory(), TryCreateLeakCheck) .WillOnce( Return(ByMove(std::make_unique<NiceMock<MockLeakDetectionCheck>>()))); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_CALL(client(), NotifyUserCredentialsWereLeaked( @@ -432,8 +419,7 @@ EXPECT_CALL(factory(), TryCreateLeakCheck) .WillOnce( Return(ByMove(std::make_unique<NiceMock<MockLeakDetectionCheck>>()))); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_CALL(client(), NotifyUserCredentialsWereLeaked( @@ -464,8 +450,7 @@ EXPECT_CALL(factory(), TryCreateLeakCheck) .WillOnce( Return(ByMove(std::make_unique<NiceMock<MockLeakDetectionCheck>>()))); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); // The credential is not saved in a store that is synced remotely - therefore // `IsSyncing` is false. @@ -491,8 +476,7 @@ EXPECT_CALL(factory(), TryCreateLeakCheck) .WillOnce( Return(ByMove(std::make_unique<NiceMock<MockLeakDetectionCheck>>()))); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_CALL(client(), NotifyUserCredentialsWereLeaked( @@ -520,8 +504,7 @@ EXPECT_CALL(factory(), TryCreateLeakCheck(&delegate(), _, _, _)) .WillOnce(Return(ByMove(std::move(check_instance)))); PasswordForm form = CreateTestForm(); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); ASSERT_TRUE(delegate().leak_check()); // The delegate analyses the password store after this call. @@ -536,8 +519,7 @@ .WillOnce(Return(ByMove(std::move(check_instance)))); form.username_value = u"username"; form.password_value = u"password"; - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); ASSERT_TRUE(delegate().leak_check()); // Simulate the previous check is complete now. @@ -561,8 +543,7 @@ EXPECT_CALL(client(), GetChannel).WillOnce(Return(channel)); EXPECT_CALL(factory(), TryCreateLeakCheck(&delegate(), _, _, channel)) .WillOnce(Return(ByMove(std::move(check_instance)))); - delegate().StartLeakCheck(form, - /*submitted_form_was_likely_signup_form=*/false); + delegate().StartLeakCheck(form); EXPECT_TRUE(delegate().leak_check()); }
diff --git a/components/password_manager/core/browser/mock_password_feature_manager.h b/components/password_manager/core/browser/mock_password_feature_manager.h index 16697e6..7f3f50f 100644 --- a/components/password_manager/core/browser/mock_password_feature_manager.h +++ b/components/password_manager/core/browser/mock_password_feature_manager.h
@@ -16,10 +16,6 @@ ~MockPasswordFeatureManager() override; MOCK_METHOD(bool, IsGenerationEnabled, (), (override, const)); - MOCK_METHOD(bool, - AreRequirementsForAutomatedPasswordChangeFulfilled, - (), - (const override)); MOCK_METHOD(bool, IsOptedInForAccountStorage, (), (override, const)); MOCK_METHOD(bool, ShouldShowAccountStorageOptIn, (), (override, const)); MOCK_METHOD(bool,
diff --git a/components/password_manager/core/browser/password_feature_manager.h b/components/password_manager/core/browser/password_feature_manager.h index d9188e74..84a37ca 100644 --- a/components/password_manager/core/browser/password_feature_manager.h +++ b/components/password_manager/core/browser/password_feature_manager.h
@@ -22,11 +22,6 @@ virtual bool IsGenerationEnabled() const = 0; - // Whether the entry-point independent requirements are met to offer - // automated password change. Currently, that means that a user must be - // syncing. - virtual bool AreRequirementsForAutomatedPasswordChangeFulfilled() const = 0; - // Whether the current signed-in user (aka unconsented primary account) has // opted in to use the Google account storage for passwords (as opposed to // local/profile storage).
diff --git a/components/password_manager/core/browser/password_feature_manager_impl.cc b/components/password_manager/core/browser/password_feature_manager_impl.cc index dd13799..05e3f33 100644 --- a/components/password_manager/core/browser/password_feature_manager_impl.cc +++ b/components/password_manager/core/browser/password_feature_manager_impl.cc
@@ -34,19 +34,6 @@ } } -bool PasswordFeatureManagerImpl:: - AreRequirementsForAutomatedPasswordChangeFulfilled() const { - switch (password_manager_util::GetPasswordSyncState(sync_service_)) { - case SyncState::kNotSyncing: - case SyncState::kAccountPasswordsActiveNormalEncryption: - return base::FeatureList::IsEnabled( - features::kPasswordChangeAccountStoreUsers); - case SyncState::kSyncingWithCustomPassphrase: - case SyncState::kSyncingNormalEncryption: - return true; - } -} - bool PasswordFeatureManagerImpl::IsOptedInForAccountStorage() const { return features_util::IsOptedInForAccountStorage(pref_service_, sync_service_);
diff --git a/components/password_manager/core/browser/password_feature_manager_impl.h b/components/password_manager/core/browser/password_feature_manager_impl.h index 81c96748..05bf27f 100644 --- a/components/password_manager/core/browser/password_feature_manager_impl.h +++ b/components/password_manager/core/browser/password_feature_manager_impl.h
@@ -31,7 +31,6 @@ ~PasswordFeatureManagerImpl() override = default; bool IsGenerationEnabled() const override; - bool AreRequirementsForAutomatedPasswordChangeFulfilled() const override; bool IsOptedInForAccountStorage() const override; bool ShouldShowAccountStorageOptIn() const override; bool ShouldShowAccountStorageReSignin(
diff --git a/components/password_manager/core/browser/password_feature_manager_impl_unittest.cc b/components/password_manager/core/browser/password_feature_manager_impl_unittest.cc index 3a5bd591..12a966a6 100644 --- a/components/password_manager/core/browser/password_feature_manager_impl_unittest.cc +++ b/components/password_manager/core/browser/password_feature_manager_impl_unittest.cc
@@ -142,64 +142,6 @@ EXPECT_FALSE(password_feature_manager_.IsGenerationEnabled()); } -TEST_F(PasswordFeatureManagerImplTest, - RequirementsForAutomatedPasswordChangeMetForSyncingUser) { - sync_service_.SetAccountInfo(account_); - sync_service_.SetHasSyncConsent(true); - sync_service_.SetDisableReasons({}); - sync_service_.SetTransportState(syncer::SyncService::TransportState::ACTIVE); - sync_service_.GetUserSettings()->SetSelectedTypes( - /*sync_everything=*/false, - /*types=*/syncer::UserSelectableTypeSet( - syncer::UserSelectableType::kPasswords)); - - ASSERT_EQ(password_manager_util::GetPasswordSyncState(&sync_service_), - password_manager::SyncState::kSyncingNormalEncryption); - - EXPECT_TRUE(password_feature_manager_ - .AreRequirementsForAutomatedPasswordChangeFulfilled()); -} - -TEST_F(PasswordFeatureManagerImplTest, - RequirementsForAutomatedPasswordChangeNotMetForNonSyncingUser) { - sync_service_.SetAccountInfo(account_); - sync_service_.SetHasSyncConsent(false); - sync_service_.SetDisableReasons( - {syncer::SyncService::DisableReason::DISABLE_REASON_USER_CHOICE}); - sync_service_.SetTransportState(syncer::SyncService::TransportState::ACTIVE); - sync_service_.GetUserSettings()->SetSelectedTypes( - /*sync_everything=*/false, - /*types=*/syncer::UserSelectableTypeSet()); - - ASSERT_EQ(password_manager_util::GetPasswordSyncState(&sync_service_), - password_manager::SyncState::kNotSyncing); - - EXPECT_FALSE(password_feature_manager_ - .AreRequirementsForAutomatedPasswordChangeFulfilled()); -} - -TEST_F(PasswordFeatureManagerImplTest, - RequirementsForAutomatedPasswordChangeNotMetForAccountStoreUser) { - base::test::ScopedFeatureList features; - features.InitAndEnableFeature( - password_manager::features::kEnablePasswordsAccountStorage); - - sync_service_.SetAccountInfo(account_); - sync_service_.SetHasSyncConsent(false); - sync_service_.SetDisableReasons( - {syncer::SyncService::DisableReason::DISABLE_REASON_USER_CHOICE}); - sync_service_.SetTransportState(syncer::SyncService::TransportState::ACTIVE); - - password_feature_manager_.OptInToAccountStorage(); - - ASSERT_EQ( - password_manager_util::GetPasswordSyncState(&sync_service_), - password_manager::SyncState::kAccountPasswordsActiveNormalEncryption); - - EXPECT_FALSE(password_feature_manager_ - .AreRequirementsForAutomatedPasswordChangeFulfilled()); -} - #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) struct TestCase {
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc index 487b677..d444f13 100644 --- a/components/password_manager/core/browser/password_form_manager.cc +++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -568,35 +568,29 @@ votes_uploader_.set_generation_element(generation_element); } -bool PasswordFormManager::UpdateStateOnUserInput( +void PasswordFormManager::UpdateStateOnUserInput( FormRendererId form_id, FieldRendererId field_id, const std::u16string& field_value) { - DCHECK((form_id && observed_form()->is_form_tag && - observed_form()->unique_renderer_id == form_id) || - (!form_id && !observed_form()->is_form_tag)); - - bool form_data_changed = false; - for (FormFieldData& field : mutable_observed_form()->fields) { - if (field.unique_renderer_id == field_id) { - field.value = field_value; - form_data_changed = true; - break; - } - } + DCHECK(observed_form()->unique_renderer_id == form_id); + // Update the observed field value. + auto modified_field = base::ranges::find_if( + mutable_observed_form()->fields, [&field_id](const FormFieldData& field) { + return field.unique_renderer_id == field_id; + }); + if (modified_field == mutable_observed_form()->fields.end()) + return; + modified_field->value = field_value; if (!HasGeneratedPassword()) - return true; - + return; + // Update the presaved password form. Even if generated password was not + // modified, the user might have modified the username. std::u16string generated_password = password_save_manager_->GetGeneratedPassword(); - if (votes_uploader_.get_generation_element() == field_id) { + if (votes_uploader_.get_generation_element() == field_id) generated_password = field_value; - form_data_changed = true; - } - if (form_data_changed) - PresaveGeneratedPasswordInternal(*observed_form(), generated_password); - return true; + PresaveGeneratedPasswordInternal(*observed_form(), generated_password); } void PasswordFormManager::SetDriver(
diff --git a/components/password_manager/core/browser/password_form_manager.h b/components/password_manager/core/browser/password_form_manager.h index 9efff887..aa8640d 100644 --- a/components/password_manager/core/browser/password_form_manager.h +++ b/components/password_manager/core/browser/password_form_manager.h
@@ -199,11 +199,10 @@ const std::u16string& generated_password, autofill::FieldRendererId generation_element); - // Return false and do nothing if |form_identifier| does not correspond to - // |observed_form()|. Otherwise set a value of the field with - // |field_identifier| of |observed_form()| to |field_value|. In case if there - // is a presaved credential this function updates the presaved credential. - bool UpdateStateOnUserInput(autofill::FormRendererId form_id, + // Sets a value of the field with |field_identifier| of |observed_form()| + // to |field_value|. In case if there is a presaved credential this function + // updates the presaved credential. + void UpdateStateOnUserInput(autofill::FormRendererId form_id, autofill::FieldRendererId field_id, const std::u16string& field_value);
diff --git a/components/password_manager/core/browser/password_form_manager_unittest.cc b/components/password_manager/core/browser/password_form_manager_unittest.cc index a196f908..a953f47a 100644 --- a/components/password_manager/core/browser/password_form_manager_unittest.cc +++ b/components/password_manager/core/browser/password_form_manager_unittest.cc
@@ -2161,9 +2161,9 @@ // Check that nothing is saved on changing password, in case when there was no // pre-saving. - EXPECT_CALL(form_saver, Save(_, _, _)).Times(0); - EXPECT_TRUE(form_manager_->UpdateStateOnUserInput( - observed_form_.unique_renderer_id, password_field, new_field_value)); + EXPECT_CALL(form_saver, Save).Times(0); + form_manager_->UpdateStateOnUserInput(observed_form_.unique_renderer_id, + password_field, new_field_value); EXPECT_EQ(new_field_value, form_manager_->observed_form()->fields[kPasswordFieldIndex].value);
diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc index e28c302..d67d5135 100644 --- a/components/password_manager/core/browser/password_manager.cc +++ b/components/password_manager/core/browser/password_manager.cc
@@ -119,6 +119,19 @@ return manager.IsNewLogin(); } +bool ShouldShowManualFallbackForGeneratedPassword( + const PasswordFormManager& manager) { +#if !BUILDFLAG(IS_IOS) + // On non-iOS manual fallback menu shows a confirmation that the + // generated password is presaved. + return manager.HasGeneratedPassword(); +#else + // On iOS manual fallback menu is only used to edit the credential, + // and is not applicable to generated passwords. + return false; +#endif +} + #if !BUILDFLAG(IS_IOS) // Finds the matched form manager with id |form_renderer_id| in // |form_managers|. @@ -859,21 +872,12 @@ FormRendererId form_id, FieldRendererId field_id, const std::u16string& field_value) { - for (std::unique_ptr<PasswordFormManager>& manager : form_managers_) { - if (!manager->DoesManage(form_id, driver)) { - continue; - } + PasswordFormManager* manager = GetMatchedManager(driver, form_id); + if (!manager) + return; - if (manager->UpdateStateOnUserInput(form_id, field_id, field_value)) { - ProvisionallySaveForm(*manager->observed_form(), driver, true); - if (manager->is_submitted() && !manager->HasGeneratedPassword()) { - ShowManualFallbackForSaving(manager.get(), *manager->observed_form()); - } else { - HideManualFallbackForSaving(); - } - break; - } - } + manager->UpdateStateOnUserInput(form_id, field_id, field_value); + OnInformAboutUserInput(driver, *manager->observed_form()); } void PasswordManager::OnPasswordNoLongerGenerated( @@ -1086,8 +1090,7 @@ submitted_manager->GetInsecureCredentials(), submitted_manager->GetSubmittedForm()->username_value) && !IsSingleUsernameSubmission(*submitted_manager->GetSubmittedForm())) { - leak_delegate_.StartLeakCheck(submitted_manager->GetPendingCredentials(), - submitted_form->IsLikelySignupForm()); + leak_delegate_.StartLeakCheck(submitted_manager->GetPendingCredentials()); } auto submission_event = @@ -1408,13 +1411,15 @@ } // Show the fallback if a prompt or a confirmation bubble should be available. - bool has_generated_password = form_manager->HasGeneratedPassword(); - if (ShouldPromptUserToSavePassword(*form_manager) || has_generated_password) { + bool is_fallback_for_generated_password = + ShouldShowManualFallbackForGeneratedPassword(*form_manager); + if (ShouldPromptUserToSavePassword(*form_manager) || + is_fallback_for_generated_password) { bool is_update = form_manager->IsPasswordUpdate(); form_manager->GetMetricsRecorder()->RecordShowManualFallbackForSaving( - has_generated_password, is_update); - client_->ShowManualFallbackForSaving(form_manager->Clone(), - has_generated_password, is_update); + is_fallback_for_generated_password, is_update); + client_->ShowManualFallbackForSaving( + form_manager->Clone(), is_fallback_for_generated_password, is_update); } else { HideManualFallbackForSaving(); }
diff --git a/components/password_manager/core/browser/password_manager_interface.h b/components/password_manager/core/browser/password_manager_interface.h index c08ac512..6e62ab5 100644 --- a/components/password_manager/core/browser/password_manager_interface.h +++ b/components/password_manager/core/browser/password_manager_interface.h
@@ -78,9 +78,13 @@ const std::u16string& generated_password, autofill::FieldRendererId generation_element) = 0; - // Updates the state if the PasswordFormManager which corresponds to the form - // with |form_identifier|. In case if there is a presaved credential it + // Updates the state in the PasswordFormManager which corresponds to the form + // with |form_identifier|. In case there is a presaved credential, it // updates the presaved credential. + // Cross-platform method PasswordManager::OnInformAboutUserInput cannot + // replace this method, as it needs an observed FormData object on every + // keystroke and parsing the full FormData on iOS is more expensive operation, + // than in Blink. virtual void UpdateStateOnUserInput(PasswordManagerDriver* driver, autofill::FormRendererId form_id, autofill::FieldRendererId field_id,
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc index 409f1d9b..7088f1f6 100644 --- a/components/password_manager/core/browser/password_manager_unittest.cc +++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -2597,6 +2597,9 @@ manager()->OnInformAboutUserInput(&driver_, form_data); } +// Test is not applicable to iOS, because there is no manual fallback for +// generated passwords. +#if !BUILDFLAG(IS_IOS) TEST_P(PasswordManagerTest, ManualFallbackForSaving_GeneratedPassword) { std::vector<FormData> observed; PasswordForm form(MakeSimpleForm()); @@ -2638,6 +2641,7 @@ EXPECT_THAT(store_->stored_passwords(), ElementsAre(Pair(form.signon_realm, testing::IsEmpty()))); } +#endif // !BUILDFLAG(IS_IOS) // Sync password hash should be updated upon submission of change password page. TEST_P(PasswordManagerTest, SaveSyncPasswordHashOnChangePasswordPage) {
diff --git a/components/password_manager/core/browser/password_manager_util_unittest.cc b/components/password_manager/core/browser/password_manager_util_unittest.cc index c52fd07..6d81837 100644 --- a/components/password_manager/core/browser/password_manager_util_unittest.cc +++ b/components/password_manager/core/browser/password_manager_util_unittest.cc
@@ -164,6 +164,10 @@ MigrationDeleteCardCallback), (override)); MOCK_METHOD(void, + ConfirmSaveIBANLocally, + (const autofill::IBAN&, bool, LocalSaveIBANPromptCallback), + (override)); + MOCK_METHOD(void, ShowWebauthnOfferDialog, (WebauthnDialogCallback), (override));
diff --git a/components/permissions/BUILD.gn b/components/permissions/BUILD.gn index d57c9c9..15deddf 100644 --- a/components/permissions/BUILD.gn +++ b/components/permissions/BUILD.gn
@@ -269,12 +269,12 @@ "permission_request_manager_unittest.cc", "permission_request_queue_unittest.cc", "permission_uma_util_unittest.cc", - "unused_site_permissions_service_unittest.cc", ] if (!is_android) { sources += [ "bluetooth_chooser_controller_unittest.cc", "bluetooth_scanning_prompt_controller_unittest.cc", + "unused_site_permissions_service_unittest.cc", ] } if (is_android) {
diff --git a/components/permissions/unused_site_permissions_service.cc b/components/permissions/unused_site_permissions_service.cc index f593abb..1221fc60 100644 --- a/components/permissions/unused_site_permissions_service.cc +++ b/components/permissions/unused_site_permissions_service.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "components/permissions/unused_site_permissions_service.h" + #include "base/bind.h" #include "base/functional/callback_helpers.h" #include "base/memory/scoped_refptr.h" @@ -13,6 +14,7 @@ #include "base/time/clock.h" #include "base/time/default_clock.h" #include "base/time/time.h" +#include "base/values.h" #include "components/content_settings/core/browser/content_settings_info.h" #include "components/content_settings/core/browser/content_settings_registry.h" #include "components/content_settings/core/browser/content_settings_utils.h" @@ -22,8 +24,12 @@ #include "components/content_settings/core/common/content_settings_types.h" #include "components/content_settings/core/common/features.h" #include "content/public/browser/browser_thread.h" +#include "url/gurl.h" #include "url/origin.h" +constexpr char kRevokedKey[] = "revoked"; +constexpr base::TimeDelta kRevocationThreshold = base::Days(60); + namespace permissions { namespace { @@ -43,20 +49,65 @@ ContentSettingsForOneType settings; hcsm->GetSettingsForOneType(type, &settings); for (const auto& setting : settings) { - // Skip wildcard pattern that are not host specific. These shouldn't - // track visit timestamps as they would match any URL. - if (setting.primary_pattern.GetHost().empty()) + // Skip wildcard patterns that don't belong to a single origin. These + // shouldn't track visit timestamps. + if (!setting.primary_pattern.MatchesSingleOrigin()) continue; if (setting.metadata.last_visited != base::Time() && setting.metadata.last_visited < threshold) { - auto& list = recently_unused[setting.primary_pattern.GetHost()]; - list.push_back({type, std::move(setting)}); + GURL url = GURL(setting.primary_pattern.ToString()); + // Converting URL to a origin is normally an anti-pattern but here it is + // ok since the URL belongs to a single origin. Therefore, it has a + // fully defined URL+scheme+port which makes converting URL to origin + // successful. + url::Origin origin = url::Origin::Create(url); + recently_unused[origin.Serialize()].push_back( + {type, std::move(setting)}); } } } return recently_unused; } +void StorePermissionInRevokedPermissionSetting( + const std::list<UnusedSitePermissionsService::ContentSettingEntry>& + recently_revoked_permissions, + scoped_refptr<HostContentSettingsMap> hcsm) { + DCHECK(!recently_revoked_permissions.empty()); + const ContentSettingsPattern& primary_pattern = + recently_revoked_permissions.front().source.primary_pattern; + const ContentSettingsPattern& secondary_pattern = + recently_revoked_permissions.front().source.secondary_pattern; + + GURL url = GURL(primary_pattern.ToString()); + // The url should be valid as it is checked that the pattern represents a + // single origin. + DCHECK(url.is_valid()); + // Get the current value of the setting to append the recently revoked + // permissions. + base::Value cur_value(hcsm->GetWebsiteSetting( + url, url, ContentSettingsType::REVOKED_UNUSED_SITE_PERMISSIONS, nullptr)); + + base::Value::Dict dict = cur_value.is_dict() ? std::move(cur_value.GetDict()) + : base::Value::Dict(); + base::Value::List permission_type_list = + dict.FindList(kRevokedKey) ? std::move(*dict.FindList(kRevokedKey)) + : base::Value::List(); + + for (const auto& permission : recently_revoked_permissions) { + permission_type_list.Append(static_cast<int32_t>(permission.type)); + } + + dict.Set(kRevokedKey, base::Value::List(std::move(permission_type_list))); + + // Set website setting for the list of recently revoked permissions and + // previously revoked permissions, if exists. + hcsm->SetWebsiteSettingCustomScope( + primary_pattern, secondary_pattern, + ContentSettingsType::REVOKED_UNUSED_SITE_PERMISSIONS, + base::Value(std::move(dict))); +} + } // namespace UnusedSitePermissionsService::TabHelper::TabHelper( @@ -104,13 +155,6 @@ base::Unretained(this), base::NullCallback())); } -void UnusedSitePermissionsService::UpdateUnusedPermissionsForTesting() { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - base::RunLoop loop; - UpdateUnusedPermissionsAsync(loop.QuitClosure()); - loop.Run(); -} - void UnusedSitePermissionsService::UpdateUnusedPermissionsAsync( base::RepeatingClosure callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -125,13 +169,13 @@ // Called by TabHelper when a URL was visited. void UnusedSitePermissionsService::OnPageVisited(const url::Origin& origin) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - // Check if this host has unused permissions. - auto host_entry = recently_unused_permissions_.find(origin.host()); - if (host_entry == recently_unused_permissions_.end()) + // Check if this origin has unused permissions. + auto origin_entry = recently_unused_permissions_.find(origin.Serialize()); + if (origin_entry == recently_unused_permissions_.end()) return; - // See which permissions of the host actually match the URL and update them. - auto& site_permissions = host_entry->second; + // See which permissions of the origin actually match the URL and update them. + auto& site_permissions = origin_entry->second; for (auto it = site_permissions.begin(); it != site_permissions.end();) { if (it->source.primary_pattern.Matches(origin.GetURL())) { hcsm_->UpdateLastVisitedTime(it->source.primary_pattern, @@ -141,9 +185,9 @@ it++; } } - // Remove host entry if all permissions were updated. + // Remove origin entry if all permissions were updated. if (site_permissions.empty()) { - recently_unused_permissions_.erase(host_entry); + recently_unused_permissions_.erase(origin_entry); } } @@ -152,10 +196,66 @@ UnusedPermissionMap map) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); recently_unused_permissions_ = map; + RevokeUnusedPermissions(); if (callback) std::move(callback).Run(); } +void UnusedSitePermissionsService::RevokeUnusedPermissions() { + base::Time threshold = clock_->Now() - kRevocationThreshold; + + for (auto itr = recently_unused_permissions_.begin(); + itr != recently_unused_permissions_.end();) { + std::list<ContentSettingEntry>& unused_site_permissions = itr->second; + + std::list<ContentSettingEntry> revoked_permissions; + for (auto permission_itr = unused_site_permissions.begin(); + permission_itr != unused_site_permissions.end();) { + const ContentSettingEntry& entry = *permission_itr; + // Reset the permission to default if the site is visited before + // threshold. + DCHECK(entry.source.metadata.last_visited != base::Time()); + if (entry.source.metadata.last_visited < threshold) { + revoked_permissions.push_back(entry); + hcsm_->SetContentSettingCustomScope( + entry.source.primary_pattern, entry.source.secondary_pattern, + entry.type, ContentSetting::CONTENT_SETTING_DEFAULT); + unused_site_permissions.erase(permission_itr++); + } else { + permission_itr++; + } + } + + // Store revoked permissions on HCSM. + if (!revoked_permissions.empty()) { + StorePermissionInRevokedPermissionSetting(revoked_permissions, hcsm_); + } + + // Handle clean up of recently_unused_permissions_ map after revocation. + if (unused_site_permissions.empty()) { + // Since all unused permissions are revoked, the map should be cleared. + recently_unused_permissions_.erase(itr++); + } else { + // Since there are some permissions that are not revoked, the tracked + // unused permissions should be set to those permissions. + // Note that, currently all permissions belong to a single domain will + // revoked all together, since triggering permission prompt requires a + // page visit. So the timestamp of all granted permissions of the origin + // will be updated. However, this logic will prevent edge cases like + // permission prompt stays open long time, also will provide support for + // revoking permissions separately in the future. + itr++; + } + } +} + +void UnusedSitePermissionsService::UpdateUnusedPermissionsForTesting() { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + base::RunLoop loop; + UpdateUnusedPermissionsAsync(loop.QuitClosure()); + loop.Run(); +} + std::vector<UnusedSitePermissionsService::ContentSettingEntry> UnusedSitePermissionsService::GetTrackedUnusedPermissionsForTesting() { std::vector<ContentSettingEntry> result;
diff --git a/components/permissions/unused_site_permissions_service.h b/components/permissions/unused_site_permissions_service.h index abaa104..1e5759f 100644 --- a/components/permissions/unused_site_permissions_service.h +++ b/components/permissions/unused_site_permissions_service.h
@@ -97,6 +97,10 @@ void OnUnusedPermissionsMapRetrieved(base::OnceClosure callback, UnusedPermissionMap map); + // Revokes permissions that belong to sites that were last visited over 60 + // days ago. + void RevokeUnusedPermissions(); + // Set of permissions that haven't been used for at least a week. UnusedPermissionMap recently_unused_permissions_; // Repeating timer that updates the recently_unused_permissions_ map.
diff --git a/components/permissions/unused_site_permissions_service_unittest.cc b/components/permissions/unused_site_permissions_service_unittest.cc index 90a37703..aa65f28 100644 --- a/components/permissions/unused_site_permissions_service_unittest.cc +++ b/components/permissions/unused_site_permissions_service_unittest.cc
@@ -4,19 +4,23 @@ #include "components/permissions/unused_site_permissions_service.h" #include <ctime> +#include <list> #include <memory> #include "base/memory/scoped_refptr.h" #include "base/test/simple_test_clock.h" #include "base/time/clock.h" +#include "base/values.h" #include "components/content_settings/core/browser/content_settings_utils.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings_constraints.h" +#include "components/content_settings/core/common/content_settings_pattern.h" #include "components/content_settings/core/common/content_settings_types.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "content/test/test_render_view_host.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/base/page_transition_types.h" + +constexpr char kRevokedKey[] = "revoked"; namespace permissions { class UnusedSitePermissionsServiceTest @@ -53,6 +57,33 @@ return info.metadata.last_visited; } + ContentSettingsForOneType GetRevokedUnusedPermissions( + HostContentSettingsMap* hcsm) { + ContentSettingsForOneType settings; + hcsm->GetSettingsForOneType( + ContentSettingsType::REVOKED_UNUSED_SITE_PERMISSIONS, &settings); + + return settings; + } + + base::Value::List GetRevokedPermissionsForOneOrigin( + HostContentSettingsMap* hcsm, + const GURL& url) { + base::Value setting_value(hcsm->GetWebsiteSetting( + url, url, ContentSettingsType::REVOKED_UNUSED_SITE_PERMISSIONS, + nullptr)); + + base::Value::List permissions; + if (!setting_value.is_dict() || + !setting_value.GetDict().FindList(kRevokedKey)) + return permissions; + + base::Value::List permissions_list = + std::move(*setting_value.GetDict().FindList(kRevokedKey)); + + return permissions_list; + } + private: sync_preferences::TestingPrefServiceSyncable prefs_; std::unique_ptr<UnusedSitePermissionsService> service_; @@ -81,6 +112,7 @@ url2, url2, type2, ContentSetting::CONTENT_SETTING_ALLOW, constraint); service()->UpdateUnusedPermissionsForTesting(); EXPECT_EQ(service()->GetTrackedUnusedPermissionsForTesting().size(), 0u); + EXPECT_EQ(GetRevokedUnusedPermissions(hcsm()).size(), 0u); // Travel through time for 20 days. clock()->Advance(base::Days(20)); @@ -89,6 +121,7 @@ // The old settings should now be tracked as unused. service()->UpdateUnusedPermissionsForTesting(); EXPECT_EQ(service()->GetTrackedUnusedPermissionsForTesting().size(), 3u); + EXPECT_EQ(GetRevokedUnusedPermissions(hcsm()).size(), 0u); // Visit url2 and check that the corresponding content setting got updated. UnusedSitePermissionsService::TabHelper::CreateForWebContents(web_contents(), @@ -103,6 +136,104 @@ // Check that the service is only tracking one entry now. EXPECT_EQ(service()->GetTrackedUnusedPermissionsForTesting().size(), 1u); + + // Travel through time for 50 days to make permissions be revoked. + clock()->Advance(base::Days(50)); + + // Unused permissions should be auto revoked. + service()->UpdateUnusedPermissionsForTesting(); + // url2 should be on tracked permissions list. + EXPECT_EQ(service()->GetTrackedUnusedPermissionsForTesting().size(), 2u); + std::string url2_str = + ContentSettingsPattern::FromURLNoWildcard(url2).ToString(); + EXPECT_EQ(url2_str, service() + ->GetTrackedUnusedPermissionsForTesting()[0] + .source.primary_pattern.ToString()); + EXPECT_EQ(url2_str, service() + ->GetTrackedUnusedPermissionsForTesting()[1] + .source.primary_pattern.ToString()); + // url1 should be on revoked permissions list. + EXPECT_EQ(GetRevokedUnusedPermissions(hcsm()).size(), 1u); + std::string url1_str = + ContentSettingsPattern::FromURLNoWildcard(url1).ToString(); + EXPECT_EQ(url1_str, + GetRevokedUnusedPermissions(hcsm())[0].primary_pattern.ToString()); +} + +TEST_F(UnusedSitePermissionsServiceTest, TrackOnlySingleOriginTest) { + const GURL url1("https://example1.com"); + const GURL url2("https://[*.]example2.com"); + const GURL url3("file:///foo/bar.txt"); + const ContentSettingsType type = ContentSettingsType::GEOLOCATION; + const content_settings::ContentSettingConstraints constraint{ + .track_last_visit_for_autoexpiration = true}; + + // Add one setting for all urls. + hcsm()->SetContentSettingDefaultScope( + url1, url1, type, ContentSetting::CONTENT_SETTING_ALLOW, constraint); + hcsm()->SetContentSettingDefaultScope( + url2, url2, type, ContentSetting::CONTENT_SETTING_ALLOW, constraint); + hcsm()->SetContentSettingDefaultScope( + url2, url3, type, ContentSetting::CONTENT_SETTING_ALLOW, constraint); + service()->UpdateUnusedPermissionsForTesting(); + EXPECT_EQ(service()->GetTrackedUnusedPermissionsForTesting().size(), 0u); + EXPECT_EQ(GetRevokedUnusedPermissions(hcsm()).size(), 0u); + + // Travel through time for 20 days. + clock()->Advance(base::Days(20)); + + // Only url1 should be tracked because it is the only single origin url. + service()->UpdateUnusedPermissionsForTesting(); + EXPECT_EQ(service()->GetTrackedUnusedPermissionsForTesting().size(), 1u); + auto tracked_origin = service()->GetTrackedUnusedPermissionsForTesting()[0]; + EXPECT_EQ(GURL(tracked_origin.source.primary_pattern.ToString()), url1); +} + +TEST_F(UnusedSitePermissionsServiceTest, MultipleRevocationsForSameOrigin) { + const GURL url("https://example1.com"); + const content_settings::ContentSettingConstraints constraint{ + .track_last_visit_for_autoexpiration = true}; + + // Grant GEOLOCATION permission for the url. + hcsm()->SetContentSettingDefaultScope( + url, url, ContentSettingsType::GEOLOCATION, + ContentSetting::CONTENT_SETTING_ALLOW, constraint); + EXPECT_EQ(service()->GetTrackedUnusedPermissionsForTesting().size(), 0u); + EXPECT_EQ(GetRevokedUnusedPermissions(hcsm()).size(), 0u); + + // Travel through time for 50 days. + clock()->Advance(base::Days(50)); + + // Grant MEDIASTREAM_CAMERA permission for the url. + hcsm()->SetContentSettingDefaultScope( + url, url, ContentSettingsType::MEDIASTREAM_CAMERA, + ContentSetting::CONTENT_SETTING_ALLOW, constraint); + + // Travel through time for 20 days. + clock()->Advance(base::Days(20)); + + // GEOLOCATION permission should be on the revoked permissions list. + // MEDIASTREAM_CAMERA permissions should be on the recently unused permissions + // list. + service()->UpdateUnusedPermissionsForTesting(); + EXPECT_EQ(GetRevokedPermissionsForOneOrigin(hcsm(), url).size(), 1u); + EXPECT_EQ(GetRevokedPermissionsForOneOrigin(hcsm(), url)[0].GetInt(), + static_cast<int32_t>(ContentSettingsType::GEOLOCATION)); + EXPECT_EQ(service()->GetTrackedUnusedPermissionsForTesting().size(), 1u); + EXPECT_EQ(service()->GetTrackedUnusedPermissionsForTesting()[0].type, + ContentSettingsType::MEDIASTREAM_CAMERA); + + // Travel through time for 70 days. + clock()->Advance(base::Days(70)); + + // Both GEOLOCATION and MEDIASTREAM_CAMERA permissions should be on the + // revoked permissions list. + service()->UpdateUnusedPermissionsForTesting(); + EXPECT_EQ(GetRevokedPermissionsForOneOrigin(hcsm(), url).size(), 2u); + EXPECT_EQ(GetRevokedPermissionsForOneOrigin(hcsm(), url)[0].GetInt(), + static_cast<int32_t>(ContentSettingsType::GEOLOCATION)); + EXPECT_EQ(GetRevokedPermissionsForOneOrigin(hcsm(), url)[1].GetInt(), + static_cast<int32_t>(ContentSettingsType::MEDIASTREAM_CAMERA)); } } // namespace permissions
diff --git a/components/remote_cocoa/app_shim/immersive_mode_controller.h b/components/remote_cocoa/app_shim/immersive_mode_controller.h index 52ebcadf..13ac014 100644 --- a/components/remote_cocoa/app_shim/immersive_mode_controller.h +++ b/components/remote_cocoa/app_shim/immersive_mode_controller.h
@@ -59,6 +59,8 @@ void RevealUnlock(); int reveal_lock_count() { return reveal_lock_count_; } + NSWindow* overlay_widget() { return overlay_widget_; } + private: // Pin or unpin the titlebar. void SetTitlebarPinned(bool pinned);
diff --git a/components/saved_tab_groups/saved_tab_group_model.cc b/components/saved_tab_groups/saved_tab_group_model.cc index 77c9b91..7c29cd8 100644 --- a/components/saved_tab_groups/saved_tab_group_model.cc +++ b/components/saved_tab_groups/saved_tab_group_model.cc
@@ -200,6 +200,26 @@ observer.SavedTabGroupUpdatedFromSync(id); } +SavedTabGroup* SavedTabGroupModel::GetGroupContainingTab( + const base::GUID& saved_tab_guid) { + for (auto& saved_group : saved_tab_groups_) { + if (saved_group.ContainsTab(saved_tab_guid)) + return &saved_group; + } + + return nullptr; +} + +SavedTabGroup* SavedTabGroupModel::GetGroupContainingTab( + const base::Token& local_tab_id) { + for (auto& saved_group : saved_tab_groups_) { + if (saved_group.ContainsTab(local_tab_id)) + return &saved_group; + } + + return nullptr; +} + void SavedTabGroupModel::AddTabToGroup(const base::GUID& group_id, SavedTabGroupTab tab, int index) {
diff --git a/components/saved_tab_groups/saved_tab_group_model.h b/components/saved_tab_groups/saved_tab_group_model.h index 33f3b472..67f5389 100644 --- a/components/saved_tab_groups/saved_tab_group_model.h +++ b/components/saved_tab_groups/saved_tab_group_model.h
@@ -86,6 +86,9 @@ const base::GUID& id, const tab_groups::TabGroupVisualData* visual_data); + SavedTabGroup* GetGroupContainingTab(const base::GUID& saved_tab_guid); + SavedTabGroup* GetGroupContainingTab(const base::Token& local_tab_id); + // Adds a saved tab to `index` in the specified group denoted by `group_id` if // it exists. void AddTabToGroup(const base::GUID& group_id,
diff --git a/components/saved_tab_groups/saved_tab_group_model_unittest.cc b/components/saved_tab_groups/saved_tab_group_model_unittest.cc index 8ee808e..a38d946 100644 --- a/components/saved_tab_groups/saved_tab_group_model_unittest.cc +++ b/components/saved_tab_groups/saved_tab_group_model_unittest.cc
@@ -10,6 +10,7 @@ #include <vector> #include "base/guid.h" +#include "base/token.h" #include "components/saved_tab_groups/saved_tab_group.h" #include "components/saved_tab_groups/saved_tab_group_model_observer.h" #include "components/saved_tab_groups/saved_tab_group_tab.h" @@ -20,6 +21,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/gfx/image/image.h" #include "url/gurl.h" +#include "url/url_constants.h" namespace { @@ -966,3 +968,38 @@ EXPECT_TRUE(reordered_called_); EXPECT_EQ(2, saved_tab_group_model_->GetIndexOf(stg_2.saved_guid())); } + +TEST_F(SavedTabGroupModelObserverTest, GetGroupContainingTab) { + // Add a non matching SavedTabGroup. + saved_tab_group_model_->Add(CreateTestSavedTabGroup()); + + // Add a matching group/tab and save the ids used for GetGroupContainingTab. + SavedTabGroup matching_group = CreateTestSavedTabGroup(); + base::GUID matching_group_guid = matching_group.saved_guid(); + + base::GUID matching_tab_guid = GenerateNextGUID(); + base::Token matching_local_tab_id = base::Token::CreateRandom(); + + SavedTabGroupTab tab(GURL(url::kAboutBlankURL), std::u16string(u"title"), + matching_group.saved_guid(), &matching_group, + matching_tab_guid, matching_local_tab_id); + matching_group.AddTab(0, std::move(tab)); + saved_tab_group_model_->Add(std::move(matching_group)); + + // Add another non matching SavedTabGroup. + saved_tab_group_model_->Add(CreateTestSavedTabGroup()); + ASSERT_EQ(3, saved_tab_group_model_->Count()); + + // call GetGroupContainingTab with the 2 ids and expect them to return. + EXPECT_EQ(saved_tab_group_model_->Get(matching_group_guid), + saved_tab_group_model_->GetGroupContainingTab(matching_tab_guid)); + EXPECT_EQ( + saved_tab_group_model_->Get(matching_group_guid), + saved_tab_group_model_->GetGroupContainingTab(matching_local_tab_id)); + + // Expect GetGroupContainingTab to return null when there is no match. + EXPECT_EQ(nullptr, + saved_tab_group_model_->GetGroupContainingTab(GenerateNextGUID())); + EXPECT_EQ(nullptr, + saved_tab_group_model_->GetGroupContainingTab(base::Token())); +} \ No newline at end of file
diff --git a/components/segmentation_platform/public/features.cc b/components/segmentation_platform/public/features.cc index 458b0d2..b1da7e1 100644 --- a/components/segmentation_platform/public/features.cc +++ b/components/segmentation_platform/public/features.cc
@@ -58,7 +58,7 @@ BASE_FEATURE(kContextualPageActionPriceTracking, "ContextualPageActionPriceTracking", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kContextualPageActionReaderMode, "ContextualPageActionReaderMode",
diff --git a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java index c3b192a6..185dbbc 100644 --- a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java +++ b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java
@@ -19,7 +19,6 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.Log; -import org.chromium.base.compat.ApiHelperForN; import org.chromium.content_public.browser.StylusWritingHandler; import org.chromium.content_public.browser.StylusWritingImeCallback; import org.chromium.content_public.browser.WebContents; @@ -441,7 +440,7 @@ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) return false; PointerIcon icon = PointerIcon.getSystemIcon( currentView.getContext(), DirectWritingConstants.STYLUS_WRITING_ICON_VALUE); - ApiHelperForN.setPointerIcon(currentView, icon); + currentView.setPointerIcon(icon); return true; } }
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.cc b/components/sync_bookmarks/bookmark_model_type_processor.cc index 30e18ba..97a06e9 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor.cc +++ b/components/sync_bookmarks/bookmark_model_type_processor.cc
@@ -254,11 +254,13 @@ updates_handler.Process(updates, got_new_encryption_requirements); } - // Issue error and disable sync if bookmarks count exceeds limit. + // Issue error and stop sync if bookmarks count exceeds limit. if (bookmark_tracker_->TrackedBookmarksCount() > max_bookmarks_till_sync_enabled_ && base::FeatureList::IsEnabled(syncer::kSyncEnforceBookmarksCountLimit)) { - StopTrackingMetadataAndResetTracker(); + // Local changes continue to be tracked in order to allow users to delete + // bookmarks and recover upon restart. + DisconnectSync(); error_handler_.Run( syncer::ModelError(FROM_HERE, "Local bookmarks count exceed limit.")); return; @@ -301,7 +303,7 @@ std::string metadata_str; if (bookmark_tracker_) { // |last_initial_merge_remote_updates_exceeded_limit_| is only set in error - // case and thus tracker would be empty. + // cases where the tracker would not be initialized. DCHECK(!last_initial_merge_remote_updates_exceeded_limit_); sync_pb::BookmarkModelMetadata model_metadata = @@ -424,6 +426,8 @@ } DCHECK(error_handler_); + // ConnectSync() should not have been called by now. + DCHECK(!worker_); // Report error if remote updates fetched last time during initial merge // exceeded limit. @@ -439,16 +443,18 @@ return; } - // Issue error and disable sync if bookmarks exceed limit. - // TODO(ankushkush): Think about adding two different limits: one for when - // sync just starts, the other (larger one) as hard limit, incl. incremental - // changes. + // Issue error and stop sync if bookmarks exceed limit. + // TODO(crbug.com/1347466): Think about adding two different limits: one for + // when sync just starts, the other (larger one) as hard limit, incl. + // incremental changes. const size_t count = bookmark_tracker_ ? bookmark_tracker_->TrackedBookmarksCount() : CountSyncableBookmarksFromModel(bookmark_model_); if (count > max_bookmarks_till_sync_enabled_ && base::FeatureList::IsEnabled(syncer::kSyncEnforceBookmarksCountLimit)) { - StopTrackingMetadataAndResetTracker(); + // For the case where a tracker already exists, local changes will continue + // to be tracked in order order to allow users to delete bookmarks and + // recover upon restart. start_callback_.Reset(); error_handler_.Run( syncer::ModelError(FROM_HERE, "Local bookmarks count exceed limit.")); @@ -527,14 +533,16 @@ void BookmarkModelTypeProcessor::NudgeForCommitIfNeeded() { DCHECK(bookmark_tracker_); - // Issue error and disable sync if the number of local bookmarks exceed limit. + // Issue error and stop sync if the number of local bookmarks exceed limit. // If |error_handler_| is not set, the check is ignored because this gets // re-evaluated in ConnectIfReady(). if (error_handler_ && bookmark_tracker_->TrackedBookmarksCount() > max_bookmarks_till_sync_enabled_ && base::FeatureList::IsEnabled(syncer::kSyncEnforceBookmarksCountLimit)) { - StopTrackingMetadataAndResetTracker(); + // Local changes continue to be tracked in order to allow users to delete + // bookmarks and recover upon restart. + DisconnectSync(); start_callback_.Reset(); error_handler_.Run( syncer::ModelError(FROM_HERE, "Local bookmarks count exceed limit.")); @@ -576,6 +584,7 @@ // very unlikely that there will be many updates downloaded. if (updates.size() > max_initial_updates_count && base::FeatureList::IsEnabled(syncer::kSyncEnforceBookmarksCountLimit)) { + DisconnectSync(); last_initial_merge_remote_updates_exceeded_limit_ = true; error_handler_.Run( syncer::ModelError(FROM_HERE, "Remote bookmarks count exceed limit.")); @@ -758,16 +767,4 @@ max_bookmarks_till_sync_enabled_ = limit; } -void BookmarkModelTypeProcessor::StopTrackingMetadataAndResetTracker() { - if (!bookmark_tracker_) { - return; - } - DCHECK(bookmark_model_); - DCHECK(bookmark_model_observer_); - - StopTrackingMetadata(); - bookmark_tracker_.reset(); - schedule_save_closure_.Run(); -} - } // namespace sync_bookmarks
diff --git a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc index f3c9d3b..3577c6d 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc +++ b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
@@ -930,7 +930,6 @@ // Expect failure when adding new bookmark. EXPECT_CALL(*error_handler(), Run); - EXPECT_CALL(*schedule_save_closure(), Run); SimulateOnSyncStarting(); SimulateModelReadyToSyncWithInitialSyncDone(); @@ -950,6 +949,8 @@ GURL(kUrl)); EXPECT_FALSE(processor()->IsConnectedForTest()); + // Expect tracking to still be enabled. + EXPECT_THAT(processor()->GetTrackerForTest(), NotNull()); } TEST_F( @@ -962,7 +963,6 @@ // Expect error twice. First, when new bookmark is added. Next after restart. EXPECT_CALL(*error_handler(), Run).Times(2); - EXPECT_CALL(*schedule_save_closure(), Run).Times(2); SimulateModelReadyToSyncWithInitialSyncDone(); SimulateOnSyncStarting(); @@ -1001,7 +1001,8 @@ // Should invoke error_handler::Run and schedule_save_closure::Run. SimulateOnSyncStarting(); - EXPECT_THAT(processor()->GetTrackerForTest(), IsNull()); + // Expect tracking to still be enabled. + EXPECT_THAT(processor()->GetTrackerForTest(), NotNull()); } TEST_F( @@ -1014,9 +1015,6 @@ // Expect error twice. First, when new bookmark is added. Next after restart. EXPECT_CALL(*error_handler(), Run).Times(2); - // save closure is invoked only once because bookmark tracker won't be set by - // ModelReadyToSync(). - EXPECT_CALL(*schedule_save_closure(), Run); SimulateModelReadyToSyncWithInitialSyncDone(); SimulateOnSyncStarting(); @@ -1042,8 +1040,6 @@ EXPECT_THAT(processor()->GetTrackerForTest(), IsNull()); // Should invoke error_handler::Run and schedule_save_closure::Run. SimulateOnSyncStarting(); - - EXPECT_THAT(processor()->GetTrackerForTest(), IsNull()); } TEST_F( @@ -1133,6 +1129,7 @@ SimulateModelReadyToSyncWithoutLocalMetadata(); SimulateOnSyncStarting(); + SimulateConnectSync(); const syncer::UniquePosition kRandomPosition = syncer::UniquePosition::InitialPosition( @@ -1157,12 +1154,13 @@ // Ensures that OnInitialUpdateReceived will be called. ASSERT_THAT(processor()->GetTrackerForTest(), IsNull()); ASSERT_TRUE(bookmark_bar->children().empty()); + ASSERT_TRUE(processor()->IsConnectedForTest()); ASSERT_FALSE(error_reported); processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), /*gc_directive=*/absl::nullopt); EXPECT_TRUE(error_reported); - EXPECT_THAT(processor()->GetTrackerForTest(), IsNull()); + EXPECT_FALSE(processor()->IsConnectedForTest()); // New bookmark gets added though. Note that this is as per the current // behaviour but is not a requirement. EXPECT_FALSE(bookmark_bar->children().empty()); @@ -1183,6 +1181,7 @@ SimulateModelReadyToSyncWithInitialSyncDone(); SimulateOnSyncStarting(); + SimulateConnectSync(); const syncer::UniquePosition kRandomPosition = syncer::UniquePosition::InitialPosition( @@ -1205,11 +1204,14 @@ // Ensures that path for incremental updates will be called. ASSERT_THAT(processor()->GetTrackerForTest(), NotNull()); ASSERT_TRUE(bookmark_bar->children().empty()); + ASSERT_TRUE(processor()->IsConnectedForTest()); ASSERT_FALSE(error_reported); processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), /*gc_directive=*/absl::nullopt); EXPECT_TRUE(error_reported); + EXPECT_FALSE(processor()->IsConnectedForTest()); + EXPECT_THAT(processor()->GetTrackerForTest(), NotNull()); // New bookmark gets added though. Note that this is as per the current // behaviour but is not a requirement. EXPECT_FALSE(bookmark_bar->children().empty()); @@ -1231,6 +1233,7 @@ SimulateModelReadyToSyncWithoutLocalMetadata(); SimulateOnSyncStarting(); + SimulateConnectSync(); const syncer::UniquePosition kRandomPosition = syncer::UniquePosition::InitialPosition( @@ -1262,11 +1265,13 @@ // Ensures that OnInitialUpdateReceived will be called. ASSERT_THAT(processor()->GetTrackerForTest(), IsNull()); ASSERT_TRUE(bookmark_bar->children().empty()); + ASSERT_TRUE(processor()->IsConnectedForTest()); ASSERT_FALSE(error_reported); processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), /*gc_directive=*/absl::nullopt); EXPECT_TRUE(error_reported); + EXPECT_FALSE(processor()->IsConnectedForTest()); // Tracker should remain null and bookmark model unchanged. EXPECT_THAT(processor()->GetTrackerForTest(), IsNull()); EXPECT_TRUE(bookmark_bar->children().empty()); @@ -1281,6 +1286,7 @@ SimulateModelReadyToSyncWithoutLocalMetadata(); SimulateOnSyncStarting(); + SimulateConnectSync(); const syncer::UniquePosition kRandomPosition = syncer::UniquePosition::InitialPosition( @@ -1308,11 +1314,13 @@ // Ensures that OnInitialUpdateReceived will be called. ASSERT_THAT(processor()->GetTrackerForTest(), IsNull()); + ASSERT_TRUE(processor()->IsConnectedForTest()); processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), /*gc_directive=*/absl::nullopt); ASSERT_THAT(processor()->GetTrackerForTest(), IsNull()); + ASSERT_FALSE(processor()->IsConnectedForTest()); // Metadata should contain the relevant field. sync_pb::BookmarkModelMetadata model_metadata; @@ -1338,6 +1346,7 @@ SimulateModelReadyToSyncWithoutLocalMetadata(); SimulateOnSyncStarting(); + SimulateConnectSync(); const syncer::UniquePosition kRandomPosition = syncer::UniquePosition::InitialPosition( @@ -1371,6 +1380,7 @@ /*gc_directive=*/absl::nullopt); ASSERT_TRUE(error_reported); ASSERT_THAT(processor()->GetTrackerForTest(), IsNull()); + ASSERT_FALSE(processor()->IsConnectedForTest()); sync_pb::BookmarkModelMetadata model_metadata; std::string metadata_str = processor()->EncodeSyncMetadata(); @@ -1463,7 +1473,6 @@ bookmark_model()); SimulateOnSyncStarting(); EXPECT_TRUE(error_reported); - // Tracker would not be initialised. EXPECT_THAT(processor()->GetTrackerForTest(), IsNull()); @@ -1482,7 +1491,6 @@ bookmark_model()); SimulateOnSyncStarting(); EXPECT_TRUE(error_reported); - // Tracker would not be initialised. EXPECT_THAT(processor()->GetTrackerForTest(), IsNull());
diff --git a/components/viz/service/display_embedder/output_presenter_gl.cc b/components/viz/service/display_embedder/output_presenter_gl.cc index 9471688..ae3b11d 100644 --- a/components/viz/service/display_embedder/output_presenter_gl.cc +++ b/components/viz/service/display_embedder/output_presenter_gl.cc
@@ -29,6 +29,8 @@ #include "ui/gl/gl_surface.h" #if BUILDFLAG(IS_ANDROID) +#include "ui/gl/android/scoped_a_native_window.h" +#include "ui/gl/android/scoped_java_surface.h" #include "ui/gl/gl_surface_egl_surface_control.h" #endif @@ -139,21 +141,16 @@ } bool can_be_used_with_surface_control = false; - ANativeWindow* window = - gpu::GpuSurfaceLookup::GetInstance()->AcquireNativeWidget( + gl::ScopedJavaSurface scoped_java_surface = + gpu::GpuSurfaceLookup::GetInstance()->AcquireJavaSurface( deps->GetSurfaceHandle(), &can_be_used_with_surface_control); - base::ScopedClosureRunner release_runner(base::BindOnce( - [](gfx::AcceleratedWidget widget) { - if (widget) - ANativeWindow_release(widget); - }, - window)); + gl::ScopedANativeWindow window(scoped_java_surface); if (!window || !can_be_used_with_surface_control) return nullptr; // TODO(https://crbug.com/1012401): don't depend on GL. auto gl_surface = base::MakeRefCounted<gl::GLSurfaceEGLSurfaceControl>( deps->GetSharedContextState()->display()->GetAs<gl::GLDisplayEGL>(), - window, base::SingleThreadTaskRunner::GetCurrentDefault()); + std::move(window), base::SingleThreadTaskRunner::GetCurrentDefault()); if (!gl_surface->Initialize(gl::GLSurfaceFormat())) { LOG(ERROR) << "Failed to initialize GLSurfaceEGLSurfaceControl."; return nullptr;
diff --git a/components/viz/service/display_embedder/skia_output_device_vulkan.cc b/components/viz/service/display_embedder/skia_output_device_vulkan.cc index 2017c4a..11529228 100644 --- a/components/viz/service/display_embedder/skia_output_device_vulkan.cc +++ b/components/viz/service/display_embedder/skia_output_device_vulkan.cc
@@ -28,6 +28,8 @@ #if BUILDFLAG(IS_ANDROID) #include <android/native_window_jni.h> +#include "ui/gl/android/scoped_a_native_window.h" +#include "ui/gl/android/scoped_java_surface.h" #endif namespace viz { @@ -260,15 +262,11 @@ gfx::AcceleratedWidget accelerated_widget = gfx::kNullAcceleratedWidget; #if BUILDFLAG(IS_ANDROID) bool can_be_used_with_surface_control = false; - accelerated_widget = - gpu::GpuSurfaceLookup::GetInstance()->AcquireNativeWidget( + gl::ScopedJavaSurface scoped_java_surface = + gpu::GpuSurfaceLookup::GetInstance()->AcquireJavaSurface( surface_handle_, &can_be_used_with_surface_control); - base::ScopedClosureRunner release_runner(base::BindOnce( - [](gfx::AcceleratedWidget widget) { - if (widget) - ANativeWindow_release(widget); - }, - accelerated_widget)); + gl::ScopedANativeWindow window(scoped_java_surface); + accelerated_widget = window.a_native_window(); #else accelerated_widget = surface_handle_; #endif
diff --git a/components/webapps/browser/banners/app_banner_manager.cc b/components/webapps/browser/banners/app_banner_manager.cc index 229558e8..0e8c3ae 100644 --- a/components/webapps/browser/banners/app_banner_manager.cc +++ b/components/webapps/browser/banners/app_banner_manager.cc
@@ -152,9 +152,6 @@ default: NOTREACHED(); } - - TrackBeforeInstallEvent( - BEFORE_INSTALL_EVENT_PROMPT_CALLED_AFTER_PREVENT_DEFAULT); } } // anonymous namespace
diff --git a/content/app/android/content_child_process_service_delegate.cc b/content/app/android/content_child_process_service_delegate.cc index 67b46754..fbdd977 100644 --- a/content/app/android/content_child_process_service_delegate.cc +++ b/content/app/android/content_child_process_service_delegate.cc
@@ -65,34 +65,6 @@ } // Overridden from GpuSurfaceLookup: - gfx::AcceleratedWidget AcquireNativeWidget( - int surface_id, - bool* can_be_used_with_surface_control) override { - JNIEnv* env = base::android::AttachCurrentThread(); - base::android::ScopedJavaLocalRef<jobject> surface_wrapper = - content::Java_ContentChildProcessServiceDelegate_getViewSurface( - env, service_impl_, surface_id); - if (!surface_wrapper) - return gfx::kNullAcceleratedWidget; - - gl::ScopedJavaSurface surface( - content::JNI_SurfaceWrapper_getSurface(env, surface_wrapper)); - DCHECK(!surface.j_surface().is_null()); - - // Note: This ensures that any local references used by - // ANativeWindow_fromSurface are released immediately. This is needed as a - // workaround for https://code.google.com/p/android/issues/detail?id=68174 - base::android::ScopedJavaLocalFrame scoped_local_reference_frame(env); - ANativeWindow* native_window = - ANativeWindow_fromSurface(env, surface.j_surface().obj()); - - *can_be_used_with_surface_control = - content::JNI_SurfaceWrapper_canBeUsedWithSurfaceControl( - env, surface_wrapper); - return native_window; - } - - // Overridden from GpuSurfaceLookup: gl::ScopedJavaSurface AcquireJavaSurface( int surface_id, bool* can_be_used_with_surface_control) override {
diff --git a/content/browser/child_process_launcher.cc b/content/browser/child_process_launcher.cc index 97338ee0..34898ce2 100644 --- a/content/browser/child_process_launcher.cc +++ b/content/browser/child_process_launcher.cc
@@ -61,7 +61,7 @@ using internal::ChildProcessLauncherHelper; -void ChildProcessLauncherPriority::WriteIntoTrace( +void RenderProcessPriority::WriteIntoTrace( perfetto::TracedProto<TraceProto> proto) const { proto->set_is_backgrounded(is_background()); proto->set_has_pending_views(boost_for_pending_views); @@ -136,16 +136,28 @@ } } -void ChildProcessLauncher::SetProcessPriority( - const ChildProcessLauncherPriority& priority) { +#if BUILDFLAG(IS_ANDROID) +void ChildProcessLauncher::SetRenderProcessPriority( + const RenderProcessPriority& priority) { DCHECK_CURRENTLY_ON(BrowserThread::UI); base::Process to_pass = process_.process.Duplicate(); GetProcessLauncherTaskRunner()->PostTask( FROM_HERE, base::BindOnce( - &ChildProcessLauncherHelper::SetProcessPriorityOnLauncherThread, + &ChildProcessLauncherHelper::SetRenderProcessPriorityOnLauncherThread, helper_, std::move(to_pass), priority)); } +#else // !BUILDFLAG(IS_ANDROID) +void ChildProcessLauncher::SetProcessBackgrounded(bool is_background) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + base::Process to_pass = process_.process.Duplicate(); + GetProcessLauncherTaskRunner()->PostTask( + FROM_HERE, + base::BindOnce( + &ChildProcessLauncherHelper::SetProcessBackgroundedOnLauncherThread, + helper_, std::move(to_pass), is_background)); +} +#endif // !BUILDFLAG(IS_ANDROID) void ChildProcessLauncher::Notify(ChildProcessLauncherHelper::Process process, #if BUILDFLAG(IS_WIN) @@ -258,13 +270,13 @@ return ret; } -bool ChildProcessLauncherPriority::is_background() const { +bool RenderProcessPriority::is_background() const { return !visible && !has_media_stream && !boost_for_pending_views && !has_foreground_service_worker; } -bool ChildProcessLauncherPriority::operator==( - const ChildProcessLauncherPriority& other) const { +bool RenderProcessPriority::operator==( + const RenderProcessPriority& other) const { return visible == other.visible && has_media_stream == other.has_media_stream && has_foreground_service_worker == other.has_foreground_service_worker &&
diff --git a/content/browser/child_process_launcher.h b/content/browser/child_process_launcher.h index ba1f0d6..6261080 100644 --- a/content/browser/child_process_launcher.h +++ b/content/browser/child_process_launcher.h
@@ -77,18 +77,18 @@ "LaunchResultCode must not overlap with sandbox::ResultCode"); #endif -struct ChildProcessLauncherPriority { - ChildProcessLauncherPriority(bool visible, - bool has_media_stream, - bool has_foreground_service_worker, - unsigned int frame_depth, - bool intersects_viewport, - bool boost_for_pending_views +struct RenderProcessPriority { + RenderProcessPriority(bool visible, + bool has_media_stream, + bool has_foreground_service_worker, + unsigned int frame_depth, + bool intersects_viewport, + bool boost_for_pending_views #if BUILDFLAG(IS_ANDROID) - , - ChildProcessImportance importance + , + ChildProcessImportance importance #endif - ) + ) : visible(visible), has_media_stream(has_media_stream), has_foreground_service_worker(has_foreground_service_worker), @@ -105,8 +105,8 @@ // Returns true if the child process is backgrounded. bool is_background() const; - bool operator==(const ChildProcessLauncherPriority& other) const; - bool operator!=(const ChildProcessLauncherPriority& other) const { + bool operator==(const RenderProcessPriority& other) const; + bool operator!=(const RenderProcessPriority& other) const { return !(*this == other); } @@ -133,14 +133,14 @@ // |frame_depth| is the depth of the shallowest frame this process is // responsible for which has |visible| visibility. It only makes sense to - // compare this property for two ChildProcessLauncherPriority instances with - // matching |visible| properties. + // compare this property for two RenderProcessPriority instances with matching + // |visible| properties. unsigned int frame_depth; // |intersects_viewport| is true if this process is responsible for a frame // which intersects a viewport which has |visible| visibility. It only makes - // sense to compare this property for two ChildProcessLauncherPriority - // instances with matching |visible| properties. + // sense to compare this property for two RenderProcessPriority instances + // with matching |visible| properties. bool intersects_viewport; // |boost_for_pending_views| is true if this process is responsible for a @@ -248,9 +248,15 @@ // more discussion of Linux implementation details. ChildProcessTerminationInfo GetChildTerminationInfo(bool known_dead); +#if BUILDFLAG(IS_ANDROID) + // Changes whether the render process runs in the background or not. Only + // call this after the process has started. + void SetRenderProcessPriority(const RenderProcessPriority& priority); +#else // Changes whether the process runs in the background or not. Only call // this after the process has started. - void SetProcessPriority(const ChildProcessLauncherPriority& priority); + void SetProcessBackgrounded(bool is_background); +#endif // BUILDFLAG(IS_ANDROID) // Terminates the process associated with this ChildProcessLauncher. // Returns true if the process was stopped, false if the process had not been
diff --git a/content/browser/child_process_launcher_helper.h b/content/browser/child_process_launcher_helper.h index b65900db..819978a 100644 --- a/content/browser/child_process_launcher_helper.h +++ b/content/browser/child_process_launcher_helper.h
@@ -65,8 +65,8 @@ class ChildProcessLauncher; class SandboxedProcessLauncherDelegate; struct ChildProcessLauncherFileData; -struct ChildProcessLauncherPriority; struct ChildProcessTerminationInfo; +struct RenderProcessPriority; #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) class PosixFileDescriptorInfo; @@ -199,10 +199,6 @@ static void ForceNormalProcessTerminationAsync( ChildProcessLauncherHelper::Process process); - void SetProcessPriorityOnLauncherThread( - base::Process process, - const ChildProcessLauncherPriority& priority); - #if BUILDFLAG(IS_ANDROID) void OnChildProcessStarted(JNIEnv* env, jint handle); @@ -210,7 +206,14 @@ // Dumps the stack of the child process without crashing it. void DumpProcessStack(const base::Process& process); -#endif // BUILDFLAG(IS_ANDROID) + + void SetRenderProcessPriorityOnLauncherThread( + base::Process process, + const RenderProcessPriority& priority); +#else // !BUILDFLAG(IS_ANDROID) + void SetProcessBackgroundedOnLauncherThread(base::Process process, + bool is_background); +#endif // !BUILDFLAG(IS_ANDROID) std::string GetProcessType();
diff --git a/content/browser/child_process_launcher_helper_android.cc b/content/browser/child_process_launcher_helper_android.cc index 2f93f294..beaa9b02 100644 --- a/content/browser/child_process_launcher_helper_android.cc +++ b/content/browser/child_process_launcher_helper_android.cc
@@ -231,19 +231,6 @@ << process.process.Handle(); StopChildProcess(process.process.Handle()); } - -void ChildProcessLauncherHelper::SetProcessPriorityOnLauncherThread( - base::Process process, - const ChildProcessLauncherPriority& priority) { - JNIEnv* env = AttachCurrentThread(); - DCHECK(env); - return Java_ChildProcessLauncherHelperImpl_setPriority( - env, java_peer_, process.Handle(), priority.visible, - priority.has_media_stream, priority.has_foreground_service_worker, - priority.frame_depth, priority.intersects_viewport, - priority.boost_for_pending_views, static_cast<jint>(priority.importance)); -} - // static base::File OpenFileToShare(const base::FilePath& path, base::MemoryMappedFile::Region* region) { @@ -267,6 +254,18 @@ process.Handle()); } +void ChildProcessLauncherHelper::SetRenderProcessPriorityOnLauncherThread( + base::Process process, + const RenderProcessPriority& priority) { + JNIEnv* env = AttachCurrentThread(); + DCHECK(env); + return Java_ChildProcessLauncherHelperImpl_setPriority( + env, java_peer_, process.Handle(), priority.visible, + priority.has_media_stream, priority.has_foreground_service_worker, + priority.frame_depth, priority.intersects_viewport, + priority.boost_for_pending_views, static_cast<jint>(priority.importance)); +} + // Called from ChildProcessLauncher.java when the ChildProcess was started. // |handle| is the processID of the child process as originated in Java, 0 if // the ChildProcess could not be created.
diff --git a/content/browser/child_process_launcher_helper_fuchsia.cc b/content/browser/child_process_launcher_helper_fuchsia.cc index ba73868..27c67177 100644 --- a/content/browser/child_process_launcher_helper_fuchsia.cc +++ b/content/browser/child_process_launcher_helper_fuchsia.cc
@@ -53,9 +53,9 @@ } // namespace -void ChildProcessLauncherHelper::SetProcessPriorityOnLauncherThread( +void ChildProcessLauncherHelper::SetProcessBackgroundedOnLauncherThread( base::Process process, - const ChildProcessLauncherPriority& priority) { + bool is_background) { DCHECK(CurrentlyOnProcessLauncherTaskRunner()); // TODO(https://crbug.com/926583): Fuchsia does not currently support this. }
diff --git a/content/browser/child_process_launcher_helper_linux.cc b/content/browser/child_process_launcher_helper_linux.cc index dd5ccfc..8c5cc2b 100644 --- a/content/browser/child_process_launcher_helper_linux.cc +++ b/content/browser/child_process_launcher_helper_linux.cc
@@ -160,12 +160,12 @@ } } -void ChildProcessLauncherHelper::SetProcessPriorityOnLauncherThread( +void ChildProcessLauncherHelper::SetProcessBackgroundedOnLauncherThread( base::Process process, - const ChildProcessLauncherPriority& priority) { + bool is_background) { DCHECK(CurrentlyOnProcessLauncherTaskRunner()); if (process.CanBackgroundProcesses()) - process.SetProcessBackgrounded(priority.is_background()); + process.SetProcessBackgrounded(is_background); } // static
diff --git a/content/browser/child_process_launcher_helper_mac.cc b/content/browser/child_process_launcher_helper_mac.cc index db736da..faddc7a 100644 --- a/content/browser/child_process_launcher_helper_mac.cc +++ b/content/browser/child_process_launcher_helper_mac.cc
@@ -239,12 +239,12 @@ base::EnsureProcessTerminated(std::move(process.process)); } -void ChildProcessLauncherHelper::SetProcessPriorityOnLauncherThread( +void ChildProcessLauncherHelper::SetProcessBackgroundedOnLauncherThread( base::Process process, - const ChildProcessLauncherPriority& priority) { + bool is_background) { if (process.CanBackgroundProcesses()) { process.SetProcessBackgrounded(ChildProcessTaskPortProvider::GetInstance(), - priority.is_background()); + is_background); } }
diff --git a/content/browser/child_process_launcher_helper_win.cc b/content/browser/child_process_launcher_helper_win.cc index 799ad0a..a3e04a97 100644 --- a/content/browser/child_process_launcher_helper_win.cc +++ b/content/browser/child_process_launcher_helper_win.cc
@@ -114,12 +114,12 @@ process.process.Terminate(RESULT_CODE_NORMAL_EXIT, false); } -void ChildProcessLauncherHelper::SetProcessPriorityOnLauncherThread( +void ChildProcessLauncherHelper::SetProcessBackgroundedOnLauncherThread( base::Process process, - const ChildProcessLauncherPriority& priority) { + bool is_background) { DCHECK(CurrentlyOnProcessLauncherTaskRunner()); if (process.CanBackgroundProcesses()) - process.SetProcessBackgrounded(priority.is_background()); + process.SetProcessBackgrounded(is_background); } } // namespace internal
diff --git a/content/browser/fenced_frame/fenced_frame_browsertest.cc b/content/browser/fenced_frame/fenced_frame_browsertest.cc index 306edeb9..12e1e33f 100644 --- a/content/browser/fenced_frame/fenced_frame_browsertest.cc +++ b/content/browser/fenced_frame/fenced_frame_browsertest.cc
@@ -73,8 +73,9 @@ FencedFrameURLMapping* fenced_frame_url_mapping, const GURL& https_url, const ReportingMetadata& reporting_metadata = ReportingMetadata()) { - absl::optional<GURL> urn_uuid = fenced_frame_url_mapping->AddFencedFrameURL( - https_url, reporting_metadata); + absl::optional<GURL> urn_uuid = + fenced_frame_url_mapping->AddFencedFrameURLForTesting(https_url, + reporting_metadata); EXPECT_TRUE(urn_uuid.has_value()); EXPECT_TRUE(urn_uuid->is_valid()); return urn_uuid.value();
diff --git a/content/browser/fenced_frame/fenced_frame_config.cc b/content/browser/fenced_frame/fenced_frame_config.cc index dcab669..5459e9f 100644 --- a/content/browser/fenced_frame/fenced_frame_config.cc +++ b/content/browser/fenced_frame/fenced_frame_config.cc
@@ -18,6 +18,8 @@ base::GUID::GenerateRandomV4().AsLowercaseString()); } +namespace { + std::vector<std::pair<GURL, FencedFrameConfig>> GenerateURNConfigVectorForConfigs( const std::vector<FencedFrameConfig>& nested_configs) { @@ -44,6 +46,20 @@ return nested_urn_config_pairs; } +template <typename Property> +void RedactProperty( + const absl::optional<FencedFrameProperty<Property>>& property, + FencedFrameEntity entity, + absl::optional<blink::FencedFrame::RedactedFencedFrameProperty<Property>>& + out) { + if (property.has_value()) { + out = blink::FencedFrame::RedactedFencedFrameProperty( + property->GetValueForEntity(entity)); + } +} + +} // namespace + FencedFrameConfig::FencedFrameConfig() = default; FencedFrameConfig::FencedFrameConfig(const GURL& mapped_url) @@ -92,18 +108,17 @@ blink::FencedFrame::RedactedFencedFrameConfig FencedFrameConfig::RedactFor( FencedFrameEntity entity) const { blink::FencedFrame::RedactedFencedFrameConfig redacted_config; - if (urn_.has_value()) + if (urn_.has_value()) { redacted_config.urn_ = urn_; - if (mapped_url_.has_value()) { - redacted_config.mapped_url_ = - blink::FencedFrame::RedactedFencedFrameProperty( - mapped_url_->GetValueForEntity(entity)); } - if (ad_auction_data_.has_value()) { - redacted_config.ad_auction_data_ = - blink::FencedFrame::RedactedFencedFrameProperty( - ad_auction_data_->GetValueForEntity(entity)); - } + + RedactProperty(mapped_url_, entity, redacted_config.mapped_url_); + RedactProperty(container_size_, entity, redacted_config.container_size_); + RedactProperty(content_size_, entity, redacted_config.content_size_); + RedactProperty(deprecated_should_freeze_initial_size_, entity, + redacted_config.deprecated_should_freeze_initial_size_); + RedactProperty(ad_auction_data_, entity, redacted_config.ad_auction_data_); + if (nested_configs_.has_value()) { absl::optional<std::vector<FencedFrameConfig>> partially_redacted_nested_configs = @@ -120,16 +135,12 @@ redacted_config.nested_configs_.emplace(absl::nullopt); } } - if (shared_storage_budget_metadata_.has_value()) { - redacted_config.shared_storage_budget_metadata_ = - blink::FencedFrame::RedactedFencedFrameProperty( - shared_storage_budget_metadata_->GetValueForEntity(entity)); - } - if (reporting_metadata_.has_value()) { - redacted_config.reporting_metadata_ = - blink::FencedFrame::RedactedFencedFrameProperty( - reporting_metadata_->GetValueForEntity(entity)); - } + + RedactProperty(shared_storage_budget_metadata_, entity, + redacted_config.shared_storage_budget_metadata_); + RedactProperty(reporting_metadata_, entity, + redacted_config.reporting_metadata_); + return redacted_config; } @@ -145,6 +156,10 @@ FencedFrameProperties::FencedFrameProperties(const FencedFrameConfig& config) : urn_(config.urn_), mapped_url_(config.mapped_url_), + container_size_(config.container_size_), + content_size_(config.content_size_), + deprecated_should_freeze_initial_size_( + config.deprecated_should_freeze_initial_size_), ad_auction_data_(config.ad_auction_data_), on_navigate_callback_(config.on_navigate_callback_), nested_urn_config_pairs_(absl::nullopt), @@ -182,18 +197,18 @@ blink::FencedFrame::RedactedFencedFrameProperties FencedFrameProperties::RedactFor(FencedFrameEntity entity) const { blink::FencedFrame::RedactedFencedFrameProperties redacted_properties; - if (urn_.has_value()) + if (urn_.has_value()) { redacted_properties.urn_ = urn_; - if (mapped_url_.has_value()) { - redacted_properties.mapped_url_ = - blink::FencedFrame::RedactedFencedFrameProperty( - mapped_url_->GetValueForEntity(entity)); } - if (ad_auction_data_.has_value()) { - redacted_properties.ad_auction_data_ = - blink::FencedFrame::RedactedFencedFrameProperty( - ad_auction_data_->GetValueForEntity(entity)); - } + + RedactProperty(mapped_url_, entity, redacted_properties.mapped_url_); + RedactProperty(container_size_, entity, redacted_properties.container_size_); + RedactProperty(content_size_, entity, redacted_properties.content_size_); + RedactProperty(deprecated_should_freeze_initial_size_, entity, + redacted_properties.deprecated_should_freeze_initial_size_); + RedactProperty(ad_auction_data_, entity, + redacted_properties.ad_auction_data_); + if (nested_urn_config_pairs_.has_value()) { absl::optional<std::vector<std::pair<GURL, FencedFrameConfig>>> partially_redacted_nested_urn_config_pairs = @@ -226,11 +241,10 @@ absl::nullopt); } } - if (reporting_metadata_.has_value()) { - redacted_properties.reporting_metadata_ = - blink::FencedFrame::RedactedFencedFrameProperty( - reporting_metadata_->GetValueForEntity(entity)); - } + + RedactProperty(reporting_metadata_, entity, + redacted_properties.reporting_metadata_); + return redacted_properties; }
diff --git a/content/browser/fenced_frame/fenced_frame_config.h b/content/browser/fenced_frame/fenced_frame_config.h index c49b0f9..50a146c 100644 --- a/content/browser/fenced_frame/fenced_frame_config.h +++ b/content/browser/fenced_frame/fenced_frame_config.h
@@ -76,6 +76,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h" #include "third_party/blink/public/mojom/fenced_frame/fenced_frame.mojom.h" +#include "ui/gfx/geometry/size.h" #include "url/gurl.h" #include "url/origin.h" @@ -212,6 +213,23 @@ absl::optional<FencedFrameProperty<GURL>> mapped_url_; + // The initial size of the outer container (the size that the embedder sees + // for the fenced frame). This will only be respected if the embedder hasn't + // explicitly declared a size for the <fencedframe> element, and will be + // disregarded if the embedder subsequently resizes the fenced frame. + absl::optional<FencedFrameProperty<gfx::Size>> container_size_; + + // The size of the inner frame (the size that the fenced frame sees for + // itself). + absl::optional<FencedFrameProperty<gfx::Size>> content_size_; + + // Whether we should use the old size freezing behavior for backwards + // compatibility. (The old behavior is to freeze the fenced frame to its size + // at navigation start, coerced to a list of allowed sizes. The new behavior + // uses `container_size` and `content_size` above.) + absl::optional<FencedFrameProperty<bool>> + deprecated_should_freeze_initial_size_; + // Extra data set if `mapped_url` is the result of a FLEDGE auction. Used // to fill in `AdAuctionDocumentData` for the fenced frame that navigates // to `mapped_url`. @@ -277,6 +295,13 @@ absl::optional<FencedFrameProperty<GURL>> mapped_url_; + absl::optional<FencedFrameProperty<gfx::Size>> container_size_; + + absl::optional<FencedFrameProperty<gfx::Size>> content_size_; + + absl::optional<FencedFrameProperty<bool>> + deprecated_should_freeze_initial_size_; + absl::optional<FencedFrameProperty<AdAuctionData>> ad_auction_data_; // Should be invoked when `mapped_url` is navigated to via the passed in
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping.cc b/content/browser/fenced_frame/fenced_frame_url_mapping.cc index 98e5346..606db43 100644 --- a/content/browser/fenced_frame/fenced_frame_url_mapping.cc +++ b/content/browser/fenced_frame/fenced_frame_url_mapping.cc
@@ -88,7 +88,7 @@ } } -absl::optional<GURL> FencedFrameURLMapping::AddFencedFrameURL( +absl::optional<GURL> FencedFrameURLMapping::AddFencedFrameURLForTesting( const GURL& url, const ReportingMetadata& reporting_metadata) { DCHECK(url.is_valid()); @@ -262,7 +262,8 @@ } SharedStorageBudgetMetadata* -FencedFrameURLMapping::GetSharedStorageBudgetMetadata(const GURL& urn_uuid) { +FencedFrameURLMapping::GetSharedStorageBudgetMetadataForTesting( + const GURL& urn_uuid) { auto it = urn_uuid_to_url_map_.find(urn_uuid); DCHECK(it != urn_uuid_to_url_map_.end());
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping.h b/content/browser/fenced_frame/fenced_frame_url_mapping.h index 597fc2e..6231424 100644 --- a/content/browser/fenced_frame/fenced_frame_url_mapping.h +++ b/content/browser/fenced_frame/fenced_frame_url_mapping.h
@@ -69,19 +69,6 @@ void ImportPendingAdComponents( const std::vector<std::pair<GURL, FencedFrameConfig>>& components); - // Adds a mapping for |url| to a URN:UUID that will be generated by this - // function. Should only be invoked with a valid URL which is one of the - // "potentially trustworthy URLs". - // Mapping will not be added and return absl::nullopt if number of mappings - // has reached limit. Enforcing a limit on number of mappings prevents - // excessive memory consumption. - // `reporting_metadata` will contain a `ReportingMetadata` that populates - // any metadata invoked by the worklet using `RegisterAdBeacon`. See - // https://github.com/WICG/turtledove/blob/main/Fenced_Frames_Ads_Reporting.md#registeradbeacon - absl::optional<GURL> AddFencedFrameURL( - const GURL& url, - const ReportingMetadata& reporting_metadata = ReportingMetadata()); - // Move pending mapped `urn_uuid` from `pending_urn_uuid_to_url_map_` to // `urn_uuid_to_url_map_`. Then assign ad auction data as well as an ordered // list of ad component URLs, provided by a bidder running an auction, to the @@ -135,6 +122,19 @@ const GURL& urn_uuid, const SharedStorageURNMappingResult& mapping_result); + // Adds a mapping for |url| to a URN:UUID that will be generated by this + // function. Should only be invoked with a valid URL which is one of the + // "potentially trustworthy URLs". + // Mapping will not be added and return absl::nullopt if number of mappings + // has reached limit. Enforcing a limit on number of mappings prevents + // excessive memory consumption. + // `reporting_metadata` will contain a `ReportingMetadata` that populates + // any metadata invoked by the worklet using `RegisterAdBeacon`. See + // https://github.com/WICG/turtledove/blob/main/Fenced_Frames_Ads_Reporting.md#registeradbeacon + absl::optional<GURL> AddFencedFrameURLForTesting( + const GURL& url, + const ReportingMetadata& reporting_metadata = ReportingMetadata()); + // Return the `SharedStorageBudgetMetadata` associated with `urn_uuid`, or // nullptr if there's no metadata associated (i.e. `urn_uuid` was not // originated from shared storage). Precondition: `urn_uuid` exists in @@ -146,7 +146,7 @@ // `FencedFrameURLMapping`'s (thus the page's) lifetime, and a page will // outlive any `NavigationRequest` occurring in fenced frames in the page, // thus it's safe for a `NavigationRequest` to store a pointer to this. - SharedStorageBudgetMetadata* GetSharedStorageBudgetMetadata( + SharedStorageBudgetMetadata* GetSharedStorageBudgetMetadataForTesting( const GURL& urn_uuid); // Modifies the true URL from a URN by replacing substrings specified in the
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc b/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc index fb07124..cf1c1c4e 100644 --- a/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc +++ b/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc
@@ -124,7 +124,7 @@ FencedFrameURLMapping fenced_frame_url_mapping; GURL test_url("https://foo.test"); absl::optional<GURL> urn_uuid = - fenced_frame_url_mapping.AddFencedFrameURL(test_url); + fenced_frame_url_mapping.AddFencedFrameURLForTesting(test_url); EXPECT_TRUE(urn_uuid.has_value()); TestFencedFrameURLMappingResultObserver observer; @@ -186,14 +186,16 @@ EXPECT_EQ(absl::nullopt, observer2.nested_urn_config_pairs()); SharedStorageBudgetMetadata* metadata1 = - fenced_frame_url_mapping.GetSharedStorageBudgetMetadata(urn_uuid1); + fenced_frame_url_mapping.GetSharedStorageBudgetMetadataForTesting( + urn_uuid1); EXPECT_TRUE(metadata1); EXPECT_EQ(metadata1->origin, shared_storage_origin); EXPECT_DOUBLE_EQ(metadata1->budget_to_charge, 2.0); SharedStorageBudgetMetadata* metadata2 = - fenced_frame_url_mapping.GetSharedStorageBudgetMetadata(urn_uuid2); + fenced_frame_url_mapping.GetSharedStorageBudgetMetadataForTesting( + urn_uuid2); EXPECT_TRUE(metadata2); EXPECT_EQ(metadata2->origin, shared_storage_origin); @@ -479,7 +481,7 @@ FencedFrameURLMapping fenced_frame_url_mapping; GURL test_url("https://foo.test"); absl::optional<GURL> urn_uuid = - fenced_frame_url_mapping.AddFencedFrameURL(test_url); + fenced_frame_url_mapping.AddFencedFrameURLForTesting(test_url); EXPECT_TRUE(urn_uuid.has_value()); std::string spec = urn_uuid->spec(); @@ -507,8 +509,9 @@ fenced_frame_reporting .metadata[blink::FencedFrame::ReportingDestination::kSeller] ["mouse interaction"] = seller_reporting_url; - absl::optional<GURL> urn_uuid = fenced_frame_url_mapping.AddFencedFrameURL( - test_url, fenced_frame_reporting); + absl::optional<GURL> urn_uuid = + fenced_frame_url_mapping.AddFencedFrameURLForTesting( + test_url, fenced_frame_reporting); EXPECT_TRUE(urn_uuid.has_value()); EXPECT_TRUE(urn_uuid->is_valid()); TestFencedFrameURLMappingResultObserver observer; @@ -575,7 +578,7 @@ // Able to add urn mapping when map is not full. const GURL test_url("https://test.test"); absl::optional<GURL> urn_uuid = - fenced_frame_url_mapping.AddFencedFrameURL(test_url); + fenced_frame_url_mapping.AddFencedFrameURLForTesting(test_url); EXPECT_TRUE(urn_uuid.has_value()); // Fill the map until its size reaches the limit. @@ -590,7 +593,7 @@ // Subsequent additions of urn mapping should fail when map is full. const GURL extra_url("https://extra.test"); absl::optional<GURL> extra_urn_uuid = - fenced_frame_url_mapping.AddFencedFrameURL(extra_url); + fenced_frame_url_mapping.AddFencedFrameURLForTesting(extra_url); EXPECT_FALSE(extra_urn_uuid.has_value()); }
diff --git a/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc b/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc index 5bb42b0..d10ddba 100644 --- a/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc +++ b/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc
@@ -205,6 +205,33 @@ TEST_PROPERTY(FencedFrameProperties, mapped_url_, test_url, eq_fn, eq_fn); } + // Test `container_size` and `content_size`. + { + gfx::Size test_size(100, 200); + auto eq_fn = [](const gfx::Size& a, const gfx::Size& b) { return a == b; }; + + TEST_PROPERTY(FencedFrameConfig, container_size_, test_size, eq_fn, eq_fn); + TEST_PROPERTY(FencedFrameProperties, container_size_, test_size, eq_fn, + eq_fn); + + TEST_PROPERTY(FencedFrameConfig, content_size_, test_size, eq_fn, eq_fn); + TEST_PROPERTY(FencedFrameProperties, content_size_, test_size, eq_fn, + eq_fn); + } + + // Test `deprecated_should_freeze_initial_size`. + { + auto eq_fn = [](const bool a, const bool b) { return a == b; }; + TEST_PROPERTY(FencedFrameConfig, deprecated_should_freeze_initial_size_, + true, eq_fn, eq_fn); + TEST_PROPERTY(FencedFrameProperties, deprecated_should_freeze_initial_size_, + true, eq_fn, eq_fn); + TEST_PROPERTY(FencedFrameConfig, deprecated_should_freeze_initial_size_, + false, eq_fn, eq_fn); + TEST_PROPERTY(FencedFrameProperties, deprecated_should_freeze_initial_size_, + false, eq_fn, eq_fn); + } + // Test `ad_auction_data`. { AdAuctionData test_ad_auction_data = {url::Origin::Create(test_url),
diff --git a/content/browser/interest_group/ad_auction_service_impl_unittest.cc b/content/browser/interest_group/ad_auction_service_impl_unittest.cc index 0bc6886e..f897cc7 100644 --- a/content/browser/interest_group/ad_auction_service_impl_unittest.cc +++ b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
@@ -1016,12 +1016,14 @@ // The server JSON updates all fields that can be updated. TEST_F(AdAuctionServiceImplTest, UpdateAllUpdatableFields) { network_responder_->RegisterUpdateResponse( - kDailyUpdateUrlPath, base::StringPrintf(R"({ + kDailyUpdateUrlPath, + base::StringPrintf(R"({ "priority": 1.59, "enableBiddingSignalsPrioritization": true, "priorityVector": {"old1": 2, "new1": 1.1}, "prioritySignalsOverrides": {"old2": 1, "new1": 1.1, "browserSignals.reserved":-1}, +"sellerCapabilities": {"%s": ["latencyStats"], "*": ["interestGroupCounts"]}, "biddingLogicUrl": "%s/interest_group/new_bidding_logic.js", "biddingWasmHelperUrl":"%s/interest_group/new_bidding_wasm_helper_url.wasm", "trustedBiddingSignalsUrl": @@ -1034,14 +1036,20 @@ "metadata": {"new_c": "d"} }] })", - kOriginStringA, kOriginStringA, - kOriginStringA, kOriginStringA)); + kOriginStringA, kOriginStringA, kOriginStringA, + kOriginStringA, kOriginStringA)); blink::InterestGroup interest_group = CreateInterestGroup(); interest_group.priority = 2.0; interest_group.enable_bidding_signals_prioritization = false; interest_group.priority_vector = {{{"old1", 1}, {"old2", 2}}}; interest_group.priority_signals_overrides = {{{"old1", 1}, {"old2", 2}}}; + interest_group.seller_capabilities.emplace(); + interest_group.seller_capabilities->insert(std::make_pair( + kOriginA, + blink::InterestGroup::SellerCapabilities::kInterestGroupCounts)); + interest_group.all_sellers_capabilities = + blink::InterestGroup::SellerCapabilities::kLatencyStats; interest_group.daily_update_url = kUpdateUrlA; interest_group.bidding_url = kBiddingLogicUrlA; interest_group.trusted_bidding_signals_url = kTrustedBiddingSignalsUrlA; @@ -1079,6 +1087,12 @@ EXPECT_EQ(group.priority_signals_overrides, expected_priority_signals_overrides); + EXPECT_EQ(group.all_sellers_capabilities, + blink::InterestGroup::SellerCapabilities::kInterestGroupCounts); + ASSERT_TRUE(group.seller_capabilities); + ASSERT_EQ(group.seller_capabilities->size(), 1u); + EXPECT_EQ(group.seller_capabilities->at(kOriginA), + blink::InterestGroup::SellerCapabilities::kLatencyStats); ASSERT_TRUE(group.bidding_url.has_value()); EXPECT_EQ(group.bidding_url->spec(), base::StringPrintf("%s/interest_group/new_bidding_logic.js", @@ -1802,6 +1816,46 @@ EXPECT_EQ(group.bidding_url, kBiddingLogicUrlA); } +// The `sellerCapabilities` field has an invalid capability. The entire update +// should get cancelled, since updates are atomic. +TEST_F(AdAuctionServiceImplTest, + UpdateInvalidSellerCapabilitiesCancelsAllUpdates) { + network_responder_->RegisterUpdateResponse( + kDailyUpdateUrlPath, base::StringPrintf(R"({ +"sellerCapabilities": {"%s": ["latencyStats"], "*": ["interestGroupCounts", + "invalidCapability"]}, +"biddingLogicUrl": "%s/interest_group/new_bidding_logic.js" +})", + kOriginStringA, kOriginStringA)); + + blink::InterestGroup interest_group = CreateInterestGroup(); + interest_group.daily_update_url = kUpdateUrlA; + interest_group.bidding_url = kBiddingLogicUrlA; + interest_group.trusted_bidding_signals_url = kTrustedBiddingSignalsUrlA; + interest_group.trusted_bidding_signals_keys.emplace(); + interest_group.trusted_bidding_signals_keys->push_back("key1"); + interest_group.ads.emplace(); + blink::InterestGroup::Ad ad( + /*render_url=*/GURL("https://example.com/render"), + /*metadata=*/absl::nullopt); + interest_group.ads->emplace_back(std::move(ad)); + JoinInterestGroupAndFlush(interest_group); + EXPECT_EQ(1, GetJoinCount(kOriginA, kInterestGroupName)); + + UpdateInterestGroupNoFlush(); + task_environment()->RunUntilIdle(); + + // Check that the seller capabilities and bidding logic URL didn't change. + std::vector<StorageInterestGroup> groups = + GetInterestGroupsForOwner(kOriginA); + ASSERT_EQ(groups.size(), 1u); + const auto& group = groups[0].interest_group; + EXPECT_EQ(group.all_sellers_capabilities, + blink::InterestGroup::SellerCapabilitiesType()); + EXPECT_FALSE(group.seller_capabilities); + EXPECT_EQ(group.bidding_url, kBiddingLogicUrlA); +} + // The server response can't be parsed as valid JSON. The update is cancelled. TEST_F(AdAuctionServiceImplTest, UpdateInvalidJSONIgnored) { network_responder_->RegisterUpdateResponse(kDailyUpdateUrlPath,
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc index 72c0a7d..1ac96d5 100644 --- a/content/browser/interest_group/interest_group_browsertest.cc +++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -113,7 +113,7 @@ return list; } -base::Value::Dict stringDoubleMapToDict( +base::Value::Dict StringDoubleMapToDict( const base::flat_map<std::string, double>& map) { base::Value::Dict dict; for (const auto& pair : map) { @@ -122,6 +122,41 @@ return dict; } +base::Value::List SellerCapabilitiesToList( + blink::InterestGroup::SellerCapabilitiesType capabilities) { + base::Value::List list; + for (blink::InterestGroup::SellerCapabilities capability : capabilities) { + if (capability == + blink::InterestGroup::SellerCapabilities::kInterestGroupCounts) { + list.Append("interestGroupCounts"); + } else if (capability == + blink::InterestGroup::SellerCapabilities::kLatencyStats) { + list.Append("latencyStats"); + } else { + ADD_FAILURE() << "Unknown seller capability " + << static_cast<uint32_t>(capability); + } + } + return list; +} + +base::Value::Dict SellerCapabilitiesToDict( + const absl::optional< + base::flat_map<url::Origin, + blink::InterestGroup::SellerCapabilitiesType>>& map, + blink::InterestGroup::SellerCapabilitiesType all_sellers_capabilities) { + base::Value::Dict dict; + if (map) { + for (const auto& [origin, capabilities] : *map) { + dict.Set(origin.Serialize(), SellerCapabilitiesToList(capabilities)); + } + } + if (!all_sellers_capabilities.Empty()) { + dict.Set("*", SellerCapabilitiesToList(all_sellers_capabilities)); + } + return dict; +} + class AllowlistedOriginContentBrowserClient : public TestContentBrowserClient { public: explicit AllowlistedOriginContentBrowserClient() = default; @@ -585,11 +620,14 @@ dict.Set("enableBiddingSignalsPrioritization", group.enable_bidding_signals_prioritization); if (group.priority_vector) - dict.Set("priorityVector", stringDoubleMapToDict(*group.priority_vector)); + dict.Set("priorityVector", StringDoubleMapToDict(*group.priority_vector)); if (group.priority_signals_overrides) { dict.Set("prioritySignalsOverrides", - stringDoubleMapToDict(*group.priority_signals_overrides)); + StringDoubleMapToDict(*group.priority_signals_overrides)); } + dict.Set("sellerCapabilities", + SellerCapabilitiesToDict(group.seller_capabilities, + group.all_sellers_capabilities)); if (group.bidding_url) dict.Set("biddingLogicUrl", group.bidding_url->spec()); if (group.bidding_wasm_helper_url) @@ -2500,6 +2538,52 @@ } IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, + JoinInterestGroupValidSellerCapabilities) { + GURL url = https_server_->GetURL("a.test", "/echo"); + auto origin = url::Origin::Create(url); + std::string origin_string = origin.Serialize(); + ASSERT_TRUE(NavigateToURL(shell(), url)); + + EXPECT_EQ( + kSuccess, + JoinInterestGroupAndVerify(blink::InterestGroup( + /*expiry=*/base::Time(), + /*owner=*/origin, + /*name=*/"cars", + /*priority=*/0.0, /*enable_bidding_signals_prioritization=*/false, + /*priority_vector=*/absl::nullopt, + /*priority_signals_overrides=*/absl::nullopt, + /*seller_capabilities=*/ + {{{url::Origin::Create(GURL("https://example.test")), + blink::InterestGroup::SellerCapabilities::kInterestGroupCounts}}}, + /*all_sellers_capabilities=*/ + blink::InterestGroup::SellerCapabilities:: + kLatencyStats, /*execution_mode=*/ + blink::InterestGroup::ExecutionMode::kCompatibilityMode, + /*bidding_url=*/absl::nullopt, + /*bidding_wasm_helper_url=*/absl::nullopt, + /*daily_update_url=*/absl::nullopt, + /*trusted_bidding_signals_url=*/absl::nullopt, + /*trusted_bidding_signals_keys=*/absl::nullopt, + /*user_bidding_signals=*/absl::nullopt, + /*ads=*/absl::nullopt, + /*ad_components=*/absl::nullopt))); + + WaitForAccessObserved({}); + + std::vector<StorageInterestGroup> groups = GetInterestGroupsForOwner(origin); + ASSERT_EQ(groups.size(), 1u); + const blink::InterestGroup& group = groups[0].interest_group; + EXPECT_EQ(group.all_sellers_capabilities, + blink::InterestGroup::SellerCapabilities::kLatencyStats); + ASSERT_TRUE(group.seller_capabilities); + ASSERT_EQ(group.seller_capabilities->size(), 1u); + EXPECT_EQ(group.seller_capabilities->at( + url::Origin::Create(GURL("https://example.test"))), + blink::InterestGroup::SellerCapabilities::kInterestGroupCounts); +} + +IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, JoinInterestGroupInvalidBiddingLogicUrl) { GURL url = https_server_->GetURL("a.test", "/echo"); std::string origin_string = url::Origin::Create(url).Serialize();
diff --git a/content/browser/interest_group/interest_group_storage.cc b/content/browser/interest_group/interest_group_storage.cc index f80bfebc..32f4c7e 100644 --- a/content/browser/interest_group/interest_group_storage.cc +++ b/content/browser/interest_group/interest_group_storage.cc
@@ -5,9 +5,12 @@ #include "content/browser/interest_group/interest_group_storage.h" #include <stddef.h> +#include <stdint.h> #include <algorithm> +#include <limits> #include <memory> +#include <utility> #include <vector> #include "base/bind.h" @@ -22,6 +25,7 @@ #include "base/rand_util.h" #include "base/sequence_checker.h" #include "base/strings/escape.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h" #include "base/threading/sequenced_task_runner_handle.h" #include "base/time/time.h" @@ -48,6 +52,7 @@ using auction_worklet::mojom::BiddingBrowserSignalsPtr; using auction_worklet::mojom::PreviousWinPtr; +using SellerCapabilitiesType = blink::InterestGroup::SellerCapabilitiesType; const base::FilePath::CharType kDatabasePath[] = FILE_PATH_LITERAL("InterestGroups"); @@ -76,11 +81,12 @@ // Version 9 changes bid_history and join_history to daily counts. // Version 10 changes k-anonymity table so it doesn't split by type. // Version 11 adds priority vector support and time a group was joined. -const int kCurrentVersionNumber = 11; +// Version 12 adds seller capabilities fields. +const int kCurrentVersionNumber = 12; // Earliest version of the code which can use a |kCurrentVersionNumber| // database without failing. -const int kCompatibleVersionNumber = 10; +const int kCompatibleVersionNumber = 12; // Latest version of the database that cannot be upgraded to // |kCurrentVersionNumber| without razing the database. @@ -212,6 +218,49 @@ return result; } +int64_t Serialize(SellerCapabilitiesType capabilities) { + uint64_t result = capabilities.ToEnumBitmask(); + // Supporting 64 or more seller capabilities will require a different + // serialization format. + DCHECK(result <= std::numeric_limits<int64_t>::max()); + return static_cast<int64_t>(result); +} +SellerCapabilitiesType DeserializeSellerCapabilities(int64_t serialized) { + DCHECK(serialized >= 0); + return SellerCapabilitiesType::FromEnumBitmask(serialized); +} + +std::string Serialize( + const absl::optional<base::flat_map<url::Origin, SellerCapabilitiesType>>& + flat_map) { + if (!flat_map) + return std::string(); + base::Value::Dict dict; + for (const auto& key_value_pair : *flat_map) { + dict.Set(Serialize(key_value_pair.first), + base::NumberToString(Serialize(key_value_pair.second))); + } + return Serialize(base::Value(std::move(dict))); +} +absl::optional<base::flat_map<url::Origin, SellerCapabilitiesType>> +DeserializeSellerCapabilitiesMap(const std::string& serialized) { + std::unique_ptr<base::Value> dict = DeserializeValue(serialized); + if (!dict || !dict->is_dict()) + return absl::nullopt; + std::vector<std::pair<url::Origin, SellerCapabilitiesType>> result; + for (std::pair<const std::string&, base::Value&> entry : dict->GetDict()) { + std::string* value_string = entry.second.GetIfString(); + if (!value_string) + return absl::nullopt; + int64_t value_bitmask; + if (!base::StringToInt64(*value_string, &value_bitmask)) + return absl::nullopt; + result.emplace_back(DeserializeOrigin(entry.first), + DeserializeSellerCapabilities(value_bitmask)); + } + return result; +} + StorageInterestGroup::KAnonymityData DefaultKAnonymityData( const std::string& key) { return {key, /*is_k_anonymous=*/false, /*last_updated=*/base::Time::Min()}; @@ -297,7 +346,7 @@ // Initializes the tables, returning true on success. // The tables cannot exist when calling this function. -bool CreateV11Schema(sql::Database& db) { +bool CreateV12Schema(sql::Database& db) { DCHECK(!db.DoesTableExist("interest_groups")); static const char kInterestGroupTableSql[] = // clang-format off @@ -317,6 +366,8 @@ "enable_bidding_signals_prioritization INTEGER NOT NULL," "priority_vector TEXT NOT NULL," "priority_signals_overrides TEXT NOT NULL," + "seller_capabilities TEXT NOT NULL," + "all_sellers_capabilities INTEGER NOT NULL," "execution_mode INTEGER NOT NULL," "joining_url TEXT NOT NULL," "bidding_url TEXT NOT NULL," @@ -414,6 +465,84 @@ return true; } +bool UpgradeV11SchemaToV12(sql::Database& db, sql::MetaTable& meta_table) { + static const char kInterestGroupTableSql[] = + // clang-format off + "CREATE TABLE new_interest_groups(" + "expiration INTEGER NOT NULL," + "last_updated INTEGER NOT NULL," + "next_update_after INTEGER NOT NULL," + "owner TEXT NOT NULL," + "joining_origin TEXT NOT NULL," + "exact_join_time INTEGER NOT NULL," + "name TEXT NOT NULL," + "priority DOUBLE NOT NULL," + "enable_bidding_signals_prioritization INTEGER NOT NULL," + "priority_vector TEXT NOT NULL," + "priority_signals_overrides TEXT NOT NULL," + "seller_capabilities TEXT NOT NULL," + "all_sellers_capabilities INTEGER NOT NULL," + "execution_mode INTEGER NOT NULL," + "joining_url TEXT NOT NULL," + "bidding_url TEXT NOT NULL," + "bidding_wasm_helper_url TEXT NOT NULL," + "update_url TEXT NOT NULL," + "trusted_bidding_signals_url TEXT NOT NULL," + "trusted_bidding_signals_keys TEXT NOT NULL," + "user_bidding_signals TEXT," + "ads TEXT NOT NULL," + "ad_components TEXT NOT NULL," + "PRIMARY KEY(owner,name))"; + // clang-format on + if (!db.Execute(kInterestGroupTableSql)) + return false; + + static const char kCopyInterestGroupTableSql[] = + // clang-format off + "INSERT INTO new_interest_groups " + "SELECT expiration," + "last_updated," + "next_update_after," + "owner," + "joining_origin," + "exact_join_time," + "name," + "priority," + "enable_bidding_signals_prioritization," + "priority_vector," + "priority_signals_overrides," + "''," // seller_capabilities + "0," // all_sellers_capabilities + "execution_mode," + "joining_url," + "bidding_url," + "bidding_wasm_helper_url," + "update_url," + "trusted_bidding_signals_url," + "trusted_bidding_signals_keys," + "user_bidding_signals," + "ads," + "ad_components " + "FROM interest_groups"; + // clang-format on + if (!db.Execute(kCopyInterestGroupTableSql)) + return false; + + static const char kDropInterestGroupTableSql[] = "DROP TABLE interest_groups"; + if (!db.Execute(kDropInterestGroupTableSql)) + return false; + + static const char kRenameInterestGroupTableSql[] = + // clang-format off + "ALTER TABLE new_interest_groups " + "RENAME TO interest_groups"; + // clang-format on + if (!db.Execute(kRenameInterestGroupTableSql)) + return false; + + return CreateInterestGroupIndices(db); +} + bool UpgradeV10SchemaToV11(sql::Database& db, sql::MetaTable& meta_table) { static const char kInterestGroupTableSql[] = // clang-format off @@ -799,6 +928,8 @@ "enable_bidding_signals_prioritization," "priority_vector," "priority_signals_overrides," + "seller_capabilities," + "all_sellers_capabilities," "execution_mode," "bidding_url," "bidding_wasm_helper_url," @@ -836,18 +967,22 @@ group.priority_vector = DeserializeStringDoubleMap(load.ColumnString(6)); group.priority_signals_overrides = DeserializeStringDoubleMap(load.ColumnString(7)); + group.seller_capabilities = + DeserializeSellerCapabilitiesMap(load.ColumnString(8)); + group.all_sellers_capabilities = + DeserializeSellerCapabilities(load.ColumnInt64(9)); group.execution_mode = - static_cast<blink::InterestGroup::ExecutionMode>(load.ColumnInt(8)); - group.bidding_url = DeserializeURL(load.ColumnString(9)); - group.bidding_wasm_helper_url = DeserializeURL(load.ColumnString(10)); - group.daily_update_url = DeserializeURL(load.ColumnString(11)); - group.trusted_bidding_signals_url = DeserializeURL(load.ColumnString(12)); + static_cast<blink::InterestGroup::ExecutionMode>(load.ColumnInt(10)); + group.bidding_url = DeserializeURL(load.ColumnString(11)); + group.bidding_wasm_helper_url = DeserializeURL(load.ColumnString(12)); + group.daily_update_url = DeserializeURL(load.ColumnString(13)); + group.trusted_bidding_signals_url = DeserializeURL(load.ColumnString(14)); group.trusted_bidding_signals_keys = - DeserializeStringVector(load.ColumnString(13)); - if (load.GetColumnType(14) != sql::ColumnType::kNull) - group.user_bidding_signals = load.ColumnString(14); - group.ads = DeserializeInterestGroupAdVector(load.ColumnString(15)); - group.ad_components = DeserializeInterestGroupAdVector(load.ColumnString(16)); + DeserializeStringVector(load.ColumnString(15)); + if (load.GetColumnType(16) != sql::ColumnType::kNull) + group.user_bidding_signals = load.ColumnString(16); + group.ads = DeserializeInterestGroupAdVector(load.ColumnString(17)); + group.ad_components = DeserializeInterestGroupAdVector(load.ColumnString(18)); return true; } @@ -941,6 +1076,8 @@ "enable_bidding_signals_prioritization," "priority_vector," "priority_signals_overrides," + "seller_capabilities," + "all_sellers_capabilities," "execution_mode," "joining_url," "bidding_url," @@ -951,7 +1088,7 @@ "user_bidding_signals," // opaque data "ads," "ad_components) " - "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")); + "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)")); // clang-format on if (!join_group.is_valid()) @@ -969,20 +1106,22 @@ join_group.BindBool(8, data.enable_bidding_signals_prioritization); join_group.BindString(9, Serialize(data.priority_vector)); join_group.BindString(10, Serialize(data.priority_signals_overrides)); - join_group.BindInt(11, static_cast<int>(data.execution_mode)); - join_group.BindString(12, Serialize(joining_url)); - join_group.BindString(13, Serialize(data.bidding_url)); - join_group.BindString(14, Serialize(data.bidding_wasm_helper_url)); - join_group.BindString(15, Serialize(data.daily_update_url)); - join_group.BindString(16, Serialize(data.trusted_bidding_signals_url)); - join_group.BindString(17, Serialize(data.trusted_bidding_signals_keys)); + join_group.BindString(11, Serialize(data.seller_capabilities)); + join_group.BindInt64(12, Serialize(data.all_sellers_capabilities)); + join_group.BindInt(13, static_cast<int>(data.execution_mode)); + join_group.BindString(14, Serialize(joining_url)); + join_group.BindString(15, Serialize(data.bidding_url)); + join_group.BindString(16, Serialize(data.bidding_wasm_helper_url)); + join_group.BindString(17, Serialize(data.daily_update_url)); + join_group.BindString(18, Serialize(data.trusted_bidding_signals_url)); + join_group.BindString(19, Serialize(data.trusted_bidding_signals_keys)); if (data.user_bidding_signals) { - join_group.BindString(18, data.user_bidding_signals.value()); + join_group.BindString(20, data.user_bidding_signals.value()); } else { - join_group.BindNull(18); + join_group.BindNull(20); } - join_group.BindString(19, Serialize(data.ads)); - join_group.BindString(20, Serialize(data.ad_components)); + join_group.BindString(21, Serialize(data.ads)); + join_group.BindString(22, Serialize(data.ad_components)); if (!join_group.Run()) return false; @@ -1006,6 +1145,8 @@ "enable_bidding_signals_prioritization=?," "priority_vector=?," "priority_signals_overrides=?," + "seller_capabilities=?," + "all_sellers_capabilities=?," "execution_mode=?," "bidding_url=?," "bidding_wasm_helper_url=?," @@ -1028,16 +1169,18 @@ store_group.BindBool(3, group.enable_bidding_signals_prioritization); store_group.BindString(4, Serialize(group.priority_vector)); store_group.BindString(5, Serialize(group.priority_signals_overrides)); - store_group.BindInt(6, static_cast<int>(group.execution_mode)); - store_group.BindString(7, Serialize(group.bidding_url)); - store_group.BindString(8, Serialize(group.bidding_wasm_helper_url)); - store_group.BindString(9, Serialize(group.daily_update_url)); - store_group.BindString(10, Serialize(group.trusted_bidding_signals_url)); - store_group.BindString(11, Serialize(group.trusted_bidding_signals_keys)); - store_group.BindString(12, Serialize(group.ads)); - store_group.BindString(13, Serialize(group.ad_components)); - store_group.BindString(14, Serialize(group.owner)); - store_group.BindString(15, group.name); + store_group.BindString(6, Serialize(group.seller_capabilities)); + store_group.BindInt64(7, Serialize(group.all_sellers_capabilities)); + store_group.BindInt(8, static_cast<int>(group.execution_mode)); + store_group.BindString(9, Serialize(group.bidding_url)); + store_group.BindString(10, Serialize(group.bidding_wasm_helper_url)); + store_group.BindString(11, Serialize(group.daily_update_url)); + store_group.BindString(12, Serialize(group.trusted_bidding_signals_url)); + store_group.BindString(13, Serialize(group.trusted_bidding_signals_keys)); + store_group.BindString(14, Serialize(group.ads)); + store_group.BindString(15, Serialize(group.ad_components)); + store_group.BindString(16, Serialize(group.owner)); + store_group.BindString(17, group.name); return store_group.Run(); } @@ -1082,6 +1225,10 @@ MergePrioritySignalsOverrides(*update.priority_signals_overrides, stored_group.priority_signals_overrides); } + if (update.seller_capabilities) + stored_group.seller_capabilities = update.seller_capabilities; + if (update.all_sellers_capabilities) + stored_group.all_sellers_capabilities = *update.all_sellers_capabilities; if (update.execution_mode) stored_group.execution_mode = *update.execution_mode; if (update.bidding_url) @@ -2089,7 +2236,7 @@ return false; if (new_db) - return CreateV11Schema(*db_); + return CreateV12Schema(*db_); const int db_version = meta_table.GetVersionNumber(); @@ -2128,13 +2275,17 @@ case 10: if (!UpgradeV10SchemaToV11(*db_, meta_table)) return false; + ABSL_FALLTHROUGH_INTENDED; + case 11: + if (!UpgradeV11SchemaToV12(*db_, meta_table)) + return false; meta_table.SetVersionNumber(kCurrentVersionNumber); } return transaction.Commit(); } - NOTREACHED(); // Only V6 through V8 should have passed RazeIfIncompatible. + NOTREACHED(); // Only V6 through V12 should have passed RazeIfIncompatible. return false; }
diff --git a/content/browser/interest_group/interest_group_storage_unittest.cc b/content/browser/interest_group/interest_group_storage_unittest.cc index 78e002a..25e432f2 100644 --- a/content/browser/interest_group/interest_group_storage_unittest.cc +++ b/content/browser/interest_group/interest_group_storage_unittest.cc
@@ -38,11 +38,14 @@ #include "url/origin.h" namespace content { +namespace { using blink::InterestGroup; using testing::Field; using testing::UnorderedElementsAre; using testing::UnorderedElementsAreArray; +using SellerCapabilities = blink::InterestGroup::SellerCapabilities; +using SellerCapabilitiesType = blink::InterestGroup::SellerCapabilitiesType; class InterestGroupStorageTest : public testing::Test { public: @@ -81,6 +84,109 @@ return result; } + // This test is in a helper function so that it can also be run after + // UpgradeFromV6. + void StoresAllFieldsTest() { + const url::Origin partial_origin = + url::Origin::Create(GURL("https://partial.example.com")); + InterestGroup partial = NewInterestGroup(partial_origin, "partial"); + const url::Origin full_origin = + url::Origin::Create(GURL("https://full.example.com")); + InterestGroup full( + /*expiry=*/base::Time::Now() + base::Days(30), /*owner=*/full_origin, + /*name=*/"full", /*priority=*/1.0, + /*enable_bidding_signals_prioritization=*/true, + /*priority_vector=*/{{{"a", 2}, {"b", -2.2}}}, + /*priority_signals_overrides=*/{{{"a", -2}, {"c", 10}, {"d", 1.2}}}, + /*seller_capabilities=*/ + {{{full_origin, SellerCapabilities::kInterestGroupCounts}, + {partial_origin, SellerCapabilities::kLatencyStats}}}, + /*all_sellers_capabilities=*/ + {SellerCapabilities::kInterestGroupCounts, + SellerCapabilities::kLatencyStats}, + /*execution_mode=*/InterestGroup::ExecutionMode::kCompatibilityMode, + /*bidding_url=*/GURL("https://full.example.com/bid"), + /*bidding_wasm_helper_url=*/GURL("https://full.example.com/bid_wasm"), + /*daily_update_url=*/GURL("https://full.example.com/update"), + /*trusted_bidding_signals_url=*/ + GURL("https://full.example.com/signals"), + /*trusted_bidding_signals_keys=*/ + std::vector<std::string>{"a", "b", "c", "d"}, + /*user_bidding_signals=*/"foo", + /*ads=*/ + std::vector<InterestGroup::Ad>{ + blink::InterestGroup::Ad(GURL("https://full.example.com/ad1"), + "metadata1"), + blink::InterestGroup::Ad(GURL("https://full.example.com/ad2"), + "metadata2")}, + /*ad_components=*/ + std::vector<InterestGroup::Ad>{ + blink::InterestGroup::Ad( + GURL("https://full.example.com/adcomponent1"), "metadata1c"), + blink::InterestGroup::Ad( + GURL("https://full.example.com/adcomponent2"), "metadata2c")}); + + std::unique_ptr<InterestGroupStorage> storage = CreateStorage(); + + storage->JoinInterestGroup(partial, partial_origin.GetURL()); + storage->JoinInterestGroup(full, full_origin.GetURL()); + + std::vector<StorageInterestGroup> storage_interest_groups = + storage->GetInterestGroupsForOwner(partial_origin); + ASSERT_EQ(1u, storage_interest_groups.size()); + EXPECT_TRUE( + partial.IsEqualForTesting(storage_interest_groups[0].interest_group)); + + storage_interest_groups = storage->GetInterestGroupsForOwner(full_origin); + ASSERT_EQ(1u, storage_interest_groups.size()); + EXPECT_TRUE( + full.IsEqualForTesting(storage_interest_groups[0].interest_group)); + base::Time join_time = base::Time::Now(); + EXPECT_EQ(storage_interest_groups[0].join_time, join_time); + EXPECT_EQ(storage_interest_groups[0].last_updated, join_time); + + // Test update as well. + + // Pass time, so can check if `join_time` or `last_updated` is updated. + task_environment().FastForwardBy(base::Seconds(1234)); + + InterestGroupUpdate update; + update.bidding_url = GURL("https://full.example.com/bid2"); + update.bidding_wasm_helper_url = GURL("https://full.example.com/bid_wasm2"); + update.trusted_bidding_signals_url = + GURL("https://full.example.com/signals2"); + update.trusted_bidding_signals_keys = + std::vector<std::string>{"a", "b2", "c", "d"}; + update.ads = full.ads; + update.ads->emplace_back(blink::InterestGroup::Ad( + GURL("https://full.example.com/ad3"), "metadata3")); + update.ad_components = full.ad_components; + update.ad_components->emplace_back(blink::InterestGroup::Ad( + GURL("https://full.example.com/adcomponent3"), "metadata3c")); + storage->UpdateInterestGroup(blink::InterestGroupKey(full.owner, full.name), + update); + + InterestGroup updated = full; + updated.bidding_url = update.bidding_url; + updated.bidding_wasm_helper_url = update.bidding_wasm_helper_url; + updated.trusted_bidding_signals_url = update.trusted_bidding_signals_url; + updated.trusted_bidding_signals_keys = update.trusted_bidding_signals_keys; + updated.ads = update.ads; + updated.ad_components = update.ad_components; + + storage_interest_groups = storage->GetInterestGroupsForOwner(full_origin); + ASSERT_EQ(1u, storage_interest_groups.size()); + EXPECT_TRUE( + updated.IsEqualForTesting(storage_interest_groups[0].interest_group)); + // `join_time` should not be modified be updates, but `last_updated` should + // be. + EXPECT_EQ(storage_interest_groups[0].join_time, join_time); + EXPECT_EQ(storage_interest_groups[0].last_updated, base::Time::Now()); + // Make sure the clock was advanced. + EXPECT_NE(storage_interest_groups[0].join_time, + storage_interest_groups[0].last_updated); + } + private: base::test::ScopedFeatureList scoped_feature_list_; base::ScopedTempDir temp_directory_; @@ -598,101 +704,7 @@ } TEST_F(InterestGroupStorageTest, StoresAllFields) { - const url::Origin partial_origin = - url::Origin::Create(GURL("https://partial.example.com")); - InterestGroup partial = NewInterestGroup(partial_origin, "partial"); - const url::Origin full_origin = - url::Origin::Create(GURL("https://full.example.com")); - InterestGroup full( - /*expiry=*/base::Time::Now() + base::Days(30), /*owner=*/full_origin, - /*name=*/"full", /*priority=*/1.0, - /*enable_bidding_signals_prioritization=*/true, - /*priority_vector=*/{{{"a", 2}, {"b", -2.2}}}, - /*priority_signals_overrides=*/{{{"a", -2}, {"c", 10}, {"d", 1.2}}}, - // TODO(crbug.com/1385549): Update once storage support added. - /*seller_capabilities=*/absl::nullopt, - /*all_sellers_capabilities=*/ - blink::InterestGroup::SellerCapabilitiesType(), - /*execution_mode=*/InterestGroup::ExecutionMode::kCompatibilityMode, - /*bidding_url=*/GURL("https://full.example.com/bid"), - /*bidding_wasm_helper_url=*/GURL("https://full.example.com/bid_wasm"), - /*daily_update_url=*/GURL("https://full.example.com/update"), - /*trusted_bidding_signals_url=*/GURL("https://full.example.com/signals"), - /*trusted_bidding_signals_keys=*/ - std::vector<std::string>{"a", "b", "c", "d"}, - /*user_bidding_signals=*/"foo", - /*ads=*/ - std::vector<InterestGroup::Ad>{ - blink::InterestGroup::Ad(GURL("https://full.example.com/ad1"), - "metadata1"), - blink::InterestGroup::Ad(GURL("https://full.example.com/ad2"), - "metadata2")}, - /*ad_components=*/ - std::vector<InterestGroup::Ad>{ - blink::InterestGroup::Ad( - GURL("https://full.example.com/adcomponent1"), "metadata1c"), - blink::InterestGroup::Ad( - GURL("https://full.example.com/adcomponent2"), "metadata2c")}); - - std::unique_ptr<InterestGroupStorage> storage = CreateStorage(); - - storage->JoinInterestGroup(partial, partial_origin.GetURL()); - storage->JoinInterestGroup(full, full_origin.GetURL()); - - std::vector<StorageInterestGroup> storage_interest_groups = - storage->GetInterestGroupsForOwner(partial_origin); - ASSERT_EQ(1u, storage_interest_groups.size()); - EXPECT_TRUE( - partial.IsEqualForTesting(storage_interest_groups[0].interest_group)); - - storage_interest_groups = storage->GetInterestGroupsForOwner(full_origin); - ASSERT_EQ(1u, storage_interest_groups.size()); - EXPECT_TRUE( - full.IsEqualForTesting(storage_interest_groups[0].interest_group)); - base::Time join_time = base::Time::Now(); - EXPECT_EQ(storage_interest_groups[0].join_time, join_time); - EXPECT_EQ(storage_interest_groups[0].last_updated, join_time); - - // Test update as well. - - // Pass time, so can check if `join_time` or `last_updated` is updated. - task_environment().FastForwardBy(base::Seconds(1234)); - - InterestGroupUpdate update; - update.bidding_url = GURL("https://full.example.com/bid2"); - update.bidding_wasm_helper_url = GURL("https://full.example.com/bid_wasm2"); - update.trusted_bidding_signals_url = - GURL("https://full.example.com/signals2"); - update.trusted_bidding_signals_keys = - std::vector<std::string>{"a", "b2", "c", "d"}; - update.ads = full.ads; - update.ads->emplace_back(blink::InterestGroup::Ad( - GURL("https://full.example.com/ad3"), "metadata3")); - update.ad_components = full.ad_components; - update.ad_components->emplace_back(blink::InterestGroup::Ad( - GURL("https://full.example.com/adcomponent3"), "metadata3c")); - storage->UpdateInterestGroup(blink::InterestGroupKey(full.owner, full.name), - update); - - InterestGroup updated = full; - updated.bidding_url = update.bidding_url; - updated.bidding_wasm_helper_url = update.bidding_wasm_helper_url; - updated.trusted_bidding_signals_url = update.trusted_bidding_signals_url; - updated.trusted_bidding_signals_keys = update.trusted_bidding_signals_keys; - updated.ads = update.ads; - updated.ad_components = update.ad_components; - - storage_interest_groups = storage->GetInterestGroupsForOwner(full_origin); - ASSERT_EQ(1u, storage_interest_groups.size()); - EXPECT_TRUE( - updated.IsEqualForTesting(storage_interest_groups[0].interest_group)); - // `join_time` should not be modified be updates, but `last_updated` should - // be. - EXPECT_EQ(storage_interest_groups[0].join_time, join_time); - EXPECT_EQ(storage_interest_groups[0].last_updated, base::Time::Now()); - // Make sure the clock was advanced. - EXPECT_NE(storage_interest_groups[0].join_time, - storage_interest_groups[0].last_updated); + StoresAllFieldsTest(); } TEST_F(InterestGroupStorageTest, DeleteOriginDeleteAll) { @@ -1036,7 +1048,7 @@ EXPECT_EQ(0, interest_groups[0].bidding_browser_signals->bid_count); } -// Upgrades a v6 database dump to an expected v9 database. +// Upgrades a v6 database dump to an expected current database. // The v6 database dump was extracted from the InterestGroups database in // a browser profile by using `sqlite3 dump <path-to-database>` and then // cleaning up and formatting the output. @@ -1069,6 +1081,11 @@ Field("priority_signals_overrides", &InterestGroup::priority_signals_overrides, absl::nullopt), + Field("seller_capabilities", + &InterestGroup::seller_capabilities, absl::nullopt), + Field("all_sellers_capabilities", + &InterestGroup::all_sellers_capabilities, + SellerCapabilitiesType()), Field("bidding_url", &InterestGroup::bidding_url, GURL("https://owner.example.com/bidder.js")), Field("bidding_wasm_helper_url", @@ -1152,6 +1169,11 @@ Field("priority_signals_overrides", &InterestGroup::priority_signals_overrides, absl::nullopt), + Field("seller_capabilities", + &InterestGroup::seller_capabilities, absl::nullopt), + Field("all_sellers_capabilities", + &InterestGroup::all_sellers_capabilities, + SellerCapabilitiesType()), Field("bidding_url", &InterestGroup::bidding_url, GURL("https://owner.example.com/bidder.js")), Field("bidding_wasm_helper_url", @@ -1235,6 +1257,11 @@ Field("priority_signals_overrides", &InterestGroup::priority_signals_overrides, absl::nullopt), + Field("seller_capabilities", + &InterestGroup::seller_capabilities, absl::nullopt), + Field("all_sellers_capabilities", + &InterestGroup::all_sellers_capabilities, + SellerCapabilitiesType()), Field("bidding_url", &InterestGroup::bidding_url, GURL("https://owner.example.com/bidder.js")), Field("bidding_wasm_helper_url", @@ -1300,7 +1327,7 @@ base::Time::FromDeltaSinceWindowsEpoch( base::Microseconds(13291340603098283))))); - // Upgrade if necessary and read. + // Upgrade and read. { std::unique_ptr<InterestGroupStorage> storage = CreateStorage(); ASSERT_TRUE(storage); @@ -1321,6 +1348,30 @@ } } +// Upgrades a v6 database dump to an expected current database, then attempts to +// insert new rows into the migrated database. +// +// The v6 database dump was extracted from the InterestGroups database in +// a browser profile by using `sqlite3 dump <path-to-database>` and then +// cleaning up and formatting the output. +TEST_F(InterestGroupStorageTest, UpgradeFromV6ThenAcceptNewData) { + // Create V6 database from dump + base::FilePath file_path; + base::PathService::Get(base::DIR_SOURCE_ROOT, &file_path); + file_path = + file_path.AppendASCII("content/test/data/interest_group/schemaV6.sql"); + ASSERT_TRUE(base::PathExists(file_path)); + ASSERT_TRUE(sql::test::CreateDatabaseFromSQL(db_path(), file_path)); + + // Upgrade. + std::unique_ptr<InterestGroupStorage> storage = CreateStorage(); + ASSERT_TRUE(storage); + + // Make sure the database can accept new data (including new fields) correctly + // after the migration. + StoresAllFieldsTest(); +} + TEST_F(InterestGroupStorageTest, ClusteredGroupsClearedWhenClusterChangesOnJoin) { const url::Origin cluster_origin = @@ -1726,4 +1777,5 @@ storage->GetLastKAnonymityReported(ad2_url.spec())); } +} // namespace } // namespace content
diff --git a/content/browser/interest_group/interest_group_update.h b/content/browser/interest_group/interest_group_update.h index 480efc4..9a9bff65 100644 --- a/content/browser/interest_group/interest_group_update.h +++ b/content/browser/interest_group/interest_group_update.h
@@ -5,6 +5,8 @@ #ifndef CONTENT_BROWSER_INTEREST_GROUP_INTEREST_GROUP_UPDATE_H_ #define CONTENT_BROWSER_INTEREST_GROUP_INTEREST_GROUP_UPDATE_H_ +#include <stdint.h> + #include <string> #include <vector> @@ -13,6 +15,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/interest_group/interest_group.h" #include "url/gurl.h" +#include "url/origin.h" namespace content { @@ -35,6 +38,11 @@ // old overrides around. Keys mapped to nullopt are deleted. absl::optional<base::flat_map<std::string, absl::optional<double>>> priority_signals_overrides; + absl::optional< + base::flat_map<url::Origin, blink::InterestGroup::SellerCapabilitiesType>> + seller_capabilities; + absl::optional<blink::InterestGroup::SellerCapabilitiesType> + all_sellers_capabilities; absl::optional<blink::InterestGroup::ExecutionMode> execution_mode; absl::optional<GURL> bidding_url; absl::optional<GURL> bidding_wasm_helper_url;
diff --git a/content/browser/interest_group/interest_group_update_manager.cc b/content/browser/interest_group/interest_group_update_manager.cc index 1ffbd41..fbb9e30 100644 --- a/content/browser/interest_group/interest_group_update_manager.cc +++ b/content/browser/interest_group/interest_group_update_manager.cc
@@ -5,9 +5,16 @@ #include "content/browser/interest_group/interest_group_update_manager.h" #include <stddef.h> +#include <stdint.h> + +#include <memory> +#include <string> +#include <utility> +#include <vector> #include "base/bind.h" #include "base/callback.h" +#include "base/containers/flat_map.h" #include "base/containers/span.h" #include "base/json/json_string_value_serializer.h" #include "base/memory/scoped_refptr.h" @@ -28,6 +35,7 @@ #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/public/mojom/client_security_state.mojom.h" #include "third_party/blink/public/common/interest_group/interest_group.h" +#include "third_party/blink/public/mojom/interest_group/interest_group_types.mojom.h" #include "url/gurl.h" #include "url/origin.h" @@ -111,7 +119,8 @@ // Extract all key/value pairs to a vector before writing to a flat_map, since // flat_map insertion is O(n). std::vector<std::pair<std::string, double>> pairs; - for (const auto pair : maybe_dict->GetDict()) { + for (const std::pair<const std::string&, const base::Value&> pair : + maybe_dict->GetDict()) { if (pair.second.is_int() || pair.second.is_double()) { pairs.emplace_back(pair.first, pair.second.GetDouble()); continue; @@ -137,7 +146,8 @@ return false; std::vector<std::pair<std::string, absl::optional<double>>> pairs; - for (const auto pair : maybe_dict->GetDict()) { + for (const std::pair<const std::string&, const base::Value&> pair : + maybe_dict->GetDict()) { if (pair.second.is_none()) { pairs.emplace_back(pair.first, absl::nullopt); continue; @@ -153,6 +163,52 @@ return true; } +// Copies the sellerCapabilities JSON field into +// `seller_capabilities` and `all_sellers_capabilities`, returns true if the +// JSON is valid and the copy completed. +[[nodiscard]] bool TryToCopySellerCapabilities( + const base::Value::Dict& dict, + InterestGroupUpdate& interest_group_update) { + const base::Value* maybe_dict = dict.Find("sellerCapabilities"); + if (!maybe_dict) + return true; + if (!maybe_dict->is_dict()) + return false; + + std::vector< + std::pair<url::Origin, blink::InterestGroup::SellerCapabilitiesType>> + seller_capabilities_vec; + for (const std::pair<const std::string&, const base::Value&> pair : + maybe_dict->GetDict()) { + if (!pair.second.is_list()) + return false; + blink::InterestGroup::SellerCapabilitiesType capabilities; + for (const base::Value& maybe_capability : pair.second.GetList()) { + if (!maybe_capability.is_string()) + return false; + const std::string& capability = maybe_capability.GetString(); + if (capability == "interestGroupCounts") { + capabilities.Put( + blink::InterestGroup::SellerCapabilities::kInterestGroupCounts); + } else if (capability == "latencyStats") { + capabilities.Put( + blink::InterestGroup::SellerCapabilities::kLatencyStats); + } else { + return false; + } + } + if (pair.first == "*") { + interest_group_update.all_sellers_capabilities = capabilities; + } else { + seller_capabilities_vec.emplace_back( + url::Origin::Create(GURL(pair.first)), capabilities); + } + } + if (!seller_capabilities_vec.empty()) + interest_group_update.seller_capabilities.emplace(seller_capabilities_vec); + return true; +} + // Copies the executionMode JSON field into `interest_group_update`, returns // true iff the JSON is valid and the copy completed. [[nodiscard]] bool TryToCopyExecutionMode( @@ -293,6 +349,9 @@ !TryToCopyExecutionMode(*dict, interest_group_update)) { return absl::nullopt; } + if (!TryToCopySellerCapabilities(*dict, interest_group_update)) { + return absl::nullopt; + } const std::string* maybe_bidding_url = dict->FindString("biddingLogicUrl"); if (maybe_bidding_url) interest_group_update.bidding_url = GURL(*maybe_bidding_url);
diff --git a/content/browser/preloading/prerender/prerender_browsertest.cc b/content/browser/preloading/prerender/prerender_browsertest.cc index 14a09855..7129819 100644 --- a/content/browser/preloading/prerender/prerender_browsertest.cc +++ b/content/browser/preloading/prerender/prerender_browsertest.cc
@@ -9440,4 +9440,68 @@ EXPECT_FALSE(delegate.is_updated_target_url()); } +// Tests that an unused RenderWidgetHost (that is owned by a RenderViewHostImpl) +// created by a prerendering FrameTree points to the primary frame tree after +// activation. Regression test for crbug.com/1324149. +IN_PROC_BROWSER_TEST_F( + PrerenderBrowserTest, + UnusedRenderWidgetHostFrameTreePointerUpdatedOnActivation) { + IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess()); + + // Navigate to an initial page. + const GURL kInitialUrl = GetUrl("/title1.html"); + ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl)); + EXPECT_TRUE(AddTestUtilJS(current_frame_host())); + + // Start a prerender. + const GURL kPrerenderingUrl = GetUrl("/title2.html"); + int host_id = AddPrerender(kPrerenderingUrl); + + // Add a cross-origin iframe to the prerendering page. + const GURL kCrossOriginSubframeUrl = GetCrossSiteUrl("/title2.html"); + RenderFrameHostImpl* prerender_rfh = GetPrerenderedMainFrameHost(host_id); + EXPECT_TRUE(AddTestUtilJS(prerender_rfh)); + EXPECT_TRUE(ExecJs(prerender_rfh, JsReplace("add_iframe_async($1)", + kCrossOriginSubframeUrl))); + base::RunLoop().RunUntilIdle(); + + ASSERT_EQ(prerender_rfh->child_count(), 1u); + FrameTreeNode* iframe = prerender_rfh->child_at(0); + // The cross-origin navigation in the iframe will be throttled, but not before + // creating a out-of-process speculative RFH (which would also result in an + // RVH created for the subframe speculatively). + ASSERT_TRUE(iframe->render_manager()->speculative_frame_host()); + RenderViewHostImpl* render_view_host = + iframe->render_manager()->speculative_frame_host()->render_view_host(); + + // Activate. + NavigatePrimaryPage(kPrerenderingUrl); + ASSERT_EQ(web_contents()->GetLastCommittedURL(), kPrerenderingUrl); + // Wait for iframe to finish navigating. + ASSERT_EQ("LOADED", + EvalJs(prerender_rfh, JsReplace("wait_iframe_async($1)", + kCrossOriginSubframeUrl))); + // This asserts that the current RenderViewHost was created before activation + // (to make sure we're testing the right thing). + EXPECT_EQ(render_view_host, iframe->current_frame_host()->render_view_host()); + + // The unused RenderWidgetHost should point to the primary FrameTree now. + RenderWidgetHostImpl* render_widget_host = render_view_host->GetWidget(); + EXPECT_NE(render_widget_host, + iframe->current_frame_host()->GetRenderWidgetHost()); + EXPECT_EQ(render_widget_host->frame_tree(), + current_frame_host()->frame_tree()); + + // Navigate the primary main frame to the same origin as |iframe|; this + // should reuse |render_view_host|, and as a result |render_widget_host| will + // be used. If the |render_widget_host| points to the wrong frame_tree, this + // will result in a segfault (reproducing crbug.com/1324149) when we try to + // focus the new page's view. + const GURL kCrossOriginUrl = GetCrossSiteUrl("/title1.html"); + DisableProactiveBrowsingInstanceSwapFor(current_frame_host()); + NavigatePrimaryPage(kCrossOriginUrl); + ASSERT_EQ(current_frame_host()->render_view_host(), render_view_host); + ASSERT_EQ(current_frame_host()->GetRenderWidgetHost(), render_widget_host); +} + } // namespace content
diff --git a/content/browser/renderer_host/frame_tree.cc b/content/browser/renderer_host/frame_tree.cc index 8863c7f6..4a25200 100644 --- a/content/browser/renderer_host/frame_tree.cc +++ b/content/browser/renderer_host/frame_tree.cc
@@ -51,12 +51,8 @@ // proxy_hosts_ because of openers). std::set<SiteInstanceGroup*> CollectSiteInstanceGroups(FrameTree* tree) { std::set<SiteInstanceGroup*> groups; - for (FrameTreeNode* node : tree->Nodes()) { - // TODO(crbug.com/1324149): Remove diagnostic asserts below. - CHECK(node->current_frame_host()); - CHECK(node->current_frame_host()->GetSiteInstance()); + for (FrameTreeNode* node : tree->Nodes()) groups.insert(node->current_frame_host()->GetSiteInstance()->group()); - } return groups; }
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc index 7afa280..f644df8 100644 --- a/content/browser/renderer_host/media/media_stream_manager.cc +++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -95,6 +95,10 @@ #include "media/capture/video/chromeos/video_capture_device_factory_chromeos.h" #endif +#if BUILDFLAG(IS_CHROMEOS_LACROS) +#include "chromeos/lacros/lacros_service.h" +#endif + using blink::mojom::MediaDeviceType; namespace content { @@ -777,20 +781,7 @@ RequestTypeToString(request_type))); } - virtual ~DeviceRequest() { - if (generate_streams_cb_) { - std::move(generate_streams_cb_) - .Run(MediaStreamRequestResult::FAILED_DUE_TO_SHUTDOWN, - /*label=*/std::string(), - /*stream_devices_set=*/nullptr, - /*pan_tilt_zoom_allowed=*/false); - } - - if (open_device_cb) { - std::move(open_device_cb) - .Run(false /* success */, std::string(), MediaStreamDevice()); - } - } + virtual ~DeviceRequest() = default; void set_request_type(MediaStreamRequestType type) { request_type_ = type; } MediaStreamRequestType request_type() const { return request_type_; } @@ -879,9 +870,9 @@ state_[static_cast<int>(stream_type)] = new_state; } -#if BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS) NotifyMultiCaptureStateChanged(new_state); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) +#endif // BUILDFLAG(IS_CHROMEOS) MediaObserver* media_observer = GetContentClient()->browser()->GetMediaObserver(); @@ -985,18 +976,21 @@ stream_controls_.exclude_system_audio = false; } - void SetGenerateStreamsCallback(GenerateStreamsCallback callback) { - generate_streams_cb_ = std::move(callback); + // TODO(crbug.com/1386165): Remove this method from DeviceRequest when + // GenerateStreamRequest::FinalizeRequest and + // GetOpenDeviceRequest::FinalizeRequest have been implemented (this should be + // an internal callback in those subclasses). + virtual void PanTiltZoomPermissionChecked(const std::string& label, + bool pan_tilt_zoom_allowed) { + NOTREACHED(); } - GenerateStreamsCallback&& MoveGenerateStreamsCallback() { - return std::move(generate_streams_cb_); - } + // TODO(crbug.com/1386165): Make pure virtual when there is a subclass for all + // MediaStreamRequestTypes + virtual void FinalizeRequest(const std::string& label) { NOTREACHED(); } - bool HasGenerateStreamsCallback() const { - return !generate_streams_cb_.is_null(); - } - + // TODO(crbug.com/1386165): Make pure virtual when there is a subclass for all + // MediaStreamRequestTypes virtual void FinalizeRequestFailed(MediaStreamRequestResult result) { NOTREACHED(); } @@ -1039,11 +1033,6 @@ // Currently it is only used by |DEVICE_ACCESS| type. MediaAccessRequestCallback media_access_request_cb; - // This callback is only used by pepper and tries to open the device - // identified by device_id. If it is opened successfully, it returns this - // device. Otherwise, returns an empty device. - OpenDeviceCallback open_device_cb; - DeviceStoppedCallback device_stopped_cb; DeviceChangedCallback device_changed_cb; @@ -1061,31 +1050,53 @@ PermissionController::SubscriptionId video_subscription_id; private: -#if BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS) + static void NotifyMultiCaptureStarted(const std::string& label, + const url::Origin& origin) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + auto* const service = chromeos::LacrosService::Get(); + if (!service->IsRegistered<crosapi::mojom::MultiCaptureService>() || + !service->IsAvailable<crosapi::mojom::MultiCaptureService>()) { + LOG(ERROR) << "chrome.MultiCaptureService is not available in Lacros."; + return; + } + crosapi::mojom::MultiCaptureService* const multi_capture_service = + service->GetRemote<crosapi::mojom::MultiCaptureService>().get(); + multi_capture_service->MultiCaptureStarted(label, origin.host()); +#elif BUILDFLAG(IS_CHROMEOS_ASH) + content::GetMultiCaptureService().NotifyMultiCaptureStarted(label, origin); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + } + + static void NotifyMultiCaptureStopped(const std::string& label) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + auto* const service = chromeos::LacrosService::Get(); + if (!service->IsRegistered<crosapi::mojom::MultiCaptureService>() || + !service->IsAvailable<crosapi::mojom::MultiCaptureService>()) { + LOG(ERROR) << "chrome.MultiCaptureService is not available in Lacros."; + return; + } + crosapi::mojom::MultiCaptureService* const multi_capture_service = + service->GetRemote<crosapi::mojom::MultiCaptureService>().get(); + multi_capture_service->MultiCaptureStopped(label); +#elif BUILDFLAG(IS_CHROMEOS_ASH) + content::GetMultiCaptureService().NotifyMultiCaptureStopped(label); +#endif + } + void NotifyMultiCaptureStateChanged(MediaRequestState new_state) { if (!IsGetDisplayMediaSet()) return; switch (new_state) { case MediaRequestState::MEDIA_REQUEST_STATE_OPENING: GetUIThreadTaskRunner({})->PostTask( - FROM_HERE, - base::BindOnce( - [](const std::string& label, const url::Origin& origin) { - content::GetMultiCaptureService().NotifyMultiCaptureStarted( - label, origin); - }, - label_, salt_and_origin.origin)); + FROM_HERE, base::BindOnce(NotifyMultiCaptureStarted, label_, + salt_and_origin.origin)); break; case MediaRequestState::MEDIA_REQUEST_STATE_CLOSING: case MediaRequestState::MEDIA_REQUEST_STATE_ERROR: GetUIThreadTaskRunner({})->PostTask( - FROM_HERE, - base::BindOnce( - [](const std::string& label) { - content::GetMultiCaptureService().NotifyMultiCaptureStopped( - label); - }, - label_)); + FROM_HERE, base::BindOnce(NotifyMultiCaptureStopped, label_)); break; case MediaRequestState::MEDIA_REQUEST_STATE_NOT_REQUESTED: case MediaRequestState::MEDIA_REQUEST_STATE_REQUESTED: @@ -1096,7 +1107,8 @@ break; } } -#endif // BUILDFLAG(IS_CHROMEOS_ASH) + +#endif // BUILDFLAG(IS_CHROMEOS) // Mark true if the MediaStreamDevice of |MediaStreamType| type should be // stopped but can't at the moment because of ongoing transfers. @@ -1116,6 +1128,70 @@ int target_process_id_; int target_frame_id_; std::string label_; +}; + +class MediaStreamManager::GenerateStreamsRequest + : public MediaStreamManager::DeviceRequest { + public: + GenerateStreamsRequest( + int requesting_process_id, + int requesting_frame_id, + int requester_id, + int page_request_id, + bool user_gesture, + StreamSelectionInfoPtr audio_stream_selection_info_ptr, + const StreamControls& controls, + MediaDeviceSaltAndOrigin salt_and_origin, + DeviceStoppedCallback device_stopped_cb, + DeviceChangedCallback device_changed_cb, + DeviceRequestStateChangeCallback device_request_state_change_cb, + DeviceCaptureHandleChangeCallback device_capture_handle_change_cb, + GenerateStreamsCallback generate_streams_cb) + : DeviceRequest(requesting_process_id, + requesting_frame_id, + requester_id, + page_request_id, + user_gesture, + std::move(audio_stream_selection_info_ptr), + blink::MEDIA_GENERATE_STREAM, + controls, + std::move(salt_and_origin), + std::move(device_stopped_cb), + std::move(device_changed_cb), + std::move(device_request_state_change_cb), + std::move(device_capture_handle_change_cb)), + generate_streams_cb_(std::move(generate_streams_cb)) { + DCHECK(generate_streams_cb_); + } + + ~GenerateStreamsRequest() override { + if (generate_streams_cb_) { + std::move(generate_streams_cb_) + .Run(MediaStreamRequestResult::FAILED_DUE_TO_SHUTDOWN, + /*label=*/std::string(), + /*stream_devices_set=*/nullptr, + /*pan_tilt_zoom_allowed=*/false); + } + } + + void PanTiltZoomPermissionChecked(const std::string& label, + bool pan_tilt_zoom_allowed) override { + DCHECK(generate_streams_cb_); + std::move(generate_streams_cb_) + .Run(MediaStreamRequestResult::OK, label, stream_devices_set.Clone(), + pan_tilt_zoom_allowed); + } + + void FinalizeRequestFailed(MediaStreamRequestResult result) override { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK(generate_streams_cb_); + std::move(generate_streams_cb_) + .Run(result, /*label=*/std::string(), + /*stream_devices_set=*/nullptr, + /*pan_tilt_zoom_allowed=*/false); + } + + private: GenerateStreamsCallback generate_streams_cb_; }; @@ -1157,8 +1233,24 @@ } } - GetOpenDeviceCallback&& MoveGetOpenDeviceCallback() { - return std::move(get_open_device_cb_); + void PanTiltZoomPermissionChecked(const std::string& label, + bool pan_tilt_zoom_allowed) override { + DCHECK(get_open_device_cb_); + // GetOpenDevice is only available with exactly one stream. + DCHECK_EQ(stream_devices_set.stream_devices.size(), 1u); + const blink::mojom::StreamDevices& stream_devices = + *stream_devices_set.stream_devices[0]; + // GetOpenDevice should return exactly one device, which can be of either + // audio or video type. + DCHECK_NE(stream_devices.audio_device.has_value(), + stream_devices.video_device.has_value()); + MediaStreamDevice device = blink::IsVideoInputMediaType(video_type()) + ? stream_devices.video_device.value() + : stream_devices.audio_device.value(); + + std::move(get_open_device_cb_) + .Run(MediaStreamRequestResult::OK, + GetOpenDeviceResponse::New(label, device, pan_tilt_zoom_allowed)); } void FinalizeRequestFailed(MediaStreamRequestResult result) override { @@ -1177,6 +1269,65 @@ GetOpenDeviceCallback get_open_device_cb_; }; +class MediaStreamManager::OpenDeviceRequest + : public MediaStreamManager::DeviceRequest { + public: + OpenDeviceRequest(int requesting_process_id, + int requesting_frame_id, + int requester_id, + int page_request_id, + StreamSelectionInfoPtr audio_stream_selection_info_ptr, + const StreamControls& controls, + MediaDeviceSaltAndOrigin salt_and_origin, + DeviceStoppedCallback device_stopped_cb, + OpenDeviceCallback open_device_cb) + : DeviceRequest(requesting_process_id, + requesting_frame_id, + requester_id, + page_request_id, + /*user gesture=*/false, + std::move(audio_stream_selection_info_ptr), + blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY, + controls, + std::move(salt_and_origin), + std::move(device_stopped_cb)), + open_device_cb_(std::move(open_device_cb)) { + DCHECK(open_device_cb_); + } + + ~OpenDeviceRequest() override { + if (open_device_cb_) { + std::move(open_device_cb_) + .Run(/*success=*/false, std::string(), MediaStreamDevice()); + } + } + + void FinalizeRequest(const std::string& label) override { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK(open_device_cb_); + SendLogMessage(base::StringPrintf( + "FinalizeOpenDevice({label=%s}, {requester_id=" + "%d}, {request_type=%s})", + label.c_str(), requester_id, RequestTypeToString(request_type()))); + std::move(open_device_cb_) + .Run(/*success=*/true, label, + blink::ToMediaStreamDevicesList(stream_devices_set).front()); + } + + void FinalizeRequestFailed(MediaStreamRequestResult result) override { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK(open_device_cb_); + std::move(open_device_cb_) + .Run(/*success=*/false, /*label=*/std::string(), MediaStreamDevice()); + } + + private: + // This callback is only used by pepper and tries to open the device + // identified by device_id. If it is opened successfully, it returns this + // device. Otherwise, returns an empty device. + OpenDeviceCallback open_device_cb_; +}; + // static void MediaStreamManager::SendMessageToNativeLog(const std::string& message) { if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { @@ -1381,14 +1532,15 @@ DCHECK_CURRENTLY_ON(BrowserThread::IO); SendLogMessage(GetGenerateStreamsLogString(render_process_id, render_frame_id, requester_id, page_request_id)); - std::unique_ptr<DeviceRequest> request = std::make_unique<DeviceRequest>( - render_process_id, render_frame_id, requester_id, page_request_id, - user_gesture, std::move(audio_stream_selection_info_ptr), - blink::MEDIA_GENERATE_STREAM, controls, std::move(salt_and_origin), - std::move(device_stopped_cb), std::move(device_changed_cb), - std::move(device_request_state_change_cb), - std::move(device_capture_handle_change_cb)); - request->SetGenerateStreamsCallback(std::move(generate_streams_cb)); + std::unique_ptr<DeviceRequest> request = + std::make_unique<GenerateStreamsRequest>( + render_process_id, render_frame_id, requester_id, page_request_id, + user_gesture, std::move(audio_stream_selection_info_ptr), controls, + std::move(salt_and_origin), std::move(device_stopped_cb), + std::move(device_changed_cb), + std::move(device_request_state_change_cb), + std::move(device_capture_handle_change_cb), + std::move(generate_streams_cb)); DeviceRequest* const request_ptr = request.get(); const std::string label = AddRequest(std::move(request)); @@ -1788,13 +1940,11 @@ StreamSelectionInfo::New( blink::mojom::StreamSelectionStrategy::SEARCH_BY_DEVICE_ID, absl::nullopt); - auto request = std::make_unique<DeviceRequest>( + auto request = std::make_unique<OpenDeviceRequest>( render_process_id, render_frame_id, requester_id, page_request_id, - false /* user gesture */, std::move(audio_stream_selection_info_ptr), - blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY, controls, - std::move(salt_and_origin), std::move(device_stopped_cb)); - - request->open_device_cb = std::move(open_device_cb); + std::move(audio_stream_selection_info_ptr), controls, + std::move(salt_and_origin), std::move(device_stopped_cb), + std::move(open_device_cb)); const std::string label = AddRequest(std::move(request)); // Post a task and handle the request asynchronously. The reason is that the @@ -2525,7 +2675,7 @@ DeviceRequest* request) { DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK(request); - DCHECK(request->HasGenerateStreamsCallback()); + DCHECK_EQ(request->request_type(), blink::MEDIA_GENERATE_STREAM); SendLogMessage( base::StringPrintf("FinalizeGenerateStreams({label=%s}, {requester_id=" "%d}, {request_type=%s})", @@ -2540,12 +2690,8 @@ request->stream_devices_set.Clone(); if (request->IsGetDisplayMediaSet()) { - PanTiltZoomPermissionChecked( - label, MediaStreamDevice(), - base::BindOnce(request->MoveGenerateStreamsCallback(), - MediaStreamRequestResult::OK, label, - std::move(stream_devices_set)), - /*pan_tilt_zoom_allowed=*/false); + PanTiltZoomPermissionChecked(label, MediaStreamDevice(), + /*pan_tilt_zoom_allowed=*/false); return; } @@ -2565,25 +2711,14 @@ base::BindOnce( &MediaStreamManager::PanTiltZoomPermissionChecked, base::Unretained(this), label, - request->stream_devices_set.stream_devices[0]->video_device, - base::BindOnce(request->MoveGenerateStreamsCallback(), - MediaStreamRequestResult::OK, label, - std::move(stream_devices_set)))); + request->stream_devices_set.stream_devices[0]->video_device)); } void MediaStreamManager::FinalizeGetOpenDevice(const std::string& label, DeviceRequest* request) { DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK(request); - DCHECK(request->request_type() == blink::MEDIA_GET_OPEN_DEVICE); - // GetOpenDevice is only available with exactly one stream. - DCHECK_EQ(request->stream_devices_set.stream_devices.size(), 1u); - const blink::mojom::StreamDevices& stream_devices = - *request->stream_devices_set.stream_devices[0]; - // GetOpenDevice should return exactly one device, which can be of either - // audio or video type. - DCHECK_NE(stream_devices.audio_device.has_value(), - stream_devices.video_device.has_value()); + DCHECK_EQ(request->request_type(), blink::MEDIA_GET_OPEN_DEVICE); SendLogMessage( base::StringPrintf("FinalizeGetOpenDevice({label=%s}, {requester_id=" "%d}, {request_type=%s})", @@ -2594,22 +2729,6 @@ // user denies mic/camera. SubscribeToPermissionController(label, request); - // TODO(crbug.com/1386165): Call the response-callback (get_open_device_cb_ in - // this case) using a virtual method in PanTiltZoomPermissionChecked when a - // subclass has been added also for GenerateStream requests. - base::OnceCallback<void(bool)> ptz_callback = base::BindOnce( - [](const std::string& label, GetOpenDeviceCallback callback, - MediaStreamDevice device, bool pan_tilt_zoom_allowed) { - std::move(callback).Run( - MediaStreamRequestResult::OK, - GetOpenDeviceResponse::New(label, device, pan_tilt_zoom_allowed)); - }, - label, - static_cast<GetOpenDeviceRequest*>(request)->MoveGetOpenDeviceCallback(), - blink::IsVideoInputMediaType(request->video_type()) - ? stream_devices.video_device.value() - : stream_devices.audio_device.value()); - // It is safe to bind base::Unretained(this) because MediaStreamManager is // owned by BrowserMainLoop and so outlives the IO thread. // TODO(crbug.com/1314743): Avoid this check once you have this permission @@ -2623,8 +2742,7 @@ base::BindOnce( &MediaStreamManager::PanTiltZoomPermissionChecked, base::Unretained(this), label, - request->stream_devices_set.stream_devices[0]->video_device, - std::move(ptz_callback))); + request->stream_devices_set.stream_devices[0]->video_device)); } // TODO(https://crbug.com/1288839): Ensure CaptureHandle works for transferred @@ -2634,7 +2752,6 @@ void MediaStreamManager::PanTiltZoomPermissionChecked( const std::string& label, const absl::optional<MediaStreamDevice>& video_device, - base::OnceCallback<void(bool)> callback, bool pan_tilt_zoom_allowed) { DCHECK_CURRENTLY_ON(BrowserThread::IO); DeviceRequest* request = FindRequest(label); @@ -2647,7 +2764,7 @@ label.c_str(), request->requester_id, RequestTypeToString(request->request_type()), pan_tilt_zoom_allowed)); - std::move(callback).Run(pan_tilt_zoom_allowed); + request->PanTiltZoomPermissionChecked(label, pan_tilt_zoom_allowed); if (request->IsGetDisplayMediaSet()) return; @@ -2694,24 +2811,10 @@ label.c_str(), request->requester_id, RequestResultToString(result))); switch (request->request_type()) { - case blink::MEDIA_GENERATE_STREAM: { - DCHECK(request->HasGenerateStreamsCallback()); - request->MoveGenerateStreamsCallback().Run( - result, /*label=*/std::string(), - /*stream_devices_set=*/nullptr, - /*pan_tilt_zoom_allowed=*/false); - break; - } - case blink::MEDIA_GET_OPEN_DEVICE: { - request->FinalizeRequestFailed(result); - break; - } + case blink::MEDIA_GENERATE_STREAM: + case blink::MEDIA_GET_OPEN_DEVICE: case blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY: { - if (request->open_device_cb) { - std::move(request->open_device_cb) - .Run(/*success=*/false, /*label=*/std::string(), - MediaStreamDevice()); - } + request->FinalizeRequestFailed(result); break; } case blink::MEDIA_DEVICE_ACCESS: { @@ -2752,22 +2855,6 @@ DeleteRequest(label); } -void MediaStreamManager::FinalizeOpenDevice(const std::string& label, - DeviceRequest* request) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - SendLogMessage( - base::StringPrintf("FinalizeOpenDevice({label=%s}, {requester_id=" - "%d}, {request_type=%s})", - label.c_str(), request->requester_id, - RequestTypeToString(request->request_type()))); - if (request->open_device_cb) { - std::move(request->open_device_cb) - .Run(true /* success */, label, - blink::ToMediaStreamDevicesList(request->stream_devices_set) - .front()); - } -} - void MediaStreamManager::FinalizeChangeDevice(const std::string& label, DeviceRequest* request) { DCHECK_CURRENTLY_ON(BrowserThread::IO); @@ -2986,7 +3073,7 @@ switch (request->request_type()) { case blink::MEDIA_OPEN_DEVICE_PEPPER_ONLY: - FinalizeOpenDevice(label, request); + request->FinalizeRequest(label); OnStreamStarted(label); break; case blink::MEDIA_GENERATE_STREAM: {
diff --git a/content/browser/renderer_host/media/media_stream_manager.h b/content/browser/renderer_host/media/media_stream_manager.h index 2f84a843a..2794f1e 100644 --- a/content/browser/renderer_host/media/media_stream_manager.h +++ b/content/browser/renderer_host/media/media_stream_manager.h
@@ -456,8 +456,12 @@ // Contains common data needed to keep track of requests. class DeviceRequest; + // Contains data specific for GenerateStreams requests + class GenerateStreamsRequest; // Contains data specific for GetOpenDevice requests class GetOpenDeviceRequest; + // Contains data specific for OpenDevice requests + class OpenDeviceRequest; // |DeviceRequests| is a list to ensure requests are processed in the order // they arrive. The first member of the pair is the label of the @@ -584,12 +588,10 @@ void PanTiltZoomPermissionChecked( const std::string& label, const absl::optional<blink::MediaStreamDevice>& video_device, - base::OnceCallback<void(bool)> callback, bool pan_tilt_zoom_allowed); void FinalizeRequestFailed(const std::string& label, DeviceRequest* request, blink::mojom::MediaStreamRequestResult result); - void FinalizeOpenDevice(const std::string& label, DeviceRequest* request); void FinalizeChangeDevice(const std::string& label, DeviceRequest* request); void FinalizeMediaAccessRequest( const std::string& label,
diff --git a/content/browser/renderer_host/media/media_stream_manager_unittest.cc b/content/browser/renderer_host/media/media_stream_manager_unittest.cc index c5b02c8..5f14d2d 100644 --- a/content/browser/renderer_host/media/media_stream_manager_unittest.cc +++ b/content/browser/renderer_host/media/media_stream_manager_unittest.cc
@@ -48,6 +48,10 @@ #include "url/gurl.h" #include "url/origin.h" +#if BUILDFLAG(IS_CHROMEOS_LACROS) +#include "chromeos/lacros/lacros_test_helper.h" +#endif + #if defined(USE_ALSA) #include "media/audio/alsa/audio_manager_alsa.h" #elif BUILDFLAG(IS_ANDROID) @@ -259,10 +263,20 @@ } // namespace -class MediaStreamManagerTest : public ::testing::Test { +class MediaStreamManagerTest : public ::testing::Test +#if BUILDFLAG(IS_CHROMEOS_LACROS) + , + public crosapi::mojom::MultiCaptureService +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) +{ public: MediaStreamManagerTest() - : task_environment_(content::BrowserTaskEnvironment::IO_MAINLOOP) { + : task_environment_(content::BrowserTaskEnvironment::IO_MAINLOOP) +#if BUILDFLAG(IS_CHROMEOS_LACROS) + , + receiver_(this) +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) + { audio_manager_ = std::make_unique<MockAudioManager>(); audio_system_ = std::make_unique<media::AudioSystemImpl>(audio_manager_.get()); @@ -286,6 +300,24 @@ })); } +#if BUILDFLAG(IS_CHROMEOS_LACROS) + void SetUp() override { + chromeos::LacrosService::Get()->InjectRemoteForTesting( + receiver_.BindNewPipeAndPassRemote()); + } + + // crosapi::mojom::MultiCaptureService: + MOCK_METHOD(void, + MultiCaptureStarted, + (const std::string& label, const std::string& host), + (override)); + MOCK_METHOD(void, + MultiCaptureStopped, + (const std::string& label), + (override)); + +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) + MediaStreamManagerTest(const MediaStreamManagerTest&) = delete; MediaStreamManagerTest& operator=(const MediaStreamManagerTest&) = delete; @@ -334,6 +366,9 @@ _, _, _, _, blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_SET, MEDIA_REQUEST_STATE_OPENING)); +#if BUILDFLAG(IS_CHROMEOS_LACROS) + EXPECT_CALL(*this, MultiCaptureStarted(_, _)); +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) stream_provider_listener_ = std::make_unique<MediaStreamProviderListenerMock>(); media_stream_manager_->video_capture_manager_->RegisterListener( @@ -553,6 +588,10 @@ std::unique_ptr<MockMediaObserver> media_observer_; std::unique_ptr<ContentBrowserClient> browser_content_client_; content::BrowserTaskEnvironment task_environment_; +#if BUILDFLAG(IS_CHROMEOS_LACROS) + chromeos::ScopedLacrosServiceTestHelper lacros_service_test_helper_; + mojo::Receiver<crosapi::mojom::MultiCaptureService> receiver_; +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) std::unique_ptr<MockAudioManager> audio_manager_; std::unique_ptr<media::AudioSystem> audio_system_; raw_ptr<MockVideoCaptureProvider> video_capture_provider_; @@ -1128,7 +1167,6 @@ TEST_F(MediaStreamManagerTest, MultiCaptureAllDevicesOpened) { base::UnguessableToken session = base::UnguessableToken::Create(); RequestMultiScreenCapture(/*screen_count=*/3u, session); - const std::vector<base::UnguessableToken>& session_ids = stream_provider_listener_->capture_session_ids(); EXPECT_EQ(3u, session_ids.size()); @@ -1199,6 +1237,9 @@ _, _, _, _, blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_SET, MEDIA_REQUEST_STATE_DONE)) .Times(0); +#if BUILDFLAG(IS_CHROMEOS_LACROS) + EXPECT_CALL(*this, MultiCaptureStopped(_)); +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) } class MediaStreamManagerTestForTransfers : public MediaStreamManagerTest {
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index daae954e1..6453489 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -13989,8 +13989,8 @@ DCHECK_EQ(&frame_tree_node_->frame_tree(), &frame_tree); frame_tree_ = &frame_tree; render_view_host()->SetFrameTree(frame_tree); - if (GetRenderWidgetHost()) { - GetRenderWidgetHost()->SetFrameTree(frame_tree); + if (owned_render_widget_host_) { + owned_render_widget_host_->SetFrameTree(frame_tree); } }
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc index ae3a092..8111274 100644 --- a/content/browser/renderer_host/render_frame_host_manager.cc +++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -3765,15 +3765,6 @@ RenderViewHostImpl* old_rvh = old_render_frame_host->render_view_host(); RenderViewHostImpl* new_rvh = render_frame_host_->render_view_host(); - // TODO(crbug.com/1324149): Remove diagnostic asserts below. - if (is_main_frame && old_view) { - RenderWidgetHostViewBase* old_rwhvb = - static_cast<RenderWidgetHostViewBase*>(old_view); - CHECK(old_rwhvb->host()); - CHECK_EQ(old_rwhvb->host(), old_rvh->GetWidget()); - CHECK_EQ(old_rwhvb->host()->frame_tree(), &frame_tree_node_->frame_tree()); - } - if (is_main_frame && old_view && old_rvh != new_rvh) { // Note that this hides the RenderWidget but does not hide the Page. If it // did hide the Page then making a new RenderFrameHost on another call to @@ -3789,15 +3780,6 @@ // this renderer frame is live its ancestors must be as well. DCHECK(new_view); - // TODO(crbug.com/1324149): Remove diagnostic asserts below. - if (is_main_frame) { - RenderWidgetHostViewBase* new_rwhvb = - static_cast<RenderWidgetHostViewBase*>(new_view); - CHECK(new_rwhvb->host()); - CHECK_EQ(new_rwhvb->host(), new_rvh->GetWidget()); - CHECK_EQ(new_rwhvb->host()->frame_tree(), &frame_tree_node_->frame_tree()); - } - if (focus_render_view) { if (is_main_frame) { // If the old page was focused, ensure the new one preserves
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index b8d00c7df..962c03c 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -4936,7 +4936,7 @@ has_recorded_media_stream_frame_depth_metric_ = true; } - ChildProcessLauncherPriority priority( + RenderProcessPriority priority( visible_clients_ > 0 || base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kDisableRendererBackgrounding), media_stream_count_ > 0, foreground_service_worker_count_ > 0, @@ -4953,7 +4953,7 @@ // logic into this class, or rip out the existing logic entirely. if (priority_override_.has_value()) { bool foregrounded = priority_override_.value(); - priority = ChildProcessLauncherPriority( + priority = RenderProcessPriority( foregrounded, /* is_visible */ foregrounded, /* has_media_stream */ foregrounded, /* has_foreground_service_worker */ @@ -4988,7 +4988,11 @@ if (!run_renderer_in_process()) { DCHECK(child_process_launcher_.get()); DCHECK(!child_process_launcher_->IsStarting()); - child_process_launcher_->SetProcessPriority(priority_); +#if BUILDFLAG(IS_ANDROID) + child_process_launcher_->SetRenderProcessPriority(priority_); +#else + child_process_launcher_->SetProcessBackgrounded(priority_.is_background()); +#endif } // Notify the child process of the change in state.
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h index c1f57b26..8d6fe0d 100644 --- a/content/browser/renderer_host/render_process_host_impl.h +++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -1065,7 +1065,7 @@ // Clients that contribute priority to this process. base::flat_set<RenderProcessHostPriorityClient*> priority_clients_; - ChildProcessLauncherPriority priority_; + RenderProcessPriority priority_; // If this is set then the built-in process priority calculation system is // ignored, and an externally computed process priority is used. Set to true
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index fb8a0f3..6b36af5 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -570,6 +570,7 @@ frame_tree_->UnregisterRenderViewHost(render_view_host_map_id_, this); frame_tree_ = &frame_tree; frame_tree_->RegisterRenderViewHost(render_view_host_map_id_, this); + render_widget_host_->SetFrameTree(frame_tree); } void RenderViewHostImpl::EnterBackForwardCache() {
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index 4cc7212a..fdf7f8f 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -1164,7 +1164,7 @@ // An expiry time for resetting the pending_user_activation_timer_. static const base::TimeDelta kActivationNotificationExpireTime; - raw_ptr<FrameTree, DanglingUntriaged> frame_tree_; + raw_ptr<FrameTree> frame_tree_; // RenderWidgetHost are either: // - Owned by RenderViewHostImpl.
diff --git a/content/browser/shared_storage/shared_storage_browsertest.cc b/content/browser/shared_storage/shared_storage_browsertest.cc index 7bcbeb4..1a50097 100644 --- a/content/browser/shared_storage/shared_storage_browsertest.cc +++ b/content/browser/shared_storage/shared_storage_browsertest.cc
@@ -664,7 +664,8 @@ .fenced_frame_urls_map(); SharedStorageBudgetMetadata* metadata = - fenced_frame_url_mapping.GetSharedStorageBudgetMetadata(GURL(urn_uuid)); + fenced_frame_url_mapping.GetSharedStorageBudgetMetadataForTesting( + GURL(urn_uuid)); return metadata; }
diff --git a/content/browser/webauth/authenticator_common_impl.cc b/content/browser/webauth/authenticator_common_impl.cc index 538428e..c28b69e7 100644 --- a/content/browser/webauth/authenticator_common_impl.cc +++ b/content/browser/webauth/authenticator_common_impl.cc
@@ -397,6 +397,7 @@ request_delegate_->ConfigureCable( caller_origin_, cable_request_type, + make_credential_options_->resident_key, base::span<const device::CableDiscoveryData>(), discovery_factory()); make_credential_options_->allow_skipping_pin_touch = allow_skipping_pin_touch; @@ -439,6 +440,7 @@ } request_delegate_->ConfigureCable(caller_origin_, device::CableRequestType::kGetAssertion, + /*resident_key_requirement=*/absl::nullopt, cable_pairings, discovery_factory()); #if BUILDFLAG(IS_CHROMEOS) discovery_factory()->set_get_assertion_request_for_legacy_credential_check(
diff --git a/content/browser/webid/README.md b/content/browser/webid/README.md index 96e78e9..a2d2a488 100644 --- a/content/browser/webid/README.md +++ b/content/browser/webid/README.md
@@ -1,7 +1,7 @@ # FedCM Browser side This folder contains the implementation of the browser side logic for the -[FedCM](https://github.com/fedidcg/FedCM/blob/main/explainer/README.md) feature. It is responsible for making all of the +[FedCM](https://github.com/fedidcg/FedCM/blob/main/explainer.md) feature. It is responsible for making all of the network requests needed to implement a FedCM request and also controls what UI and at which point in the process is shown to the user.
diff --git a/content/browser/webui/url_data_manager_backend.cc b/content/browser/webui/url_data_manager_backend.cc index 6112fbeb..c7d6d13 100644 --- a/content/browser/webui/url_data_manager_backend.cc +++ b/content/browser/webui/url_data_manager_backend.cc
@@ -30,7 +30,6 @@ #include "content/public/browser/content_browser_client.h" #include "content/public/browser/render_process_host.h" #include "content/public/common/content_client.h" -#include "content/public/common/content_features.h" #include "content/public/common/url_constants.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" @@ -49,10 +48,6 @@ const char kChromeURLContentSecurityPolicyHeaderName[] = "Content-Security-Policy"; -const char kChromeURLContentSecurityPolicyReportOnlyHeaderName[] = - "Content-Security-Policy-Report-Only"; -const char kChromeURLContentSecurityPolicyReportOnlyHeaderValue[] = - "require-trusted-types-for 'script'"; const char kChromeURLCrossOriginOpenerPolicyName[] = "Cross-Origin-Opener-Policy"; @@ -203,11 +198,6 @@ kChromeURLXFrameOptionsHeaderValue); } - if (base::FeatureList::IsEnabled(features::kWebUIReportOnlyTrustedTypes)) { - headers->SetHeader(kChromeURLContentSecurityPolicyReportOnlyHeaderName, - kChromeURLContentSecurityPolicyReportOnlyHeaderValue); - } - if (!source->AllowCaching()) headers->SetHeader("Cache-Control", "no-cache");
diff --git a/content/browser/webui/web_ui_security_browsertest.cc b/content/browser/webui/web_ui_security_browsertest.cc index f9fe498..973ceb10 100644 --- a/content/browser/webui/web_ui_security_browsertest.cc +++ b/content/browser/webui/web_ui_security_browsertest.cc
@@ -10,7 +10,6 @@ #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" -#include "base/test/scoped_feature_list.h" #include "base/threading/thread_restrictions.h" #include "content/browser/child_process_security_policy_impl.h" #include "content/browser/renderer_host/frame_tree_node.h" @@ -510,47 +509,6 @@ shared_resource_url))); } -class WebUISecurityTestWithWebUIReportOnlyTrustedTypesEnabled - : public WebUISecurityTest { - public: - WebUISecurityTestWithWebUIReportOnlyTrustedTypesEnabled() { - feature_list_.InitAndEnableFeature(features::kWebUIReportOnlyTrustedTypes); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// Verify Report-Only Trusted Types won't block assignment to a dangerous sink, -// but logs warning -IN_PROC_BROWSER_TEST_F(WebUISecurityTestWithWebUIReportOnlyTrustedTypesEnabled, - DoNotBlockSinkAssignmentOnReportOnlyTrustedTypes) { - ASSERT_TRUE(embedded_test_server()->Start()); - GURL test_url(GetWebUIURL("web-ui/title1.html")); - - EXPECT_TRUE(NavigateToURL(shell(), test_url)); - - const char kDangerousSinkUse[] = - "(() => {" - " try {" - " document.body.innerHTML = 1;" - " throw 'Assignment should have blocked';" - " } catch(e) {" - " return 'Assignment blocked';" - " }" - "})();"; - { - WebContentsConsoleObserver console_observer(shell()->web_contents()); - console_observer.SetPattern( - "This document requires 'TrustedHTML' assignment."); - - EXPECT_EQ("Assignment blocked", - EvalJs(shell(), kDangerousSinkUse, EXECUTE_SCRIPT_DEFAULT_OPTIONS, - 1 /* world_id */)); - ASSERT_TRUE(console_observer.Wait()); - } -} - namespace { class UntrustedSourceWithCorsSupport : public URLDataSource { public:
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn index 709a777..e8fe0f9a 100644 --- a/content/public/browser/BUILD.gn +++ b/content/public/browser/BUILD.gn
@@ -1,5 +1,5 @@ # Copyright 2014 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be +# 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") @@ -534,7 +534,7 @@ ] allow_circular_includes_from = [ - # This target is a pair with content/browser. They always go together and + # This target is a pair with content / browser.They always go together and # include headers from each other. "//content/browser", ] @@ -621,6 +621,8 @@ if (is_chromeos) { sources += [ + "chromeos/multi_capture_service.cc", + "chromeos/multi_capture_service.h", "firewall_hole_proxy.h", "lock_screen_storage.h", ] @@ -639,8 +641,6 @@ if (is_chromeos_ash) { sources += [ "chromeos/delegate_to_browser_gpu_service_accelerator_factory.h", - "chromeos/multi_capture_service.cc", - "chromeos/multi_capture_service.h", "tts_controller_delegate.cc", "tts_controller_delegate.h", ]
diff --git a/content/public/browser/authenticator_request_client_delegate.cc b/content/public/browser/authenticator_request_client_delegate.cc index fffa03ae..d6e0e3f4 100644 --- a/content/public/browser/authenticator_request_client_delegate.cc +++ b/content/public/browser/authenticator_request_client_delegate.cc
@@ -165,6 +165,7 @@ void AuthenticatorRequestClientDelegate::ConfigureCable( const url::Origin& origin, device::CableRequestType request_type, + absl::optional<device::ResidentKeyRequirement> resident_key_requirement, base::span<const device::CableDiscoveryData> pairings_from_extension, device::FidoDiscoveryFactory* fido_discovery_factory) {}
diff --git a/content/public/browser/authenticator_request_client_delegate.h b/content/public/browser/authenticator_request_client_delegate.h index 2388d1f..d0957a29 100644 --- a/content/public/browser/authenticator_request_client_delegate.h +++ b/content/public/browser/authenticator_request_client_delegate.h
@@ -280,12 +280,14 @@ // ConfigureCable optionally configures Cloud-assisted Bluetooth Low Energy // transports. |origin| is the origin of the calling site and // |pairings_from_extension| are caBLEv1 pairings that have been provided in - // an extension to the WebAuthn get() call. If the embedder wishes, it may use - // this to configure caBLE on the |FidoDiscoveryFactory| for use in this - // request. + // an extension to the WebAuthn get() call. |resident_key_requirement| is only + // set when provided (i.e. for makeCredential calls) and reflects the value + // requested by the site. If the embedder wishes, it may use this to configure + // caBLE on the |FidoDiscoveryFactory| for use in this request. virtual void ConfigureCable( const url::Origin& origin, device::CableRequestType request_type, + absl::optional<device::ResidentKeyRequirement> resident_key_requirement, base::span<const device::CableDiscoveryData> pairings_from_extension, device::FidoDiscoveryFactory* fido_discovery_factory);
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 556d2b1e..2ecd1e68 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -1351,11 +1351,6 @@ "WebUICodeCache", base::FEATURE_DISABLED_BY_DEFAULT); -// Enables report-only Trusted Types experiment on WebUIs -BASE_FEATURE(kWebUIReportOnlyTrustedTypes, - "WebUIReportOnlyTrustedTypes", - base::FEATURE_DISABLED_BY_DEFAULT); - // Controls whether the WebUSB API is enabled: // https://wicg.github.io/webusb BASE_FEATURE(kWebUsb, "WebUSB", base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index 3800796..926b15c 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -281,7 +281,6 @@ CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebPayments); CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebRtcUseGpuMemoryBufferVideoFrames); CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebUICodeCache); -CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebUIReportOnlyTrustedTypes); CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebUsb); CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebXr); CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebXrArModule);
diff --git a/content/public/test/fenced_frame_test_util.cc b/content/public/test/fenced_frame_test_util.cc index f7b8b64..0eeeea9 100644 --- a/content/public/test/fenced_frame_test_util.cc +++ b/content/public/test/fenced_frame_test_util.cc
@@ -135,7 +135,7 @@ static_cast<RenderFrameHostImpl*>(rfh)->frame_tree_node(); FencedFrameURLMapping& url_mapping = target_node->current_frame_host()->GetPage().fenced_frame_urls_map(); - absl::optional<GURL> urn_uuid = url_mapping.AddFencedFrameURL(url); + absl::optional<GURL> urn_uuid = url_mapping.AddFencedFrameURLForTesting(url); EXPECT_TRUE(urn_uuid.has_value()); EXPECT_TRUE(urn_uuid->is_valid()); return urn_uuid.value();
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 230d740f..9a3f1bd6 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -2841,6 +2841,13 @@ "//third_party/mesa_headers", ] + if (is_chromeos_lacros) { + deps += [ + "//chromeos/crosapi/mojom", + "//chromeos/lacros:test_support", + ] + } + if (is_mac) { data_deps += [ "//device/fido/strings:fido_test_strings" ] }
diff --git a/content/test/data/accessibility/html/iframe-scrollable-expected-fuchsia.txt b/content/test/data/accessibility/html/iframe-scrollable-expected-fuchsia.txt index cf8dd20..6d4466e 100644 --- a/content/test/data/accessibility/html/iframe-scrollable-expected-fuchsia.txt +++ b/content/test/data/accessibility/html/iframe-scrollable-expected-fuchsia.txt
@@ -1,7 +1,7 @@ UNKNOWN focusable has_input_focus ++UNKNOWN hidden ++++UNKNOWN -++++++UNKNOWN focusable label='Scrollable iframe' +++++++UNKNOWN label='Scrollable iframe' ++++++++UNKNOWN focusable ++++++++++UNKNOWN hidden ++++++++++++UNKNOWN hidden @@ -11,4 +11,4 @@ ++++++++++++++UNKNOWN hidden ++++++++++++++UNKNOWN ++++++++++++++++STATIC_TEXT label='hidden from viewport' -++++++++++++++++++UNKNOWN label='hidden from viewport' \ No newline at end of file +++++++++++++++++++UNKNOWN label='hidden from viewport'
diff --git a/content/test/data/accessibility/html/iframe-srcdoc-changed-expected-fuchsia.txt b/content/test/data/accessibility/html/iframe-srcdoc-changed-expected-fuchsia.txt index ea3a0663..06974b4b 100644 --- a/content/test/data/accessibility/html/iframe-srcdoc-changed-expected-fuchsia.txt +++ b/content/test/data/accessibility/html/iframe-srcdoc-changed-expected-fuchsia.txt
@@ -1,7 +1,7 @@ UNKNOWN focusable has_input_focus label='done' ++UNKNOWN hidden ++++UNKNOWN -++++++UNKNOWN focusable +++++++UNKNOWN ++++++++UNKNOWN focusable ++++++++++UNKNOWN hidden -++++++++++++UNKNOWN hidden \ No newline at end of file +++++++++++++UNKNOWN hidden
diff --git a/content/test/data/accessibility/html/iframe-transform-expected-fuchsia.txt b/content/test/data/accessibility/html/iframe-transform-expected-fuchsia.txt index 6b1368c..db0a107 100644 --- a/content/test/data/accessibility/html/iframe-transform-expected-fuchsia.txt +++ b/content/test/data/accessibility/html/iframe-transform-expected-fuchsia.txt
@@ -1,13 +1,13 @@ UNKNOWN focusable has_input_focus ++UNKNOWN hidden ++++UNKNOWN hidden -++++++UNKNOWN focusable +++++++UNKNOWN ++++++++UNKNOWN focusable ++++++++++UNKNOWN hidden ++++++++++++UNKNOWN hidden ++++++++++++++IMAGE -++++++UNKNOWN focusable +++++++UNKNOWN ++++++++UNKNOWN focusable ++++++++++UNKNOWN hidden ++++++++++++UNKNOWN hidden -++++++++++++++IMAGE \ No newline at end of file +++++++++++++++IMAGE
diff --git a/content/test/data/accessibility/html/input-date-expected-fuchsia.txt b/content/test/data/accessibility/html/input-date-expected-fuchsia.txt index cb4a244..b4aabd4 100644 --- a/content/test/data/accessibility/html/input-date-expected-fuchsia.txt +++ b/content/test/data/accessibility/html/input-date-expected-fuchsia.txt
@@ -17,7 +17,7 @@ ++++++++++++UNKNOWN focusable label='Year' actions='{SET_VALUE}' value='2008' ++++++++++++++STATIC_TEXT label='2008' ++++++++++++++++UNKNOWN label='2008' -++++++++UNKNOWN focusable label='Show date picker' +++++++++UNKNOWN focusable label='Show date picker' actions='{DEFAULT}' ++++++UNKNOWN focusable label='When' actions='{DEFAULT, SET_VALUE}' value='2008-09-01' ++++++++UNKNOWN ++++++++++UNKNOWN @@ -34,4 +34,4 @@ ++++++++++++UNKNOWN focusable label='Year When' actions='{SET_VALUE}' value='2008' ++++++++++++++STATIC_TEXT label='2008' ++++++++++++++++UNKNOWN label='2008' -++++++++UNKNOWN focusable label='Show date picker' \ No newline at end of file +++++++++UNKNOWN focusable label='Show date picker' actions='{DEFAULT}'
diff --git a/content/test/data/accessibility/html/input-datetime-local-expected-fuchsia.txt b/content/test/data/accessibility/html/input-datetime-local-expected-fuchsia.txt index 24ad4600..78fb520 100644 --- a/content/test/data/accessibility/html/input-datetime-local-expected-fuchsia.txt +++ b/content/test/data/accessibility/html/input-datetime-local-expected-fuchsia.txt
@@ -32,4 +32,4 @@ ++++++++++++UNKNOWN focusable label='AM/PM' actions='{SET_VALUE}' ++++++++++++++STATIC_TEXT label='--' ++++++++++++++++UNKNOWN label='--' -++++++++UNKNOWN focusable label='Show local date and time picker' \ No newline at end of file +++++++++UNKNOWN focusable label='Show local date and time picker' actions='{DEFAULT}'
diff --git a/content/test/data/accessibility/html/input-month-expected-fuchsia.txt b/content/test/data/accessibility/html/input-month-expected-fuchsia.txt index 256e96d..cece284 100644 --- a/content/test/data/accessibility/html/input-month-expected-fuchsia.txt +++ b/content/test/data/accessibility/html/input-month-expected-fuchsia.txt
@@ -12,4 +12,4 @@ ++++++++++++UNKNOWN focusable label='Year' actions='{SET_VALUE}' ++++++++++++++STATIC_TEXT label='----' ++++++++++++++++UNKNOWN label='----' -++++++++UNKNOWN focusable label='Show month picker' \ No newline at end of file +++++++++UNKNOWN focusable label='Show month picker' actions='{DEFAULT}'
diff --git a/content/test/data/accessibility/html/input-text-name-calc-expected-fuchsia.txt b/content/test/data/accessibility/html/input-text-name-calc-expected-fuchsia.txt index e7b2abe..45a2be03 100644 --- a/content/test/data/accessibility/html/input-text-name-calc-expected-fuchsia.txt +++ b/content/test/data/accessibility/html/input-text-name-calc-expected-fuchsia.txt
@@ -17,11 +17,11 @@ ++++++TEXT_FIELD focusable label='Placeholder4b' actions='{DEFAULT, SET_VALUE}' ++++++++UNKNOWN hidden ++++++++UNKNOWN -++++++TEXT_FIELD focusable label='Placeholder5' actions='{DEFAULT, SET_VALUE}' secondary_label='Title5' +++++++TEXT_FIELD focusable label='Title5' actions='{DEFAULT, SET_VALUE}' ++++++++UNKNOWN hidden ++++++++UNKNOWN ++++++TEXT_FIELD focusable label='LabelledBy6' actions='{DEFAULT, SET_VALUE}' secondary_label='DescribedBy6' ++++++++UNKNOWN ++++++TEXT_FIELD focusable label='AriaLabel7' actions='{DEFAULT, SET_VALUE}' secondary_label='DescribedBy7' ++++++++UNKNOWN hidden -++++++++UNKNOWN \ No newline at end of file +++++++++UNKNOWN
diff --git a/content/test/data/accessibility/html/input-time-expected-fuchsia.txt b/content/test/data/accessibility/html/input-time-expected-fuchsia.txt index 06bd052e..58987269 100644 --- a/content/test/data/accessibility/html/input-time-expected-fuchsia.txt +++ b/content/test/data/accessibility/html/input-time-expected-fuchsia.txt
@@ -17,7 +17,7 @@ ++++++++++++UNKNOWN focusable label='AM/PM' actions='{SET_VALUE}' value='AM' ++++++++++++++STATIC_TEXT label='AM' ++++++++++++++++UNKNOWN label='AM' -++++++++UNKNOWN focusable label='Show time picker' +++++++++UNKNOWN focusable label='Show time picker' actions='{DEFAULT}' ++++++UNKNOWN focusable label='Breakfast' actions='{DEFAULT, SET_VALUE}' value='00:00:00' ++++++++UNKNOWN ++++++++++UNKNOWN @@ -34,4 +34,4 @@ ++++++++++++UNKNOWN focusable label='AM/PM Breakfast' actions='{SET_VALUE}' value='AM' ++++++++++++++STATIC_TEXT label='AM' ++++++++++++++++UNKNOWN label='AM' -++++++++UNKNOWN focusable label='Show time picker' \ No newline at end of file +++++++++UNKNOWN focusable label='Show time picker' actions='{DEFAULT}'
diff --git a/content/test/data/accessibility/html/input-time-with-popup-open-expected-fuchsia.txt b/content/test/data/accessibility/html/input-time-with-popup-open-expected-fuchsia.txt index af6ec5e..98b4b473 100644 --- a/content/test/data/accessibility/html/input-time-with-popup-open-expected-fuchsia.txt +++ b/content/test/data/accessibility/html/input-time-with-popup-open-expected-fuchsia.txt
@@ -27,15 +27,15 @@ ++++++++++++UNKNOWN focusable label='AM/PM' actions='{SET_VALUE}' value='PM' ++++++++++++++STATIC_TEXT label='PM' ++++++++++++++++UNKNOWN label='PM' -++++++++UNKNOWN focusable label='Show time picker' +++++++++UNKNOWN focusable label='Show time picker' actions='{DEFAULT}' ++++++++UNKNOWN focusable ++++++++++UNKNOWN hidden ++++++++++++UNKNOWN hidden ++++++++++++++UNKNOWN ++++++++++++++++UNKNOWN actions='{DEFAULT}' ++++++++++++++++++UNKNOWN hidden -++++++++++++++++++++UNKNOWN focusable has_input_focus label='Hours' actions='{DEFAULT}' -++++++++++++++++++++++UNKNOWN focusable selected label='01' actions='{DEFAULT}' +++++++++++++++++++++UNKNOWN focusable label='Hours' actions='{DEFAULT}' +++++++++++++++++++++++UNKNOWN focusable has_input_focus selected label='01' actions='{DEFAULT}' ++++++++++++++++++++++++STATIC_TEXT label='01' actions='{DEFAULT}' ++++++++++++++++++++++UNKNOWN focusable label='02' actions='{DEFAULT}' ++++++++++++++++++++++++STATIC_TEXT label='02' actions='{DEFAULT}'
diff --git a/content/test/data/accessibility/html/input-week-expected-fuchsia.txt b/content/test/data/accessibility/html/input-week-expected-fuchsia.txt index f1b45dd..f4cc9014 100644 --- a/content/test/data/accessibility/html/input-week-expected-fuchsia.txt +++ b/content/test/data/accessibility/html/input-week-expected-fuchsia.txt
@@ -14,4 +14,4 @@ ++++++++++++UNKNOWN focusable label='Year' actions='{SET_VALUE}' ++++++++++++++STATIC_TEXT label='----' ++++++++++++++++UNKNOWN label='----' -++++++++UNKNOWN focusable label='Show week picker' \ No newline at end of file +++++++++UNKNOWN focusable label='Show week picker' actions='{DEFAULT}'
diff --git a/content/test/data/accessibility/html/offscreen-iframe-expected-fuchsia.txt b/content/test/data/accessibility/html/offscreen-iframe-expected-fuchsia.txt index 646feca8e..cee85dc 100644 --- a/content/test/data/accessibility/html/offscreen-iframe-expected-fuchsia.txt +++ b/content/test/data/accessibility/html/offscreen-iframe-expected-fuchsia.txt
@@ -1,9 +1,9 @@ UNKNOWN focusable has_input_focus ++UNKNOWN hidden ++++UNKNOWN -++++++UNKNOWN focusable +++++++UNKNOWN ++++++++UNKNOWN focusable ++++++++++UNKNOWN hidden ++++++++++++UNKNOWN hidden ++++++++++++++UNKNOWN label='iframe_onscreen' -++++++++++++++UNKNOWN label='iframe_offscreen' \ No newline at end of file +++++++++++++++UNKNOWN label='iframe_offscreen'
diff --git a/content/test/data/accessibility/html/svg-as-object-source-expected-fuchsia.txt b/content/test/data/accessibility/html/svg-as-object-source-expected-fuchsia.txt index 549a26a..b4d881f 100644 --- a/content/test/data/accessibility/html/svg-as-object-source-expected-fuchsia.txt +++ b/content/test/data/accessibility/html/svg-as-object-source-expected-fuchsia.txt
@@ -1,7 +1,7 @@ UNKNOWN focusable has_input_focus ++UNKNOWN hidden ++++UNKNOWN -++++++UNKNOWN focusable label='object without space' +++++++UNKNOWN label='object without space' ++++++++UNKNOWN focusable ++++++++++UNKNOWN ++++++++++++BUTTON label='face' @@ -9,11 +9,11 @@ ++++++++++++BUTTON label='right-eye' ++++++++++++BUTTON label='nose' ++++++++++++BUTTON label='smile' -++++++UNKNOWN focusable label='object with space' +++++++UNKNOWN label='object with space' ++++++++UNKNOWN focusable ++++++++++UNKNOWN ++++++++++++BUTTON label='face' ++++++++++++BUTTON label='left-eye' ++++++++++++BUTTON label='right-eye' ++++++++++++BUTTON label='nose' -++++++++++++BUTTON label='smile' \ No newline at end of file +++++++++++++BUTTON label='smile'
diff --git a/docs/security/faq.md b/docs/security/faq.md index af93f95..dddcccf 100644 --- a/docs/security/faq.md +++ b/docs/security/faq.md
@@ -382,8 +382,9 @@ No. PDF files have the ability to run JavaScript, usually to facilitate field validation during form fill-out. Note that the set of bindings provided to -the PDF are more limited than those provided by the DOM to HTML documents (e.g. -no document.cookie). +the PDF are more limited than those provided by the DOM to HTML documents, nor +do PDFs get any ambient authority based upon the domain from which they are +served (e.g. no document.cookie). <a name="TOC-Are-PDF-files-static-content-in-Chromium-"></a> ### Are PDF files static content in Chromium?
diff --git a/extensions/common/api/declarative_net_request/dnr_manifest_unittest.cc b/extensions/common/api/declarative_net_request/dnr_manifest_unittest.cc index fd31cbf..b405509 100644 --- a/extensions/common/api/declarative_net_request/dnr_manifest_unittest.cc +++ b/extensions/common/api/declarative_net_request/dnr_manifest_unittest.cc
@@ -30,7 +30,7 @@ namespace declarative_net_request { namespace { -std::string GetRuleResourcesKey() { +std::string GetRuleResourcesPath() { return base::JoinString({dnr_api::ManifestKeys::kDeclarativeNetRequest, dnr_api::DNRInfo::kRuleResources}, "."); @@ -88,7 +88,7 @@ } } - void WriteManifestAndRuleset(const base::Value& manifest, + void WriteManifestAndRuleset(const base::Value::Dict& manifest, const std::vector<TestRulesetInfo>& info) { EXPECT_TRUE(temp_dir_.CreateUniqueTempDir()); @@ -118,16 +118,16 @@ TEST_F(DNRManifestTest, EmptyRuleset) { std::vector<TestRulesetInfo> rulesets({CreateDefaultRuleset()}); - WriteManifestAndRuleset(*CreateManifest(rulesets), rulesets); + WriteManifestAndRuleset(CreateManifest(rulesets), rulesets); LoadAndExpectSuccess(rulesets); } TEST_F(DNRManifestTest, InvalidManifestKey) { std::vector<TestRulesetInfo> rulesets({CreateDefaultRuleset()}); - std::unique_ptr<base::DictionaryValue> manifest = CreateManifest(rulesets); - manifest->SetIntKey(dnr_api::ManifestKeys::kDeclarativeNetRequest, 3); + base::Value::Dict manifest = CreateManifest(rulesets); + manifest.Set(dnr_api::ManifestKeys::kDeclarativeNetRequest, 3); - WriteManifestAndRuleset(*manifest, rulesets); + WriteManifestAndRuleset(manifest, rulesets); LoadAndExpectError( "Error at key 'declarative_net_request'. Type is invalid. Expected " "dictionary, found integer."); @@ -135,29 +135,25 @@ TEST_F(DNRManifestTest, InvalidRulesFileKey) { std::vector<TestRulesetInfo> rulesets({CreateDefaultRuleset()}); - std::unique_ptr<base::DictionaryValue> manifest = CreateManifest(rulesets); - manifest->SetIntPath(GetRuleResourcesKey(), 3); + base::Value::Dict manifest = CreateManifest(rulesets); + manifest.SetByDottedPath(GetRuleResourcesPath(), 3); - WriteManifestAndRuleset(*manifest, rulesets); + WriteManifestAndRuleset(manifest, rulesets); LoadAndExpectError( "Error at key 'declarative_net_request.rule_resources'. Type is invalid. " "Expected list, found integer."); } TEST_F(DNRManifestTest, InvalidRulesFileFormat) { - const char* kRulesetFile = "file1.json"; - std::unique_ptr<base::DictionaryValue> manifest = CreateManifest({}); - manifest->SetKey( - dnr_api::ManifestKeys::kDeclarativeNetRequest, - base::Value::FromUniquePtrValue( - DictionaryBuilder() - .Set(dnr_api::DNRInfo::kRuleResources, - (ListBuilder().Append( - std::make_unique<base::Value>(kRulesetFile))) - .Build()) - .Build())); + const char kRulesetFile[] = "file1.json"; + base::Value::Dict manifest = CreateManifest({}); + manifest.Set(dnr_api::ManifestKeys::kDeclarativeNetRequest, + DictionaryBuilder() + .Set(dnr_api::DNRInfo::kRuleResources, + (ListBuilder().Append(kRulesetFile)).BuildList()) + .BuildDict()); - WriteManifestAndRuleset(*manifest, {}); + WriteManifestAndRuleset(manifest, {}); LoadAndExpectError( "Error at key 'declarative_net_request.rule_resources'. Parsing array " @@ -166,7 +162,7 @@ TEST_F(DNRManifestTest, ZeroRulesets) { std::vector<TestRulesetInfo> no_rulesets; - WriteManifestAndRuleset(*CreateManifest(no_rulesets), no_rulesets); + WriteManifestAndRuleset(CreateManifest(no_rulesets), no_rulesets); LoadAndExpectSuccess(no_rulesets); } @@ -179,7 +175,7 @@ true /* enabled */); std::vector<TestRulesetInfo> rulesets = {ruleset_1, ruleset_2, ruleset_3}; - WriteManifestAndRuleset(*CreateManifest(rulesets), rulesets); + WriteManifestAndRuleset(CreateManifest(rulesets), rulesets); LoadAndExpectSuccess(rulesets); } @@ -188,7 +184,7 @@ TestRulesetInfo ruleset_2("2", "file2.json", base::ListValue()); // Only persist |ruleset_1| on disk but include both in the manifest. - WriteManifestAndRuleset(*CreateManifest({ruleset_1, ruleset_2}), {ruleset_1}); + WriteManifestAndRuleset(CreateManifest({ruleset_1, ruleset_2}), {ruleset_1}); LoadAndExpectError(ErrorUtils::FormatErrorMessage( errors::kRulesFileIsInvalid, @@ -203,7 +199,7 @@ false /* enabled */); } - WriteManifestAndRuleset(*CreateManifest(rulesets), rulesets); + WriteManifestAndRuleset(CreateManifest(rulesets), rulesets); LoadAndExpectError(ErrorUtils::FormatErrorMessage( errors::kRulesetCountExceeded, @@ -219,7 +215,7 @@ true /* enabled */); } - WriteManifestAndRuleset(*CreateManifest(rulesets), rulesets); + WriteManifestAndRuleset(CreateManifest(rulesets), rulesets); LoadAndExpectError(ErrorUtils::FormatErrorMessage( errors::kEnabledRulesetCountExceeded, @@ -231,9 +227,9 @@ TEST_F(DNRManifestTest, NonExistentRulesFile) { TestRulesetInfo ruleset("id", "invalid_file.json", base::ListValue()); - std::unique_ptr<base::DictionaryValue> manifest = CreateManifest({ruleset}); + base::Value::Dict manifest = CreateManifest({ruleset}); - WriteManifestAndRuleset(*manifest, {}); + WriteManifestAndRuleset(manifest, {}); LoadAndExpectError(ErrorUtils::FormatErrorMessage( errors::kRulesFileIsInvalid, @@ -243,11 +239,11 @@ TEST_F(DNRManifestTest, NeedsDeclarativeNetRequestPermission) { std::vector<TestRulesetInfo> rulesets({CreateDefaultRuleset()}); - std::unique_ptr<base::DictionaryValue> manifest = CreateManifest(rulesets); + base::Value::Dict manifest = CreateManifest(rulesets); // Remove "declarativeNetRequest" permission. - manifest->RemoveKey(manifest_keys::kPermissions); + manifest.Remove(manifest_keys::kPermissions); - WriteManifestAndRuleset(*manifest, rulesets); + WriteManifestAndRuleset(manifest, rulesets); LoadAndExpectError(ErrorUtils::FormatErrorMessage( errors::kDeclarativeNetRequestPermissionNeeded, @@ -258,9 +254,9 @@ TestRulesetInfo ruleset("id", "dir/rules_file.json", base::ListValue()); std::vector<TestRulesetInfo> rulesets({ruleset}); - std::unique_ptr<base::DictionaryValue> manifest = CreateManifest(rulesets); + base::Value::Dict manifest = CreateManifest(rulesets); - WriteManifestAndRuleset(*manifest, rulesets); + WriteManifestAndRuleset(manifest, rulesets); LoadAndExpectSuccess(rulesets); } @@ -269,7 +265,7 @@ TestRulesetInfo ruleset_2("", "2.json", base::ListValue()); TestRulesetInfo ruleset_3("3", "3.json", base::ListValue()); std::vector<TestRulesetInfo> rulesets({ruleset_1, ruleset_2, ruleset_3}); - WriteManifestAndRuleset(*CreateManifest(rulesets), rulesets); + WriteManifestAndRuleset(CreateManifest(rulesets), rulesets); LoadAndExpectError(ErrorUtils::FormatErrorMessage( errors::kInvalidRulesetID, dnr_api::ManifestKeys::kDeclarativeNetRequest, @@ -283,7 +279,7 @@ TestRulesetInfo ruleset_4("1", "3.json", base::ListValue()); std::vector<TestRulesetInfo> rulesets( {ruleset_1, ruleset_2, ruleset_3, ruleset_4}); - WriteManifestAndRuleset(*CreateManifest(rulesets), rulesets); + WriteManifestAndRuleset(CreateManifest(rulesets), rulesets); LoadAndExpectError(ErrorUtils::FormatErrorMessage( errors::kInvalidRulesetID, dnr_api::ManifestKeys::kDeclarativeNetRequest, @@ -295,7 +291,7 @@ TestRulesetInfo ruleset_2("_bar", "2.json", base::ListValue()); TestRulesetInfo ruleset_3("baz", "3.json", base::ListValue()); std::vector<TestRulesetInfo> rulesets({ruleset_1, ruleset_2, ruleset_3}); - WriteManifestAndRuleset(*CreateManifest(rulesets), rulesets); + WriteManifestAndRuleset(CreateManifest(rulesets), rulesets); LoadAndExpectError(ErrorUtils::FormatErrorMessage( errors::kInvalidRulesetID, dnr_api::ManifestKeys::kDeclarativeNetRequest, @@ -311,7 +307,7 @@ std::string error; scoped_refptr<Extension> extension = Extension::Create( base::FilePath(), mojom::ManifestLocation::kInternal, - *CreateManifest({ruleset}), Extension::FROM_WEBSTORE, &error); + CreateManifest({ruleset}), Extension::FROM_WEBSTORE, &error); EXPECT_TRUE(extension); EXPECT_TRUE(error.empty()) << error; @@ -319,7 +315,7 @@ TEST_F(DNRManifestTest, EmptyRulesetPath1) { TestRulesetInfo ruleset("foo", "", base::ListValue()); - WriteManifestAndRuleset(*CreateManifest({ruleset}), {}); + WriteManifestAndRuleset(CreateManifest({ruleset}), {}); LoadAndExpectError(ErrorUtils::FormatErrorMessage( errors::kRulesFileIsInvalid, dnr_api::ManifestKeys::kDeclarativeNetRequest, @@ -328,7 +324,7 @@ TEST_F(DNRManifestTest, EmptyRulesetPath2) { TestRulesetInfo ruleset("foo", ".", base::ListValue()); - WriteManifestAndRuleset(*CreateManifest({ruleset}), {}); + WriteManifestAndRuleset(CreateManifest({ruleset}), {}); LoadAndExpectError(ErrorUtils::FormatErrorMessage( errors::kRulesFileIsInvalid, dnr_api::ManifestKeys::kDeclarativeNetRequest,
diff --git a/extensions/common/api/declarative_net_request/test_utils.cc b/extensions/common/api/declarative_net_request/test_utils.cc index 3c59c345..52754a4 100644 --- a/extensions/common/api/declarative_net_request/test_utils.cc +++ b/extensions/common/api/declarative_net_request/test_utils.cc
@@ -251,7 +251,7 @@ return ruleset.ToValue(); } -std::unique_ptr<base::DictionaryValue> CreateManifest( +base::Value::Dict CreateManifest( const std::vector<TestRulesetInfo>& ruleset_info, const std::vector<std::string>& hosts, unsigned flags, @@ -288,7 +288,7 @@ dnr_api::ManifestKeys::kDeclarativeNetRequest, DictionaryBuilder() .Set(dnr_api::DNRInfo::kRuleResources, ToValue(ruleset_info)) - .Build()); + .BuildDict()); } return manifest_builder.Set(keys::kName, extension_name) @@ -297,9 +297,9 @@ .Set(keys::kManifestVersion, 2) .Set("background", DictionaryBuilder() .Set("scripts", ToValue(background_scripts)) - .Build()) - .Set(keys::kBrowserAction, DictionaryBuilder().Build()) - .Build(); + .BuildDict()) + .Set(keys::kBrowserAction, DictionaryBuilder().BuildDict()) + .BuildDict(); } base::Value ToListValue(const std::vector<std::string>& vec) { @@ -331,7 +331,7 @@ // Persist manifest file. JSONFileValueSerializer(extension_dir.Append(kManifestFilename)) - .Serialize(*CreateManifest(ruleset_info, hosts, flags, extension_name)); + .Serialize(CreateManifest(ruleset_info, hosts, flags, extension_name)); } void WriteManifestAndRuleset(const base::FilePath& extension_dir,
diff --git a/extensions/common/api/declarative_net_request/test_utils.h b/extensions/common/api/declarative_net_request/test_utils.h index 29e0631..d3790a5 100644 --- a/extensions/common/api/declarative_net_request/test_utils.h +++ b/extensions/common/api/declarative_net_request/test_utils.h
@@ -5,7 +5,6 @@ #ifndef EXTENSIONS_COMMON_API_DECLARATIVE_NET_REQUEST_TEST_UTILS_H_ #define EXTENSIONS_COMMON_API_DECLARATIVE_NET_REQUEST_TEST_UTILS_H_ -#include <memory> #include <string> #include <vector> @@ -220,7 +219,7 @@ // kDeclarativeNetRequestKey manifest key. |hosts| specifies the host // permissions to grant. |flags| is a bitmask of ConfigFlag to configure the // extension. |ruleset_info| specifies the static rulesets for the extension. -std::unique_ptr<base::DictionaryValue> CreateManifest( +base::Value::Dict CreateManifest( const std::vector<TestRulesetInfo>& ruleset_info, const std::vector<std::string>& hosts = {}, unsigned flags = ConfigFlag::kConfig_None,
diff --git a/gin/gin_features.cc b/gin/gin_features.cc index eec07b2..6a90e38 100644 --- a/gin/gin_features.cc +++ b/gin/gin_features.cc
@@ -146,9 +146,9 @@ BASE_FEATURE(kV8DelayMemoryReducer, "V8DelayMemoryReducer", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); const base::FeatureParam<base::TimeDelta> kV8MemoryReducerStartDelay{ - &kV8DelayMemoryReducer, "delay", base::Seconds(8)}; + &kV8DelayMemoryReducer, "delay", base::Seconds(30)}; // JavaScript language features.
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn index 429701a0..f588c013 100644 --- a/gpu/BUILD.gn +++ b/gpu/BUILD.gn
@@ -309,7 +309,6 @@ "command_buffer/tests/es3_misc_functions_unittest.cc", "command_buffer/tests/gl_bgra_mipmap_unittest.cc", "command_buffer/tests/gl_bind_uniform_location_unittest.cc", - "command_buffer/tests/gl_chromium_framebuffer_mixed_samples_unittest.cc", "command_buffer/tests/gl_chromium_framebuffer_multisample_unittest.cc", "command_buffer/tests/gl_clear_framebuffer_unittest.cc", "command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc",
diff --git a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_framebuffer_mixed_samples.txt b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_framebuffer_mixed_samples.txt deleted file mode 100644 index df65d8f..0000000 --- a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_framebuffer_mixed_samples.txt +++ /dev/null
@@ -1,147 +0,0 @@ -Name - - CHROMIUM_framebuffer_mixed_samples - -Name Strings - - GL_CHROMIUM_framebuffer_mixed_samples - -Version - - Last Modifed Date: 7. December, 2015 - -Dependencies - - OpenGL ES 2.0 is required. - - This extension interacts with CHROMIUM_framebuffer_multisample. - -Overview - - This extension allows multisample rendering with a raster and - depth/stencil sample count that is larger than the color sample count. - Rasterization and the results of the depth and stencil tests together - determine the portion of a pixel that is "covered". It can be useful to - evaluate coverage at a higher frequency than color samples are stored. - This coverage is then "reduced" to a collection of covered color samples, - each having an opacity value corresponding to the fraction of the color - sample covered. The opacity can optionally be blended into individual - color samples. - - The key features of this extension are: - - - It allows a framebuffer object to be considered complete when its depth - or stencil samples are a multiple of the number of color samples. - - - It redefines SAMPLES to be the number of depth/stencil samples (if any); - otherwise, it uses the number of color samples. SAMPLE_BUFFERS is one if - there are multisample depth/stencil attachments. Multisample - rasterization and multisample fragment ops are allowed if SAMPLE_BUFFERS - is one. - - - It replaces several error checks involving SAMPLE_BUFFERS by error - checks directly referencing the number of samples in the relevant - attachments. - - - A coverage reduction step is added to Per-Fragment Operations which - converts a set of covered raster/depth/stencil samples to a set of - covered color samples. The coverage reduction step also includes an - optional coverage modulation step, multiplying color values by a - fractional opacity corresponding to the number of associated - raster/depth/stencil samples covered. - -New Procedures and Functions - - void CoverageModulationCHROMIUM(enum components); - -New Tokens - - Accepted by the <pname> parameter of GetBooleanv, GetIntegerv and - GetFloatv: - - COVERAGE_MODULATION_CHROMIUM 0x9332 - - -Additions to specification text related to framebuffers and framebuffer objects -(Framebuffers and Framebuffer Objects) - - Pending CHROMIUM_framebuffer_multisample specification. - Apply relevant rules in spirit of the overview to the specification text. - - - -Additions to Chapter 3 of OpenGL ES 2.0 Specification (Rasterization) - - - Modify Section 3.2 (Multisampling) - - Pending CHROMIUM_framebuffer_multisample specification. - Apply relevant rules in spirit of the overview to the specification text. - -Additions to Chapter 4 of OpenGL ES 2.0 Specification -(Per-Fragment Operations and the Framebuffer) - - Modify Figure 4.1 (Per-fragment operations) - - Add a new stage called "Coverage Reduction" between "Dept Buffer Test" and - "Blending". - - Add a new Section 4.1.Y (Coverage Reduction) after 4.1.5. - - If the value of effective raster samples is greater than the value of - color samples, a fragment's coverage is reduced from - effective raster samples bits to color samples bits. There is an - implementation-dependent association of raster samples to color samples. - The reduced "color coverage" is computed such that the coverage bit for - each color sample is 1 if any of the associated bits in the fragment's - coverage is on, and 0 otherwise. Blending and writes to the framebuffer - are not performed on samples whose color coverage bit is zero. - - For each color sample, the associated bits of the fragment's coverage are - counted and divided by the number of associated bits to produce a - modulation factor R in the range (0,1] (a value of zero would have been - killed due to a color coverage of 0). Specifically: - - N = value of effective raster samples; - M = value of color samples; - R = popcount(associated coverage bits) / (N / M); - - For each draw buffer with a floating point or normalized color format, the - fragment's color value is replicated to M values which may each be - modulated (multiplied) by that color sample's associated value of R. This - modulation is controlled by the function: - - CoverageModulationCHROMIUM(enum components); - - <components> may be RGB, RGBA, ALPHA, or NONE. If <components> is RGB or - RGBA, the red, green, and blue components are modulated. If components is - RGBA or ALPHA, the alpha component is modulated. The initial value of - COVERAGE_MODULATION_CHROMIUM is NONE. - -New State - - Get Value Get Command Type Initial Value Description Sec. Attribute - --------- ----------- ---- ------------- ----------- ---- --------- - - COVERAGE_MODULATION_CHROMIUM GetIntegerv E NONE Which components are 4.1.Y - - multiplied by coverage - fraction -Issues - - (1) How is coverage modulation intended to be used? - - RESOLVED: Coverage modulation allows the coverage to be converted to - "opacity", which can then be blended into the color buffer to accomplish - antialiasing. This is similar to the intent of POLYGON_SMOOTH. For example, - if non-premultiplied alpha colors are in use (common OpenGL usage): - - glCoverageModulationCHROMIUM(GL_ALPHA); - glEnable(GL_BLEND); - glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, - GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - - or if using pre-multiplied alpha colors (common in 2D rendering): - - glCoverageModulationCHROMIUM(GL_RGBA); - glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
diff --git a/gpu/GLES2/gl2chromium_autogen.h b/gpu/GLES2/gl2chromium_autogen.h index 155cf63..450e21ee 100644 --- a/gpu/GLES2/gl2chromium_autogen.h +++ b/gpu/GLES2/gl2chromium_autogen.h
@@ -341,7 +341,6 @@ #define glSetActiveURLCHROMIUM GLES2_GET_FUN(SetActiveURLCHROMIUM) #define glContextVisibilityHintCHROMIUM \ GLES2_GET_FUN(ContextVisibilityHintCHROMIUM) -#define glCoverageModulationCHROMIUM GLES2_GET_FUN(CoverageModulationCHROMIUM) #define glGetGraphicsResetStatusKHR GLES2_GET_FUN(GetGraphicsResetStatusKHR) #define glBlendBarrierKHR GLES2_GET_FUN(BlendBarrierKHR) #define glBindFragDataLocationIndexedEXT \
diff --git a/gpu/GLES2/gl2extchromium.h b/gpu/GLES2/gl2extchromium.h index 4ff95bf..1e4eb61 100644 --- a/gpu/GLES2/gl2extchromium.h +++ b/gpu/GLES2/gl2extchromium.h
@@ -703,16 +703,6 @@ #define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC #endif /* GL_EXT_blend_func_extended */ -#ifndef GL_CHROMIUM_framebuffer_mixed_samples -#define GL_CHROMIUM_framebuffer_mixed_samples 1 -typedef void(GL_APIENTRYP PFNGLCOVERAGEMODULATIONCHROMIUMPROC)( - GLenum components); -#ifdef GL_GLEXT_PROTOTYPES -GL_APICALL void GL_APIENTRY glCoverageModulationCHROMIUM(GLenum components); -#endif -#define GL_COVERAGE_MODULATION_CHROMIUM 0x9332 -#endif /* GL_CHROMIUM_framebuffer_mixed_samples */ - #ifndef GL_ARB_occlusion_query #define GL_ARB_occlusion_query 1 #define GL_SAMPLES_PASSED_ARB 0x8914
diff --git a/gpu/command_buffer/build_cmd_buffer_lib.py b/gpu/command_buffer/build_cmd_buffer_lib.py index 736bf55..4d36c88 100644 --- a/gpu/command_buffer/build_cmd_buffer_lib.py +++ b/gpu/command_buffer/build_cmd_buffer_lib.py
@@ -180,18 +180,6 @@ {'name': 'stencil_clear', 'type': 'GLint', 'default': '0'}, ], }, - 'CoverageModulationCHROMIUM': { - 'type': 'Normal', - 'func': 'CoverageModulationNV', - 'extension_flag': 'chromium_framebuffer_mixed_samples', - 'states': [ - { 'enum': 'GL_COVERAGE_MODULATION_CHROMIUM', - 'name': 'coverage_modulation', - 'type': 'GLenum', - 'default': 'GL_NONE', - }, - ] - }, 'BlendColor': { 'type': 'Normal', 'func': 'BlendColor',
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index 1c852476..5884771 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -40,12 +40,6 @@ 'GL_LINEAR_MIPMAP_LINEAR', ], }, - 'CoverageModulationComponents': { - 'type': 'GLenum', - 'valid': [ - 'GL_RGB', 'GL_RGBA', 'GL_ALPHA', 'GL_NONE' - ], - }, 'FramebufferTarget': { 'type': 'GLenum', 'valid': [ @@ -1869,13 +1863,6 @@ 'unit_test': False, 'es3': True, }, - 'CoverageModulationCHROMIUM': { - 'type': 'StateSet', - 'state': 'CoverageModulationCHROMIUM', - 'decoder_func': 'glCoverageModulationNV', - 'extension': 'CHROMIUM_framebuffer_mixed_samples', - 'extension_flag': 'chromium_framebuffer_mixed_samples', - }, 'CreateAndConsumeTextureCHROMIUM': { 'type': 'NoCommand', 'extension': "CHROMIUM_texture_mailbox",
diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h index 4c87d34..2480fb96 100644 --- a/gpu/command_buffer/client/gles2_c_lib_autogen.h +++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h
@@ -1579,9 +1579,6 @@ void GL_APIENTRY GLES2ContextVisibilityHintCHROMIUM(GLboolean visibility) { gles2::GetGLContext()->ContextVisibilityHintCHROMIUM(visibility); } -void GL_APIENTRY GLES2CoverageModulationCHROMIUM(GLenum components) { - gles2::GetGLContext()->CoverageModulationCHROMIUM(components); -} GLenum GL_APIENTRY GLES2GetGraphicsResetStatusKHR() { return gles2::GetGLContext()->GetGraphicsResetStatusKHR(); } @@ -2951,10 +2948,6 @@ reinterpret_cast<GLES2FunctionPointer>(glContextVisibilityHintCHROMIUM), }, { - "glCoverageModulationCHROMIUM", - reinterpret_cast<GLES2FunctionPointer>(glCoverageModulationCHROMIUM), - }, - { "glGetGraphicsResetStatusKHR", reinterpret_cast<GLES2FunctionPointer>(glGetGraphicsResetStatusKHR), },
diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h index c71c454..58624171 100644 --- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h +++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
@@ -3002,14 +3002,6 @@ } } -void CoverageModulationCHROMIUM(GLenum components) { - gles2::cmds::CoverageModulationCHROMIUM* c = - GetCmdSpace<gles2::cmds::CoverageModulationCHROMIUM>(); - if (c) { - c->Init(components); - } -} - void BlendBarrierKHR() { gles2::cmds::BlendBarrierKHR* c = GetCmdSpace<gles2::cmds::BlendBarrierKHR>(); if (c) {
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h index 40bed79..396d6075 100644 --- a/gpu/command_buffer/client/gles2_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -1113,8 +1113,6 @@ void ContextVisibilityHintCHROMIUM(GLboolean visibility) override; -void CoverageModulationCHROMIUM(GLenum components) override; - GLenum GetGraphicsResetStatusKHR() override; void BlendBarrierKHR() override;
diff --git a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h index 338922d..4e6f99b 100644 --- a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
@@ -3397,16 +3397,6 @@ CheckGLError(); } -void GLES2Implementation::CoverageModulationCHROMIUM(GLenum components) { - GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG( - "[" << GetLogPrefix() << "] glCoverageModulationCHROMIUM(" - << GLES2Util::GetStringCoverageModulationComponents(components) - << ")"); - helper_->CoverageModulationCHROMIUM(components); - CheckGLError(); -} - void GLES2Implementation::BlendBarrierKHR() { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendBarrierKHR("
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h index c09b695..30714e8 100644 --- a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
@@ -2944,17 +2944,6 @@ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } -TEST_F(GLES2ImplementationTest, CoverageModulationCHROMIUM) { - struct Cmds { - cmds::CoverageModulationCHROMIUM cmd; - }; - Cmds expected; - expected.cmd.Init(GL_RGB); - - gl_->CoverageModulationCHROMIUM(GL_RGB); - EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); -} - TEST_F(GLES2ImplementationTest, WindowRectanglesEXT) { GLint data[2][4] = {{0}}; struct Cmds {
diff --git a/gpu/command_buffer/client/gles2_interface_autogen.h b/gpu/command_buffer/client/gles2_interface_autogen.h index 35e5733..8359b58 100644 --- a/gpu/command_buffer/client/gles2_interface_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_autogen.h
@@ -827,7 +827,6 @@ virtual GLuint GetLastFlushIdCHROMIUM() = 0; virtual void SetActiveURLCHROMIUM(const char* url) = 0; virtual void ContextVisibilityHintCHROMIUM(GLboolean visibility) = 0; -virtual void CoverageModulationCHROMIUM(GLenum components) = 0; virtual GLenum GetGraphicsResetStatusKHR() = 0; virtual void BlendBarrierKHR() = 0; virtual void BindFragDataLocationIndexedEXT(GLuint program,
diff --git a/gpu/command_buffer/client/gles2_interface_stub_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_autogen.h index 77a3998..a8811b52 100644 --- a/gpu/command_buffer/client/gles2_interface_stub_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
@@ -803,7 +803,6 @@ GLuint GetLastFlushIdCHROMIUM() override; void SetActiveURLCHROMIUM(const char* url) override; void ContextVisibilityHintCHROMIUM(GLboolean visibility) override; -void CoverageModulationCHROMIUM(GLenum components) override; GLenum GetGraphicsResetStatusKHR() override; void BlendBarrierKHR() override; void BindFragDataLocationIndexedEXT(GLuint program,
diff --git a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h index 472acca..88e2ce84 100644 --- a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
@@ -1075,7 +1075,6 @@ void GLES2InterfaceStub::SetActiveURLCHROMIUM(const char* /* url */) {} void GLES2InterfaceStub::ContextVisibilityHintCHROMIUM( GLboolean /* visibility */) {} -void GLES2InterfaceStub::CoverageModulationCHROMIUM(GLenum /* components */) {} GLenum GLES2InterfaceStub::GetGraphicsResetStatusKHR() { return 0; }
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h index 9b78369..2553796 100644 --- a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
@@ -803,7 +803,6 @@ GLuint GetLastFlushIdCHROMIUM() override; void SetActiveURLCHROMIUM(const char* url) override; void ContextVisibilityHintCHROMIUM(GLboolean visibility) override; -void CoverageModulationCHROMIUM(GLenum components) override; GLenum GetGraphicsResetStatusKHR() override; void BlendBarrierKHR() override; void BindFragDataLocationIndexedEXT(GLuint program,
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h index f6d605d..37b419c 100644 --- a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
@@ -2275,12 +2275,6 @@ gl_->ContextVisibilityHintCHROMIUM(visibility); } -void GLES2TraceImplementation::CoverageModulationCHROMIUM(GLenum components) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", - "GLES2Trace::CoverageModulationCHROMIUM"); - gl_->CoverageModulationCHROMIUM(components); -} - GLenum GLES2TraceImplementation::GetGraphicsResetStatusKHR() { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetGraphicsResetStatusKHR"); return gl_->GetGraphicsResetStatusKHR();
diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h index b083f7b..f64dd69 100644 --- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
@@ -14849,39 +14849,6 @@ static_assert(offsetof(ContextVisibilityHintCHROMIUM, visibility) == 4, "offset of ContextVisibilityHintCHROMIUM visibility should be 4"); -struct CoverageModulationCHROMIUM { - typedef CoverageModulationCHROMIUM ValueType; - static const CommandId kCmdId = kCoverageModulationCHROMIUM; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - - static uint32_t ComputeSize() { - return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { header.SetCmd<ValueType>(); } - - void Init(GLenum _components) { - SetHeader(); - components = _components; - } - - void* Set(void* cmd, GLenum _components) { - static_cast<ValueType*>(cmd)->Init(_components); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32_t components; -}; - -static_assert(sizeof(CoverageModulationCHROMIUM) == 8, - "size of CoverageModulationCHROMIUM should be 8"); -static_assert(offsetof(CoverageModulationCHROMIUM, header) == 0, - "offset of CoverageModulationCHROMIUM header should be 0"); -static_assert(offsetof(CoverageModulationCHROMIUM, components) == 4, - "offset of CoverageModulationCHROMIUM components should be 4"); - struct BlendBarrierKHR { typedef BlendBarrierKHR ValueType; static const CommandId kCmdId = kBlendBarrierKHR;
diff --git a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h index 26822679..31ca190 100644 --- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
@@ -4910,17 +4910,6 @@ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } -TEST_F(GLES2FormatTest, CoverageModulationCHROMIUM) { - cmds::CoverageModulationCHROMIUM& cmd = - *GetBufferAs<cmds::CoverageModulationCHROMIUM>(); - void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11)); - EXPECT_EQ(static_cast<uint32_t>(cmds::CoverageModulationCHROMIUM::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLenum>(11), cmd.components); - CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); -} - TEST_F(GLES2FormatTest, BlendBarrierKHR) { cmds::BlendBarrierKHR& cmd = *GetBufferAs<cmds::BlendBarrierKHR>(); void* next_cmd = cmd.Set(&cmd);
diff --git a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h index cdeb325..08066c0 100644 --- a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
@@ -310,33 +310,32 @@ OP(FlushDriverCachesCHROMIUM) /* 551 */ \ OP(SetActiveURLCHROMIUM) /* 552 */ \ OP(ContextVisibilityHintCHROMIUM) /* 553 */ \ - OP(CoverageModulationCHROMIUM) /* 554 */ \ - OP(BlendBarrierKHR) /* 555 */ \ - OP(BindFragDataLocationIndexedEXTBucket) /* 556 */ \ - OP(BindFragDataLocationEXTBucket) /* 557 */ \ - OP(GetFragDataIndexEXT) /* 558 */ \ - OP(InitializeDiscardableTextureCHROMIUM) /* 559 */ \ - OP(UnlockDiscardableTextureCHROMIUM) /* 560 */ \ - OP(LockDiscardableTextureCHROMIUM) /* 561 */ \ - OP(WindowRectanglesEXTImmediate) /* 562 */ \ - OP(CreateGpuFenceINTERNAL) /* 563 */ \ - OP(WaitGpuFenceCHROMIUM) /* 564 */ \ - OP(DestroyGpuFenceCHROMIUM) /* 565 */ \ - OP(SetReadbackBufferShadowAllocationINTERNAL) /* 566 */ \ - OP(FramebufferTextureMultiviewOVR) /* 567 */ \ - OP(MaxShaderCompilerThreadsKHR) /* 568 */ \ - OP(CreateAndTexStorage2DSharedImageINTERNALImmediate) /* 569 */ \ - OP(BeginSharedImageAccessDirectCHROMIUM) /* 570 */ \ - OP(EndSharedImageAccessDirectCHROMIUM) /* 571 */ \ - OP(EnableiOES) /* 572 */ \ - OP(DisableiOES) /* 573 */ \ - OP(BlendEquationiOES) /* 574 */ \ - OP(BlendEquationSeparateiOES) /* 575 */ \ - OP(BlendFunciOES) /* 576 */ \ - OP(BlendFuncSeparateiOES) /* 577 */ \ - OP(ColorMaskiOES) /* 578 */ \ - OP(IsEnablediOES) /* 579 */ \ - OP(ProvokingVertexANGLE) /* 580 */ + OP(BlendBarrierKHR) /* 554 */ \ + OP(BindFragDataLocationIndexedEXTBucket) /* 555 */ \ + OP(BindFragDataLocationEXTBucket) /* 556 */ \ + OP(GetFragDataIndexEXT) /* 557 */ \ + OP(InitializeDiscardableTextureCHROMIUM) /* 558 */ \ + OP(UnlockDiscardableTextureCHROMIUM) /* 559 */ \ + OP(LockDiscardableTextureCHROMIUM) /* 560 */ \ + OP(WindowRectanglesEXTImmediate) /* 561 */ \ + OP(CreateGpuFenceINTERNAL) /* 562 */ \ + OP(WaitGpuFenceCHROMIUM) /* 563 */ \ + OP(DestroyGpuFenceCHROMIUM) /* 564 */ \ + OP(SetReadbackBufferShadowAllocationINTERNAL) /* 565 */ \ + OP(FramebufferTextureMultiviewOVR) /* 566 */ \ + OP(MaxShaderCompilerThreadsKHR) /* 567 */ \ + OP(CreateAndTexStorage2DSharedImageINTERNALImmediate) /* 568 */ \ + OP(BeginSharedImageAccessDirectCHROMIUM) /* 569 */ \ + OP(EndSharedImageAccessDirectCHROMIUM) /* 570 */ \ + OP(EnableiOES) /* 571 */ \ + OP(DisableiOES) /* 572 */ \ + OP(BlendEquationiOES) /* 573 */ \ + OP(BlendEquationSeparateiOES) /* 574 */ \ + OP(BlendFunciOES) /* 575 */ \ + OP(BlendFuncSeparateiOES) /* 576 */ \ + OP(ColorMaskiOES) /* 577 */ \ + OP(IsEnablediOES) /* 578 */ \ + OP(ProvokingVertexANGLE) /* 579 */ enum CommandId { kOneBeforeStartPoint =
diff --git a/gpu/command_buffer/common/gles2_cmd_utils_autogen.h b/gpu/command_buffer/common/gles2_cmd_utils_autogen.h index f8452342..c15bacd 100644 --- a/gpu/command_buffer/common/gles2_cmd_utils_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_utils_autogen.h
@@ -27,7 +27,6 @@ static std::string GetStringCapability(uint32_t value); static std::string GetStringCmpFunction(uint32_t value); static std::string GetStringCompressedTextureFormat(uint32_t value); -static std::string GetStringCoverageModulationComponents(uint32_t value); static std::string GetStringDrawMode(uint32_t value); static std::string GetStringDstBlendFactor(uint32_t value); static std::string GetStringEquation(uint32_t value);
diff --git a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h index 29b40916..2979f77c 100644 --- a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
@@ -7012,17 +7012,6 @@ return GLES2Util::GetQualifiedEnumString(nullptr, 0, value); } -std::string GLES2Util::GetStringCoverageModulationComponents(uint32_t value) { - static const EnumToString string_table[] = { - {GL_RGB, "GL_RGB"}, - {GL_RGBA, "GL_RGBA"}, - {GL_ALPHA, "GL_ALPHA"}, - {GL_NONE, "GL_NONE"}, - }; - return GLES2Util::GetQualifiedEnumString(string_table, - std::size(string_table), value); -} - std::string GLES2Util::GetStringDrawMode(uint32_t value) { static const EnumToString string_table[] = { {GL_POINTS, "GL_POINTS"},
diff --git a/gpu/command_buffer/gles2_cmd_buffer_functions.txt b/gpu/command_buffer/gles2_cmd_buffer_functions.txt index 8fa70e8..49450096 100644 --- a/gpu/command_buffer/gles2_cmd_buffer_functions.txt +++ b/gpu/command_buffer/gles2_cmd_buffer_functions.txt
@@ -336,9 +336,6 @@ // Extension CHROMIUM_context_visibility_hint GL_APICALL void GL_APIENTRY glContextVisibilityHintCHROMIUM (GLboolean visibility); -// Extension CHROMIUM_framebuffer_mixed_samples -GL_APICALL void GL_APIENTRY glCoverageModulationCHROMIUM (GLenumCoverageModulationComponents components); - // Extension KHR_robustness GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusKHR (void);
diff --git a/gpu/command_buffer/service/context_state_autogen.h b/gpu/command_buffer/service/context_state_autogen.h index 3258024..2cf80d0 100644 --- a/gpu/command_buffer/service/context_state_autogen.h +++ b/gpu/command_buffer/service/context_state_autogen.h
@@ -68,7 +68,6 @@ GLboolean cached_color_mask_blue; GLboolean color_mask_alpha; GLboolean cached_color_mask_alpha; -GLenum coverage_modulation; GLenum cull_mode; GLenum depth_func; GLboolean depth_mask;
diff --git a/gpu/command_buffer/service/context_state_impl_autogen.h b/gpu/command_buffer/service/context_state_impl_autogen.h index 7fbd3a6e..cbdc7ad 100644 --- a/gpu/command_buffer/service/context_state_impl_autogen.h +++ b/gpu/command_buffer/service/context_state_impl_autogen.h
@@ -67,7 +67,6 @@ cached_color_mask_blue = true; color_mask_alpha = true; cached_color_mask_alpha = true; - coverage_modulation = GL_NONE; cull_mode = GL_BACK; depth_func = GL_LESS; depth_mask = true; @@ -246,9 +245,6 @@ (cached_color_mask_alpha != prev_state->cached_color_mask_alpha)) api()->glColorMaskFn(cached_color_mask_red, cached_color_mask_green, cached_color_mask_blue, cached_color_mask_alpha); - if (feature_info_->feature_flags().chromium_framebuffer_mixed_samples) - if ((coverage_modulation != prev_state->coverage_modulation)) - api()->glCoverageModulationNVFn(coverage_modulation); if ((cull_mode != prev_state->cull_mode)) api()->glCullFaceFn(cull_mode); if ((depth_func != prev_state->depth_func)) @@ -342,8 +338,6 @@ api()->glClearStencilFn(stencil_clear); api()->glColorMaskFn(cached_color_mask_red, cached_color_mask_green, cached_color_mask_blue, cached_color_mask_alpha); - if (feature_info_->feature_flags().chromium_framebuffer_mixed_samples) - api()->glCoverageModulationNVFn(coverage_modulation); api()->glCullFaceFn(cull_mode); api()->glDepthFuncFn(depth_func); api()->glDepthMaskFn(cached_depth_mask); @@ -498,12 +492,6 @@ params[3] = static_cast<GLint>(color_mask_alpha); } return true; - case GL_COVERAGE_MODULATION_CHROMIUM: - *num_written = 1; - if (params) { - params[0] = static_cast<GLint>(coverage_modulation); - } - return true; case GL_CULL_FACE_MODE: *num_written = 1; if (params) { @@ -926,12 +914,6 @@ params[3] = static_cast<GLfloat>(color_mask_alpha); } return true; - case GL_COVERAGE_MODULATION_CHROMIUM: - *num_written = 1; - if (params) { - params[0] = static_cast<GLfloat>(coverage_modulation); - } - return true; case GL_CULL_FACE_MODE: *num_written = 1; if (params) {
diff --git a/gpu/command_buffer/service/context_state_test_helpers_autogen.h b/gpu/command_buffer/service/context_state_test_helpers_autogen.h index 9f20632..c098d90 100644 --- a/gpu/command_buffer/service/context_state_test_helpers_autogen.h +++ b/gpu/command_buffer/service/context_state_test_helpers_autogen.h
@@ -57,11 +57,6 @@ EXPECT_CALL(*gl, ColorMask(true, true, true, true)) .Times(1) .RetiresOnSaturation(); - if (feature_info->feature_flags().chromium_framebuffer_mixed_samples) { - EXPECT_CALL(*gl, CoverageModulationNV(GL_NONE)) - .Times(1) - .RetiresOnSaturation(); - } EXPECT_CALL(*gl, CullFace(GL_BACK)).Times(1).RetiresOnSaturation(); EXPECT_CALL(*gl, DepthFunc(GL_LESS)).Times(1).RetiresOnSaturation(); EXPECT_CALL(*gl, DepthMask(true)).Times(1).RetiresOnSaturation();
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc index a51590a..c7d58d4 100644 --- a/gpu/command_buffer/service/feature_info.cc +++ b/gpu/command_buffer/service/feature_info.cc
@@ -1460,12 +1460,6 @@ } } - if (gfx::HasExtension(extensions, "GL_NV_framebuffer_mixed_samples")) { - AddExtensionString("GL_CHROMIUM_framebuffer_mixed_samples"); - feature_flags_.chromium_framebuffer_mixed_samples = true; - validators_.g_l_state.AddValue(GL_COVERAGE_MODULATION_CHROMIUM); - } - if ((gl_version_info_->is_es3 || gl_version_info_->is_desktop_core_profile || gfx::HasExtension(extensions, "GL_EXT_texture_rg") || gfx::HasExtension(extensions, "GL_ARB_texture_rg")) &&
diff --git a/gpu/command_buffer/service/feature_info.h b/gpu/command_buffer/service/feature_info.h index 5442fae..3482ca2 100644 --- a/gpu/command_buffer/service/feature_info.h +++ b/gpu/command_buffer/service/feature_info.h
@@ -92,7 +92,6 @@ bool chromium_texture_filtering_hint = false; bool angle_texture_usage = false; bool ext_texture_storage = false; - bool chromium_framebuffer_mixed_samples = false; bool blend_equation_advanced = false; bool blend_equation_advanced_coherent = false; bool ext_texture_rg = false;
diff --git a/gpu/command_buffer/service/framebuffer_manager.cc b/gpu/command_buffer/service/framebuffer_manager.cc index a1262c3..da377f10 100644 --- a/gpu/command_buffer/service/framebuffer_manager.cc +++ b/gpu/command_buffer/service/framebuffer_manager.cc
@@ -701,8 +701,6 @@ GLsizei samples = -1; uint32_t colorbufferSize = 0; bool colorbufferSizeValid = false; - const bool kSamplesMustMatch = feature_info->IsWebGLContext() || - !feature_info->feature_flags().chromium_framebuffer_mixed_samples; for (AttachmentMap::const_iterator it = attachments_.begin(); it != attachments_.end(); ++it) { @@ -729,15 +727,13 @@ return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT; } - if (kSamplesMustMatch) { - if (samples < 0) { - samples = attachment->samples(); - } else if (attachment->samples() != samples) { - // It's possible that the specified samples isn't the actual samples a - // GL implementation uses, but we always return INCOMPLETE_MULTISAMPLE - // here to ensure consistent behaviors across platforms. - return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE; - } + if (samples < 0) { + samples = attachment->samples(); + } else if (attachment->samples() != samples) { + // It's possible that the specified samples isn't the actual samples a + // GL implementation uses, but we always return INCOMPLETE_MULTISAMPLE + // here to ensure consistent behaviors across platforms. + return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE; } if (!attachment->CanRenderTo(feature_info)) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
diff --git a/gpu/command_buffer/service/framebuffer_manager_unittest.cc b/gpu/command_buffer/service/framebuffer_manager_unittest.cc index 213bde4f..e690a3ae 100644 --- a/gpu/command_buffer/service/framebuffer_manager_unittest.cc +++ b/gpu/command_buffer/service/framebuffer_manager_unittest.cc
@@ -433,8 +433,6 @@ framebuffer_->IsPossiblyComplete(feature_info_.get())); // Change samples. - ASSERT_FALSE( - feature_info_->feature_flags().chromium_framebuffer_mixed_samples); renderbuffer_manager_->SetInfoAndInvalidate(renderbuffer5, kDifferentSamples5, kFormat5, kWidth5, kHeight5); EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE),
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h index 32469a4d..2ccc13d 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -5138,29 +5138,6 @@ return error::kNoError; } -error::Error GLES2DecoderImpl::HandleCoverageModulationCHROMIUM( - uint32_t immediate_data_size, - const volatile void* cmd_data) { - const volatile gles2::cmds::CoverageModulationCHROMIUM& c = - *static_cast<const volatile gles2::cmds::CoverageModulationCHROMIUM*>( - cmd_data); - if (!features().chromium_framebuffer_mixed_samples) { - return error::kUnknownCommand; - } - - GLenum components = static_cast<GLenum>(c.components); - if (!validators_->coverage_modulation_components.IsValid(components)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glCoverageModulationCHROMIUM", components, - "components"); - return error::kNoError; - } - if (state_.coverage_modulation != components) { - state_.coverage_modulation = components; - glCoverageModulationNV(components); - } - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleBlendBarrierKHR( uint32_t immediate_data_size, const volatile void* cmd_data) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc index c226443..1657239 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
@@ -1032,7 +1032,6 @@ "GL_ANGLE_texture_compression_dxt3", "GL_ANGLE_texture_compression_dxt5", "GL_ANGLE_translated_shader_source", - "GL_CHROMIUM_framebuffer_mixed_samples", "GL_CHROMIUM_path_rendering", "GL_EXT_blend_minmax", "GL_EXT_discard_framebuffer",
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc index a52b22ec..75a8ff6b 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
@@ -4409,24 +4409,6 @@ return error::kNoError; } -error::Error GLES2DecoderPassthroughImpl::HandleCoverageModulationCHROMIUM( - uint32_t immediate_data_size, - const volatile void* cmd_data) { - const volatile gles2::cmds::CoverageModulationCHROMIUM& c = - *static_cast<const volatile gles2::cmds::CoverageModulationCHROMIUM*>( - cmd_data); - if (!features().chromium_framebuffer_mixed_samples) { - return error::kUnknownCommand; - } - - GLenum components = static_cast<GLenum>(c.components); - error::Error error = DoCoverageModulationCHROMIUM(components); - if (error != error::kNoError) { - return error; - } - return error::kNoError; -} - error::Error GLES2DecoderPassthroughImpl::HandleBlendBarrierKHR( uint32_t immediate_data_size, const volatile void* cmd_data) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_extensions.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_extensions.cc index 57557c9..ee3eaec 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_extensions.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_extensions.cc
@@ -42,27 +42,6 @@ GLES2DecoderTestWithBlendEquationAdvanced, ::testing::Bool()); -class GLES2DecoderTestWithCHROMIUMFramebufferMixedSamples - : public GLES2DecoderTest { - public: - GLES2DecoderTestWithCHROMIUMFramebufferMixedSamples() = default; - void SetUp() override { - InitState init; - init.gl_version = "OpenGL ES 3.1"; - init.has_alpha = true; - init.has_depth = true; - init.request_alpha = true; - init.request_depth = true; - init.bind_generates_resource = true; - init.extensions = "GL_NV_framebuffer_mixed_samples "; - InitDecoder(init); - } -}; - -INSTANTIATE_TEST_SUITE_P(Service, - GLES2DecoderTestWithCHROMIUMFramebufferMixedSamples, - ::testing::Bool()); - class GLES3DecoderTestWithEXTWindowRectangles : public GLES3DecoderTest { public: GLES3DecoderTestWithEXTWindowRectangles() = default;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_extensions_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_extensions_autogen.h index 6a5194c..e4b2bef2 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_extensions_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_extensions_autogen.h
@@ -12,16 +12,6 @@ #ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_EXTENSIONS_AUTOGEN_H_ #define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_EXTENSIONS_AUTOGEN_H_ -TEST_P(GLES2DecoderTestWithCHROMIUMFramebufferMixedSamples, - CoverageModulationCHROMIUMValidArgs) { - EXPECT_CALL(*gl_, CoverageModulationNV(GL_RGB)); - SpecializedSetup<cmds::CoverageModulationCHROMIUM, 0>(true); - cmds::CoverageModulationCHROMIUM cmd; - cmd.Init(GL_RGB); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - TEST_P(GLES2DecoderTestWithBlendEquationAdvanced, BlendBarrierKHRValidArgs) { EXPECT_CALL(*gl_, BlendBarrierKHR()); SpecializedSetup<cmds::BlendBarrierKHR, 0>(true);
diff --git a/gpu/command_buffer/service/gles2_cmd_validation_autogen.h b/gpu/command_buffer/service/gles2_cmd_validation_autogen.h index 0c2eb4ac..95146d4 100644 --- a/gpu/command_buffer/service/gles2_cmd_validation_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_validation_autogen.h
@@ -92,7 +92,6 @@ CmpFunctionValidator cmp_function; ValueValidator<GLenum> compressed_texture_format; -ValueValidator<GLenum> coverage_modulation_components; class DrawModeValidator { public: bool IsValid(const GLenum value) const;
diff --git a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h index 5581ba0b..68c8f0f 100644 --- a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
@@ -174,13 +174,6 @@ return false; } -static const GLenum valid_coverage_modulation_components_table[] = { - GL_RGB, - GL_RGBA, - GL_ALPHA, - GL_NONE, -}; - bool Validators::DrawModeValidator::IsValid(const GLenum value) const { switch (value) { case GL_POINTS: @@ -1310,9 +1303,6 @@ bufferuiv(valid_bufferuiv_table, std::size(valid_bufferuiv_table)), capability(valid_capability_table, std::size(valid_capability_table)), compressed_texture_format(), - coverage_modulation_components( - valid_coverage_modulation_components_table, - std::size(valid_coverage_modulation_components_table)), dst_blend_factor(valid_dst_blend_factor_table, std::size(valid_dst_blend_factor_table)), equation(valid_equation_table, std::size(valid_equation_table)),
diff --git a/gpu/command_buffer/tests/gl_chromium_framebuffer_mixed_samples_unittest.cc b/gpu/command_buffer/tests/gl_chromium_framebuffer_mixed_samples_unittest.cc deleted file mode 100644 index 86201fe..0000000 --- a/gpu/command_buffer/tests/gl_chromium_framebuffer_mixed_samples_unittest.cc +++ /dev/null
@@ -1,245 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <GLES2/gl2.h> -#include <GLES2/gl2ext.h> -#include <GLES2/gl2extchromium.h> -#include <stdint.h> -#include <string.h> - -#include <memory> - -#include "base/command_line.h" -#include "gpu/command_buffer/service/gpu_switches.h" -#include "gpu/command_buffer/tests/gl_manager.h" -#include "gpu/command_buffer/tests/gl_test_utils.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -#define SHADER(Src) #Src - -namespace gpu { - -class CHROMIUMFramebufferMixedSamplesTest : public testing::Test { - protected: - const GLuint kWidth = 100; - const GLuint kHeight = 100; - - void SetUp() override { - gl_.Initialize(GLManager::Options()); - } - - void TearDown() override { gl_.Destroy(); } - - bool IsApplicable() const { - return GLTestHelper::HasExtension( - "GL_CHROMIUM_framebuffer_mixed_samples") && - GLTestHelper::HasExtension("GL_OES_rgb8_rgba8"); - } - - enum SetupFBOType { - MixedSampleFBO, // 1 color sample, N stencil samples. - SingleSampleFBO, // 1 color sample, 1 stencil sample. - }; - - void SetupState(SetupFBOType fbo_type) { - // clang-format off - static const char* kVertexShaderSource = SHADER( - attribute mediump vec4 position; - void main() { - gl_Position = position; - }); - static const char* kFragmentShaderSource = SHADER( - uniform mediump vec4 color; - void main() { - gl_FragColor = color; - }); - // clang-format on - GLuint program = - GLTestHelper::LoadProgram(kVertexShaderSource, kFragmentShaderSource); - glUseProgram(program); - GLuint position_loc = glGetAttribLocation(program, "position"); - color_loc_ = glGetUniformLocation(program, "color"); - - GLuint vbo = 0; - glGenBuffers(1, &vbo); - glBindBuffer(GL_ARRAY_BUFFER, vbo); - static float vertices[] = { - 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, - -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - glEnableVertexAttribArray(position_loc); - glVertexAttribPointer(position_loc, 2, GL_FLOAT, GL_FALSE, 0, 0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - GLuint texture = 0; - glActiveTexture(GL_TEXTURE0); - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, - GL_UNSIGNED_BYTE, nullptr); - glBindTexture(GL_TEXTURE_2D, 0); - - GLuint stencil_rb = 0; - glGenRenderbuffers(1, &stencil_rb); - glBindRenderbuffer(GL_RENDERBUFFER, stencil_rb); - - if (fbo_type == MixedSampleFBO) { - // Create a sample buffer. - GLsizei num_samples = 8, max_samples = 0; - glGetIntegerv(GL_MAX_SAMPLES, &max_samples); - num_samples = std::min(num_samples, max_samples); - glRenderbufferStorageMultisampleCHROMIUM( - GL_RENDERBUFFER, num_samples, GL_STENCIL_INDEX8, kWidth, kHeight); - GLint param = 0; - glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, - ¶m); - EXPECT_GT(param, 1); - } else { - glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, kWidth, - kHeight); - } - glBindRenderbuffer(GL_RENDERBUFFER, 0); - - GLuint sample_fbo = 0; - glGenFramebuffers(1, &sample_fbo); - glBindFramebuffer(GL_FRAMEBUFFER, sample_fbo); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - texture, 0); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, - GL_RENDERBUFFER, stencil_rb); - EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), - glCheckFramebufferStatus(GL_FRAMEBUFFER)); - - glViewport(0, 0, kWidth, kHeight); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClearStencil(1); - glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); - glEnable(GL_STENCIL_TEST); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glStencilMask(0xffffffff); - glStencilFunc(GL_EQUAL, 1, 0xffffffff); - glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); - } - - GLManager gl_; - GLint color_loc_; -}; - -TEST_F(CHROMIUMFramebufferMixedSamplesTest, Simple) { - if (!IsApplicable()) { - return; - } - GLint value = -1; - glGetIntegerv(GL_COVERAGE_MODULATION_CHROMIUM, &value); - EXPECT_EQ(0, value); - GLenum kValues[] = {GL_NONE, GL_RGB, GL_RGBA, GL_ALPHA}; - for (auto expect : kValues) { - glCoverageModulationCHROMIUM(expect); - value = -1; - glGetIntegerv(GL_COVERAGE_MODULATION_CHROMIUM, &value); - EXPECT_EQ(expect, static_cast<GLenum>(value)); - EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); - } - - glCoverageModulationCHROMIUM(GL_BYTE); - EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), glGetError()); - value = -1; - glGetIntegerv(GL_COVERAGE_MODULATION_CHROMIUM, &value); - EXPECT_EQ(static_cast<GLenum>(GL_ALPHA), static_cast<GLenum>(value)); - EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); -} - -// The test pattern is as follows: -// A green triangle (bottom left, top right, top left). -// A blue triangle (top left, bottom right, bottom left). -// The triangles will overlap but overlap only contains green pixels, -// due to each draw erasing its area from stencil. -// The blue triangle will fill only the area (bottom left, center, -// bottom right). - -// The test tests that CoverageModulation call works. -// The fractional pixels of both triangles end up being modulated -// by the coverage of the fragment. Test that drawing with and without -// CoverageModulation causes the result to be different. -TEST_F(CHROMIUMFramebufferMixedSamplesTest, CoverageModulation) { - if (!IsApplicable()) { - return; - } - static const float kBlue[] = {0.0f, 0.0f, 1.0f, 1.0f}; - static const float kGreen[] = {0.0f, 1.0f, 0.0f, 1.0f}; - std::unique_ptr<uint8_t[]> results[3]; - const GLint kResultSize = kWidth * kHeight * 4; - - for (int pass = 0; pass < 3; ++pass) { - SetupState(MixedSampleFBO); - if (pass == 1) { - glCoverageModulationCHROMIUM(GL_RGBA); - } - glUniform4fv(color_loc_, 1, kGreen); - glDrawArrays(GL_TRIANGLES, 0, 3); - - glUniform4fv(color_loc_, 1, kBlue); - glDrawArrays(GL_TRIANGLES, 3, 3); - if (pass == 1) { - glCoverageModulationCHROMIUM(GL_NONE); - } - - results[pass].reset(new uint8_t[kResultSize]); - memset(results[pass].get(), GLTestHelper::kCheckClearValue, kResultSize); - glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - results[pass].get()); - } - - EXPECT_NE(0, memcmp(results[0].get(), results[1].get(), kResultSize)); - // Verify that rendering is deterministic, so that the pass above does not - // come from non-deterministic rendering. - EXPECT_EQ(0, memcmp(results[0].get(), results[2].get(), kResultSize)); -} - -// The test tests that the stencil buffer can be multisampled, even though the -// color buffer is single-sampled. Draws the same pattern with single-sample -// stencil buffer and with multisample stencil buffer. The images should differ. -TEST_F(CHROMIUMFramebufferMixedSamplesTest, MultisampleStencilEffective) { - if (!IsApplicable()) { - return; - } - - static const float kBlue[] = {0.0f, 0.0f, 1.0f, 1.0f}; - static const float kGreen[] = {0.0f, 1.0f, 0.0f, 1.0f}; - - std::unique_ptr<uint8_t[]> results[3]; - const GLint kResultSize = kWidth * kHeight * 4; - - for (int pass = 0; pass < 3; ++pass) { - if (pass == 1) { - SetupState(MixedSampleFBO); - } else { - SetupState(SingleSampleFBO); - } - glUniform4fv(color_loc_, 1, kGreen); - glDrawArrays(GL_TRIANGLES, 0, 3); - - glUniform4fv(color_loc_, 1, kBlue); - glDrawArrays(GL_TRIANGLES, 3, 3); - - results[pass].reset(new uint8_t[kResultSize]); - memset(results[pass].get(), GLTestHelper::kCheckClearValue, kResultSize); - glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - results[pass].get()); - } - - EXPECT_NE(0, memcmp(results[0].get(), results[1].get(), kResultSize)); - // Verify that rendering is deterministic, so that the pass above does not - // come from non-deterministic rendering. - EXPECT_EQ(0, memcmp(results[0].get(), results[2].get(), kResultSize)); -} - -} // namespace gpu
diff --git a/gpu/ipc/common/gpu_surface_lookup.h b/gpu/ipc/common/gpu_surface_lookup.h index 6daf5e3..f7b3a4e 100644 --- a/gpu/ipc/common/gpu_surface_lookup.h +++ b/gpu/ipc/common/gpu_surface_lookup.h
@@ -30,10 +30,6 @@ static GpuSurfaceLookup* GetInstance(); static void InitInstance(GpuSurfaceLookup* lookup); - virtual gfx::AcceleratedWidget AcquireNativeWidget( - gpu::SurfaceHandle surface_handle, - bool* can_be_used_with_surface_control) = 0; - #if BUILDFLAG(IS_ANDROID) virtual gl::ScopedJavaSurface AcquireJavaSurface( int surface_id,
diff --git a/gpu/ipc/common/gpu_surface_tracker.cc b/gpu/ipc/common/gpu_surface_tracker.cc index db1bb5f4..84921d2 100644 --- a/gpu/ipc/common/gpu_surface_tracker.cc +++ b/gpu/ipc/common/gpu_surface_tracker.cc
@@ -66,24 +66,6 @@ surface_map_.erase(surface_handle); } -gfx::AcceleratedWidget GpuSurfaceTracker::AcquireNativeWidget( - gpu::SurfaceHandle surface_handle, - bool* can_be_used_with_surface_control) { - base::AutoLock lock(surface_map_lock_); - SurfaceMap::iterator it = surface_map_.find(surface_handle); - if (it == surface_map_.end()) - return gfx::kNullAcceleratedWidget; - -#if BUILDFLAG(IS_ANDROID) - if (it->second.widget != gfx::kNullAcceleratedWidget) - ANativeWindow_acquire(it->second.widget); - *can_be_used_with_surface_control = - it->second.can_be_used_with_surface_control; -#endif // BUILDFLAG(IS_ANDROID) - - return it->second.widget; -} - #if BUILDFLAG(IS_ANDROID) gl::ScopedJavaSurface GpuSurfaceTracker::AcquireJavaSurface( gpu::SurfaceHandle surface_handle,
diff --git a/gpu/ipc/common/gpu_surface_tracker.h b/gpu/ipc/common/gpu_surface_tracker.h index 2e33ece..3b245fa 100644 --- a/gpu/ipc/common/gpu_surface_tracker.h +++ b/gpu/ipc/common/gpu_surface_tracker.h
@@ -50,6 +50,7 @@ SurfaceRecord(SurfaceRecord&&); SurfaceRecord(const SurfaceRecord&) = delete; + // TODO(crbug.com/1399516): Make this non-android. gfx::AcceleratedWidget widget; #if BUILDFLAG(IS_ANDROID) gl::ScopedJavaSurface surface; @@ -57,13 +58,6 @@ #endif }; - // GpuSurfaceLookup implementation: - // Returns the native widget associated with a given surface_handle. - // On Android, this adds a reference on the ANativeWindow. - gfx::AcceleratedWidget AcquireNativeWidget( - gpu::SurfaceHandle surface_handle, - bool* can_be_used_with_surface_control) override; - #if BUILDFLAG(IS_ANDROID) gl::ScopedJavaSurface AcquireJavaSurface( gpu::SurfaceHandle surface_handle,
diff --git a/gpu/ipc/service/image_transport_surface_android.cc b/gpu/ipc/service/image_transport_surface_android.cc index a4eb304f..4c6ab490 100644 --- a/gpu/ipc/service/image_transport_surface_android.cc +++ b/gpu/ipc/service/image_transport_surface_android.cc
@@ -4,6 +4,8 @@ #include "gpu/ipc/service/image_transport_surface.h" +#include <utility> + #include "base/feature_list.h" #include "base/logging.h" #include "base/task/single_thread_task_runner.h" @@ -11,6 +13,7 @@ #include "gpu/config/gpu_finch_features.h" #include "gpu/ipc/common/gpu_surface_lookup.h" #include "gpu/ipc/service/pass_through_image_transport_surface.h" +#include "ui/gl/android/scoped_a_native_window.h" #include "ui/gl/gl_surface_egl.h" #include "ui/gl/gl_surface_egl_surface_control.h" #include "ui/gl/gl_surface_stub.h" @@ -31,10 +34,12 @@ // On Android, the surface_handle is the id of the surface in the // GpuSurfaceTracker/GpuSurfaceLookup bool can_be_used_with_surface_control = false; - ANativeWindow* window = GpuSurfaceLookup::GetInstance()->AcquireNativeWidget( - surface_handle, &can_be_used_with_surface_control); + gl::ScopedJavaSurface scoped_java_surface = + GpuSurfaceLookup::GetInstance()->AcquireJavaSurface( + surface_handle, &can_be_used_with_surface_control); + gl::ScopedANativeWindow window(scoped_java_surface); if (!window) { - LOG(WARNING) << "Failed to acquire native widget."; + LOG(WARNING) << "Failed to acquire ANativeWindow"; return nullptr; } scoped_refptr<gl::GLSurface> surface; @@ -43,15 +48,14 @@ delegate->GetFeatureInfo()->feature_flags().android_surface_control && can_be_used_with_surface_control) { surface = new gl::GLSurfaceEGLSurfaceControl( - display->GetAs<gl::GLDisplayEGL>(), window, + display->GetAs<gl::GLDisplayEGL>(), std::move(window), base::SingleThreadTaskRunner::GetCurrentDefault()); } else { surface = new gl::NativeViewGLSurfaceEGL(display->GetAs<gl::GLDisplayEGL>(), - window, nullptr); + std::move(window), nullptr); } bool initialize_success = surface->Initialize(format); - ANativeWindow_release(window); if (!initialize_success) return scoped_refptr<gl::GLSurface>();
diff --git a/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc b/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc index f532127..e3890212 100644 --- a/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc +++ b/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc
@@ -384,8 +384,6 @@ &GLES2Interface::BlitFramebufferCHROMIUM, impl, context_support); functions->fGenerateMipmap = gles_bind(&GLES2Interface::GenerateMipmap, impl, context_support); - functions->fCoverageModulation = gles_bind( - &GLES2Interface::CoverageModulationCHROMIUM, impl, context_support); functions->fWindowRectangles = gles_bind(&GLES2Interface::WindowRectanglesEXT, impl, context_support); // Skia should not use program binaries over the command buffer. Allowing
diff --git a/gpu/skia_bindings/gles2_implementation_with_grcontext_support.cc b/gpu/skia_bindings/gles2_implementation_with_grcontext_support.cc index 4162d8e3..e6a776e8 100644 --- a/gpu/skia_bindings/gles2_implementation_with_grcontext_support.cc +++ b/gpu/skia_bindings/gles2_implementation_with_grcontext_support.cc
@@ -192,13 +192,6 @@ ResetGrContextIfNeeded(kBlend_GrGLBackendState); } -// Calls that invalidate kMSAAEnable_GrGLBackendState -void GLES2ImplementationWithGrContextSupport::CoverageModulationCHROMIUM( - GLenum components) { - BaseClass::CoverageModulationCHROMIUM(components); - ResetGrContextIfNeeded(kMSAAEnable_GrGLBackendState); -} - // Calls that invalidate kVertex_GrGLBackendState void GLES2ImplementationWithGrContextSupport::BindVertexArrayOES(GLuint array) { BaseClass::BindVertexArrayOES(array);
diff --git a/gpu/skia_bindings/gles2_implementation_with_grcontext_support.h b/gpu/skia_bindings/gles2_implementation_with_grcontext_support.h index 717122ec..dbbbb065 100644 --- a/gpu/skia_bindings/gles2_implementation_with_grcontext_support.h +++ b/gpu/skia_bindings/gles2_implementation_with_grcontext_support.h
@@ -89,9 +89,6 @@ GLenum srcAlpha, GLenum dstAlpha) override; - // Calls that invalidate kMSAAEnable_GrGLBackendState - void CoverageModulationCHROMIUM(GLenum components) override; - // Calls that invalidate kVertex_GrGLBackendState void BindVertexArrayOES(GLuint array) override; void DeleteVertexArraysOES(GLsizei n, const GLuint* arrays) override;
diff --git a/gpu/vulkan/vulkan_surface.cc b/gpu/vulkan/vulkan_surface.cc index 662bf74..38122ca 100644 --- a/gpu/vulkan/vulkan_surface.cc +++ b/gpu/vulkan/vulkan_surface.cc
@@ -16,10 +16,6 @@ #include "gpu/vulkan/vulkan_function_pointers.h" #include "gpu/vulkan/vulkan_swap_chain.h" -#if BUILDFLAG(IS_ANDROID) -#include <android/native_window_jni.h> -#endif - namespace gpu { namespace { @@ -81,10 +77,6 @@ VulkanSurface::~VulkanSurface() { DCHECK_EQ(static_cast<VkSurfaceKHR>(VK_NULL_HANDLE), surface_); -#if BUILDFLAG(IS_ANDROID) - if (accelerated_widget_) - ANativeWindow_release(accelerated_widget_); -#endif } VulkanSurface::VulkanSurface(VkInstance vk_instance, @@ -93,6 +85,9 @@ uint64_t acquire_next_image_timeout_ns, std::unique_ptr<gfx::VSyncProvider> vsync_provider) : vk_instance_(vk_instance), +#if BUILDFLAG(IS_ANDROID) + a_native_window_(gl::ScopedANativeWindow::Wrap(accelerated_widget)), +#endif accelerated_widget_(accelerated_widget), surface_(surface), acquire_next_image_timeout_ns_(acquire_next_image_timeout_ns), @@ -102,11 +97,6 @@ vsync_provider_ = std::make_unique<gfx::FixedVSyncProvider>( base::TimeTicks(), base::Seconds(1) / 60); } - -#if BUILDFLAG(IS_ANDROID) - if (accelerated_widget_) - ANativeWindow_acquire(accelerated_widget_); -#endif } bool VulkanSurface::Initialize(VulkanDeviceQueue* device_queue,
diff --git a/gpu/vulkan/vulkan_surface.h b/gpu/vulkan/vulkan_surface.h index 35ec172..5d49c4d 100644 --- a/gpu/vulkan/vulkan_surface.h +++ b/gpu/vulkan/vulkan_surface.h
@@ -11,6 +11,7 @@ #include "base/component_export.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" +#include "build/build_config.h" #include "gpu/vulkan/vulkan_device_queue.h" #include "gpu/vulkan/vulkan_swap_chain.h" #include "ui/gfx/geometry/size.h" @@ -20,6 +21,10 @@ #include "ui/gfx/swap_result.h" #include "ui/gfx/vsync_provider.h" +#if BUILDFLAG(IS_ANDROID) +#include "ui/gl/android/scoped_a_native_window.h" +#endif + namespace gpu { class VulkanDeviceQueue; @@ -93,6 +98,9 @@ const VkInstance vk_instance_; +#if BUILDFLAG(IS_ANDROID) + const gl::ScopedANativeWindow a_native_window_; +#endif const gfx::AcceleratedWidget accelerated_widget_; VkSurfaceKHR surface_ = VK_NULL_HANDLE; VkSurfaceFormatKHR surface_format_ = {};
diff --git a/infra/config/dev/subprojects/chromium/ci.star b/infra/config/dev/subprojects/chromium/ci.star index eb1036a..49a3f72 100644 --- a/infra/config/dev/subprojects/chromium/ci.star +++ b/infra/config/dev/subprojects/chromium/ci.star
@@ -97,9 +97,9 @@ chromium_config = builder_config.chromium_config( config = "android", build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.ARM, target_bits = 64, target_platform = builder_config.target_platform.ANDROID, - target_arch = builder_config.target_arch.ARM, ), android_config = builder_config.android_config( config = "main_builder_mb", @@ -110,33 +110,81 @@ ci_builder( name = "linux-rel-swarming", description_html = "Test description. <b>Test HTML</b>.", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + ), + ), ) ci_builder( name = "linux-ssd-rel-swarming", description_html = "Ensures builders are using available local SSDs", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + ), + ), builderless = False, ) ci_builder( name = "mac-rel-swarming", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + ), + ), os = os.MAC_DEFAULT, ) ci_builder( name = "mac-arm-rel-swarming", - cpu = cpu.ARM64, + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + ), + ), os = os.MAC_DEFAULT, + cpu = cpu.ARM64, ) ci_builder( name = "win-rel-swarming", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + ), + ), os = os.WINDOWS_10, goma_enable_ats = True, ) ci_builder( name = "win11-rel-swarming", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + ), + ), os = os.WINDOWS_11, goma_enable_ats = True, )
diff --git a/infra/config/generated/builders/ci/ASAN Debug/properties.json b/infra/config/generated/builders/ci/ASAN Debug/properties.json index d2e0e3b..92d2df12 100644 --- a/infra/config/generated/builders/ci/ASAN Debug/properties.json +++ b/infra/config/generated/builders/ci/ASAN Debug/properties.json
@@ -1,4 +1,47 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ASAN Debug", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "asan", + "gs_acl": "public-read", + "gs_bucket": "chromium-browser-asan" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "clobber" + ], + "build_config": "Debug", + "config": "chromium_asan", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ASAN Debug", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/ASAN Release Media/properties.json b/infra/config/generated/builders/ci/ASAN Release Media/properties.json index d2e0e3b..1241edf 100644 --- a/infra/config/generated/builders/ci/ASAN Release Media/properties.json +++ b/infra/config/generated/builders/ci/ASAN Release Media/properties.json
@@ -1,4 +1,47 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ASAN Release Media", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "asan", + "gs_acl": "public-read", + "gs_bucket": "chrome-test-builds/media" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "clobber" + ], + "build_config": "Release", + "config": "chromium_asan", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ASAN Release Media", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/ASAN Release/properties.json b/infra/config/generated/builders/ci/ASAN Release/properties.json index d2e0e3b..9d40136 100644 --- a/infra/config/generated/builders/ci/ASAN Release/properties.json +++ b/infra/config/generated/builders/ci/ASAN Release/properties.json
@@ -1,4 +1,47 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ASAN Release", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "asan", + "gs_acl": "public-read", + "gs_bucket": "chromium-browser-asan" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "clobber" + ], + "build_config": "Release", + "config": "chromium_asan", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ASAN Release", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git "a/infra/config/generated/builders/ci/ASan Debug \05032-bit x86 with V8-ARM\051/properties.json" "b/infra/config/generated/builders/ci/ASan Debug \05032-bit x86 with V8-ARM\051/properties.json" index d2e0e3b..b6a9b25f 100644 --- "a/infra/config/generated/builders/ci/ASan Debug \05032-bit x86 with V8-ARM\051/properties.json" +++ "b/infra/config/generated/builders/ci/ASan Debug \05032-bit x86 with V8-ARM\051/properties.json"
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ASan Debug (32-bit x86 with V8-ARM)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "asan-v8-arm", + "archive_subdir": "v8-arm", + "gs_acl": "public-read", + "gs_bucket": "chromium-browser-asan" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "clobber" + ], + "build_config": "Debug", + "config": "chromium_asan", + "target_bits": 32 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ASan Debug (32-bit x86 with V8-ARM)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git "a/infra/config/generated/builders/ci/ASan Release \05032-bit x86 with V8-ARM\051/properties.json" "b/infra/config/generated/builders/ci/ASan Release \05032-bit x86 with V8-ARM\051/properties.json" index d2e0e3b..9795e02 100644 --- "a/infra/config/generated/builders/ci/ASan Release \05032-bit x86 with V8-ARM\051/properties.json" +++ "b/infra/config/generated/builders/ci/ASan Release \05032-bit x86 with V8-ARM\051/properties.json"
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ASan Release (32-bit x86 with V8-ARM)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "asan-v8-arm", + "archive_subdir": "v8-arm", + "gs_acl": "public-read", + "gs_bucket": "chromium-browser-asan" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "clobber" + ], + "build_config": "Release", + "config": "chromium_asan", + "target_bits": 32 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ASan Release (32-bit x86 with V8-ARM)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git "a/infra/config/generated/builders/ci/ASan Release Media \05032-bit x86 with V8-ARM\051/properties.json" "b/infra/config/generated/builders/ci/ASan Release Media \05032-bit x86 with V8-ARM\051/properties.json" index d2e0e3b..ad70f60 100644 --- "a/infra/config/generated/builders/ci/ASan Release Media \05032-bit x86 with V8-ARM\051/properties.json" +++ "b/infra/config/generated/builders/ci/ASan Release Media \05032-bit x86 with V8-ARM\051/properties.json"
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ASan Release Media (32-bit x86 with V8-ARM)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "asan-v8-arm", + "archive_subdir": "v8-arm", + "gs_acl": "public-read", + "gs_bucket": "chrome-test-builds/media" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "clobber" + ], + "build_config": "Release", + "config": "chromium_asan", + "target_bits": 32 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ASan Release Media (32-bit x86 with V8-ARM)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git "a/infra/config/generated/builders/ci/Android ASAN \050dbg\051 \050reclient\051/properties.json" "b/infra/config/generated/builders/ci/Android ASAN \050dbg\051 \050reclient\051/properties.json" index b6e2921..f6b1192 100644 --- "a/infra/config/generated/builders/ci/Android ASAN \050dbg\051 \050reclient\051/properties.json" +++ "b/infra/config/generated/builders/ci/Android ASAN \050dbg\051 \050reclient\051/properties.json"
@@ -1,4 +1,49 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Android ASAN (dbg) (reclient)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "clang_builder_mb" + }, + "legacy_chromium_config": { + "apply_configs": [ + "errorprone" + ], + "build_config": "Debug", + "config": "android_clang", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Android ASAN (dbg) (reclient)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/ChromiumOS ASAN Release/properties.json b/infra/config/generated/builders/ci/ChromiumOS ASAN Release/properties.json index 3c360dd..d6a8d4c4 100644 --- a/infra/config/generated/builders/ci/ChromiumOS ASAN Release/properties.json +++ b/infra/config/generated/builders/ci/ChromiumOS ASAN Release/properties.json
@@ -1,4 +1,51 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ChromiumOS ASAN Release", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "asan", + "archive_subdir": "chromeos", + "gs_acl": "public-read", + "gs_bucket": "chromium-browser-asan" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "clobber" + ], + "build_config": "Release", + "config": "chromium_asan", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ChromiumOS ASAN Release", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 500,
diff --git a/infra/config/generated/builders/ci/Leak Detection Linux/properties.json b/infra/config/generated/builders/ci/Leak Detection Linux/properties.json index 6c2d163..1f9df90 100644 --- a/infra/config/generated/builders/ci/Leak Detection Linux/properties.json +++ b/infra/config/generated/builders/ci/Leak Detection Linux/properties.json
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Leak Detection Linux", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-linux-archive", + "builder_group": "chromium.linux", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Leak Detection Linux", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "leak_detection_linux", + "group": "tryserver.chromium.linux" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git "a/infra/config/generated/builders/ci/Linux Builder \050j-500\051 \050reclient\051/properties.json" "b/infra/config/generated/builders/ci/Linux Builder \050j-500\051 \050reclient\051/properties.json" index 5b83cad..9b4f40b 100644 --- "a/infra/config/generated/builders/ci/Linux Builder \050j-500\051 \050reclient\051/properties.json" +++ "b/infra/config/generated/builders/ci/Linux Builder \050j-500\051 \050reclient\051/properties.json"
@@ -1,4 +1,45 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Linux Builder (j-500) (reclient)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_clang_coverage" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Linux Builder (j-500) (reclient)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 500,
diff --git "a/infra/config/generated/builders/ci/Linux CFI \050reclient shadow\051/properties.json" "b/infra/config/generated/builders/ci/Linux CFI \050reclient shadow\051/properties.json" index 505efbb..fb1bce2 100644 --- "a/infra/config/generated/builders/ci/Linux CFI \050reclient shadow\051/properties.json" +++ "b/infra/config/generated/builders/ci/Linux CFI \050reclient shadow\051/properties.json"
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Linux CFI (reclient shadow)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Linux CFI (reclient shadow)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 400,
diff --git a/infra/config/generated/builders/ci/Linux Viz/properties.json b/infra/config/generated/builders/ci/Linux Viz/properties.json index b232002..0b4748fd 100644 --- a/infra/config/generated/builders/ci/Linux Viz/properties.json +++ b/infra/config/generated/builders/ci/Linux Viz/properties.json
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Linux Viz", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Linux Viz", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "linux-viz-rel", + "group": "tryserver.chromium.linux" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git "a/infra/config/generated/builders/ci/MSAN Release \050chained origins\051/properties.json" "b/infra/config/generated/builders/ci/MSAN Release \050chained origins\051/properties.json" index d2e0e3b..50bf0dd 100644 --- "a/infra/config/generated/builders/ci/MSAN Release \050chained origins\051/properties.json" +++ "b/infra/config/generated/builders/ci/MSAN Release \050chained origins\051/properties.json"
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "MSAN Release (chained origins)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "msan-chained-origins", + "gs_acl": "public-read", + "gs_bucket": "chromium-browser-msan" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "msan", + "clobber" + ], + "build_config": "Release", + "config": "chromium_clang", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "MSAN Release (chained origins)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git "a/infra/config/generated/builders/ci/MSAN Release \050no origins\051/properties.json" "b/infra/config/generated/builders/ci/MSAN Release \050no origins\051/properties.json" index d2e0e3b..d0c78eb4 100644 --- "a/infra/config/generated/builders/ci/MSAN Release \050no origins\051/properties.json" +++ "b/infra/config/generated/builders/ci/MSAN Release \050no origins\051/properties.json"
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "MSAN Release (no origins)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "msan-no-origins", + "gs_acl": "public-read", + "gs_bucket": "chromium-browser-msan" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "msan", + "clobber" + ], + "build_config": "Release", + "config": "chromium_clang", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "MSAN Release (no origins)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/Mac ASAN Release Media/properties.json b/infra/config/generated/builders/ci/Mac ASAN Release Media/properties.json index d2e0e3b..cf845633 100644 --- a/infra/config/generated/builders/ci/Mac ASAN Release Media/properties.json +++ b/infra/config/generated/builders/ci/Mac ASAN Release Media/properties.json
@@ -1,4 +1,47 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Mac ASAN Release Media", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "asan", + "gs_acl": "public-read", + "gs_bucket": "chrome-test-builds/media" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "clobber" + ], + "build_config": "Release", + "config": "chromium_asan", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Mac ASAN Release Media", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/Mac ASAN Release/properties.json b/infra/config/generated/builders/ci/Mac ASAN Release/properties.json index d2e0e3b..c0b5aab 100644 --- a/infra/config/generated/builders/ci/Mac ASAN Release/properties.json +++ b/infra/config/generated/builders/ci/Mac ASAN Release/properties.json
@@ -1,4 +1,47 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Mac ASAN Release", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "asan", + "gs_acl": "public-read", + "gs_bucket": "chromium-browser-asan" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "clobber" + ], + "build_config": "Release", + "config": "chromium_asan", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Mac ASAN Release", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git "a/infra/config/generated/builders/ci/Mac Builder \050reclient compare\051/properties.json" "b/infra/config/generated/builders/ci/Mac Builder \050reclient compare\051/properties.json" index b3dcd4d..1868a992 100644 --- "a/infra/config/generated/builders/ci/Mac Builder \050reclient compare\051/properties.json" +++ "b/infra/config/generated/builders/ci/Mac Builder \050reclient compare\051/properties.json"
@@ -1,4 +1,46 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Mac Builder (reclient compare)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_clang_coverage", + "reclient_test" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Mac Builder (reclient compare)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "ensure_verified": true, "instance": "rbe-chromium-trusted",
diff --git "a/infra/config/generated/builders/ci/Mac Builder \050reclient\051/properties.json" "b/infra/config/generated/builders/ci/Mac Builder \050reclient\051/properties.json" index 84338d0d..ae3c2a47 100644 --- "a/infra/config/generated/builders/ci/Mac Builder \050reclient\051/properties.json" +++ "b/infra/config/generated/builders/ci/Mac Builder \050reclient\051/properties.json"
@@ -1,4 +1,46 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Mac Builder (reclient)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_clang_coverage", + "reclient_test" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Mac Builder (reclient)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "metrics_project": "chromium-reclient-metrics"
diff --git a/infra/config/generated/builders/ci/Mac Builder Next/properties.json b/infra/config/generated/builders/ci/Mac Builder Next/properties.json index b232002..4fbdcc1 100644 --- a/infra/config/generated/builders/ci/Mac Builder Next/properties.json +++ b/infra/config/generated/builders/ci/Mac Builder Next/properties.json
@@ -1,4 +1,49 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Mac Builder Next", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_arch": "arm", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Mac Builder Next", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "mac-builder-next-rel", + "group": "tryserver.chromium.mac" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/Site Isolation Android/properties.json b/infra/config/generated/builders/ci/Site Isolation Android/properties.json index b232002..d399ecea 100644 --- a/infra/config/generated/builders/ci/Site Isolation Android/properties.json +++ b/infra/config/generated/builders/ci/Site Isolation Android/properties.json
@@ -1,4 +1,46 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Site Isolation Android", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "arm64_builder_mb" + }, + "legacy_chromium_config": { + "build_config": "Release", + "config": "android", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Site Isolation Android", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/TSAN Debug/properties.json b/infra/config/generated/builders/ci/TSAN Debug/properties.json index d2e0e3b..a8cc862 100644 --- a/infra/config/generated/builders/ci/TSAN Debug/properties.json +++ b/infra/config/generated/builders/ci/TSAN Debug/properties.json
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "TSAN Debug", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "tsan", + "gs_acl": "public-read", + "gs_bucket": "chromium-browser-tsan" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "tsan2", + "clobber" + ], + "build_config": "Debug", + "config": "chromium_clang", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "TSAN Debug", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/TSAN Release/properties.json b/infra/config/generated/builders/ci/TSAN Release/properties.json index d2e0e3b..78caa0f 100644 --- a/infra/config/generated/builders/ci/TSAN Release/properties.json +++ b/infra/config/generated/builders/ci/TSAN Release/properties.json
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "TSAN Release", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "tsan", + "gs_acl": "public-read", + "gs_bucket": "chromium-browser-tsan" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "tsan2", + "clobber" + ], + "build_config": "Release", + "config": "chromium_clang", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "TSAN Release", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/UBSan Release/properties.json b/infra/config/generated/builders/ci/UBSan Release/properties.json index d2e0e3b..bb34ce6 100644 --- a/infra/config/generated/builders/ci/UBSan Release/properties.json +++ b/infra/config/generated/builders/ci/UBSan Release/properties.json
@@ -1,4 +1,46 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "UBSan Release", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "ubsan", + "gs_acl": "public-read", + "gs_bucket": "chromium-browser-ubsan" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium_linux_ubsan", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "UBSan Release", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/UBSan vptr Release/properties.json b/infra/config/generated/builders/ci/UBSan vptr Release/properties.json index d2e0e3b..bd1a0cb 100644 --- a/infra/config/generated/builders/ci/UBSan vptr Release/properties.json +++ b/infra/config/generated/builders/ci/UBSan vptr Release/properties.json
@@ -1,4 +1,47 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "UBSan vptr Release", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "ubsan-vptr", + "archive_subdir": "vptr", + "gs_acl": "public-read", + "gs_bucket": "chromium-browser-ubsan" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium_linux_ubsan_vptr", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "UBSan vptr Release", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/Win 10 Fast Ring/properties.json b/infra/config/generated/builders/ci/Win 10 Fast Ring/properties.json index c5b49c9..5bf89c90 100644 --- a/infra/config/generated/builders/ci/Win 10 Fast Ring/properties.json +++ b/infra/config/generated/builders/ci/Win 10 Fast Ring/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Win 10 Fast Ring", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Win 10 Fast Ring", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 80,
diff --git a/infra/config/generated/builders/ci/Win ASan Release Media/properties.json b/infra/config/generated/builders/ci/Win ASan Release Media/properties.json index 5dd708a0..04d3cec 100644 --- a/infra/config/generated/builders/ci/Win ASan Release Media/properties.json +++ b/infra/config/generated/builders/ci/Win ASan Release Media/properties.json
@@ -1,4 +1,47 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Win ASan Release Media", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "asan", + "gs_acl": "public-read", + "gs_bucket": "chrome-test-builds/media" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "clobber" + ], + "build_config": "Release", + "config": "chromium_win_clang_asan", + "target_bits": 32 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Win ASan Release Media", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 80,
diff --git a/infra/config/generated/builders/ci/Win ASan Release/properties.json b/infra/config/generated/builders/ci/Win ASan Release/properties.json index 5dd708a0..e7f8daf 100644 --- a/infra/config/generated/builders/ci/Win ASan Release/properties.json +++ b/infra/config/generated/builders/ci/Win ASan Release/properties.json
@@ -1,4 +1,47 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Win ASan Release", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.fuzz", + "clusterfuzz_archive": { + "archive_name_prefix": "asan", + "gs_acl": "public-read", + "gs_bucket": "chromium-browser-asan" + }, + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "clobber" + ], + "build_config": "Release", + "config": "chromium_win_clang_asan", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Win ASan Release", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 80,
diff --git "a/infra/config/generated/builders/ci/Win x64 Builder \050reclient\051\050cross\051/properties.json" "b/infra/config/generated/builders/ci/Win x64 Builder \050reclient\051\050cross\051/properties.json" index 6ccb1721..f60d06a 100644 --- "a/infra/config/generated/builders/ci/Win x64 Builder \050reclient\051\050cross\051/properties.json" +++ "b/infra/config/generated/builders/ci/Win x64 Builder \050reclient\051\050cross\051/properties.json"
@@ -1,4 +1,46 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Win x64 Builder (reclient)(cross)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_clang_coverage", + "reclient_test" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Win x64 Builder (reclient)(cross)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "metrics_project": "chromium-reclient-metrics",
diff --git "a/infra/config/generated/builders/ci/Win x64 Builder \050reclient\051/properties.json" "b/infra/config/generated/builders/ci/Win x64 Builder \050reclient\051/properties.json" index 84338d0d..433f3c5 100644 --- "a/infra/config/generated/builders/ci/Win x64 Builder \050reclient\051/properties.json" +++ "b/infra/config/generated/builders/ci/Win x64 Builder \050reclient\051/properties.json"
@@ -1,4 +1,46 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Win x64 Builder (reclient)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_clang_coverage", + "reclient_test" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Win x64 Builder (reclient)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "metrics_project": "chromium-reclient-metrics"
diff --git a/infra/config/generated/builders/ci/android-11-x86-fyi-rel/properties.json b/infra/config/generated/builders/ci/android-11-x86-fyi-rel/properties.json index b6e2921..cbe6b143 100644 --- a/infra/config/generated/builders/ci/android-11-x86-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/android-11-x86-fyi-rel/properties.json
@@ -1,4 +1,46 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-11-x86-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder_mb" + }, + "legacy_chromium_config": { + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-11-x86-fyi-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/android-annotator-rel/properties.json b/infra/config/generated/builders/ci/android-annotator-rel/properties.json index b6e2921..3014861 100644 --- a/infra/config/generated/builders/ci/android-annotator-rel/properties.json +++ b/infra/config/generated/builders/ci/android-annotator-rel/properties.json
@@ -1,4 +1,49 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-annotator-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-annotator-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/android-asan/properties.json b/infra/config/generated/builders/ci/android-asan/properties.json index 51428c7..3d86f41 100644 --- a/infra/config/generated/builders/ci/android-asan/properties.json +++ b/infra/config/generated/builders/ci/android-asan/properties.json
@@ -1,4 +1,55 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-asan", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-memory-archive", + "builder_group": "chromium.memory", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android_asan", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-asan", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-asan", + "group": "tryserver.chromium.android" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 500,
diff --git a/infra/config/generated/builders/ci/android-backuprefptr-arm-fyi-rel/properties.json b/infra/config/generated/builders/ci/android-backuprefptr-arm-fyi-rel/properties.json index b232002..2a14bb6 100644 --- a/infra/config/generated/builders/ci/android-backuprefptr-arm-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/android-backuprefptr-arm-fyi-rel/properties.json
@@ -1,4 +1,49 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-backuprefptr-arm-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-backuprefptr-arm-fyi-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/android-backuprefptr-arm64-fyi-rel/properties.json b/infra/config/generated/builders/ci/android-backuprefptr-arm64-fyi-rel/properties.json index b232002..5d631273 100644 --- a/infra/config/generated/builders/ci/android-backuprefptr-arm64-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/android-backuprefptr-arm64-fyi-rel/properties.json
@@ -1,4 +1,49 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-backuprefptr-arm64-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-backuprefptr-arm64-fyi-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/android-chrome-pie-x86-wpt-fyi-rel/properties.json b/infra/config/generated/builders/ci/android-chrome-pie-x86-wpt-fyi-rel/properties.json index b6e2921..f909bd9 100644 --- a/infra/config/generated/builders/ci/android-chrome-pie-x86-wpt-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/android-chrome-pie-x86-wpt-fyi-rel/properties.json
@@ -1,4 +1,55 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-chrome-pie-x86-wpt-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-chrome-pie-x86-wpt-fyi-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-chrome-pie-x86-wpt-fyi-rel", + "group": "tryserver.chromium.android" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/android-code-coverage-native/properties.json b/infra/config/generated/builders/ci/android-code-coverage-native/properties.json index cd9f7596..3492eeea 100644 --- a/infra/config/generated/builders/ci/android-code-coverage-native/properties.json +++ b/infra/config/generated/builders/ci/android-code-coverage-native/properties.json
@@ -1,4 +1,57 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-code-coverage-native", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "download_vr_test_apks", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android", + "use_clang_coverage" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-code-coverage-native", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-pie-arm64-coverage-rel", + "group": "tryserver.chromium.android" + } + ] + } + }, "$build/code_coverage": { "coverage_test_types": [ "overall",
diff --git a/infra/config/generated/builders/ci/android-code-coverage/properties.json b/infra/config/generated/builders/ci/android-code-coverage/properties.json index 1e2bf2a..7973de5 100644 --- a/infra/config/generated/builders/ci/android-code-coverage/properties.json +++ b/infra/config/generated/builders/ci/android-code-coverage/properties.json
@@ -1,4 +1,50 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-code-coverage", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "download_vr_test_apks", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-code-coverage", + "project": "chromium" + } + ] + } + }, "$build/code_coverage": { "coverage_test_types": [ "overall",
diff --git a/infra/config/generated/builders/ci/android-cronet-arm64-dbg/properties.json b/infra/config/generated/builders/ci/android-cronet-arm64-dbg/properties.json index d954e2f..f8abc60 100644 --- a/infra/config/generated/builders/ci/android-cronet-arm64-dbg/properties.json +++ b/infra/config/generated/builders/ci/android-cronet-arm64-dbg/properties.json
@@ -1,4 +1,56 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-arm64-dbg", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Debug", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-cronet-arm64-dbg", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-cronet-arm64-dbg", + "group": "tryserver.chromium.android" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 500,
diff --git a/infra/config/generated/builders/ci/android-cronet-arm64-rel/properties.json b/infra/config/generated/builders/ci/android-cronet-arm64-rel/properties.json index d954e2f..274c6de 100644 --- a/infra/config/generated/builders/ci/android-cronet-arm64-rel/properties.json +++ b/infra/config/generated/builders/ci/android-cronet-arm64-rel/properties.json
@@ -1,4 +1,56 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-arm64-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-cronet-arm64-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-cronet-arm64-rel", + "group": "tryserver.chromium.android" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 500,
diff --git a/infra/config/generated/builders/ci/android-cronet-asan-arm-rel/properties.json b/infra/config/generated/builders/ci/android-cronet-asan-arm-rel/properties.json index d954e2f..eeb28c1 100644 --- a/infra/config/generated/builders/ci/android-cronet-asan-arm-rel/properties.json +++ b/infra/config/generated/builders/ci/android-cronet-asan-arm-rel/properties.json
@@ -1,4 +1,56 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-asan-arm-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-cronet-asan-arm-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-cronet-asan-arm-rel", + "group": "tryserver.chromium.android" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 500,
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-rel-kitkat-tests/properties.json b/infra/config/generated/builders/ci/android-cronet-x86-rel-kitkat-tests/properties.json index 1bc707e..78f7837 100644 --- a/infra/config/generated/builders/ci/android-cronet-x86-rel-kitkat-tests/properties.json +++ b/infra/config/generated/builders/ci/android-cronet-x86-rel-kitkat-tests/properties.json
@@ -1,4 +1,92 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-x86-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-x86-rel-kitkat-tests", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "android-cronet-x86-rel", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-cronet-x86-rel-kitkat-tests", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-cronet-x86-rel-kitkat-tests", + "group": "tryserver.chromium.android" + } + ] + } + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-cronet-x86-rel/properties.json b/infra/config/generated/builders/ci/android-cronet-x86-rel/properties.json index d954e2f..aa2a778f 100644 --- a/infra/config/generated/builders/ci/android-cronet-x86-rel/properties.json +++ b/infra/config/generated/builders/ci/android-cronet-x86-rel/properties.json
@@ -1,4 +1,103 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-x86-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-x86-rel-kitkat-tests", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "android-cronet-x86-rel", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-cronet-x86-rel", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "ci", + "builder": "android-cronet-x86-rel-kitkat-tests", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-cronet-x86-rel", + "group": "tryserver.chromium.android" + }, + { + "builder": "android-cronet-x86-rel-kitkat-tests", + "group": "tryserver.chromium.android" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 500,
diff --git a/infra/config/generated/builders/ci/android-pie-arm64-coverage-experimental-rel/properties.json b/infra/config/generated/builders/ci/android-pie-arm64-coverage-experimental-rel/properties.json index d954e2f..5ced0e76 100644 --- a/infra/config/generated/builders/ci/android-pie-arm64-coverage-experimental-rel/properties.json +++ b/infra/config/generated/builders/ci/android-pie-arm64-coverage-experimental-rel/properties.json
@@ -1,4 +1,56 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-pie-arm64-coverage-experimental-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android", + "use_clang_coverage" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-pie-arm64-coverage-experimental-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-pie-arm64-coverage-experimental-rel", + "group": "tryserver.chromium.android" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 500,
diff --git a/infra/config/generated/builders/ci/android-pie-arm64-wpt-rel-non-cq/properties.json b/infra/config/generated/builders/ci/android-pie-arm64-wpt-rel-non-cq/properties.json index b6e2921..5c8bbac 100644 --- a/infra/config/generated/builders/ci/android-pie-arm64-wpt-rel-non-cq/properties.json +++ b/infra/config/generated/builders/ci/android-pie-arm64-wpt-rel-non-cq/properties.json
@@ -1,4 +1,55 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-pie-arm64-wpt-rel-non-cq", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-pie-arm64-wpt-rel-non-cq", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-pie-arm64-wpt-rel-non-cq", + "group": "tryserver.chromium.android" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/android-pie-x86-fyi-rel/properties.json b/infra/config/generated/builders/ci/android-pie-x86-fyi-rel/properties.json index b6e2921..7bcace2 100644 --- a/infra/config/generated/builders/ci/android-pie-x86-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/android-pie-x86-fyi-rel/properties.json
@@ -1,4 +1,49 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-pie-x86-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-pie-x86-fyi-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/android-rust-arm-dbg/properties.json b/infra/config/generated/builders/ci/android-rust-arm-dbg/properties.json index 1e3e28e..4eed56b 100644 --- a/infra/config/generated/builders/ci/android-rust-arm-dbg/properties.json +++ b/infra/config/generated/builders/ci/android-rust-arm-dbg/properties.json
@@ -1,4 +1,56 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-rust-arm-dbg", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.rust", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "android" + ], + "build_config": "Debug", + "config": "android", + "target_arch": "arm", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_rust", + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-rust-arm-dbg", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-rust-arm-dbg", + "group": "tryserver.chromium.rust" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/android-rust-arm-rel/properties.json b/infra/config/generated/builders/ci/android-rust-arm-rel/properties.json index 1e3e28e..82266ff 100644 --- a/infra/config/generated/builders/ci/android-rust-arm-rel/properties.json +++ b/infra/config/generated/builders/ci/android-rust-arm-rel/properties.json
@@ -1,4 +1,56 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-rust-arm-rel", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.rust", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "android" + ], + "build_config": "Release", + "config": "android", + "target_arch": "arm", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_rust", + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-rust-arm-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-rust-arm-rel", + "group": "tryserver.chromium.rust" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/android-webview-pie-x86-wpt-fyi-rel/properties.json b/infra/config/generated/builders/ci/android-webview-pie-x86-wpt-fyi-rel/properties.json index b6e2921..7279c52 100644 --- a/infra/config/generated/builders/ci/android-webview-pie-x86-wpt-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/android-webview-pie-x86-wpt-fyi-rel/properties.json
@@ -1,4 +1,55 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-webview-pie-x86-wpt-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-webview-pie-x86-wpt-fyi-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-webview-pie-x86-wpt-fyi-rel", + "group": "tryserver.chromium.android" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git "a/infra/config/generated/builders/ci/chromeos-amd64-generic-rel \050reclient compare\051/properties.json" "b/infra/config/generated/builders/ci/chromeos-amd64-generic-rel \050reclient compare\051/properties.json" index b3dcd4d..905bd19 100644 --- "a/infra/config/generated/builders/ci/chromeos-amd64-generic-rel \050reclient compare\051/properties.json" +++ "b/infra/config/generated/builders/ci/chromeos-amd64-generic-rel \050reclient compare\051/properties.json"
@@ -1,4 +1,49 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "chromeos-amd64-generic-rel (reclient compare)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "config": "chromium", + "cros_boards_with_qemu_images": [ + "amd64-generic", + "amd64-generic-vm" + ], + "target_bits": 64, + "target_platform": "chromeos" + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "chromeos-amd64-generic-rel (reclient compare)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "ensure_verified": true, "instance": "rbe-chromium-trusted",
diff --git "a/infra/config/generated/builders/ci/chromeos-amd64-generic-rel \050reclient\051/properties.json" "b/infra/config/generated/builders/ci/chromeos-amd64-generic-rel \050reclient\051/properties.json" index 60b39eb..160743f 100644 --- "a/infra/config/generated/builders/ci/chromeos-amd64-generic-rel \050reclient\051/properties.json" +++ "b/infra/config/generated/builders/ci/chromeos-amd64-generic-rel \050reclient\051/properties.json"
@@ -1,4 +1,49 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "chromeos-amd64-generic-rel (reclient)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "config": "chromium", + "cros_boards_with_qemu_images": [ + "amd64-generic", + "amd64-generic-vm" + ], + "target_bits": 64, + "target_platform": "chromeos" + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "chromeos-amd64-generic-rel (reclient)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "metrics_project": "chromium-reclient-metrics",
diff --git a/infra/config/generated/builders/ci/fuchsia-code-coverage/properties.json b/infra/config/generated/builders/ci/fuchsia-code-coverage/properties.json index 736b789..dddb6de 100644 --- a/infra/config/generated/builders/ci/fuchsia-code-coverage/properties.json +++ b/infra/config/generated/builders/ci/fuchsia-code-coverage/properties.json
@@ -1,4 +1,47 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "fuchsia-code-coverage", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64, + "target_platform": "fuchsia" + }, + "legacy_gclient_config": { + "apply_configs": [ + "fuchsia_x64", + "use_clang_coverage" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "fuchsia-code-coverage", + "project": "chromium" + } + ] + } + }, "$build/code_coverage": { "coverage_test_types": [ "overall",
diff --git a/infra/config/generated/builders/ci/ios-simulator-code-coverage/properties.json b/infra/config/generated/builders/ci/ios-simulator-code-coverage/properties.json index 7ac33787..3ad3565 100644 --- a/infra/config/generated/builders/ci/ios-simulator-code-coverage/properties.json +++ b/infra/config/generated/builders/ci/ios-simulator-code-coverage/properties.json
@@ -1,4 +1,47 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ios-simulator-code-coverage", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "mac_toolchain" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64, + "target_platform": "ios" + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_clang_coverage" + ], + "config": "ios" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ios-simulator-code-coverage", + "project": "chromium" + } + ] + } + }, "$build/code_coverage": { "coverage_exclude_sources": "ios_test_files_and_test_utils", "coverage_test_types": [
diff --git a/infra/config/generated/builders/ci/ios-simulator-multi-window/properties.json b/infra/config/generated/builders/ci/ios-simulator-multi-window/properties.json index 0c2d1422..03ddfa9 100644 --- a/infra/config/generated/builders/ci/ios-simulator-multi-window/properties.json +++ b/infra/config/generated/builders/ci/ios-simulator-multi-window/properties.json
@@ -1,4 +1,50 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ios-simulator-multi-window", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "mac_toolchain" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64, + "target_platform": "ios" + }, + "legacy_gclient_config": { + "config": "ios" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ios-simulator-multi-window", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "ios-simulator-multi-window", + "group": "tryserver.chromium.mac" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/ios-webkit-tot/properties.json b/infra/config/generated/builders/ci/ios-webkit-tot/properties.json index ad29b12..cc81c7b 100644 --- a/infra/config/generated/builders/ci/ios-webkit-tot/properties.json +++ b/infra/config/generated/builders/ci/ios-webkit-tot/properties.json
@@ -1,4 +1,47 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ios-webkit-tot", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "mac_toolchain" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64, + "target_platform": "ios" + }, + "legacy_gclient_config": { + "apply_configs": [ + "ios_webkit_tot" + ], + "config": "ios" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ios-webkit-tot", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/ios15-beta-simulator/properties.json b/infra/config/generated/builders/ci/ios15-beta-simulator/properties.json index 0c2d1422..d415f4ec 100644 --- a/infra/config/generated/builders/ci/ios15-beta-simulator/properties.json +++ b/infra/config/generated/builders/ci/ios15-beta-simulator/properties.json
@@ -1,4 +1,50 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ios15-beta-simulator", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "mac_toolchain" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64, + "target_platform": "ios" + }, + "legacy_gclient_config": { + "config": "ios" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ios15-beta-simulator", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "ios15-beta-simulator", + "group": "tryserver.chromium.mac" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/ios15-sdk-simulator/properties.json b/infra/config/generated/builders/ci/ios15-sdk-simulator/properties.json index 0c2d1422..0d7f333 100644 --- a/infra/config/generated/builders/ci/ios15-sdk-simulator/properties.json +++ b/infra/config/generated/builders/ci/ios15-sdk-simulator/properties.json
@@ -1,4 +1,50 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ios15-sdk-simulator", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "mac_toolchain" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64, + "target_platform": "ios" + }, + "legacy_gclient_config": { + "config": "ios" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ios15-sdk-simulator", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "ios15-sdk-simulator", + "group": "tryserver.chromium.mac" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git "a/infra/config/generated/builders/ci/lacros-amd64-generic-rel \050reclient\051/properties.json" "b/infra/config/generated/builders/ci/lacros-amd64-generic-rel \050reclient\051/properties.json" index 014cf54c..c996315 100644 --- "a/infra/config/generated/builders/ci/lacros-amd64-generic-rel \050reclient\051/properties.json" +++ "b/infra/config/generated/builders/ci/lacros-amd64-generic-rel \050reclient\051/properties.json"
@@ -1,4 +1,51 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "lacros-amd64-generic-rel (reclient)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_arch": "intel", + "target_bits": 64, + "target_cros_boards": [ + "amd64-generic" + ], + "target_platform": "chromeos" + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos", + "checkout_lacros_sdk" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "lacros-amd64-generic-rel (reclient)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "metrics_project": "chromium-reclient-metrics",
diff --git a/infra/config/generated/builders/ci/lacros-amd64-generic-rel-fyi/properties.json b/infra/config/generated/builders/ci/lacros-amd64-generic-rel-fyi/properties.json index 342b501..27543bb5 100644 --- a/infra/config/generated/builders/ci/lacros-amd64-generic-rel-fyi/properties.json +++ b/infra/config/generated/builders/ci/lacros-amd64-generic-rel-fyi/properties.json
@@ -1,4 +1,53 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "lacros-amd64-generic-rel-fyi", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "mb_no_luci_auth" + ], + "config": "chromium", + "cros_boards_with_qemu_images": [ + "amd64-generic" + ], + "target_bits": 64, + "target_cros_boards": [ + "eve" + ], + "target_platform": "chromeos" + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos", + "checkout_lacros_sdk" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "lacros-amd64-generic-rel-fyi", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 500,
diff --git a/infra/config/generated/builders/ci/linux-annotator-rel/properties.json b/infra/config/generated/builders/ci/linux-annotator-rel/properties.json index 342b501..670ba72 100644 --- a/infra/config/generated/builders/ci/linux-annotator-rel/properties.json +++ b/infra/config/generated/builders/ci/linux-annotator-rel/properties.json
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-annotator-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-annotator-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "linux-annotator-rel", + "group": "tryserver.chromium.linux" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 500,
diff --git a/infra/config/generated/builders/ci/linux-backuprefptr-x64-fyi-rel/properties.json b/infra/config/generated/builders/ci/linux-backuprefptr-x64-fyi-rel/properties.json index b232002..c00d2d5 100644 --- a/infra/config/generated/builders/ci/linux-backuprefptr-x64-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/linux-backuprefptr-x64-fyi-rel/properties.json
@@ -1,4 +1,43 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-backuprefptr-x64-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64, + "target_platform": "linux" + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-backuprefptr-x64-fyi-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/linux-blink-animation-use-time-delta/properties.json b/infra/config/generated/builders/ci/linux-blink-animation-use-time-delta/properties.json index b232002..cd64075 100644 --- a/infra/config/generated/builders/ci/linux-blink-animation-use-time-delta/properties.json +++ b/infra/config/generated/builders/ci/linux-blink-animation-use-time-delta/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-blink-animation-use-time-delta", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-blink-animation-use-time-delta", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/linux-blink-heap-verification/properties.json b/infra/config/generated/builders/ci/linux-blink-heap-verification/properties.json index 342b501..feb6d553 100644 --- a/infra/config/generated/builders/ci/linux-blink-heap-verification/properties.json +++ b/infra/config/generated/builders/ci/linux-blink-heap-verification/properties.json
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-blink-heap-verification", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-blink-heap-verification", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "linux-blink-heap-verification-try", + "group": "tryserver.chromium.linux" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 500,
diff --git a/infra/config/generated/builders/ci/linux-chromeos-code-coverage/properties.json b/infra/config/generated/builders/ci/linux-chromeos-code-coverage/properties.json index cd9f7596..8912ea9 100644 --- a/infra/config/generated/builders/ci/linux-chromeos-code-coverage/properties.json +++ b/infra/config/generated/builders/ci/linux-chromeos-code-coverage/properties.json
@@ -1,4 +1,47 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-chromeos-code-coverage", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_arch": "intel", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos", + "use_clang_coverage" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-chromeos-code-coverage", + "project": "chromium" + } + ] + } + }, "$build/code_coverage": { "coverage_test_types": [ "overall",
diff --git a/infra/config/generated/builders/ci/linux-code-coverage/properties.json b/infra/config/generated/builders/ci/linux-code-coverage/properties.json index 3d86a409..41dc5d9 100644 --- a/infra/config/generated/builders/ci/linux-code-coverage/properties.json +++ b/infra/config/generated/builders/ci/linux-code-coverage/properties.json
@@ -1,4 +1,45 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-code-coverage", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_clang_coverage" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-code-coverage", + "project": "chromium" + } + ] + } + }, "$build/code_coverage": { "coverage_test_types": [ "overall",
diff --git a/infra/config/generated/builders/ci/linux-fieldtrial-rel/properties.json b/infra/config/generated/builders/ci/linux-fieldtrial-rel/properties.json index b232002..c0e64ec 100644 --- a/infra/config/generated/builders/ci/linux-fieldtrial-rel/properties.json +++ b/infra/config/generated/builders/ci/linux-fieldtrial-rel/properties.json
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-fieldtrial-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-fieldtrial-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "linux-fieldtrial-rel", + "group": "tryserver.chromium.linux" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/linux-headless-shell-rel/properties.json b/infra/config/generated/builders/ci/linux-headless-shell-rel/properties.json index b232002..3a49478 100644 --- a/infra/config/generated/builders/ci/linux-headless-shell-rel/properties.json +++ b/infra/config/generated/builders/ci/linux-headless-shell-rel/properties.json
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-headless-shell-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-headless-shell-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "linux-headless-shell-rel", + "group": "tryserver.chromium.linux" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/linux-lacros-builder-fyi-rel/properties.json b/infra/config/generated/builders/ci/linux-lacros-builder-fyi-rel/properties.json index 342b501..6c53a00 100644 --- a/infra/config/generated/builders/ci/linux-lacros-builder-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/linux-lacros-builder-fyi-rel/properties.json
@@ -1,4 +1,86 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-lacros-builder-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos" + ], + "config": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "linux-lacros-tester-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "linux-lacros-builder-fyi-rel", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-lacros-builder-fyi-rel", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "ci", + "builder": "linux-lacros-tester-fyi-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "linux-lacros-fyi-rel", + "group": "tryserver.chromium.linux" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 500,
diff --git "a/infra/config/generated/builders/ci/linux-lacros-builder-rel \050reclient\051/properties.json" "b/infra/config/generated/builders/ci/linux-lacros-builder-rel \050reclient\051/properties.json" index 984cce6..9170776 100644 --- "a/infra/config/generated/builders/ci/linux-lacros-builder-rel \050reclient\051/properties.json" +++ "b/infra/config/generated/builders/ci/linux-lacros-builder-rel \050reclient\051/properties.json"
@@ -1,4 +1,46 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-lacros-builder-rel (reclient)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_arch": "intel", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-lacros-builder-rel (reclient)", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "metrics_project": "chromium-reclient-metrics",
diff --git a/infra/config/generated/builders/ci/linux-lacros-code-coverage/properties.json b/infra/config/generated/builders/ci/linux-lacros-code-coverage/properties.json index 886262c..7152d7e 100644 --- a/infra/config/generated/builders/ci/linux-lacros-code-coverage/properties.json +++ b/infra/config/generated/builders/ci/linux-lacros-code-coverage/properties.json
@@ -1,4 +1,46 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-lacros-code-coverage", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos", + "use_clang_coverage" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-lacros-code-coverage", + "project": "chromium" + } + ] + } + }, "$build/code_coverage": { "coverage_test_types": [ "overall",
diff --git a/infra/config/generated/builders/ci/linux-lacros-dbg-fyi/properties.json b/infra/config/generated/builders/ci/linux-lacros-dbg-fyi/properties.json index 342b501..368301c1 100644 --- a/infra/config/generated/builders/ci/linux-lacros-dbg-fyi/properties.json +++ b/infra/config/generated/builders/ci/linux-lacros-dbg-fyi/properties.json
@@ -1,4 +1,80 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-lacros-dbg-fyi", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos" + ], + "config": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "linux-lacros-dbg-tests-fyi", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "linux-lacros-dbg-fyi", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-lacros-dbg-fyi", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "ci", + "builder": "linux-lacros-dbg-tests-fyi", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 500,
diff --git a/infra/config/generated/builders/ci/linux-lacros-dbg-tests-fyi/properties.json b/infra/config/generated/builders/ci/linux-lacros-dbg-tests-fyi/properties.json index ef42b767..f036ae25 100644 --- a/infra/config/generated/builders/ci/linux-lacros-dbg-tests-fyi/properties.json +++ b/infra/config/generated/builders/ci/linux-lacros-dbg-tests-fyi/properties.json
@@ -1,4 +1,73 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-lacros-dbg-fyi", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos" + ], + "config": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "linux-lacros-dbg-tests-fyi", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "linux-lacros-dbg-fyi", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-lacros-dbg-tests-fyi", + "project": "chromium" + } + ] + } + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/linux-lacros-tester-fyi-rel/properties.json b/infra/config/generated/builders/ci/linux-lacros-tester-fyi-rel/properties.json index ef42b767..70c7013 100644 --- a/infra/config/generated/builders/ci/linux-lacros-tester-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/linux-lacros-tester-fyi-rel/properties.json
@@ -1,4 +1,79 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-lacros-builder-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos" + ], + "config": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "linux-lacros-tester-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "linux-lacros-builder-fyi-rel", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-lacros-tester-fyi-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "linux-lacros-fyi-rel", + "group": "tryserver.chromium.linux" + } + ] + } + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/linux-lacros-version-skew-fyi/properties.json b/infra/config/generated/builders/ci/linux-lacros-version-skew-fyi/properties.json index 342b501..5140a099 100644 --- a/infra/config/generated/builders/ci/linux-lacros-version-skew-fyi/properties.json +++ b/infra/config/generated/builders/ci/linux-lacros-version-skew-fyi/properties.json
@@ -1,4 +1,51 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-lacros-version-skew-fyi", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-lacros-version-skew-fyi", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "linux-lacros-version-skew-fyi", + "group": "tryserver.chromium.linux" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 500,
diff --git a/infra/config/generated/builders/ci/linux-perfetto-rel/properties.json b/infra/config/generated/builders/ci/linux-perfetto-rel/properties.json index b232002..7775545 100644 --- a/infra/config/generated/builders/ci/linux-perfetto-rel/properties.json +++ b/infra/config/generated/builders/ci/linux-perfetto-rel/properties.json
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-perfetto-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-perfetto-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "linux-perfetto-rel", + "group": "tryserver.chromium.linux" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/linux-rust-x64-dbg/properties.json b/infra/config/generated/builders/ci/linux-rust-x64-dbg/properties.json index 1e3e28e..0866933b 100644 --- a/infra/config/generated/builders/ci/linux-rust-x64-dbg/properties.json +++ b/infra/config/generated/builders/ci/linux-rust-x64-dbg/properties.json
@@ -1,4 +1,50 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-rust-x64-dbg", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.rust", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_rust" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-rust-x64-dbg", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "linux-rust-x64-dbg", + "group": "tryserver.chromium.rust" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/linux-rust-x64-rel/properties.json b/infra/config/generated/builders/ci/linux-rust-x64-rel/properties.json index 1e3e28e..109144f 100644 --- a/infra/config/generated/builders/ci/linux-rust-x64-rel/properties.json +++ b/infra/config/generated/builders/ci/linux-rust-x64-rel/properties.json
@@ -1,4 +1,54 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-rust-x64-rel", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.rust", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_rust" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-rust-x64-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "linux-rust-x64-rel", + "group": "tryserver.chromium.rust" + }, + { + "builder": "linux-rust-x64-rel-android-toolchain", + "group": "tryserver.chromium.rust" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/linux-upload-perfetto/properties.json b/infra/config/generated/builders/ci/linux-upload-perfetto/properties.json index b232002..d03598eb 100644 --- a/infra/config/generated/builders/ci/linux-upload-perfetto/properties.json +++ b/infra/config/generated/builders/ci/linux-upload-perfetto/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-upload-perfetto", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-upload-perfetto", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/linux-wpt-fyi-rel/properties.json b/infra/config/generated/builders/ci/linux-wpt-fyi-rel/properties.json index b232002..88d8d05 100644 --- a/infra/config/generated/builders/ci/linux-wpt-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/linux-wpt-fyi-rel/properties.json
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-wpt-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-wpt-fyi-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "linux-wpt-fyi-rel", + "group": "tryserver.chromium.linux" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/linux-wpt-identity-fyi-rel/properties.json b/infra/config/generated/builders/ci/linux-wpt-identity-fyi-rel/properties.json index b232002..59ee9ec 100644 --- a/infra/config/generated/builders/ci/linux-wpt-identity-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/linux-wpt-identity-fyi-rel/properties.json
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-wpt-identity-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-wpt-identity-fyi-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "linux-wpt-identity-fyi-rel", + "group": "tryserver.chromium.linux" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/linux-wpt-input-fyi-rel/properties.json b/infra/config/generated/builders/ci/linux-wpt-input-fyi-rel/properties.json index b232002..e118898 100644 --- a/infra/config/generated/builders/ci/linux-wpt-input-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/linux-wpt-input-fyi-rel/properties.json
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-wpt-input-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-wpt-input-fyi-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "linux-wpt-input-fyi-rel", + "group": "tryserver.chromium.linux" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/mac-arm64-on-arm64-rel-reclient/properties.json b/infra/config/generated/builders/ci/mac-arm64-on-arm64-rel-reclient/properties.json index 84338d0d..284cb98 100644 --- a/infra/config/generated/builders/ci/mac-arm64-on-arm64-rel-reclient/properties.json +++ b/infra/config/generated/builders/ci/mac-arm64-on-arm64-rel-reclient/properties.json
@@ -1,4 +1,46 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "mac-arm64-on-arm64-rel-reclient", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_arch": "arm", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "reclient_test" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "mac-arm64-on-arm64-rel-reclient", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "metrics_project": "chromium-reclient-metrics"
diff --git a/infra/config/generated/builders/ci/mac-code-coverage/properties.json b/infra/config/generated/builders/ci/mac-code-coverage/properties.json index cd9f7596..75b08d6 100644 --- a/infra/config/generated/builders/ci/mac-code-coverage/properties.json +++ b/infra/config/generated/builders/ci/mac-code-coverage/properties.json
@@ -1,4 +1,45 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "mac-code-coverage", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_clang_coverage" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "mac-code-coverage", + "project": "chromium" + } + ] + } + }, "$build/code_coverage": { "coverage_test_types": [ "overall",
diff --git a/infra/config/generated/builders/ci/mac-hermetic-upgrade-rel/properties.json b/infra/config/generated/builders/ci/mac-hermetic-upgrade-rel/properties.json index b232002..53e57621 100644 --- a/infra/config/generated/builders/ci/mac-hermetic-upgrade-rel/properties.json +++ b/infra/config/generated/builders/ci/mac-hermetic-upgrade-rel/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "mac-hermetic-upgrade-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "mac-hermetic-upgrade-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/mac-upload-perfetto/properties.json b/infra/config/generated/builders/ci/mac-upload-perfetto/properties.json index b232002..3d9dd94 100644 --- a/infra/config/generated/builders/ci/mac-upload-perfetto/properties.json +++ b/infra/config/generated/builders/ci/mac-upload-perfetto/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "mac-upload-perfetto", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "mac-upload-perfetto", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/win-annotator-rel/properties.json b/infra/config/generated/builders/ci/win-annotator-rel/properties.json index c5b49c9..b4650c37 100644 --- a/infra/config/generated/builders/ci/win-annotator-rel/properties.json +++ b/infra/config/generated/builders/ci/win-annotator-rel/properties.json
@@ -1,4 +1,48 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "win-annotator-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "win-annotator-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "win-annotator-rel", + "group": "tryserver.chromium.win" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 80,
diff --git a/infra/config/generated/builders/ci/win-archive-dbg/properties.json b/infra/config/generated/builders/ci/win-archive-dbg/properties.json index fe2893f..bd893a91 100644 --- a/infra/config/generated/builders/ci/win-archive-dbg/properties.json +++ b/infra/config/generated/builders/ci/win-archive-dbg/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "win-archive-dbg", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "clobber", + "mb" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "win-archive-dbg", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 250,
diff --git a/infra/config/generated/builders/ci/win-backuprefptr-x64-fyi-rel/properties.json b/infra/config/generated/builders/ci/win-backuprefptr-x64-fyi-rel/properties.json index c5b49c9..79a681c 100644 --- a/infra/config/generated/builders/ci/win-backuprefptr-x64-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/win-backuprefptr-x64-fyi-rel/properties.json
@@ -1,4 +1,43 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "win-backuprefptr-x64-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64, + "target_platform": "win" + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "win-backuprefptr-x64-fyi-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 80,
diff --git a/infra/config/generated/builders/ci/win-backuprefptr-x86-fyi-rel/properties.json b/infra/config/generated/builders/ci/win-backuprefptr-x86-fyi-rel/properties.json index c5b49c9..8db78fa 100644 --- a/infra/config/generated/builders/ci/win-backuprefptr-x86-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/win-backuprefptr-x86-fyi-rel/properties.json
@@ -1,4 +1,43 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "win-backuprefptr-x86-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 32, + "target_platform": "win" + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "win-backuprefptr-x86-fyi-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 80,
diff --git a/infra/config/generated/builders/ci/win-upload-perfetto/properties.json b/infra/config/generated/builders/ci/win-upload-perfetto/properties.json index c5b49c9..ad2bb9c 100644 --- a/infra/config/generated/builders/ci/win-upload-perfetto/properties.json +++ b/infra/config/generated/builders/ci/win-upload-perfetto/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "win-upload-perfetto", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "win-upload-perfetto", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 80,
diff --git a/infra/config/generated/builders/ci/win10-code-coverage/properties.json b/infra/config/generated/builders/ci/win10-code-coverage/properties.json index 3d86a409..0250be25 100644 --- a/infra/config/generated/builders/ci/win10-code-coverage/properties.json +++ b/infra/config/generated/builders/ci/win10-code-coverage/properties.json
@@ -1,4 +1,45 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "win10-code-coverage", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_clang_coverage" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "win10-code-coverage", + "project": "chromium" + } + ] + } + }, "$build/code_coverage": { "coverage_test_types": [ "overall",
diff --git a/infra/config/generated/builders/ci/win32-arm64-rel/properties.json b/infra/config/generated/builders/ci/win32-arm64-rel/properties.json index c4ff9ee..4dcb096 100644 --- a/infra/config/generated/builders/ci/win32-arm64-rel/properties.json +++ b/infra/config/generated/builders/ci/win32-arm64-rel/properties.json
@@ -1,4 +1,43 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "win32-arm64-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_arch": "arm", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "win32-arm64-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-trusted", "jobs": 150,
diff --git a/infra/config/generated/builders/goma/Chromium Android ARM 32-bit Goma RBE Staging/properties.json b/infra/config/generated/builders/goma/Chromium Android ARM 32-bit Goma RBE Staging/properties.json index 2d0e88ad..258f6f3 100644 --- a/infra/config/generated/builders/goma/Chromium Android ARM 32-bit Goma RBE Staging/properties.json +++ b/infra/config/generated/builders/goma/Chromium Android ARM 32-bit Goma RBE Staging/properties.json
@@ -1,4 +1,47 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Android ARM 32-bit Goma RBE Staging", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder_mb" + }, + "legacy_chromium_config": { + "apply_configs": [ + "goma_failfast" + ], + "config": "chromium", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Android ARM 32-bit Goma RBE Staging", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?staging",
diff --git "a/infra/config/generated/builders/goma/Chromium Android ARM 32-bit Goma RBE ToT \050ATS\051/properties.json" "b/infra/config/generated/builders/goma/Chromium Android ARM 32-bit Goma RBE ToT \050ATS\051/properties.json" index 902f04bf..8a8c964 100644 --- "a/infra/config/generated/builders/goma/Chromium Android ARM 32-bit Goma RBE ToT \050ATS\051/properties.json" +++ "b/infra/config/generated/builders/goma/Chromium Android ARM 32-bit Goma RBE ToT \050ATS\051/properties.json"
@@ -1,4 +1,49 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Android ARM 32-bit Goma RBE ToT (ATS)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder_mb" + }, + "legacy_chromium_config": { + "apply_configs": [ + "goma_failfast", + "goma_client_candidate", + "clobber" + ], + "config": "chromium", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Android ARM 32-bit Goma RBE ToT (ATS)", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?tot",
diff --git a/infra/config/generated/builders/goma/Chromium Android ARM 32-bit Goma RBE ToT/properties.json b/infra/config/generated/builders/goma/Chromium Android ARM 32-bit Goma RBE ToT/properties.json index af49876..1775675 100644 --- a/infra/config/generated/builders/goma/Chromium Android ARM 32-bit Goma RBE ToT/properties.json +++ b/infra/config/generated/builders/goma/Chromium Android ARM 32-bit Goma RBE ToT/properties.json
@@ -1,4 +1,49 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Android ARM 32-bit Goma RBE ToT", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder_mb" + }, + "legacy_chromium_config": { + "apply_configs": [ + "goma_failfast", + "goma_client_candidate", + "clobber" + ], + "config": "chromium", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Android ARM 32-bit Goma RBE ToT", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": false, "rpc_extra_params": "?tot",
diff --git "a/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging \050clobber\051/properties.json" "b/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging \050clobber\051/properties.json" index 2d0e88ad..9794a382 100644 --- "a/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging \050clobber\051/properties.json" +++ "b/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging \050clobber\051/properties.json"
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Linux Goma RBE Staging (clobber)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast", + "clobber" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Linux Goma RBE Staging (clobber)", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?staging",
diff --git "a/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging \050dbg\051 \050clobber\051/properties.json" "b/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging \050dbg\051 \050clobber\051/properties.json" index 2d0e88ad..8a0cb36 100644 --- "a/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging \050dbg\051 \050clobber\051/properties.json" +++ "b/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging \050dbg\051 \050clobber\051/properties.json"
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Linux Goma RBE Staging (dbg) (clobber)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast", + "clobber" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Linux Goma RBE Staging (dbg) (clobber)", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?staging",
diff --git "a/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging \050dbg\051/properties.json" "b/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging \050dbg\051/properties.json" index 2d0e88ad..a404040 100644 --- "a/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging \050dbg\051/properties.json" +++ "b/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging \050dbg\051/properties.json"
@@ -1,4 +1,41 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Linux Goma RBE Staging (dbg)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Linux Goma RBE Staging (dbg)", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?staging",
diff --git a/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging/properties.json b/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging/properties.json index 2d0e88ad..b89b3b9 100644 --- a/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging/properties.json +++ b/infra/config/generated/builders/goma/Chromium Linux Goma RBE Staging/properties.json
@@ -1,4 +1,41 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Linux Goma RBE Staging", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Linux Goma RBE Staging", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?staging",
diff --git "a/infra/config/generated/builders/goma/Chromium Linux Goma RBE ToT \050ATS\051/properties.json" "b/infra/config/generated/builders/goma/Chromium Linux Goma RBE ToT \050ATS\051/properties.json" index 902f04bf..e0ee79b 100644 --- "a/infra/config/generated/builders/goma/Chromium Linux Goma RBE ToT \050ATS\051/properties.json" +++ "b/infra/config/generated/builders/goma/Chromium Linux Goma RBE ToT \050ATS\051/properties.json"
@@ -1,4 +1,43 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Linux Goma RBE ToT (ATS)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast", + "goma_client_candidate", + "clobber" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Linux Goma RBE ToT (ATS)", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?tot",
diff --git a/infra/config/generated/builders/goma/Chromium Linux Goma RBE ToT/properties.json b/infra/config/generated/builders/goma/Chromium Linux Goma RBE ToT/properties.json index af49876..cb37f7db 100644 --- a/infra/config/generated/builders/goma/Chromium Linux Goma RBE ToT/properties.json +++ b/infra/config/generated/builders/goma/Chromium Linux Goma RBE ToT/properties.json
@@ -1,4 +1,43 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Linux Goma RBE ToT", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast", + "goma_client_candidate", + "clobber" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Linux Goma RBE ToT", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": false, "rpc_extra_params": "?tot",
diff --git "a/infra/config/generated/builders/goma/Chromium Mac Goma RBE Staging \050clobber\051/properties.json" "b/infra/config/generated/builders/goma/Chromium Mac Goma RBE Staging \050clobber\051/properties.json" index 52eaabfc..5edad2b 100644 --- "a/infra/config/generated/builders/goma/Chromium Mac Goma RBE Staging \050clobber\051/properties.json" +++ "b/infra/config/generated/builders/goma/Chromium Mac Goma RBE Staging \050clobber\051/properties.json"
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Mac Goma RBE Staging (clobber)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast", + "clobber" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Mac Goma RBE Staging (clobber)", + "project": "chromium" + } + ] + } + }, "$build/goma": { "jobs": 80, "rpc_extra_params": "?staging",
diff --git "a/infra/config/generated/builders/goma/Chromium Mac Goma RBE Staging \050dbg\051/properties.json" "b/infra/config/generated/builders/goma/Chromium Mac Goma RBE Staging \050dbg\051/properties.json" index 52eaabfc..a10a37b 100644 --- "a/infra/config/generated/builders/goma/Chromium Mac Goma RBE Staging \050dbg\051/properties.json" +++ "b/infra/config/generated/builders/goma/Chromium Mac Goma RBE Staging \050dbg\051/properties.json"
@@ -1,4 +1,41 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Mac Goma RBE Staging (dbg)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Mac Goma RBE Staging (dbg)", + "project": "chromium" + } + ] + } + }, "$build/goma": { "jobs": 80, "rpc_extra_params": "?staging",
diff --git a/infra/config/generated/builders/goma/Chromium Mac Goma RBE Staging/properties.json b/infra/config/generated/builders/goma/Chromium Mac Goma RBE Staging/properties.json index 52eaabfc..cc7fe0c8 100644 --- a/infra/config/generated/builders/goma/Chromium Mac Goma RBE Staging/properties.json +++ b/infra/config/generated/builders/goma/Chromium Mac Goma RBE Staging/properties.json
@@ -1,4 +1,41 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Mac Goma RBE Staging", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Mac Goma RBE Staging", + "project": "chromium" + } + ] + } + }, "$build/goma": { "jobs": 80, "rpc_extra_params": "?staging",
diff --git a/infra/config/generated/builders/goma/Chromium Mac Goma RBE ToT/properties.json b/infra/config/generated/builders/goma/Chromium Mac Goma RBE ToT/properties.json index a35a7cd5..867967d 100644 --- a/infra/config/generated/builders/goma/Chromium Mac Goma RBE ToT/properties.json +++ b/infra/config/generated/builders/goma/Chromium Mac Goma RBE ToT/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Mac Goma RBE ToT", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast", + "goma_client_candidate" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Mac Goma RBE ToT", + "project": "chromium" + } + ] + } + }, "$build/goma": { "jobs": 80, "rpc_extra_params": "?tot",
diff --git "a/infra/config/generated/builders/goma/Chromium Win Goma RBE ATS Staging \050clobber\051/properties.json" "b/infra/config/generated/builders/goma/Chromium Win Goma RBE ATS Staging \050clobber\051/properties.json" index 2d0e88ad..02c28fac 100644 --- "a/infra/config/generated/builders/goma/Chromium Win Goma RBE ATS Staging \050clobber\051/properties.json" +++ "b/infra/config/generated/builders/goma/Chromium Win Goma RBE ATS Staging \050clobber\051/properties.json"
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Win Goma RBE ATS Staging (clobber)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast", + "clobber" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Win Goma RBE ATS Staging (clobber)", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?staging",
diff --git a/infra/config/generated/builders/goma/Chromium Win Goma RBE ATS Staging/properties.json b/infra/config/generated/builders/goma/Chromium Win Goma RBE ATS Staging/properties.json index 2d0e88ad..0190f6e 100644 --- a/infra/config/generated/builders/goma/Chromium Win Goma RBE ATS Staging/properties.json +++ b/infra/config/generated/builders/goma/Chromium Win Goma RBE ATS Staging/properties.json
@@ -1,4 +1,41 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Win Goma RBE ATS Staging", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Win Goma RBE ATS Staging", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?staging",
diff --git a/infra/config/generated/builders/goma/Chromium Win Goma RBE ATS ToT/properties.json b/infra/config/generated/builders/goma/Chromium Win Goma RBE ATS ToT/properties.json index 902f04bf..69ace2b 100644 --- a/infra/config/generated/builders/goma/Chromium Win Goma RBE ATS ToT/properties.json +++ b/infra/config/generated/builders/goma/Chromium Win Goma RBE ATS ToT/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Win Goma RBE ATS ToT", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast", + "goma_client_candidate" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Win Goma RBE ATS ToT", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?tot",
diff --git "a/infra/config/generated/builders/goma/Chromium Win Goma RBE Staging \050clobber\051/properties.json" "b/infra/config/generated/builders/goma/Chromium Win Goma RBE Staging \050clobber\051/properties.json" index a202b11..cd8f864 100644 --- "a/infra/config/generated/builders/goma/Chromium Win Goma RBE Staging \050clobber\051/properties.json" +++ "b/infra/config/generated/builders/goma/Chromium Win Goma RBE Staging \050clobber\051/properties.json"
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Win Goma RBE Staging (clobber)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast", + "clobber" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Win Goma RBE Staging (clobber)", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": false, "rpc_extra_params": "?staging",
diff --git a/infra/config/generated/builders/goma/Chromium Win Goma RBE Staging/properties.json b/infra/config/generated/builders/goma/Chromium Win Goma RBE Staging/properties.json index a202b11..1739b5f 100644 --- a/infra/config/generated/builders/goma/Chromium Win Goma RBE Staging/properties.json +++ b/infra/config/generated/builders/goma/Chromium Win Goma RBE Staging/properties.json
@@ -1,4 +1,41 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Win Goma RBE Staging", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Win Goma RBE Staging", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": false, "rpc_extra_params": "?staging",
diff --git a/infra/config/generated/builders/goma/Chromium Win Goma RBE ToT/properties.json b/infra/config/generated/builders/goma/Chromium Win Goma RBE ToT/properties.json index af49876..36e79fa 100644 --- a/infra/config/generated/builders/goma/Chromium Win Goma RBE ToT/properties.json +++ b/infra/config/generated/builders/goma/Chromium Win Goma RBE ToT/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium Win Goma RBE ToT", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "goma_failfast", + "goma_client_candidate" + ], + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium Win Goma RBE ToT", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": false, "rpc_extra_params": "?tot",
diff --git a/infra/config/generated/builders/goma/Chromium iOS Goma RBE ToT/properties.json b/infra/config/generated/builders/goma/Chromium iOS Goma RBE ToT/properties.json index 47677699..c0b995f 100644 --- a/infra/config/generated/builders/goma/Chromium iOS Goma RBE ToT/properties.json +++ b/infra/config/generated/builders/goma/Chromium iOS Goma RBE ToT/properties.json
@@ -1,4 +1,46 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "Chromium iOS Goma RBE ToT", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.goma", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "mac_toolchain", + "goma_failfast", + "goma_client_candidate", + "clobber" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64, + "target_platform": "ios" + }, + "legacy_gclient_config": { + "config": "ios" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "Chromium iOS Goma RBE ToT", + "project": "chromium" + } + ] + } + }, "$build/goma": { "jobs": 80, "rpc_extra_params": "?tot",
diff --git a/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-ats-canary/properties.json b/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-ats-canary/properties.json index 396688e..e78f3df 100644 --- a/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-ats-canary/properties.json +++ b/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-ats-canary/properties.json
@@ -1,4 +1,51 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "android-archive-dbg-goma-rbe-ats-canary", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.goma.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "download_vr_test_apks", + "goma_canary" + ], + "build_config": "Debug", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "android-archive-dbg-goma-rbe-ats-canary", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-ats-latest/properties.json b/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-ats-latest/properties.json index 396688e..bed69bd3 100644 --- a/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-ats-latest/properties.json +++ b/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-ats-latest/properties.json
@@ -1,4 +1,51 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "android-archive-dbg-goma-rbe-ats-latest", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.goma.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "download_vr_test_apks", + "goma_latest_client" + ], + "build_config": "Debug", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "android-archive-dbg-goma-rbe-ats-latest", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-canary/properties.json b/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-canary/properties.json index 396688e..ceff3629 100644 --- a/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-canary/properties.json +++ b/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-canary/properties.json
@@ -1,4 +1,51 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "android-archive-dbg-goma-rbe-canary", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.goma.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "download_vr_test_apks", + "goma_canary" + ], + "build_config": "Debug", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "android-archive-dbg-goma-rbe-canary", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-latest/properties.json b/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-latest/properties.json index 396688e..b0fc45b 100644 --- a/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-latest/properties.json +++ b/infra/config/generated/builders/goma/android-archive-dbg-goma-rbe-latest/properties.json
@@ -1,4 +1,51 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "goma", + "builder": "android-archive-dbg-goma-rbe-latest", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.goma.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "download_vr_test_apks", + "goma_latest_client" + ], + "build_config": "Debug", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "goma", + "builder": "android-archive-dbg-goma-rbe-latest", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/android-asan/properties.json b/infra/config/generated/builders/try/android-asan/properties.json index 0a62872..5bc84d2 100644 --- a/infra/config/generated/builders/try/android-asan/properties.json +++ b/infra/config/generated/builders/try/android-asan/properties.json
@@ -1,4 +1,49 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-asan", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-memory-archive", + "builder_group": "chromium.memory", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android_asan", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-asan", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/android-chrome-pie-x86-wpt-fyi-rel/properties.json b/infra/config/generated/builders/try/android-chrome-pie-x86-wpt-fyi-rel/properties.json index 1758484..dceb0fcb7 100644 --- a/infra/config/generated/builders/try/android-chrome-pie-x86-wpt-fyi-rel/properties.json +++ b/infra/config/generated/builders/try/android-chrome-pie-x86-wpt-fyi-rel/properties.json
@@ -1,4 +1,49 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-chrome-pie-x86-wpt-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-chrome-pie-x86-wpt-fyi-rel", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/android-cronet-arm64-dbg/properties.json b/infra/config/generated/builders/try/android-cronet-arm64-dbg/properties.json index 0a62872..aa9b9d6a 100644 --- a/infra/config/generated/builders/try/android-cronet-arm64-dbg/properties.json +++ b/infra/config/generated/builders/try/android-cronet-arm64-dbg/properties.json
@@ -1,4 +1,50 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-arm64-dbg", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Debug", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-cronet-arm64-dbg", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/android-cronet-arm64-rel/properties.json b/infra/config/generated/builders/try/android-cronet-arm64-rel/properties.json index 0a62872..3ebf8f6 100644 --- a/infra/config/generated/builders/try/android-cronet-arm64-rel/properties.json +++ b/infra/config/generated/builders/try/android-cronet-arm64-rel/properties.json
@@ -1,4 +1,50 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-arm64-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-cronet-arm64-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/android-cronet-asan-arm-rel/properties.json b/infra/config/generated/builders/try/android-cronet-asan-arm-rel/properties.json index 0a62872..fba91d4f5 100644 --- a/infra/config/generated/builders/try/android-cronet-asan-arm-rel/properties.json +++ b/infra/config/generated/builders/try/android-cronet-asan-arm-rel/properties.json
@@ -1,4 +1,50 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-asan-arm-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-cronet-asan-arm-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/android-cronet-x86-rel-kitkat-tests/properties.json b/infra/config/generated/builders/try/android-cronet-x86-rel-kitkat-tests/properties.json index 0a62872..44946cf 100644 --- a/infra/config/generated/builders/try/android-cronet-x86-rel-kitkat-tests/properties.json +++ b/infra/config/generated/builders/try/android-cronet-x86-rel-kitkat-tests/properties.json
@@ -1,4 +1,93 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-x86-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-x86-rel-kitkat-tests", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "android-cronet-x86-rel", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-cronet-x86-rel", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "ci", + "builder": "android-cronet-x86-rel-kitkat-tests", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/android-cronet-x86-rel/properties.json b/infra/config/generated/builders/try/android-cronet-x86-rel/properties.json index 0a62872..7707585 100644 --- a/infra/config/generated/builders/try/android-cronet-x86-rel/properties.json +++ b/infra/config/generated/builders/try/android-cronet-x86-rel/properties.json
@@ -1,4 +1,50 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-x86-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-cronet-x86-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/android-pie-arm64-coverage-experimental-rel/properties.json b/infra/config/generated/builders/try/android-pie-arm64-coverage-experimental-rel/properties.json index 0c09595..7564841a 100644 --- a/infra/config/generated/builders/try/android-pie-arm64-coverage-experimental-rel/properties.json +++ b/infra/config/generated/builders/try/android-pie-arm64-coverage-experimental-rel/properties.json
@@ -1,4 +1,50 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-pie-arm64-coverage-experimental-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android", + "use_clang_coverage" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-pie-arm64-coverage-experimental-rel", + "project": "chromium" + } + ] + } + }, "$build/code_coverage": { "use_clang_coverage": true },
diff --git a/infra/config/generated/builders/try/android-pie-arm64-coverage-rel/properties.json b/infra/config/generated/builders/try/android-pie-arm64-coverage-rel/properties.json index 0c09595..bdf7da5 100644 --- a/infra/config/generated/builders/try/android-pie-arm64-coverage-rel/properties.json +++ b/infra/config/generated/builders/try/android-pie-arm64-coverage-rel/properties.json
@@ -1,4 +1,51 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-code-coverage-native", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "download_vr_test_apks", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android", + "use_clang_coverage" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-code-coverage-native", + "project": "chromium" + } + ] + } + }, "$build/code_coverage": { "use_clang_coverage": true },
diff --git a/infra/config/generated/builders/try/android-pie-arm64-wpt-rel-non-cq/properties.json b/infra/config/generated/builders/try/android-pie-arm64-wpt-rel-non-cq/properties.json index 1758484..42007b4 100644 --- a/infra/config/generated/builders/try/android-pie-arm64-wpt-rel-non-cq/properties.json +++ b/infra/config/generated/builders/try/android-pie-arm64-wpt-rel-non-cq/properties.json
@@ -1,4 +1,49 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-pie-arm64-wpt-rel-non-cq", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-pie-arm64-wpt-rel-non-cq", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/android-rust-arm-dbg/properties.json b/infra/config/generated/builders/try/android-rust-arm-dbg/properties.json index ea3ceba..d3a71507 100644 --- a/infra/config/generated/builders/try/android-rust-arm-dbg/properties.json +++ b/infra/config/generated/builders/try/android-rust-arm-dbg/properties.json
@@ -1,4 +1,50 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-rust-arm-dbg", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.rust", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "android" + ], + "build_config": "Debug", + "config": "android", + "target_arch": "arm", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_rust", + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-rust-arm-dbg", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/android-rust-arm-rel/properties.json b/infra/config/generated/builders/try/android-rust-arm-rel/properties.json index ea3ceba..0065d7c4 100644 --- a/infra/config/generated/builders/try/android-rust-arm-rel/properties.json +++ b/infra/config/generated/builders/try/android-rust-arm-rel/properties.json
@@ -1,4 +1,50 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-rust-arm-rel", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.rust", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "android" + ], + "build_config": "Release", + "config": "android", + "target_arch": "arm", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_rust", + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-rust-arm-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/android-webview-pie-x86-wpt-fyi-rel/properties.json b/infra/config/generated/builders/try/android-webview-pie-x86-wpt-fyi-rel/properties.json index 0a62872..36c82f77 100644 --- a/infra/config/generated/builders/try/android-webview-pie-x86-wpt-fyi-rel/properties.json +++ b/infra/config/generated/builders/try/android-webview-pie-x86-wpt-fyi-rel/properties.json
@@ -1,4 +1,49 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-webview-pie-x86-wpt-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-webview-pie-x86-wpt-fyi-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/ios-simulator-multi-window/properties.json b/infra/config/generated/builders/try/ios-simulator-multi-window/properties.json index f641d35..8b8390ace 100644 --- a/infra/config/generated/builders/try/ios-simulator-multi-window/properties.json +++ b/infra/config/generated/builders/try/ios-simulator-multi-window/properties.json
@@ -1,4 +1,44 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ios-simulator-multi-window", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "mac_toolchain" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64, + "target_platform": "ios" + }, + "legacy_gclient_config": { + "config": "ios" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ios-simulator-multi-window", + "project": "chromium" + } + ] + } + }, "$build/goma": { "rpc_extra_params": "?prod", "server_host": "goma.chromium.org"
diff --git a/infra/config/generated/builders/try/ios15-beta-simulator/properties.json b/infra/config/generated/builders/try/ios15-beta-simulator/properties.json index f641d35..6c66004 100644 --- a/infra/config/generated/builders/try/ios15-beta-simulator/properties.json +++ b/infra/config/generated/builders/try/ios15-beta-simulator/properties.json
@@ -1,4 +1,44 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ios15-beta-simulator", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "mac_toolchain" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64, + "target_platform": "ios" + }, + "legacy_gclient_config": { + "config": "ios" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ios15-beta-simulator", + "project": "chromium" + } + ] + } + }, "$build/goma": { "rpc_extra_params": "?prod", "server_host": "goma.chromium.org"
diff --git a/infra/config/generated/builders/try/ios15-sdk-simulator/properties.json b/infra/config/generated/builders/try/ios15-sdk-simulator/properties.json index f641d35..688006d 100644 --- a/infra/config/generated/builders/try/ios15-sdk-simulator/properties.json +++ b/infra/config/generated/builders/try/ios15-sdk-simulator/properties.json
@@ -1,4 +1,44 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "ios15-sdk-simulator", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "mac_toolchain" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64, + "target_platform": "ios" + }, + "legacy_gclient_config": { + "config": "ios" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "ios15-sdk-simulator", + "project": "chromium" + } + ] + } + }, "$build/goma": { "rpc_extra_params": "?prod", "server_host": "goma.chromium.org"
diff --git a/infra/config/generated/builders/try/leak_detection_linux/properties.json b/infra/config/generated/builders/try/leak_detection_linux/properties.json index 1011d0f..be848ad 100644 --- a/infra/config/generated/builders/try/leak_detection_linux/properties.json +++ b/infra/config/generated/builders/try/leak_detection_linux/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Leak Detection Linux", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-linux-archive", + "builder_group": "chromium.linux", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Leak Detection Linux", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "metrics_project": "chromium-reclient-metrics"
diff --git a/infra/config/generated/builders/try/linux-annotator-rel/properties.json b/infra/config/generated/builders/try/linux-annotator-rel/properties.json index 4c00daf..4d439e4b 100644 --- a/infra/config/generated/builders/try/linux-annotator-rel/properties.json +++ b/infra/config/generated/builders/try/linux-annotator-rel/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-annotator-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-annotator-rel", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/linux-blink-heap-verification-try/properties.json b/infra/config/generated/builders/try/linux-blink-heap-verification-try/properties.json index 2e3af3c..6fe95fd1 100644 --- a/infra/config/generated/builders/try/linux-blink-heap-verification-try/properties.json +++ b/infra/config/generated/builders/try/linux-blink-heap-verification-try/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-blink-heap-verification", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-blink-heap-verification", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/linux-fieldtrial-rel/properties.json b/infra/config/generated/builders/try/linux-fieldtrial-rel/properties.json index 4c00daf..134698b 100644 --- a/infra/config/generated/builders/try/linux-fieldtrial-rel/properties.json +++ b/infra/config/generated/builders/try/linux-fieldtrial-rel/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-fieldtrial-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-fieldtrial-rel", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/linux-headless-shell-rel/properties.json b/infra/config/generated/builders/try/linux-headless-shell-rel/properties.json index 2e3af3c..e81fc40a 100644 --- a/infra/config/generated/builders/try/linux-headless-shell-rel/properties.json +++ b/infra/config/generated/builders/try/linux-headless-shell-rel/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-headless-shell-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-headless-shell-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/linux-lacros-fyi-rel/properties.json b/infra/config/generated/builders/try/linux-lacros-fyi-rel/properties.json index 1011d0f..5e9a30b9 100644 --- a/infra/config/generated/builders/try/linux-lacros-fyi-rel/properties.json +++ b/infra/config/generated/builders/try/linux-lacros-fyi-rel/properties.json
@@ -1,4 +1,80 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-lacros-builder-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos" + ], + "config": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "linux-lacros-tester-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "linux-lacros-builder-fyi-rel", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-lacros-builder-fyi-rel", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "ci", + "builder": "linux-lacros-tester-fyi-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "metrics_project": "chromium-reclient-metrics"
diff --git a/infra/config/generated/builders/try/linux-lacros-version-skew-fyi/properties.json b/infra/config/generated/builders/try/linux-lacros-version-skew-fyi/properties.json index 1011d0f..4b3bfd65 100644 --- a/infra/config/generated/builders/try/linux-lacros-version-skew-fyi/properties.json +++ b/infra/config/generated/builders/try/linux-lacros-version-skew-fyi/properties.json
@@ -1,4 +1,45 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-lacros-version-skew-fyi", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "chromeos" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-lacros-version-skew-fyi", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "metrics_project": "chromium-reclient-metrics"
diff --git a/infra/config/generated/builders/try/linux-layout-tests-edit-ng/properties.json b/infra/config/generated/builders/try/linux-layout-tests-edit-ng/properties.json index 4c00daf..5cb41efc 100644 --- a/infra/config/generated/builders/try/linux-layout-tests-edit-ng/properties.json +++ b/infra/config/generated/builders/try/linux-layout-tests-edit-ng/properties.json
@@ -1,4 +1,41 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "try", + "builder": "linux-layout-tests-edit-ng", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "tryserver.chromium.linux", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "try", + "builder": "linux-layout-tests-edit-ng", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/linux-perfetto-rel/properties.json b/infra/config/generated/builders/try/linux-perfetto-rel/properties.json index 2e3af3c..c64b6bc 100644 --- a/infra/config/generated/builders/try/linux-perfetto-rel/properties.json +++ b/infra/config/generated/builders/try/linux-perfetto-rel/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-perfetto-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-perfetto-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/linux-rust-x64-dbg/properties.json b/infra/config/generated/builders/try/linux-rust-x64-dbg/properties.json index ea3ceba..d5eab85 100644 --- a/infra/config/generated/builders/try/linux-rust-x64-dbg/properties.json +++ b/infra/config/generated/builders/try/linux-rust-x64-dbg/properties.json
@@ -1,4 +1,44 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-rust-x64-dbg", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.rust", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_rust" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-rust-x64-dbg", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/linux-rust-x64-rel-android-toolchain/properties.json b/infra/config/generated/builders/try/linux-rust-x64-rel-android-toolchain/properties.json index ea1393a..2532294 100644 --- a/infra/config/generated/builders/try/linux-rust-x64-rel-android-toolchain/properties.json +++ b/infra/config/generated/builders/try/linux-rust-x64-rel-android-toolchain/properties.json
@@ -1,4 +1,44 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-rust-x64-rel", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.rust", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_rust" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-rust-x64-rel", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/linux-rust-x64-rel/properties.json b/infra/config/generated/builders/try/linux-rust-x64-rel/properties.json index ea3ceba..3f65b95e 100644 --- a/infra/config/generated/builders/try/linux-rust-x64-rel/properties.json +++ b/infra/config/generated/builders/try/linux-rust-x64-rel/properties.json
@@ -1,4 +1,44 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-rust-x64-rel", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.rust", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_rust" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-rust-x64-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/linux-viz-rel/properties.json b/infra/config/generated/builders/try/linux-viz-rel/properties.json index 4c00daf..ceb9522 100644 --- a/infra/config/generated/builders/try/linux-viz-rel/properties.json +++ b/infra/config/generated/builders/try/linux-viz-rel/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Linux Viz", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Linux Viz", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/linux-wpt-fyi-rel/properties.json b/infra/config/generated/builders/try/linux-wpt-fyi-rel/properties.json index 2e3af3c..96658ac 100644 --- a/infra/config/generated/builders/try/linux-wpt-fyi-rel/properties.json +++ b/infra/config/generated/builders/try/linux-wpt-fyi-rel/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-wpt-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-wpt-fyi-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/linux-wpt-identity-fyi-rel/properties.json b/infra/config/generated/builders/try/linux-wpt-identity-fyi-rel/properties.json index 2e3af3c..9763cd2 100644 --- a/infra/config/generated/builders/try/linux-wpt-identity-fyi-rel/properties.json +++ b/infra/config/generated/builders/try/linux-wpt-identity-fyi-rel/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-wpt-identity-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-wpt-identity-fyi-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/linux-wpt-input-fyi-rel/properties.json b/infra/config/generated/builders/try/linux-wpt-input-fyi-rel/properties.json index 2e3af3c..ca0e0fef 100644 --- a/infra/config/generated/builders/try/linux-wpt-input-fyi-rel/properties.json +++ b/infra/config/generated/builders/try/linux-wpt-input-fyi-rel/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-wpt-input-fyi-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-wpt-input-fyi-rel", + "project": "chromium" + } + ] + } + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150,
diff --git a/infra/config/generated/builders/try/mac-builder-next-rel/properties.json b/infra/config/generated/builders/try/mac-builder-next-rel/properties.json index 7aab3194..11d685ae 100644 --- a/infra/config/generated/builders/try/mac-builder-next-rel/properties.json +++ b/infra/config/generated/builders/try/mac-builder-next-rel/properties.json
@@ -1,4 +1,43 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Mac Builder Next", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_arch": "arm", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Mac Builder Next", + "project": "chromium" + } + ] + } + }, "$build/goma": { "rpc_extra_params": "?prod", "server_host": "goma.chromium.org"
diff --git a/infra/config/generated/builders/try/win-annotator-rel/properties.json b/infra/config/generated/builders/try/win-annotator-rel/properties.json index a895634..ba666b0b 100644 --- a/infra/config/generated/builders/try/win-annotator-rel/properties.json +++ b/infra/config/generated/builders/try/win-annotator-rel/properties.json
@@ -1,4 +1,42 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "win-annotator-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-fyi-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "win-annotator-rel", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": false, "rpc_extra_params": "?prod",
diff --git "a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Builder \050dbg\051/properties.json" "b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Builder \050dbg\051/properties.json" index a9cec4c4..7acd229 100644 --- "a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Builder \050dbg\051/properties.json" +++ "b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Builder \050dbg\051/properties.json"
@@ -1,4 +1,97 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Builder (dbg)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "android" + ], + "build_config": "Debug", + "config": "chromium", + "target_arch": "arm", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium_webrtc_tot" + } + } + }, + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Tests (dbg)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "android" + ], + "build_config": "Debug", + "config": "chromium", + "target_arch": "arm", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium_webrtc_tot" + }, + "parent": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Builder (dbg)", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Builder (dbg)", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Tests (dbg)", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git "a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Builder ARM64 \050dbg\051/properties.json" "b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Builder ARM64 \050dbg\051/properties.json" index a9cec4c4..50403f1 100644 --- "a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Builder ARM64 \050dbg\051/properties.json" +++ "b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Builder ARM64 \050dbg\051/properties.json"
@@ -1,4 +1,97 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Builder ARM64 (dbg)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "android" + ], + "build_config": "Debug", + "config": "chromium", + "target_arch": "arm", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium_webrtc_tot" + } + } + }, + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Tests ARM64 (dbg)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "android" + ], + "build_config": "Debug", + "config": "chromium", + "target_arch": "arm", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium_webrtc_tot" + }, + "parent": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Builder ARM64 (dbg)", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Builder ARM64 (dbg)", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Tests ARM64 (dbg)", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Builder/properties.json b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Builder/properties.json index a9cec4c4..321f748 100644 --- a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Builder/properties.json +++ b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Builder/properties.json
@@ -1,4 +1,52 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "android" + ], + "build_config": "Release", + "config": "chromium", + "target_arch": "arm", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium_webrtc_tot" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Builder", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git "a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Tests \050dbg\051/properties.json" "b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Tests \050dbg\051/properties.json" index 7883bfd5..68c7d3e 100644 --- "a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Tests \050dbg\051/properties.json" +++ "b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Tests \050dbg\051/properties.json"
@@ -1,4 +1,90 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Builder (dbg)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "android" + ], + "build_config": "Debug", + "config": "chromium", + "target_arch": "arm", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium_webrtc_tot" + } + } + }, + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Tests (dbg)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "android" + ], + "build_config": "Debug", + "config": "chromium", + "target_arch": "arm", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium_webrtc_tot" + }, + "parent": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Builder (dbg)", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Tests (dbg)", + "project": "chromium" + } + ] + } + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git "a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Tests ARM64 \050dbg\051/properties.json" "b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Tests ARM64 \050dbg\051/properties.json" index 7883bfd5..7b14774 100644 --- "a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Tests ARM64 \050dbg\051/properties.json" +++ "b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Android Tests ARM64 \050dbg\051/properties.json"
@@ -1,4 +1,90 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Builder ARM64 (dbg)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "android" + ], + "build_config": "Debug", + "config": "chromium", + "target_arch": "arm", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium_webrtc_tot" + } + } + }, + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Tests ARM64 (dbg)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "android" + ], + "build_config": "Debug", + "config": "chromium", + "target_arch": "arm", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium_webrtc_tot" + }, + "parent": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Builder ARM64 (dbg)", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Android Tests ARM64 (dbg)", + "project": "chromium" + } + ] + } + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git "a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Linux Builder \050dbg\051/properties.json" "b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Linux Builder \050dbg\051/properties.json" index a9cec4c4..9662055a 100644 --- "a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Linux Builder \050dbg\051/properties.json" +++ "b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Linux Builder \050dbg\051/properties.json"
@@ -1,4 +1,43 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Linux Builder (dbg)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc_tot" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Linux Builder (dbg)", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Linux Builder/properties.json b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Linux Builder/properties.json index a9cec4c4..f3110e6 100644 --- a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Linux Builder/properties.json +++ b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Linux Builder/properties.json
@@ -1,4 +1,82 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Linux Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "webrtc_test_resources" + ], + "config": "chromium_webrtc_tot" + } + } + }, + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Linux Tester", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc_tot" + }, + "parent": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Linux Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Linux Builder", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Linux Tester", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Linux Tester/properties.json b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Linux Tester/properties.json index 7883bfd5..75521ff4 100644 --- a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Linux Tester/properties.json +++ b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Linux Tester/properties.json
@@ -1,4 +1,75 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Linux Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "webrtc_test_resources" + ], + "config": "chromium_webrtc_tot" + } + } + }, + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Linux Tester", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc_tot" + }, + "parent": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Linux Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Linux Tester", + "project": "chromium" + } + ] + } + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git "a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Builder \050dbg\051/properties.json" "b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Builder \050dbg\051/properties.json" index af1a7531..d57c6f26 100644 --- "a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Builder \050dbg\051/properties.json" +++ "b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Builder \050dbg\051/properties.json"
@@ -1,4 +1,43 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Mac Builder (dbg)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc_tot" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Mac Builder (dbg)", + "project": "chromium" + } + ] + } + }, "$build/goma": { "rpc_extra_params": "?prod", "server_host": "goma.chromium.org"
diff --git a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Builder/properties.json b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Builder/properties.json index 33c16eee..a495fd6 100644 --- a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Builder/properties.json +++ b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Builder/properties.json
@@ -1,4 +1,84 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Mac Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "mac_toolchain" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "webrtc_test_resources" + ], + "config": "chromium_webrtc_tot" + } + } + }, + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Mac Tester", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "mac_toolchain" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc_tot" + }, + "parent": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Mac Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Mac Builder", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Mac Tester", + "project": "chromium" + } + ] + } + }, "$build/goma": { "rpc_extra_params": "?prod", "server_host": "goma.chromium.org"
diff --git a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Tester/properties.json b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Tester/properties.json index 80e74f45..bec565c 100644 --- a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Tester/properties.json +++ b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Mac Tester/properties.json
@@ -1,4 +1,77 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Mac Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "mac_toolchain" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "webrtc_test_resources" + ], + "config": "chromium_webrtc_tot" + } + } + }, + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Mac Tester", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "mac_toolchain" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc_tot" + }, + "parent": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Mac Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Mac Tester", + "project": "chromium" + } + ] + } + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git "a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Win Builder \050dbg\051/properties.json" "b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Win Builder \050dbg\051/properties.json" index a9cec4c4..7dfc85a 100644 --- "a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Win Builder \050dbg\051/properties.json" +++ "b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Win Builder \050dbg\051/properties.json"
@@ -1,4 +1,43 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Win Builder (dbg)", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 32 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc_tot" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Win Builder (dbg)", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Win Builder/properties.json b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Win Builder/properties.json index a9cec4c4..ed4b387 100644 --- a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Win Builder/properties.json +++ b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Win Builder/properties.json
@@ -1,4 +1,82 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Win Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 32 + }, + "legacy_gclient_config": { + "apply_configs": [ + "webrtc_test_resources" + ], + "config": "chromium_webrtc_tot" + } + } + }, + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Win10 Tester", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 32 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc_tot" + }, + "parent": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Win Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Win Builder", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Win10 Tester", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Win10 Tester/properties.json b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Win10 Tester/properties.json index 7883bfd5..a6a9c3fa 100644 --- a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Win10 Tester/properties.json +++ b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI Win10 Tester/properties.json
@@ -1,4 +1,75 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Win Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 32 + }, + "legacy_gclient_config": { + "apply_configs": [ + "webrtc_test_resources" + ], + "config": "chromium_webrtc_tot" + } + } + }, + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Win10 Tester", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 32 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc_tot" + }, + "parent": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Win Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI Win10 Tester", + "project": "chromium" + } + ] + } + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-device/properties.json b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-device/properties.json index 33c16eee..99c6e18 100644 --- a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-device/properties.json +++ b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-device/properties.json
@@ -1,4 +1,44 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI ios-device", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "mac_toolchain" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64, + "target_platform": "ios" + }, + "legacy_gclient_config": { + "config": "ios" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI ios-device", + "project": "chromium" + } + ] + } + }, "$build/goma": { "rpc_extra_params": "?prod", "server_host": "goma.chromium.org"
diff --git a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-simulator/properties.json b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-simulator/properties.json index 33c16eee..edfd0dae 100644 --- a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-simulator/properties.json +++ b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-simulator/properties.json
@@ -1,4 +1,44 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI ios-simulator", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb", + "mac_toolchain" + ], + "build_config": "Debug", + "config": "chromium", + "target_bits": 64, + "target_platform": "ios" + }, + "legacy_gclient_config": { + "config": "ios" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc.fyi", + "builder": "WebRTC Chromium FYI ios-simulator", + "project": "chromium" + } + ] + } + }, "$build/goma": { "rpc_extra_params": "?prod", "server_host": "goma.chromium.org"
diff --git a/infra/config/generated/builders/webrtc/WebRTC Chromium Android Builder/properties.json b/infra/config/generated/builders/webrtc/WebRTC Chromium Android Builder/properties.json index 71427de4..3ff0d43d 100644 --- a/infra/config/generated/builders/webrtc/WebRTC Chromium Android Builder/properties.json +++ b/infra/config/generated/builders/webrtc/WebRTC Chromium Android Builder/properties.json
@@ -1,4 +1,97 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Android Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "android" + ], + "build_config": "Release", + "config": "chromium", + "target_arch": "arm", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium_webrtc" + } + } + }, + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Android Tester", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "android" + ], + "build_config": "Release", + "config": "chromium", + "target_arch": "arm", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium_webrtc" + }, + "parent": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Android Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc", + "builder": "WebRTC Chromium Android Builder", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "webrtc", + "builder": "WebRTC Chromium Android Tester", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/webrtc/WebRTC Chromium Android Tester/properties.json b/infra/config/generated/builders/webrtc/WebRTC Chromium Android Tester/properties.json index 2cf90e9..f150ae1c 100644 --- a/infra/config/generated/builders/webrtc/WebRTC Chromium Android Tester/properties.json +++ b/infra/config/generated/builders/webrtc/WebRTC Chromium Android Tester/properties.json
@@ -1,4 +1,90 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Android Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "android" + ], + "build_config": "Release", + "config": "chromium", + "target_arch": "arm", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium_webrtc" + } + } + }, + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Android Tester", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "android" + ], + "build_config": "Release", + "config": "chromium", + "target_arch": "arm", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium_webrtc" + }, + "parent": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Android Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc", + "builder": "WebRTC Chromium Android Tester", + "project": "chromium" + } + ] + } + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git a/infra/config/generated/builders/webrtc/WebRTC Chromium Linux Builder/properties.json b/infra/config/generated/builders/webrtc/WebRTC Chromium Linux Builder/properties.json index 71427de4..92f9627 100644 --- a/infra/config/generated/builders/webrtc/WebRTC Chromium Linux Builder/properties.json +++ b/infra/config/generated/builders/webrtc/WebRTC Chromium Linux Builder/properties.json
@@ -1,4 +1,82 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Linux Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "webrtc_test_resources" + ], + "config": "chromium_webrtc" + } + } + }, + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Linux Tester", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc" + }, + "parent": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Linux Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc", + "builder": "WebRTC Chromium Linux Builder", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "webrtc", + "builder": "WebRTC Chromium Linux Tester", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/webrtc/WebRTC Chromium Linux Tester/properties.json b/infra/config/generated/builders/webrtc/WebRTC Chromium Linux Tester/properties.json index 2cf90e9..d23a75e 100644 --- a/infra/config/generated/builders/webrtc/WebRTC Chromium Linux Tester/properties.json +++ b/infra/config/generated/builders/webrtc/WebRTC Chromium Linux Tester/properties.json
@@ -1,4 +1,75 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Linux Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "webrtc_test_resources" + ], + "config": "chromium_webrtc" + } + } + }, + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Linux Tester", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc" + }, + "parent": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Linux Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc", + "builder": "WebRTC Chromium Linux Tester", + "project": "chromium" + } + ] + } + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git a/infra/config/generated/builders/webrtc/WebRTC Chromium Mac Builder/properties.json b/infra/config/generated/builders/webrtc/WebRTC Chromium Mac Builder/properties.json index 9002dbd..416de97 100644 --- a/infra/config/generated/builders/webrtc/WebRTC Chromium Mac Builder/properties.json +++ b/infra/config/generated/builders/webrtc/WebRTC Chromium Mac Builder/properties.json
@@ -1,4 +1,84 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Mac Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "mac_toolchain" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "webrtc_test_resources" + ], + "config": "chromium_webrtc" + } + } + }, + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Mac Tester", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "mac_toolchain" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc" + }, + "parent": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Mac Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc", + "builder": "WebRTC Chromium Mac Builder", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "webrtc", + "builder": "WebRTC Chromium Mac Tester", + "project": "chromium" + } + ] + } + }, "$build/goma": { "rpc_extra_params": "?prod", "server_host": "goma.chromium.org"
diff --git a/infra/config/generated/builders/webrtc/WebRTC Chromium Mac Tester/properties.json b/infra/config/generated/builders/webrtc/WebRTC Chromium Mac Tester/properties.json index b652460..bdcc58d 100644 --- a/infra/config/generated/builders/webrtc/WebRTC Chromium Mac Tester/properties.json +++ b/infra/config/generated/builders/webrtc/WebRTC Chromium Mac Tester/properties.json
@@ -1,4 +1,77 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Mac Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "mac_toolchain" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "webrtc_test_resources" + ], + "config": "chromium_webrtc" + } + } + }, + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Mac Tester", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb", + "mac_toolchain" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc" + }, + "parent": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Mac Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc", + "builder": "WebRTC Chromium Mac Tester", + "project": "chromium" + } + ] + } + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git a/infra/config/generated/builders/webrtc/WebRTC Chromium Win Builder/properties.json b/infra/config/generated/builders/webrtc/WebRTC Chromium Win Builder/properties.json index 71427de4..8dda881 100644 --- a/infra/config/generated/builders/webrtc/WebRTC Chromium Win Builder/properties.json +++ b/infra/config/generated/builders/webrtc/WebRTC Chromium Win Builder/properties.json
@@ -1,4 +1,82 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Win Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 32 + }, + "legacy_gclient_config": { + "apply_configs": [ + "webrtc_test_resources" + ], + "config": "chromium_webrtc" + } + } + }, + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Win10 Tester", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 32 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc" + }, + "parent": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Win Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc", + "builder": "WebRTC Chromium Win Builder", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "webrtc", + "builder": "WebRTC Chromium Win10 Tester", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/webrtc/WebRTC Chromium Win10 Tester/properties.json b/infra/config/generated/builders/webrtc/WebRTC Chromium Win10 Tester/properties.json index 2cf90e9..2ad0719 100644 --- a/infra/config/generated/builders/webrtc/WebRTC Chromium Win10 Tester/properties.json +++ b/infra/config/generated/builders/webrtc/WebRTC Chromium Win10 Tester/properties.json
@@ -1,4 +1,75 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Win Builder", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 32 + }, + "legacy_gclient_config": { + "apply_configs": [ + "webrtc_test_resources" + ], + "config": "chromium_webrtc" + } + } + }, + { + "builder_id": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Win10 Tester", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-webrtc", + "builder_group": "chromium.webrtc", + "execution_mode": "TEST", + "legacy_chromium_config": { + "apply_configs": [ + "dcheck", + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 32 + }, + "legacy_gclient_config": { + "config": "chromium_webrtc" + }, + "parent": { + "bucket": "webrtc", + "builder": "WebRTC Chromium Win Builder", + "project": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "webrtc", + "builder": "WebRTC Chromium Win10 Tester", + "project": "chromium" + } + ] + } + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git a/infra/config/generated/luci/cr-buildbucket-dev.cfg b/infra/config/generated/luci/cr-buildbucket-dev.cfg index 0fce607e..98ae799b 100644 --- a/infra/config/generated/luci/cr-buildbucket-dev.cfg +++ b/infra/config/generated/luci/cr-buildbucket-dev.cfg
@@ -118,6 +118,42 @@ } properties: '{' + ' "$build/chromium_tests_builder_config": {' + ' "builder_config": {' + ' "builder_db": {' + ' "entries": [' + ' {' + ' "builder_id": {' + ' "bucket": "ci",' + ' "builder": "linux-rel-swarming",' + ' "project": "chromium"' + ' },' + ' "builder_spec": {' + ' "builder_group": "chromium.dev",' + ' "execution_mode": "COMPILE_AND_TEST",' + ' "legacy_chromium_config": {' + ' "apply_configs": [' + ' "mb"' + ' ],' + ' "build_config": "Release",' + ' "config": "chromium"' + ' },' + ' "legacy_gclient_config": {' + ' "config": "chromium"' + ' }' + ' }' + ' }' + ' ]' + ' },' + ' "builder_ids": [' + ' {' + ' "bucket": "ci",' + ' "builder": "linux-rel-swarming",' + ' "project": "chromium"' + ' }' + ' ]' + ' }' + ' },' ' "$build/goma": {' ' "enable_ats": true,' ' "rpc_extra_params": "?prod",' @@ -177,6 +213,42 @@ } properties: '{' + ' "$build/chromium_tests_builder_config": {' + ' "builder_config": {' + ' "builder_db": {' + ' "entries": [' + ' {' + ' "builder_id": {' + ' "bucket": "ci",' + ' "builder": "linux-ssd-rel-swarming",' + ' "project": "chromium"' + ' },' + ' "builder_spec": {' + ' "builder_group": "chromium.dev",' + ' "execution_mode": "COMPILE_AND_TEST",' + ' "legacy_chromium_config": {' + ' "apply_configs": [' + ' "mb"' + ' ],' + ' "build_config": "Release",' + ' "config": "chromium"' + ' },' + ' "legacy_gclient_config": {' + ' "config": "chromium"' + ' }' + ' }' + ' }' + ' ]' + ' },' + ' "builder_ids": [' + ' {' + ' "bucket": "ci",' + ' "builder": "linux-ssd-rel-swarming",' + ' "project": "chromium"' + ' }' + ' ]' + ' }' + ' },' ' "$build/goma": {' ' "enable_ats": true,' ' "rpc_extra_params": "?prod",' @@ -235,6 +307,42 @@ } properties: '{' + ' "$build/chromium_tests_builder_config": {' + ' "builder_config": {' + ' "builder_db": {' + ' "entries": [' + ' {' + ' "builder_id": {' + ' "bucket": "ci",' + ' "builder": "mac-arm-rel-swarming",' + ' "project": "chromium"' + ' },' + ' "builder_spec": {' + ' "builder_group": "chromium.dev",' + ' "execution_mode": "COMPILE_AND_TEST",' + ' "legacy_chromium_config": {' + ' "apply_configs": [' + ' "mb"' + ' ],' + ' "build_config": "Release",' + ' "config": "chromium"' + ' },' + ' "legacy_gclient_config": {' + ' "config": "chromium"' + ' }' + ' }' + ' }' + ' ]' + ' },' + ' "builder_ids": [' + ' {' + ' "bucket": "ci",' + ' "builder": "mac-arm-rel-swarming",' + ' "project": "chromium"' + ' }' + ' ]' + ' }' + ' },' ' "$build/goma": {' ' "rpc_extra_params": "?prod",' ' "server_host": "goma.chromium.org"' @@ -291,6 +399,42 @@ } properties: '{' + ' "$build/chromium_tests_builder_config": {' + ' "builder_config": {' + ' "builder_db": {' + ' "entries": [' + ' {' + ' "builder_id": {' + ' "bucket": "ci",' + ' "builder": "mac-rel-swarming",' + ' "project": "chromium"' + ' },' + ' "builder_spec": {' + ' "builder_group": "chromium.dev",' + ' "execution_mode": "COMPILE_AND_TEST",' + ' "legacy_chromium_config": {' + ' "apply_configs": [' + ' "mb"' + ' ],' + ' "build_config": "Release",' + ' "config": "chromium"' + ' },' + ' "legacy_gclient_config": {' + ' "config": "chromium"' + ' }' + ' }' + ' }' + ' ]' + ' },' + ' "builder_ids": [' + ' {' + ' "bucket": "ci",' + ' "builder": "mac-rel-swarming",' + ' "project": "chromium"' + ' }' + ' ]' + ' }' + ' },' ' "$build/goma": {' ' "rpc_extra_params": "?prod",' ' "server_host": "goma.chromium.org"' @@ -347,6 +491,42 @@ } properties: '{' + ' "$build/chromium_tests_builder_config": {' + ' "builder_config": {' + ' "builder_db": {' + ' "entries": [' + ' {' + ' "builder_id": {' + ' "bucket": "ci",' + ' "builder": "win-rel-swarming",' + ' "project": "chromium"' + ' },' + ' "builder_spec": {' + ' "builder_group": "chromium.dev",' + ' "execution_mode": "COMPILE_AND_TEST",' + ' "legacy_chromium_config": {' + ' "apply_configs": [' + ' "mb"' + ' ],' + ' "build_config": "Release",' + ' "config": "chromium"' + ' },' + ' "legacy_gclient_config": {' + ' "config": "chromium"' + ' }' + ' }' + ' }' + ' ]' + ' },' + ' "builder_ids": [' + ' {' + ' "bucket": "ci",' + ' "builder": "win-rel-swarming",' + ' "project": "chromium"' + ' }' + ' ]' + ' }' + ' },' ' "$build/goma": {' ' "enable_ats": true,' ' "rpc_extra_params": "?prod",' @@ -404,6 +584,42 @@ } properties: '{' + ' "$build/chromium_tests_builder_config": {' + ' "builder_config": {' + ' "builder_db": {' + ' "entries": [' + ' {' + ' "builder_id": {' + ' "bucket": "ci",' + ' "builder": "win11-rel-swarming",' + ' "project": "chromium"' + ' },' + ' "builder_spec": {' + ' "builder_group": "chromium.dev",' + ' "execution_mode": "COMPILE_AND_TEST",' + ' "legacy_chromium_config": {' + ' "apply_configs": [' + ' "mb"' + ' ],' + ' "build_config": "Release",' + ' "config": "chromium"' + ' },' + ' "legacy_gclient_config": {' + ' "config": "chromium"' + ' }' + ' }' + ' }' + ' ]' + ' },' + ' "builder_ids": [' + ' {' + ' "bucket": "ci",' + ' "builder": "win11-rel-swarming",' + ' "project": "chromium"' + ' }' + ' ]' + ' }' + ' },' ' "$build/goma": {' ' "enable_ats": true,' ' "rpc_extra_params": "?prod",'
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 0558e84..baf950f 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -37312,6 +37312,48 @@ ' }' ' ]' ' },' + ' "$build/chromium_tests_builder_config": {' + ' "builder_config": {' + ' "builder_db": {' + ' "entries": [' + ' {' + ' "builder_id": {' + ' "bucket": "ci",' + ' "builder": "linux-ash-chromium-generator-rel",' + ' "project": "chromium"' + ' },' + ' "builder_spec": {' + ' "build_gs_bucket": "chromium-chromiumos-archive",' + ' "builder_group": "chromium.chromiumos",' + ' "execution_mode": "COMPILE_AND_TEST",' + ' "legacy_chromium_config": {' + ' "apply_configs": [' + ' "mb"' + ' ],' + ' "build_config": "Release",' + ' "config": "chromium",' + ' "target_arch": "intel",' + ' "target_bits": 64' + ' },' + ' "legacy_gclient_config": {' + ' "apply_configs": [' + ' "chromeos"' + ' ],' + ' "config": "chromium"' + ' }' + ' }' + ' }' + ' ]' + ' },' + ' "builder_ids": [' + ' {' + ' "bucket": "ci",' + ' "builder": "linux-ash-chromium-generator-rel",' + ' "project": "chromium"' + ' }' + ' ]' + ' }' + ' },' ' "$build/goma": {' ' "enable_ats": true,' ' "rpc_extra_params": "?prod",' @@ -40748,7 +40790,7 @@ ' "recipe": "chromium"' '}' priority: 35 - execution_timeout_secs: 10800 + execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments {
diff --git a/infra/config/subprojects/chrome/try.star b/infra/config/subprojects/chrome/try.star index 43fb1c0..3dfdfae 100644 --- a/infra/config/subprojects/chrome/try.star +++ b/infra/config/subprojects/chrome/try.star
@@ -30,11 +30,11 @@ branches.cq_tryjob_verifier( builder = "{}:try/{}".format(settings.chrome_project, builder), + cancel_stale = tryjob.cancel_stale, cq_group = "cq", disable_reuse = tryjob.disable_reuse, experiment_percentage = tryjob.experiment_percentage, location_filters = location_filters, - cancel_stale = tryjob.cancel_stale, result_visibility = cq.COMMENT_LEVEL_RESTRICTED, ) else: @@ -134,8 +134,8 @@ ) chrome_internal_verifier( - builder = "lacros-amd64-generic-chrome-skylab", branch_selector = branches.STANDARD_MILESTONE, + builder = "lacros-amd64-generic-chrome-skylab", ) chrome_internal_verifier( @@ -151,13 +151,13 @@ ) chrome_internal_verifier( - builder = "linux-chrome", branch_selector = branches.STANDARD_MILESTONE, + builder = "linux-chrome", ) chrome_internal_verifier( - builder = "linux-chrome-stable", branch_selector = branches.STANDARD_MILESTONE, + builder = "linux-chrome-stable", ) chrome_internal_verifier( @@ -176,28 +176,28 @@ ) chrome_internal_verifier( + branch_selector = branches.STANDARD_MILESTONE, builder = "linux-pgo", - branch_selector = branches.STANDARD_MILESTONE, ) chrome_internal_verifier( + branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, builder = "mac-chrome", - branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, ) chrome_internal_verifier( + branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, builder = "mac-chrome-stable", - branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, ) chrome_internal_verifier( + branch_selector = branches.STANDARD_MILESTONE, builder = "mac-arm-pgo", - branch_selector = branches.STANDARD_MILESTONE, ) chrome_internal_verifier( - builder = "mac-pgo", branch_selector = branches.STANDARD_MILESTONE, + builder = "mac-pgo", ) chrome_internal_verifier( @@ -205,31 +205,31 @@ ) chrome_internal_verifier( + branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, builder = "win-chrome", - branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, ) chrome_internal_verifier( + branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, builder = "win-chrome-stable", - branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, ) chrome_internal_verifier( + branch_selector = branches.STANDARD_MILESTONE, builder = "win32-pgo", - branch_selector = branches.STANDARD_MILESTONE, ) chrome_internal_verifier( + branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, builder = "win64-chrome", - branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, ) chrome_internal_verifier( + branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, builder = "win64-chrome-stable", - branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, ) chrome_internal_verifier( - builder = "win64-pgo", branch_selector = branches.STANDARD_MILESTONE, + builder = "win64-pgo", )
diff --git a/infra/config/subprojects/chromium/angle.try.star b/infra/config/subprojects/chromium/angle.try.star index 6eb6f8f..9825dba 100644 --- a/infra/config/subprojects/chromium/angle.try.star +++ b/infra/config/subprojects/chromium/angle.try.star
@@ -8,26 +8,26 @@ try_.defaults.set( bucket = "try", - build_numbers = True, builder_group = "tryserver.chromium.angle", + executable = "recipe:angle_chromium_trybot", + cores = 8, + os = os.LINUX_DEFAULT, + cpu = cpu.X86_64, + pool = "luci.chromium.try", + service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com", + build_numbers = True, caches = [ swarming.cache( name = "win_toolchain", path = "win_toolchain", ), ], - cores = 8, - cpu = cpu.X86_64, cq_group = "cq", - executable = "recipe:angle_chromium_trybot", execution_timeout = 2 * time.hour, # Max. pending time for builds. CQ considers builds pending >2h as timed # out: http://shortn/_8PaHsdYmlq. Keep this in sync. expiration_timeout = 2 * time.hour, goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_DEFAULT, - pool = "luci.chromium.try", - service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com", subproject_list_view = "luci.chromium.try", task_template_canary_percentage = 5, ) @@ -49,8 +49,8 @@ "ci/ios-angle-builder", "ci/ios-angle-intel", ], - pool = "luci.chromium.gpu.mac.mini.intel.try", try_settings = builder_config.try_settings( retry_failed_shards = False, ), + pool = "luci.chromium.gpu.mac.mini.intel.try", )
diff --git a/infra/config/subprojects/chromium/ci.star b/infra/config/subprojects/chromium/ci.star index 1228a595..2724142 100644 --- a/infra/config/subprojects/chromium/ci.star +++ b/infra/config/subprojects/chromium/ci.star
@@ -11,10 +11,10 @@ # Bucket-wide defaults ci.defaults.set( bucket = "ci", - build_numbers = True, - cpu = cpu.X86_64, triggered_by = ["chromium-gitiles-trigger"], + cpu = cpu.X86_64, free_space = builders.free_space.standard, + build_numbers = True, ) luci.bucket( @@ -26,11 +26,6 @@ ), acl.entry( roles = acl.BUILDBUCKET_TRIGGERER, - users = [ - # Allow chrome-release/branch builders on luci.chrome.official.infra - # to schedule builds - "chrome-official-brancher@chops-service-accounts.iam.gserviceaccount.com", - ], groups = [ "project-chromium-ci-schedulers", # Allow currently-oncall sheriffs to cancel builds. Useful when @@ -38,6 +33,11 @@ # or fix yet. "mdb/chrome-active-sheriffs", ], + users = [ + # Allow chrome-release/branch builders on luci.chrome.official.infra + # to schedule builds + "chrome-official-brancher@chops-service-accounts.iam.gserviceaccount.com", + ], ), acl.entry( roles = acl.BUILDBUCKET_OWNER, @@ -60,8 +60,8 @@ [consoles.overview_console_view( name = name, repo = "https://chromium.googlesource.com/chromium/src", - refs = [settings.ref], title = title, + refs = [settings.ref], top_level_ordering = [ "chromium", "chromium.win", @@ -91,8 +91,8 @@ # The main console includes some entries for builders from the chrome project [branches.console_view_entry( - builder = "chrome:ci/{}".format(name), console_view = "main", + builder = "chrome:ci/{}".format(name), category = "chrome", short_name = short_name, ) for name, short_name in ( @@ -120,8 +120,8 @@ # The sheriff.fuchsia console includes some entries for builders from the chrome project [branches.console_view_entry( - builder = "chrome:ci/{}".format(name), console_view = "sheriff.fuchsia", + builder = "chrome:ci/{}".format(name), category = category, short_name = short_name, ) for name, category, short_name in (
diff --git a/infra/config/subprojects/chromium/ci/blink.infra.star b/infra/config/subprojects/chromium/ci/blink.infra.star index c0ba0f6..d6cc5b4 100644 --- a/infra/config/subprojects/chromium/ci/blink.infra.star +++ b/infra/config/subprojects/chromium/ci/blink.infra.star
@@ -7,9 +7,9 @@ load("//lib/consoles.star", "consoles") ci.defaults.set( + pool = ci.DEFAULT_POOL, console_view = "blink.infra", execution_timeout = 10 * time.hour, - pool = ci.DEFAULT_POOL, ) consoles.console_view( @@ -18,15 +18,13 @@ ci.builder( name = "Blink Unexpected Pass Finder", + executable = "recipe:chromium_expectation_files/expectation_file_scripts", + triggered_by = [], builderless = True, cores = 16, console_view_entry = consoles.console_view_entry( short_name = "upf", ), - executable = "recipe:chromium_expectation_files/expectation_file_scripts", - # Run once daily at 12 AM Pacific/7 AM UTC. - schedule = "0 7 * * *", - triggered_by = [], service_account = "chromium-automated-expectation@chops-service-accounts.iam.gserviceaccount.com", properties = { "scripts": [ @@ -66,4 +64,6 @@ }, ], }, + # Run once daily at 12 AM Pacific/7 AM UTC. + schedule = "0 7 * * *", )
diff --git a/infra/config/subprojects/chromium/ci/checks.star b/infra/config/subprojects/chromium/ci/checks.star index 75c2695..91043be 100644 --- a/infra/config/subprojects/chromium/ci/checks.star +++ b/infra/config/subprojects/chromium/ci/checks.star
@@ -8,8 +8,8 @@ load("//lib/consoles.star", "consoles") ci.defaults.set( - console_view = "checks", service_account = ci.DEFAULT_SERVICE_ACCOUNT, + console_view = "checks", ) consoles.console_view( @@ -18,16 +18,19 @@ ci.builder( name = "linux-presubmit", + executable = "recipe:presubmit", + builderless = True, + cores = 32, + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( console_view = "checks", category = "presubmit", short_name = "linux", ), - cores = 32, - builderless = True, execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - os = os.LINUX_DEFAULT, - executable = "recipe:presubmit", + + # TODO(crbug.com/1370463): remove this. + omit_python2 = False, properties = { "$depot_tools/presubmit": { "runhooks": True, @@ -35,7 +38,4 @@ }, "repo_name": "chromium", }, - - # TODO(crbug.com/1370463): remove this. - omit_python2 = False, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.accessibility.star b/infra/config/subprojects/chromium/ci/chromium.accessibility.star index 7dbdeba..43c193e3 100644 --- a/infra/config/subprojects/chromium/ci/chromium.accessibility.star +++ b/infra/config/subprojects/chromium/ci/chromium.accessibility.star
@@ -10,15 +10,15 @@ ci.defaults.set( builder_group = "chromium.accessibility", - cores = 8, executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - notifies = ["cr-accessibility"], + cores = 8, os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + notifies = ["cr-accessibility"], + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) consoles.console_view( @@ -28,15 +28,15 @@ ci.builder( name = "linux-blink-web-tests-force-accessibility-rel", builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], build_config = builder_config.build_config.RELEASE, target_bits = 64, ), - gclient_config = builder_config.gclient_config( - config = "chromium", - ), ), console_view_entry = consoles.console_view_entry( category = "rel",
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star index eec753fb..90b25779 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
@@ -10,15 +10,15 @@ ci.defaults.set( builder_group = "chromium.android.fyi", - cores = 8, executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + cores = 8, os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, - priority = ci.DEFAULT_FYI_PRIORITY, service_account = ci.DEFAULT_SERVICE_ACCOUNT, - reclient_jobs = reclient.jobs.DEFAULT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + priority = ci.DEFAULT_FYI_PRIORITY, reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, ) consoles.console_view( @@ -30,6 +30,21 @@ ci.builder( name = "Android ASAN (dbg) (reclient)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android_clang", + apply_configs = ["errorprone"], + build_config = builder_config.build_config.DEBUG, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "clang_builder_mb"), + build_gs_bucket = "chromium-android-archive", + ), console_view_entry = consoles.console_view_entry( category = "builder|arm", short_name = "san", @@ -42,6 +57,21 @@ ci.builder( name = "android-pie-arm64-wpt-rel-non-cq", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-android-archive", + ), console_view_entry = consoles.console_view_entry( category = "wpt|webview", short_name = "p-arm64", @@ -50,6 +80,21 @@ ci.builder( name = "android-chrome-pie-x86-wpt-fyi-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "x86_builder"), + build_gs_bucket = "chromium-android-archive", + ), console_view_entry = consoles.console_view_entry( category = "wpt|chrome", short_name = "p-x86", @@ -58,6 +103,21 @@ ci.builder( name = "android-webview-pie-x86-wpt-fyi-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "x86_builder"), + build_gs_bucket = "chromium-android-archive", + ), console_view_entry = consoles.console_view_entry( category = "wpt|webview", short_name = "p-x86", @@ -68,14 +128,29 @@ # disabled tests. ci.builder( name = "android-pie-x86-fyi-rel", - console_view_entry = consoles.console_view_entry( - category = "emulator|x86|rel", - short_name = "P", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "x86_builder"), + build_gs_bucket = "chromium-android-archive", ), # Set to an empty list to avoid chromium-gitiles-trigger triggering new # builds. Also we don't set any `schedule` since this builder is for # reference only and should not run any new builds. triggered_by = [], + console_view_entry = consoles.console_view_entry( + category = "emulator|x86|rel", + short_name = "P", + ), ) # TODO(crbug.com/1137474): This and android-12-x64-fyi-rel @@ -84,14 +159,28 @@ # Remove these once the bugs are closed ci.builder( name = "android-11-x86-fyi-rel", - console_view_entry = consoles.console_view_entry( - category = "emulator|x86|rel", - short_name = "11", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "x86_builder_mb"), + build_gs_bucket = "chromium-android-archive", ), # Set to an empty list to avoid chromium-gitiles-trigger triggering new # builds. Also we don't set any `schedule` since this builder is for # reference only and should not run any new builds. triggered_by = [], + console_view_entry = consoles.console_view_entry( + category = "emulator|x86|rel", + short_name = "11", + ), ) ci.builder( @@ -118,6 +207,7 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["ci/android-12-x64-rel"], console_view_entry = consoles.console_view_entry( category = "emulator|x64|rel", short_name = "12", @@ -126,11 +216,25 @@ # So they need longer timeouts # Matching the execution time out of the android-12-x64-rel execution_timeout = 4 * time.hour, - triggered_by = ["ci/android-12-x64-rel"], ) ci.builder( name = "android-annotator-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-android-archive", + ), console_view_entry = consoles.console_view_entry( category = "network|traffic|annotations", short_name = "and", @@ -160,11 +264,11 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["Android x64 Builder (dbg)"], console_view_entry = consoles.console_view_entry( category = "tester|webview", short_name = "12", ), - triggered_by = ["Android x64 Builder (dbg)"], ) # TODO(crbug.com/1299910): Move to non-FYI once the tester works fine. @@ -189,16 +293,17 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["Android x64 Builder (dbg)"], console_view_entry = consoles.console_view_entry( category = "tester|phone", short_name = "12", ), - triggered_by = ["Android x64 Builder (dbg)"], ) ci.builder( name = "android-cronet-asan-x86-rel", builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.COMPILE_AND_TEST, gclient_config = builder_config.gclient_config( config = "chromium", apply_configs = ["android"], @@ -213,7 +318,6 @@ android_config = builder_config.android_config( config = "x86_builder", ), - execution_mode = builder_config.execution_mode.COMPILE_AND_TEST, ), console_view_entry = consoles.console_view_entry( category = "cronet|asan",
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star index 54e4bd6..19cd35d 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -12,18 +12,18 @@ ci.defaults.set( builder_group = "chromium.android", - cores = 8, executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + cores = 8, os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, sheriff_rotations = sheriff_rotations.ANDROID, + service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, # TODO(crbug.com/1362440): remove this. omit_python2 = False, + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) consoles.console_view( @@ -63,6 +63,7 @@ ), build_gs_bucket = "chromium-android-archive", ), + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "builder|arm", short_name = "san", @@ -70,7 +71,6 @@ # Higher build timeout since dbg ASAN builds can take a while on a clobber # build. execution_timeout = 5 * time.hour, - tree_closing = True, ) ci.thin_tester( @@ -101,12 +101,12 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["ci/Android arm64 Builder (dbg)"], console_view_entry = consoles.console_view_entry( category = "tester|webview", short_name = "N", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Android arm64 Builder (dbg)"], ) ci.thin_tester( @@ -137,12 +137,12 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["ci/Android arm64 Builder (dbg)"], console_view_entry = consoles.console_view_entry( category = "tester|webview", short_name = "O", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Android arm64 Builder (dbg)"], ) ci.thin_tester( @@ -173,12 +173,12 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["ci/Android arm64 Builder (dbg)"], console_view_entry = consoles.console_view_entry( category = "tester|webview", short_name = "P", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Android arm64 Builder (dbg)"], ) ci.builder( @@ -205,6 +205,7 @@ ), build_gs_bucket = "chromium-android-archive", ), + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "builder|arm", short_name = "32", @@ -212,7 +213,6 @@ cq_mirrors_console_view = "mirrors", execution_timeout = 4 * time.hour, reclient_jobs = reclient.jobs.DEFAULT, - tree_closing = True, ) ci.builder( @@ -239,17 +239,17 @@ ), build_gs_bucket = "chromium-android-archive", ), + # The 'All' version of this builder below provides the same build coverage + # but cycles much faster due to beefier machine resources. So any regression + # that this bot would close the tree on would always be caught by the 'All' + # bot much faster. + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "builder|arm", short_name = "64", ), cq_mirrors_console_view = "mirrors", execution_timeout = 7 * time.hour, - # The 'All' version of this builder below provides the same build coverage - # but cycles much faster due to beefier machine resources. So any regression - # that this bot would close the tree on would always be caught by the 'All' - # bot much faster. - tree_closing = False, ) # We want to confirm that we can compile everything. @@ -262,8 +262,6 @@ # History: crbug.com/1246468 ci.builder( name = "Android arm64 Builder All Targets (dbg)", - builderless = False, - cores = None, branch_selector = branches.STANDARD_MILESTONE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( @@ -286,13 +284,15 @@ ), build_gs_bucket = "chromium-android-archive", ), + builderless = False, + cores = None, + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "builder|arm", short_name = "64", ), cq_mirrors_console_view = "mirrors", execution_timeout = 7 * time.hour, - tree_closing = True, ) # This builder should be used for trybot mirroring when no need to compile all. @@ -300,8 +300,6 @@ ci.builder( name = "Android x64 Builder (dbg)", branch_selector = branches.STANDARD_MILESTONE, - builderless = False, - cores = None, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -320,6 +318,8 @@ ), build_gs_bucket = "chromium-android-archive", ), + builderless = False, + cores = None, console_view_entry = consoles.console_view_entry( category = "builder|x86", short_name = "64", @@ -366,14 +366,14 @@ ), build_gs_bucket = "chromium-android-archive", ), + ssd = True, + free_space = builders.free_space.high, console_view_entry = consoles.console_view_entry( category = "builder|x86", short_name = "32", ), cq_mirrors_console_view = "mirrors", execution_timeout = 6 * time.hour, - free_space = builders.free_space.high, - ssd = True, ) ci.builder( @@ -396,21 +396,17 @@ ), build_gs_bucket = "chromium-android-archive", ), + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "builder|x86", short_name = "x86", ), cq_mirrors_console_view = "mirrors", reclient_jobs = reclient.jobs.DEFAULT, - tree_closing = True, ) ci.thin_tester( name = "android-webview-10-x86-rel-tests", - console_view_entry = consoles.console_view_entry( - category = "tester|x86", - short_name = "10", - ), builder_spec = builder_config.builder_spec( execution_mode = builder_config.execution_mode.TEST, gclient_config = builder_config.gclient_config( @@ -431,6 +427,10 @@ build_gs_bucket = "chromium-android-archive", ), triggered_by = ["ci/android-x86-rel"], + console_view_entry = consoles.console_view_entry( + category = "tester|x86", + short_name = "10", + ), ) ci.builder( @@ -457,40 +457,40 @@ ), build_gs_bucket = "chromium-android-archive", ), + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "on_cq", short_name = "cst", ), cq_mirrors_console_view = "mirrors", - tree_closing = True, ) ci.builder( name = "Deterministic Android", + executable = "recipe:swarming/deterministic_build", + cores = 32, + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "builder|det", short_name = "rel", ), - cores = 32, - executable = "recipe:swarming/deterministic_build", execution_timeout = 7 * time.hour, notifies = ["Deterministic Android"], - tree_closing = True, ) ci.builder( name = "Deterministic Android (dbg)", + executable = "recipe:swarming/deterministic_build", + cores = 16, + ssd = True, + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "builder|det", short_name = "dbg", ), - cores = 16, - executable = "recipe:swarming/deterministic_build", execution_timeout = 6 * time.hour, notifies = ["Deterministic Android"], - tree_closing = True, reclient_jobs = reclient.jobs.DEFAULT, - ssd = True, ) ci.thin_tester( @@ -518,12 +518,12 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["ci/Android arm64 Builder (dbg)"], console_view_entry = consoles.console_view_entry( category = "tester|phone", short_name = "N", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Android arm64 Builder (dbg)"], ) ci.thin_tester( @@ -551,13 +551,13 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["ci/Android arm64 Builder (dbg)"], + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "tester|phone", short_name = "O", ), cq_mirrors_console_view = "mirrors", - sheriff_rotations = args.ignore_default(None), - triggered_by = ["ci/Android arm64 Builder (dbg)"], ) ci.builder( @@ -615,14 +615,14 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["ci/Android x64 Builder (dbg)"], + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "tester|tablet", short_name = "12L", ), # TODO: This can be reduced when builder works. execution_timeout = 4 * time.hour, - sheriff_rotations = args.ignore_default(None), - triggered_by = ["ci/Android x64 Builder (dbg)"], ) ci.builder( @@ -649,12 +649,12 @@ ), build_gs_bucket = "chromium-android-archive", ), + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "builder_tester|arm64", short_name = "M proguard", ), execution_timeout = 8 * time.hour, - sheriff_rotations = args.ignore_default(None), ) ci.builder( @@ -684,14 +684,14 @@ ci.builder( name = "android-binary-size-generator", + executable = "recipe:binary_size_generator_tot", builderless = False, cores = 32, + ssd = True, console_view_entry = consoles.console_view_entry( category = "builder|other", short_name = "size", ), - executable = "recipe:binary_size_generator_tot", - ssd = True, reclient_jobs = reclient.jobs.DEFAULT, ) @@ -720,17 +720,18 @@ ), build_gs_bucket = "chromium-android-archive", ), + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|arm", short_name = "dbg", ), cq_mirrors_console_view = "mirrors", notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), ) ci.builder( name = "android-cronet-arm-rel", + branch_selector = branches.STANDARD_MILESTONE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -753,58 +754,111 @@ ), build_gs_bucket = "chromium-android-archive", ), - branch_selector = branches.STANDARD_MILESTONE, + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|arm", short_name = "rel", ), cq_mirrors_console_view = "mirrors", notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), ) ci.builder( name = "android-cronet-arm64-dbg", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "cronet_builder", + "mb", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-android-archive", + ), + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|arm64", short_name = "dbg", ), notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), ) ci.builder( name = "android-cronet-arm64-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "cronet_builder", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-android-archive", + ), + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|arm64", short_name = "rel", ), notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), ) ci.builder( name = "android-cronet-asan-arm-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "cronet_builder", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-android-archive", + ), + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|asan", ), notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), ) # Runs on a specific machine with an attached phone ci.builder( name = "android-cronet-marshmallow-arm64-perf-rel", + executable = "recipe:cronet", + cores = None, + os = os.ANDROID, + cpu = None, + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|test|perf", short_name = "m", ), - cores = None, - cpu = None, - executable = "recipe:cronet", notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), - os = os.ANDROID, reclient_jobs = reclient.jobs.DEFAULT, ) @@ -833,12 +887,12 @@ ), build_gs_bucket = "chromium-android-archive", ), + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|x86", short_name = "dbg", ), notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), ) ci.thin_tester( @@ -866,13 +920,13 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["ci/android-cronet-x86-dbg"], + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|test", short_name = "l", ), notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), - triggered_by = ["ci/android-cronet-x86-dbg"], ) ci.thin_tester( @@ -900,13 +954,13 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["ci/android-cronet-x86-dbg"], + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|test", short_name = "m", ), notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), - triggered_by = ["ci/android-cronet-x86-dbg"], ) ci.thin_tester( @@ -934,13 +988,13 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["ci/android-cronet-x86-dbg"], + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|test", short_name = "o", ), notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), - triggered_by = ["ci/android-cronet-x86-dbg"], ) ci.thin_tester( @@ -968,13 +1022,13 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["ci/android-cronet-x86-dbg"], + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|test", short_name = "p", ), notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), - triggered_by = ["ci/android-cronet-x86-dbg"], ) ci.thin_tester( @@ -1003,13 +1057,13 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["ci/android-cronet-x86-dbg"], + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|test", short_name = "10", ), notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), - triggered_by = ["ci/android-cronet-x86-dbg"], ) ci.thin_tester( @@ -1037,34 +1091,71 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["ci/android-cronet-x86-dbg"], + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|test", short_name = "11", ), notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), - triggered_by = ["ci/android-cronet-x86-dbg"], ) ci.builder( name = "android-cronet-x86-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "cronet_builder", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "x86_builder"), + build_gs_bucket = "chromium-android-archive", + ), + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|x86", short_name = "rel", ), notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), ) ci.thin_tester( name = "android-cronet-x86-rel-kitkat-tests", + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "cronet_builder", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "x86_builder"), + build_gs_bucket = "chromium-android-archive", + ), + triggered_by = ["ci/android-cronet-x86-rel"], + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "cronet|test", short_name = "k", ), notifies = ["cronet"], - sheriff_rotations = args.ignore_default(None), - triggered_by = ["ci/android-cronet-x86-rel"], ) ci.builder( @@ -1086,12 +1177,12 @@ ), build_gs_bucket = "chromium-android-archive", ), + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "on_cq|x86", short_name = "N", ), execution_timeout = 4 * time.hour, - tree_closing = True, ) ci.thin_tester( @@ -1119,23 +1210,41 @@ ), build_gs_bucket = "chromium-android-archive", ), + triggered_by = ["ci/Android arm64 Builder (dbg)"], console_view_entry = consoles.console_view_entry( category = "tester|phone", short_name = "P", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Android arm64 Builder (dbg)"], ) # TODO(crbug/1182468) Remove android coverage bots after coverage is # running on CQ. ci.builder( name = "android-pie-arm64-coverage-experimental-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "android", + "use_clang_coverage", + ], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-android-archive", + ), + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "builder_tester|arm64", short_name = "p-cov", ), - sheriff_rotations = args.ignore_default(None), ) ci.builder( @@ -1163,13 +1272,13 @@ ), build_gs_bucket = "chromium-android-archive", ), + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "on_cq", short_name = "P", ), cq_mirrors_console_view = "mirrors", execution_timeout = 4 * time.hour, - tree_closing = True, ) ci.builder( @@ -1195,12 +1304,12 @@ ), build_gs_bucket = "chromium-android-archive", ), + cores = 16, + ssd = True, console_view_entry = consoles.console_view_entry( category = "builder_tester|x86", short_name = "P", ), - cores = 16, - ssd = True, ) # TODO(crbug.com/1137474): Update the console view config once on CQ @@ -1227,14 +1336,14 @@ ), build_gs_bucket = "chromium-android-archive", ), + # TODO(crbug.com/1137474): Add it back to sheriff once the builder is more + # stable. + sheriff_rotations = args.ignore_default(None), + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "builder_tester|x86", short_name = "11", ), - tree_closing = True, - # TODO(crbug.com/1137474): Add it back to sheriff once the builder is more - # stable. - sheriff_rotations = args.ignore_default(None), ) ci.builder( @@ -1260,12 +1369,12 @@ ), build_gs_bucket = "chromium-android-archive", ), + # TODO(crbug.com/1225851): Add it back to sheriff once the builder is more + # stable. + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "builder_tester|x64", short_name = "12", ), execution_timeout = 4 * time.hour, - # TODO(crbug.com/1225851): Add it back to sheriff once the builder is more - # stable. - sheriff_rotations = args.ignore_default(None), )
diff --git a/infra/config/subprojects/chromium/ci/chromium.angle.star b/infra/config/subprojects/chromium/ci/chromium.angle.star index 4128c04..24b14eb4 100644 --- a/infra/config/subprojects/chromium/ci/chromium.angle.star +++ b/infra/config/subprojects/chromium/ci/chromium.angle.star
@@ -11,15 +11,15 @@ ci.defaults.set( builder_group = "chromium.angle", executable = "recipe:angle_chromium", - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, - reclient_jobs = reclient.jobs.DEFAULT, pool = ci.gpu.POOL, + sheriff_rotations = sheriff_rotations.ANGLE, + service_account = ci.gpu.SERVICE_ACCOUNT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, properties = { "perf_dashboard_machine_group": "ChromiumANGLE", }, - service_account = ci.gpu.SERVICE_ACCOUNT, - sheriff_rotations = sheriff_rotations.ANGLE, + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, thin_tester_cores = 2, ) @@ -86,11 +86,11 @@ build_gs_bucket = "chromium-angle-archive", run_tests_serially = True, ), + triggered_by = ["android-angle-chromium-arm64-builder"], console_view_entry = consoles.console_view_entry( category = "Android|Nexus5X|Chromium", short_name = "arm64", ), - triggered_by = ["android-angle-chromium-arm64-builder"], ) ci.gpu.linux_builder( @@ -168,11 +168,11 @@ build_gs_bucket = "chromium-angle-archive", run_tests_serially = True, ), + triggered_by = ["linux-angle-chromium-builder"], console_view_entry = consoles.console_view_entry( category = "Linux|Intel|Chromium", short_name = "x64", ), - triggered_by = ["linux-angle-chromium-builder"], ) ci.thin_tester( @@ -197,11 +197,11 @@ build_gs_bucket = "chromium-angle-archive", run_tests_serially = True, ), + triggered_by = ["linux-angle-chromium-builder"], console_view_entry = consoles.console_view_entry( category = "Linux|NVIDIA|Chromium", short_name = "x64", ), - triggered_by = ["linux-angle-chromium-builder"], ) ci.gpu.mac_builder( @@ -252,11 +252,11 @@ build_gs_bucket = "chromium-angle-archive", run_tests_serially = True, ), + triggered_by = ["mac-angle-chromium-builder"], console_view_entry = consoles.console_view_entry( category = "Mac|AMD|Chromium", short_name = "x64", ), - triggered_by = ["mac-angle-chromium-builder"], ) ci.thin_tester( @@ -281,11 +281,11 @@ build_gs_bucket = "chromium-angle-archive", run_tests_serially = True, ), + triggered_by = ["mac-angle-chromium-builder"], console_view_entry = consoles.console_view_entry( category = "Mac|Intel|Chromium", short_name = "x64", ), - triggered_by = ["mac-angle-chromium-builder"], ) ci.gpu.mac_builder( @@ -310,11 +310,11 @@ ), build_gs_bucket = "chromium-angle-archive", ), + xcode = xcode.x14main, console_view_entry = consoles.console_view_entry( category = "iOS|Builder|ANGLE", short_name = "x64", ), - xcode = xcode.x14main, ) ci.thin_tester( @@ -341,11 +341,11 @@ build_gs_bucket = "chromium-angle-archive", run_tests_serially = True, ), + triggered_by = ["ios-angle-builder"], console_view_entry = consoles.console_view_entry( category = "iOS|Intel|ANGLE", short_name = "x64", ), - triggered_by = ["ios-angle-builder"], ) ci.gpu.windows_builder( @@ -397,11 +397,11 @@ build_gs_bucket = "chromium-angle-archive", run_tests_serially = True, ), + triggered_by = ["win-angle-chromium-x64-builder"], console_view_entry = consoles.console_view_entry( category = "Windows|Intel|Chromium", short_name = "x64", ), - triggered_by = ["win-angle-chromium-x64-builder"], ) ci.thin_tester( @@ -426,11 +426,11 @@ build_gs_bucket = "chromium-angle-archive", run_tests_serially = True, ), + triggered_by = ["win-angle-chromium-x64-builder"], console_view_entry = consoles.console_view_entry( category = "Windows|NVIDIA|Chromium", short_name = "x64", ), - triggered_by = ["win-angle-chromium-x64-builder"], ) ci.gpu.windows_builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.cft.star b/infra/config/subprojects/chromium/ci/chromium.cft.star index 461d9fe..7a6616fa 100644 --- a/infra/config/subprojects/chromium/ci/chromium.cft.star +++ b/infra/config/subprojects/chromium/ci/chromium.cft.star
@@ -10,17 +10,17 @@ ci.defaults.set( builder_group = "chromium.cft", + executable = ci.DEFAULT_EXECUTABLE, builderless = True, cores = 8, - executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - pool = ci.DEFAULT_POOL, - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, - sheriff_rotations = sheriff_rotations.CFT, ssd = True, + pool = ci.DEFAULT_POOL, + sheriff_rotations = sheriff_rotations.CFT, tree_closing = False, + service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) consoles.console_view( @@ -29,8 +29,10 @@ ci.builder( name = "mac-rel-cft", - console_view_entry = consoles.console_view_entry(), builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = [ @@ -40,10 +42,8 @@ target_bits = 64, target_platform = builder_config.target_platform.MAC, ), - gclient_config = builder_config.gclient_config( - config = "chromium", - ), ), cores = None, os = os.MAC_DEFAULT, + console_view_entry = consoles.console_view_entry(), )
diff --git a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star index 0f06d9c..eaac513 100644 --- a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star +++ b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
@@ -12,16 +12,16 @@ ci.defaults.set( builder_group = "chromium.chromiumos", - cores = 8, executable = ci.DEFAULT_EXECUTABLE, + cores = 8, + os = os.LINUX_DEFAULT, + pool = ci.DEFAULT_POOL, + sheriff_rotations = sheriff_rotations.CHROMIUM, + tree_closing = True, + service_account = ci.DEFAULT_SERVICE_ACCOUNT, execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, reclient_instance = reclient.instance.DEFAULT_TRUSTED, reclient_jobs = reclient.jobs.DEFAULT, - os = os.LINUX_DEFAULT, - pool = ci.DEFAULT_POOL, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, - sheriff_rotations = sheriff_rotations.CHROMIUM, - tree_closing = True, ) consoles.console_view( @@ -36,18 +36,34 @@ ci.builder( name = "linux-ash-chromium-generator-rel", - # This builder gets triggered against multiple branches, so it shouldn't be - # bootstrapped - bootstrap = False, + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["chromeos"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.INTEL, + target_bits = 64, + ), + build_gs_bucket = "chromium-chromiumos-archive", + ), + triggered_by = [], + sheriff_rotations = args.ignore_default(None), + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "default", ), - tree_closing = False, main_console_view = "main", + # This builder gets triggered against multiple branches, so it shouldn't be + # bootstrapped + bootstrap = False, + # This should NOT be removed because the builder gets triggered + # against multiple branches. Some of the branches are running on Goma + goma_backend = goma.backend.RBE_PROD, notifies = ["chrome-lacros-engprod-alerts"], - triggered_by = [], - schedule = "triggered", - sheriff_rotations = args.ignore_default(None), properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -68,9 +84,7 @@ ], }, }, - # This should NOT be removed because the builder gets triggered - # against multiple branches. Some of the branches are running on Goma - goma_backend = goma.backend.RBE_PROD, + schedule = "triggered", ) ci.builder( @@ -129,10 +143,10 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.INTEL, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "amd64-generic", ], - target_platform = builder_config.target_platform.CHROMEOS, ), build_gs_bucket = "chromium-chromiumos-archive", ), @@ -162,10 +176,10 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.INTEL, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "amd64-generic", ], - target_platform = builder_config.target_platform.CHROMEOS, ), build_gs_bucket = "chromium-chromiumos-archive", ), @@ -195,10 +209,10 @@ build_config = builder_config.build_config.DEBUG, target_arch = builder_config.target_arch.INTEL, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "amd64-generic", ], - target_platform = builder_config.target_platform.CHROMEOS, ), build_gs_bucket = "chromium-chromiumos-archive", ), @@ -206,13 +220,14 @@ category = "simple|debug|x64", short_name = "dbg", ), - cq_mirrors_console_view = "mirrors", main_console_view = "main", + cq_mirrors_console_view = "mirrors", reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "chromeos-amd64-generic-lacros-dbg", + branch_selector = branches.STANDARD_MILESTONE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -229,20 +244,19 @@ build_config = builder_config.build_config.DEBUG, target_arch = builder_config.target_arch.INTEL, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "amd64-generic", ], - target_platform = builder_config.target_platform.CHROMEOS, ), build_gs_bucket = "chromium-chromiumos-archive", ), - branch_selector = branches.STANDARD_MILESTONE, console_view_entry = consoles.console_view_entry( category = "lacros|x64", short_name = "dbg", ), - cq_mirrors_console_view = "mirrors", main_console_view = "main", + cq_mirrors_console_view = "mirrors", reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) @@ -250,30 +264,30 @@ name = "chromeos-amd64-generic-rel", branch_selector = branches.CROS_LTS_MILESTONE, builder_spec = builder_config.builder_spec( - build_gs_bucket = "chromium-chromiumos-archive", + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["chromeos", "checkout_lacros_sdk"], + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.INTEL, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "amd64-generic", ], - target_platform = builder_config.target_platform.CHROMEOS, cros_boards_with_qemu_images = "amd64-generic-vm", ), - gclient_config = builder_config.gclient_config( - config = "chromium", - apply_configs = ["chromeos", "checkout_lacros_sdk"], - ), + build_gs_bucket = "chromium-chromiumos-archive", ), console_view_entry = consoles.console_view_entry( category = "simple|release|x64", short_name = "rel", ), - cq_mirrors_console_view = "mirrors", main_console_view = "main", + cq_mirrors_console_view = "mirrors", reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) @@ -294,10 +308,10 @@ build_config = builder_config.build_config.DEBUG, target_arch = builder_config.target_arch.ARM, target_bits = 32, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "arm-generic", ], - target_platform = builder_config.target_platform.CHROMEOS, ), build_gs_bucket = "chromium-chromiumos-archive", ), @@ -311,7 +325,12 @@ ci.builder( name = "chromeos-arm-generic-rel", + branch_selector = branches.CROS_LTS_MILESTONE, builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["chromeos"], + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], @@ -321,24 +340,24 @@ target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = ["arm-generic"], ), - gclient_config = builder_config.gclient_config( - config = "chromium", - apply_configs = ["chromeos"], - ), ), - branch_selector = branches.CROS_LTS_MILESTONE, console_view_entry = consoles.console_view_entry( category = "simple|release", short_name = "arm", ), - cq_mirrors_console_view = "mirrors", main_console_view = "main", + cq_mirrors_console_view = "mirrors", reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "chromeos-arm64-generic-rel", + branch_selector = branches.CROS_LTS_MILESTONE, builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["chromeos"], + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], @@ -348,12 +367,7 @@ target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = ["arm64-generic"], ), - gclient_config = builder_config.gclient_config( - config = "chromium", - apply_configs = ["chromeos"], - ), ), - branch_selector = branches.CROS_LTS_MILESTONE, console_view_entry = consoles.console_view_entry( category = "simple|release", short_name = "a64", @@ -380,22 +394,22 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.ARM, target_bits = 32, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "jacuzzi", ], - target_platform = builder_config.target_platform.CHROMEOS, ), build_gs_bucket = "chromium-chromiumos-archive", ), + # TODO(crbug.com/1342987): Add to the sheriff rotation if/when the builder + # is stable. + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "simple|release", short_name = "jcz", ), main_console_view = "main", reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - # TODO(crbug.com/1342987): Add to the sheriff rotation if/when the builder - # is stable. - sheriff_rotations = args.ignore_default(None), ) ci.builder( @@ -416,22 +430,22 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.INTEL, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "octopus", ], - target_platform = builder_config.target_platform.CHROMEOS, ), build_gs_bucket = "chromium-chromiumos-archive", ), + # TODO(crbug.com/1342987): Add to the sheriff rotation if/when the builder + # is stable. + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "simple|release", short_name = "oct", ), main_console_view = "main", reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - # TODO(crbug.com/1342987): Add to the sheriff rotation if/when the builder - # is stable. - sheriff_rotations = args.ignore_default(None), ) ci.builder( @@ -452,10 +466,10 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.INTEL, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "amd64-generic", ], - target_platform = builder_config.target_platform.CHROMEOS, ), build_gs_bucket = "chromium-chromiumos-archive", ), @@ -513,10 +527,10 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.INTEL, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "eve", ], - target_platform = builder_config.target_platform.CHROMEOS, cros_boards_with_qemu_images = [ "amd64-generic", ], @@ -527,8 +541,8 @@ category = "lacros|x64", short_name = "rel", ), - cq_mirrors_console_view = "mirrors", main_console_view = "main", + cq_mirrors_console_view = "mirrors", reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) @@ -550,26 +564,26 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.INTEL, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "amd64-generic", ], - target_platform = builder_config.target_platform.CHROMEOS, ), + build_gs_bucket = "chromium-chromiumos-archive", skylab_upload_location = builder_config.skylab_upload_location( gs_bucket = "chromium-ci-skylab", ), - build_gs_bucket = "chromium-chromiumos-archive", ), + sheriff_rotations = args.ignore_default(None), + # TODO(crbug.com/1399674): Enable tree closing when stable. + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "lacros|x64", short_name = "skylab", ), - cq_mirrors_console_view = "mirrors", main_console_view = "main", + cq_mirrors_console_view = "mirrors", reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - sheriff_rotations = args.ignore_default(None), - # TODO(crbug.com/1399674): Enable tree closing when stable. - tree_closing = False, ) ci.builder( @@ -591,22 +605,22 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.INTEL, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "arm-generic", "jacuzzi", ], - target_platform = builder_config.target_platform.CHROMEOS, ), build_gs_bucket = "chromium-chromiumos-archive", ), + # TODO(crbug.com/1202631) Enable tree closing when stable. + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "lacros|arm", short_name = "arm", ), - # TODO(crbug.com/1202631) Enable tree closing when stable. - tree_closing = False, - cq_mirrors_console_view = "mirrors", main_console_view = "main", + cq_mirrors_console_view = "mirrors", reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) @@ -629,28 +643,29 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.ARM, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "arm64-generic", ], - target_platform = builder_config.target_platform.CHROMEOS, ), build_gs_bucket = "chromium-chromiumos-archive", ), - console_view_entry = consoles.console_view_entry( - category = "lacros|arm64", - short_name = "arm64", - ), - cq_mirrors_console_view = "mirrors", - main_console_view = "main", - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, # TODO(https://crbug.com/1342761): enable sheriff rotation and tree_closing # when the builder is stable. sheriff_rotations = args.ignore_default(None), tree_closing = False, + console_view_entry = consoles.console_view_entry( + category = "lacros|arm64", + short_name = "arm64", + ), + main_console_view = "main", + cq_mirrors_console_view = "mirrors", + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "linux-chromeos-dbg", + branch_selector = branches.STANDARD_MILESTONE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -669,13 +684,12 @@ ), build_gs_bucket = "chromium-chromiumos-archive", ), - branch_selector = branches.STANDARD_MILESTONE, console_view_entry = consoles.console_view_entry( category = "default", short_name = "dbg", ), - cq_mirrors_console_view = "mirrors", main_console_view = "main", + cq_mirrors_console_view = "mirrors", reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) @@ -701,19 +715,20 @@ ), build_gs_bucket = "chromium-chromiumos-archive", ), + # See crbug.com/1345687. This builder need higher memory. + builderless = False, console_view_entry = consoles.console_view_entry( category = "default", short_name = "rel", ), - cq_mirrors_console_view = "mirrors", main_console_view = "main", + cq_mirrors_console_view = "mirrors", reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - # See crbug.com/1345687. This builder need higher memory. - builderless = False, ) ci.builder( name = "linux-lacros-builder-rel", + branch_selector = branches.STANDARD_MILESTONE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium_no_telemetry_dependencies", @@ -732,20 +747,20 @@ ), build_gs_bucket = "chromium-chromiumos-archive", ), - branch_selector = branches.STANDARD_MILESTONE, + # See crbug.com/1345687. This builder need higher memory. + builderless = False, console_view_entry = consoles.console_view_entry( category = "default", short_name = "lcr", ), - cq_mirrors_console_view = "mirrors", main_console_view = "main", + cq_mirrors_console_view = "mirrors", reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - # See crbug.com/1345687. This builder need higher memory. - builderless = False, ) ci.thin_tester( name = "linux-lacros-tester-rel", + branch_selector = branches.STANDARD_MILESTONE, builder_spec = builder_config.builder_spec( execution_mode = builder_config.execution_mode.TEST, gclient_config = builder_config.gclient_config( @@ -766,15 +781,14 @@ ), build_gs_bucket = "chromium-chromiumos-archive", ), - branch_selector = branches.STANDARD_MILESTONE, + triggered_by = ["linux-lacros-builder-rel"], + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "default", short_name = "lcr", ), main_console_view = "main", cq_mirrors_console_view = "mirrors", - triggered_by = ["linux-lacros-builder-rel"], - tree_closing = False, ) ci.builder( @@ -798,15 +812,15 @@ ), build_gs_bucket = "chromium-chromiumos-archive", ), + # See crbug.com/1345687. This builder need higher memory. + builderless = False, console_view_entry = consoles.console_view_entry( category = "debug", short_name = "lcr", ), - cq_mirrors_console_view = "mirrors", main_console_view = "main", + cq_mirrors_console_view = "mirrors", reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - # See crbug.com/1345687. This builder need higher memory. - builderless = False, ) # For Chromebox for meetings(CfM)
diff --git a/infra/config/subprojects/chromium/ci/chromium.clang.star b/infra/config/subprojects/chromium/ci/chromium.clang.star index 3ee42e72..f5a566f1 100644 --- a/infra/config/subprojects/chromium/ci/chromium.clang.star +++ b/infra/config/subprojects/chromium/ci/chromium.clang.star
@@ -10,20 +10,20 @@ ci.defaults.set( builder_group = "chromium.clang", + executable = ci.DEFAULT_EXECUTABLE, builderless = True, cores = 32, - executable = ci.DEFAULT_EXECUTABLE, + os = os.LINUX_DEFAULT, + pool = ci.DEFAULT_POOL, + sheriff_rotations = sheriff_rotations.CHROMIUM_CLANG, + service_account = ci.DEFAULT_SERVICE_ACCOUNT, # Because these run ToT Clang, goma is not used. # Naturally the runtime will be ~4-8h on average, depending on config. # CFI builds will take even longer - around 11h. execution_timeout = 14 * time.hour, - os = os.LINUX_DEFAULT, - pool = ci.DEFAULT_POOL, properties = { "perf_dashboard_machine_group": "ChromiumClang", }, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, - sheriff_rotations = sheriff_rotations.CHROMIUM_CLANG, ) consoles.console_view( @@ -42,8 +42,8 @@ "ToT Android": consoles.ordering(short_names = ["rel", "dbg", "x64"]), "ToT Mac": consoles.ordering(short_names = ["rel", "ofi", "dbg"]), "ToT Windows": consoles.ordering( - short_names = ["rel", "ofi"], categories = ["x64"], + short_names = ["rel", "ofi"], ), "ToT Windows|x64": consoles.ordering(short_names = ["rel"]), "CFI|Win": consoles.ordering(short_names = ["x86", "x64"]), @@ -53,8 +53,8 @@ ) [branches.console_view_entry( - builder = "chrome:ci/{}".format(name), console_view = "chromium.clang", + builder = "chrome:ci/{}".format(name), category = category, short_name = short_name, ) for name, category, short_name in ( @@ -96,11 +96,11 @@ ci.builder( name = "CFI Linux CF", - goma_backend = None, console_view_entry = consoles.console_view_entry( category = "CFI|Linux", short_name = "CF", ), + goma_backend = None, notifies = ["CFI Linux"], reclient_instance = reclient.instance.DEFAULT_TRUSTED, reclient_jobs = reclient.jobs.DEFAULT, @@ -117,20 +117,20 @@ ci.builder( name = "CrWinAsan", + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "ToT Windows|Asan", short_name = "asn", ), - os = os.WINDOWS_ANY, ) ci.builder( name = "CrWinAsan(dll)", + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "ToT Windows|Asan", short_name = "dll", ), - os = os.WINDOWS_ANY, ) ci.builder( @@ -269,9 +269,9 @@ clang_tot_linux_builder( name = "ToTLinuxCoverage", + executable = "recipe:chromium_clang_coverage_tot", category = "ToT Code Coverage", short_name = "linux", - executable = "recipe:chromium_clang_coverage_tot", ) clang_tot_linux_builder( @@ -296,89 +296,89 @@ ci.builder( name = "ToTWin", + os = os.WINDOWS_ANY, + free_space = builders.free_space.high, console_view_entry = consoles.console_view_entry( category = "ToT Windows", short_name = "rel", ), - os = os.WINDOWS_ANY, - free_space = builders.free_space.high, ) ci.builder( name = "ToTWin(dbg)", builderless = False, + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "ToT Windows", short_name = "dbg", ), - os = os.WINDOWS_ANY, ) ci.builder( name = "ToTWin(dll)", + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "ToT Windows", short_name = "dll", ), - os = os.WINDOWS_ANY, ) ci.builder( name = "ToTWin64", + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "ToT Windows|x64", short_name = "rel", ), - os = os.WINDOWS_ANY, ) ci.builder( name = "ToTWin64(dbg)", + os = os.WINDOWS_ANY, + free_space = builders.free_space.high, console_view_entry = consoles.console_view_entry( category = "ToT Windows|x64", short_name = "dbg", ), - os = os.WINDOWS_ANY, - free_space = builders.free_space.high, ) ci.builder( name = "ToTWin64(dll)", + os = os.WINDOWS_ANY, + free_space = builders.free_space.high, console_view_entry = consoles.console_view_entry( category = "ToT Windows|x64", short_name = "dll", ), - os = os.WINDOWS_ANY, - free_space = builders.free_space.high, ) ci.builder( name = "ToTWinASanLibfuzzer", builderless = False, + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "ToT Windows|Asan", short_name = "fuz", ), - os = os.WINDOWS_ANY, ) ci.builder( name = "ToTWindowsCoverage", + executable = "recipe:chromium_clang_coverage_tot", + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "ToT Code Coverage", short_name = "win", ), - executable = "recipe:chromium_clang_coverage_tot", - os = os.WINDOWS_ANY, ) ci.builder( name = "ToTWin64PGO", + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "ToT Windows|x64", short_name = "pgo", ), - os = os.WINDOWS_ANY, ) ci.builder( @@ -392,62 +392,62 @@ ci.builder( name = "ToTiOS", builderless = False, - console_view_entry = consoles.console_view_entry( - category = "iOS|public", - short_name = "sim", - ), cores = None, os = os.MAC_12, ssd = True, xcode = xcode.x14main, + console_view_entry = consoles.console_view_entry( + category = "iOS|public", + short_name = "sim", + ), ) ci.builder( name = "ToTiOSDevice", builderless = False, - console_view_entry = consoles.console_view_entry( - category = "iOS|public", - short_name = "dev", - ), cores = None, os = os.MAC_12, ssd = True, xcode = xcode.x14main, + console_view_entry = consoles.console_view_entry( + category = "iOS|public", + short_name = "dev", + ), ) clang_mac_builder( name = "ToTMac", + cores = None, console_view_entry = consoles.console_view_entry( category = "ToT Mac", short_name = "rel", ), - cores = None, ) clang_mac_builder( name = "ToTMac (dbg)", + cores = None, console_view_entry = consoles.console_view_entry( category = "ToT Mac", short_name = "dbg", ), - cores = None, ) clang_mac_builder( name = "ToTMacASan", + cores = None, console_view_entry = consoles.console_view_entry( category = "ToT Mac", short_name = "asn", ), - cores = None, ) clang_mac_builder( name = "ToTMacCoverage", + executable = "recipe:chromium_clang_coverage_tot", + cores = None, console_view_entry = consoles.console_view_entry( category = "ToT Code Coverage", short_name = "mac", ), - executable = "recipe:chromium_clang_coverage_tot", - cores = None, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.dawn.star b/infra/config/subprojects/chromium/ci/chromium.dawn.star index b51dbfba..c1f7792f 100644 --- a/infra/config/subprojects/chromium/ci/chromium.dawn.star +++ b/infra/config/subprojects/chromium/ci/chromium.dawn.star
@@ -12,11 +12,11 @@ ci.defaults.set( builder_group = "chromium.dawn", executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - reclient_jobs = reclient.jobs.DEFAULT, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, pool = ci.gpu.POOL, service_account = ci.gpu.SERVICE_ACCOUNT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, thin_tester_cores = 2, ) @@ -140,12 +140,12 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["ci/Dawn Linux x64 DEPS Builder"], console_view_entry = consoles.console_view_entry( category = "DEPS|Linux|Intel", short_name = "x64", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Dawn Linux x64 DEPS Builder"], ) ci.thin_tester( @@ -168,12 +168,12 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["ci/Dawn Linux x64 DEPS Builder"], console_view_entry = consoles.console_view_entry( category = "DEPS|Linux|Nvidia", short_name = "x64", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Dawn Linux x64 DEPS Builder"], ) ci.gpu.linux_builder( @@ -222,11 +222,11 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["Dawn Linux x64 Builder"], console_view_entry = consoles.console_view_entry( category = "ToT|Linux|Intel", short_name = "x64", ), - triggered_by = ["Dawn Linux x64 Builder"], ) ci.thin_tester( @@ -248,11 +248,11 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["Dawn Linux x64 Builder"], console_view_entry = consoles.console_view_entry( category = "ToT|Linux|Nvidia", short_name = "x64", ), - triggered_by = ["Dawn Linux x64 Builder"], ) ci.gpu.mac_builder( @@ -330,12 +330,12 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["ci/Dawn Mac x64 DEPS Builder"], console_view_entry = consoles.console_view_entry( category = "DEPS|Mac|AMD", short_name = "x64", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Dawn Mac x64 DEPS Builder"], ) ci.thin_tester( @@ -358,12 +358,12 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["ci/Dawn Mac x64 DEPS Builder"], console_view_entry = consoles.console_view_entry( category = "DEPS|Mac|Intel", short_name = "x64", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Dawn Mac x64 DEPS Builder"], ) ci.thin_tester( @@ -385,13 +385,13 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["Dawn Mac x64 Builder"], # Uncomment this entry when this experimental tester is actually in use. # console_view_entry = consoles.console_view_entry( # category = "ToT|Mac|AMD", # short_name = "exp", # ), list_view = "chromium.gpu.experimental", - triggered_by = ["Dawn Mac x64 Builder"], ) ci.thin_tester( @@ -413,13 +413,13 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["Dawn Mac x64 Builder"], # Uncomment this entry when this experimental tester is actually in use. # console_view_entry = consoles.console_view_entry( # category = "ToT|Mac|Intel", # short_name = "exp", # ), list_view = "chromium.gpu.experimental", - triggered_by = ["Dawn Mac x64 Builder"], ) ci.thin_tester( @@ -441,11 +441,11 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["Dawn Mac x64 Builder"], console_view_entry = consoles.console_view_entry( category = "ToT|Mac|AMD", short_name = "x64", ), - triggered_by = ["Dawn Mac x64 Builder"], ) ci.thin_tester( @@ -467,11 +467,11 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["Dawn Mac x64 Builder"], console_view_entry = consoles.console_view_entry( category = "ToT|Mac|Intel", short_name = "x64", ), - triggered_by = ["Dawn Mac x64 Builder"], ) ci.gpu.windows_builder( @@ -499,10 +499,10 @@ category = "ToT|Windows|ASAN", short_name = "x64", ), - reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, # Serially executed tests + ASAN = more than the default timeout needed in # order to prevent build timeouts. execution_timeout = 6 * time.hour, + reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) ci.gpu.windows_builder( @@ -582,12 +582,12 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["ci/Dawn Win10 x64 DEPS Builder"], console_view_entry = consoles.console_view_entry( category = "DEPS|Windows|Intel", short_name = "x64", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Dawn Win10 x64 DEPS Builder"], ) ci.thin_tester( @@ -610,12 +610,12 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["ci/Dawn Win10 x64 DEPS Builder"], console_view_entry = consoles.console_view_entry( category = "DEPS|Windows|Nvidia", short_name = "x64", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Dawn Win10 x64 DEPS Builder"], ) ci.thin_tester( @@ -637,11 +637,11 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["Dawn Win10 x64 Builder"], console_view_entry = consoles.console_view_entry( category = "ToT|Windows|Intel", short_name = "ex64", ), - triggered_by = ["Dawn Win10 x64 Builder"], ) ci.thin_tester( @@ -663,11 +663,11 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["Dawn Win10 x64 Builder"], console_view_entry = consoles.console_view_entry( category = "ToT|Windows|Intel", short_name = "x64", ), - triggered_by = ["Dawn Win10 x64 Builder"], ) ci.thin_tester( @@ -689,11 +689,11 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["Dawn Win10 x64 Builder"], console_view_entry = consoles.console_view_entry( category = "ToT|Windows|Nvidia", short_name = "x64", ), - triggered_by = ["Dawn Win10 x64 Builder"], ) ci.gpu.windows_builder( @@ -773,12 +773,12 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["ci/Dawn Win10 x86 DEPS Builder"], console_view_entry = consoles.console_view_entry( category = "DEPS|Windows|Intel", short_name = "x86", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Dawn Win10 x86 DEPS Builder"], ) ci.thin_tester( @@ -801,12 +801,12 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["ci/Dawn Win10 x86 DEPS Builder"], console_view_entry = consoles.console_view_entry( category = "DEPS|Windows|Nvidia", short_name = "x86", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Dawn Win10 x86 DEPS Builder"], ) ci.thin_tester( @@ -828,11 +828,11 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["Dawn Win10 x86 Builder"], console_view_entry = consoles.console_view_entry( category = "ToT|Windows|Intel", short_name = "ex86", ), - triggered_by = ["Dawn Win10 x86 Builder"], ) ci.thin_tester( @@ -854,11 +854,11 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["Dawn Win10 x86 Builder"], console_view_entry = consoles.console_view_entry( category = "ToT|Windows|Intel", short_name = "x86", ), - triggered_by = ["Dawn Win10 x86 Builder"], ) ci.thin_tester( @@ -880,9 +880,9 @@ build_gs_bucket = "chromium-dawn-archive", run_tests_serially = True, ), + triggered_by = ["Dawn Win10 x86 Builder"], console_view_entry = consoles.console_view_entry( category = "ToT|Windows|Nvidia", short_name = "x86", ), - triggered_by = ["Dawn Win10 x86 Builder"], )
diff --git a/infra/config/subprojects/chromium/ci/chromium.fuchsia.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fuchsia.fyi.star index ba418fce..bcc8959 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fuchsia.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.fuchsia.fyi.star
@@ -11,16 +11,16 @@ ci.defaults.set( builder_group = "chromium.fuchsia.fyi", - cores = 8, executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = 10 * time.hour, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, - reclient_jobs = reclient.jobs.DEFAULT, - notifies = ["cr-fuchsia"], + cores = 8, os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, sheriff_rotations = sheriff_rotations.FUCHSIA, + service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = 10 * time.hour, + notifies = ["cr-fuchsia"], + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, ) consoles.console_view( @@ -29,8 +29,8 @@ # The chromium.fuchsia.fyi console includes some entries for builders from the chrome project. [branches.console_view_entry( - builder = "chrome:ci/{}".format(name), console_view = "chromium.fuchsia.fyi", + builder = "chrome:ci/{}".format(name), category = category, short_name = short_name, ) for name, category, short_name in ( @@ -41,6 +41,27 @@ ci.builder( name = "fuchsia-arm64-chrome-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "fuchsia_arm64", + "fuchsia_arm64_host", + ], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.ARM, + target_bits = 64, + target_platform = builder_config.target_platform.FUCHSIA, + ), + build_gs_bucket = "chromium-fyi-archive", + run_tests_serially = True, + ), console_view_entry = [ consoles.console_view_entry( category = "release", @@ -54,6 +75,10 @@ short_name = "chrome", ), ], +) + +ci.builder( + name = "fuchsia-fyi-arm64-dbg", builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -67,7 +92,7 @@ apply_configs = [ "mb", ], - build_config = builder_config.build_config.RELEASE, + build_config = builder_config.build_config.DEBUG, target_arch = builder_config.target_arch.ARM, target_bits = 64, target_platform = builder_config.target_platform.FUCHSIA, @@ -75,10 +100,6 @@ build_gs_bucket = "chromium-fyi-archive", run_tests_serially = True, ), -) - -ci.builder( - name = "fuchsia-fyi-arm64-dbg", console_view_entry = [ consoles.console_view_entry( category = "debug", @@ -91,43 +112,10 @@ short_name = "dbg", ), ], - builder_spec = builder_config.builder_spec( - gclient_config = builder_config.gclient_config( - config = "chromium", - apply_configs = [ - "fuchsia_arm64", - "fuchsia_arm64_host", - ], - ), - chromium_config = builder_config.chromium_config( - config = "chromium", - apply_configs = [ - "mb", - ], - build_config = builder_config.build_config.DEBUG, - target_arch = builder_config.target_arch.ARM, - target_bits = 64, - target_platform = builder_config.target_platform.FUCHSIA, - ), - build_gs_bucket = "chromium-fyi-archive", - run_tests_serially = True, - ), ) ci.builder( name = "fuchsia-fyi-x64-asan", - console_view_entry = [ - consoles.console_view_entry( - category = "asan", - short_name = "x64", - ), - consoles.console_view_entry( - branch_selector = branches.MAIN, - console_view = "sheriff.fuchsia", - category = "gardener|fuchsia ci|x64", - short_name = "asan", - ), - ], builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -146,22 +134,22 @@ ), build_gs_bucket = "chromium-fyi-archive", ), -) - -ci.builder( - name = "fuchsia-fyi-x64-dbg", console_view_entry = [ consoles.console_view_entry( - category = "debug", + category = "asan", short_name = "x64", ), consoles.console_view_entry( branch_selector = branches.MAIN, console_view = "sheriff.fuchsia", category = "gardener|fuchsia ci|x64", - short_name = "dbg", + short_name = "asan", ), ], +) + +ci.builder( + name = "fuchsia-fyi-x64-dbg", builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -180,10 +168,41 @@ ), build_gs_bucket = "chromium-fyi-archive", ), + console_view_entry = [ + consoles.console_view_entry( + category = "debug", + short_name = "x64", + ), + consoles.console_view_entry( + branch_selector = branches.MAIN, + console_view = "sheriff.fuchsia", + category = "gardener|fuchsia ci|x64", + short_name = "dbg", + ), + ], ) ci.builder( name = "fuchsia-x64-chrome-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "fuchsia_x64", + ], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.FUCHSIA, + ), + build_gs_bucket = "chromium-fyi-archive", + run_tests_serially = True, + ), console_view_entry = [ consoles.console_view_entry( category = "release", @@ -197,41 +216,10 @@ short_name = "chrome", ), ], - builder_spec = builder_config.builder_spec( - gclient_config = builder_config.gclient_config( - config = "chromium", - apply_configs = [ - "fuchsia_x64", - ], - ), - chromium_config = builder_config.chromium_config( - config = "chromium", - apply_configs = [ - "mb", - ], - build_config = builder_config.build_config.RELEASE, - target_bits = 64, - target_platform = builder_config.target_platform.FUCHSIA, - ), - build_gs_bucket = "chromium-fyi-archive", - run_tests_serially = True, - ), ) ci.builder( name = "fuchsia-x64-workstation", - console_view_entry = [ - consoles.console_view_entry( - category = "fuchsia|x64", - short_name = "work", - ), - consoles.console_view_entry( - branch_selector = branches.MAIN, - console_view = "sheriff.fuchsia", - category = "fyi|x64", - short_name = "work", - ), - ], builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -251,4 +239,16 @@ build_gs_bucket = "chromium-fyi-archive", run_tests_serially = True, ), + console_view_entry = [ + consoles.console_view_entry( + category = "fuchsia|x64", + short_name = "work", + ), + consoles.console_view_entry( + branch_selector = branches.MAIN, + console_view = "sheriff.fuchsia", + category = "fyi|x64", + short_name = "work", + ), + ], )
diff --git a/infra/config/subprojects/chromium/ci/chromium.fuchsia.star b/infra/config/subprojects/chromium/ci/chromium.fuchsia.star index ead6664..976b3c2 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fuchsia.star +++ b/infra/config/subprojects/chromium/ci/chromium.fuchsia.star
@@ -11,19 +11,19 @@ ci.defaults.set( builder_group = "chromium.fuchsia", - cores = 8, - cq_mirrors_console_view = "mirrors", executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - main_console_view = "main", - notifies = ["cr-fuchsia"], + cores = 8, os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, sheriff_rotations = sheriff_rotations.CHROMIUM, tree_closing = True, + main_console_view = "main", + cq_mirrors_console_view = "mirrors", + service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + notifies = ["cr-fuchsia"], + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) consoles.console_view( @@ -36,6 +36,7 @@ ci.builder( name = "Deterministic Fuchsia (dbg)", + executable = "recipe:swarming/deterministic_build", console_view_entry = [ consoles.console_view_entry( category = "det", @@ -48,25 +49,12 @@ short_name = "det", ), ], - executable = "recipe:swarming/deterministic_build", execution_timeout = 6 * time.hour, ) ci.builder( name = "fuchsia-arm64-cast-receiver-rel", branch_selector = branches.FUCHSIA_LTS_MILESTONE, - console_view_entry = [ - consoles.console_view_entry( - category = "cast-receiver", - short_name = "arm64", - ), - consoles.console_view_entry( - branch_selector = branches.MAIN, - console_view = "sheriff.fuchsia", - category = "gardener|ci|arm64", - short_name = "cast", - ), - ], builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -87,11 +75,43 @@ ), build_gs_bucket = "chromium-linux-archive", ), + console_view_entry = [ + consoles.console_view_entry( + category = "cast-receiver", + short_name = "arm64", + ), + consoles.console_view_entry( + branch_selector = branches.MAIN, + console_view = "sheriff.fuchsia", + category = "gardener|ci|arm64", + short_name = "cast", + ), + ], ) ci.builder( name = "fuchsia-arm64-rel", branch_selector = branches.FUCHSIA_LTS_MILESTONE, + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "fuchsia_arm64", + "fuchsia_arm64_host", + ], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.ARM, + target_bits = 64, + target_platform = builder_config.target_platform.FUCHSIA, + ), + build_gs_bucket = "chromium-linux-archive", + ), console_view_entry = [ consoles.console_view_entry( category = "release", @@ -104,43 +124,11 @@ short_name = "rel", ), ], - builder_spec = builder_config.builder_spec( - gclient_config = builder_config.gclient_config( - config = "chromium", - apply_configs = [ - "fuchsia_arm64", - "fuchsia_arm64_host", - ], - ), - chromium_config = builder_config.chromium_config( - config = "chromium", - apply_configs = [ - "mb", - ], - build_config = builder_config.build_config.RELEASE, - target_arch = builder_config.target_arch.ARM, - target_bits = 64, - target_platform = builder_config.target_platform.FUCHSIA, - ), - build_gs_bucket = "chromium-linux-archive", - ), ) ci.builder( name = "fuchsia-x64-cast-receiver-rel", branch_selector = branches.FUCHSIA_LTS_MILESTONE, - console_view_entry = [ - consoles.console_view_entry( - category = "cast-receiver", - short_name = "x64", - ), - consoles.console_view_entry( - branch_selector = branches.MAIN, - console_view = "sheriff.fuchsia", - category = "gardener|ci|x64", - short_name = "cast", - ), - ], builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -159,22 +147,22 @@ ), build_gs_bucket = "chromium-linux-archive", ), -) - -ci.builder( - name = "fuchsia-x64-dbg", console_view_entry = [ consoles.console_view_entry( - category = "debug", + category = "cast-receiver", short_name = "x64", ), consoles.console_view_entry( branch_selector = branches.MAIN, console_view = "sheriff.fuchsia", category = "gardener|ci|x64", - short_name = "dbg", + short_name = "cast", ), ], +) + +ci.builder( + name = "fuchsia-x64-dbg", builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -193,23 +181,23 @@ ), build_gs_bucket = "chromium-linux-archive", ), -) - -ci.builder( - name = "fuchsia-x64-rel", - branch_selector = branches.FUCHSIA_LTS_MILESTONE, console_view_entry = [ consoles.console_view_entry( - category = "release", + category = "debug", short_name = "x64", ), consoles.console_view_entry( branch_selector = branches.MAIN, console_view = "sheriff.fuchsia", category = "gardener|ci|x64", - short_name = "rel", + short_name = "dbg", ), ], +) + +ci.builder( + name = "fuchsia-x64-rel", + branch_selector = branches.FUCHSIA_LTS_MILESTONE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -228,4 +216,16 @@ ), build_gs_bucket = "chromium-linux-archive", ), + console_view_entry = [ + consoles.console_view_entry( + category = "release", + short_name = "x64", + ), + consoles.console_view_entry( + branch_selector = branches.MAIN, + console_view = "sheriff.fuchsia", + category = "gardener|ci|x64", + short_name = "rel", + ), + ], )
diff --git a/infra/config/subprojects/chromium/ci/chromium.fuzz.star b/infra/config/subprojects/chromium/ci/chromium.fuzz.star index d506c7e..5ad3d72e 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fuzz.star +++ b/infra/config/subprojects/chromium/ci/chromium.fuzz.star
@@ -3,22 +3,23 @@ # found in the LICENSE file. """Definitions of builders in the chromium.fuzz builder group.""" +load("//lib/builder_config.star", "builder_config") load("//lib/builders.star", "os", "reclient", "sheriff_rotations", "xcode") load("//lib/ci.star", "ci") load("//lib/consoles.star", "consoles") ci.defaults.set( builder_group = "chromium.fuzz", - cores = 8, executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, - reclient_jobs = reclient.jobs.DEFAULT, - notifies = ["chromesec-lkgr-failures"], + cores = 8, os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, sheriff_rotations = sheriff_rotations.CHROMIUM_FUZZ, + service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + notifies = ["chromesec-lkgr-failures"], + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, ) consoles.console_view( @@ -55,18 +56,53 @@ ci.builder( name = "ASAN Debug", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_asan", + apply_configs = [ + "mb", + "clobber", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chromium-browser-asan", + gs_acl = "public-read", + archive_name_prefix = "asan", + ), + ), console_view_entry = consoles.console_view_entry( category = "linux asan", short_name = "dbg", ), + reclient_jobs = 250, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), - reclient_jobs = 250, ) ci.builder( name = "ASan Debug (32-bit x86 with V8-ARM)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_asan", + apply_configs = [ + "mb", + "clobber", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 32, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chromium-browser-asan", + gs_acl = "public-read", + archive_name_prefix = "asan-v8-arm", + archive_subdir = "v8-arm", + ), + ), console_view_entry = consoles.console_view_entry( category = "linux asan|x64 v8-ARM", short_name = "dbg", @@ -78,18 +114,53 @@ ci.builder( name = "ASAN Release", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_asan", + apply_configs = [ + "mb", + "clobber", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chromium-browser-asan", + gs_acl = "public-read", + archive_name_prefix = "asan", + ), + ), console_view_entry = consoles.console_view_entry( category = "linux asan", short_name = "rel", ), + reclient_jobs = 250, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 5, ), - reclient_jobs = 250, ) ci.builder( name = "ASan Release (32-bit x86 with V8-ARM)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_asan", + apply_configs = [ + "mb", + "clobber", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chromium-browser-asan", + gs_acl = "public-read", + archive_name_prefix = "asan-v8-arm", + archive_subdir = "v8-arm", + ), + ), console_view_entry = consoles.console_view_entry( category = "linux asan|x64 v8-ARM", short_name = "rel", @@ -101,24 +172,41 @@ ci.builder( name = "ASAN Release Media", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_asan", + apply_configs = [ + "mb", + "clobber", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chrome-test-builds/media", + gs_acl = "public-read", + archive_name_prefix = "asan", + ), + ), console_view_entry = consoles.console_view_entry( category = "linux asan", short_name = "med", ), + reclient_jobs = 250, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), - reclient_jobs = 250, ) ci.builder( name = "Afl Upload Linux ASan", + executable = "recipe:chromium_afl", + cores = 16, console_view_entry = consoles.console_view_entry( category = "afl", short_name = "afl", ), - cores = 16, - executable = "recipe:chromium_afl", triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), @@ -126,6 +214,24 @@ ci.builder( name = "ASan Release Media (32-bit x86 with V8-ARM)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_asan", + apply_configs = [ + "mb", + "clobber", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chrome-test-builds/media", + gs_acl = "public-read", + archive_name_prefix = "asan-v8-arm", + archive_subdir = "v8-arm", + ), + ), console_view_entry = consoles.console_view_entry( category = "linux asan|x64 v8-ARM", short_name = "med", @@ -137,48 +243,122 @@ ci.builder( name = "ChromiumOS ASAN Release", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["chromeos"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium_asan", + apply_configs = [ + "mb", + "clobber", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chromium-browser-asan", + gs_acl = "public-read", + archive_name_prefix = "asan", + archive_subdir = "chromeos", + ), + ), console_view_entry = consoles.console_view_entry( category = "cros asan", ), + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 6, ), - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "MSAN Release (chained origins)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_clang", + apply_configs = [ + "mb", + "msan", + "clobber", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chromium-browser-msan", + gs_acl = "public-read", + archive_name_prefix = "msan-chained-origins", + ), + ), console_view_entry = consoles.console_view_entry( category = "linux msan", short_name = "org", ), + reclient_jobs = 250, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), - reclient_jobs = 250, ) ci.builder( name = "MSAN Release (no origins)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_clang", + apply_configs = [ + "mb", + "msan", + "clobber", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chromium-browser-msan", + gs_acl = "public-read", + archive_name_prefix = "msan-no-origins", + ), + ), console_view_entry = consoles.console_view_entry( category = "linux msan", short_name = "rel", ), + reclient_jobs = 250, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), - reclient_jobs = 250, ) ci.builder( name = "Mac ASAN Release", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_asan", + apply_configs = [ + "mb", + "clobber", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chromium-browser-asan", + gs_acl = "public-read", + archive_name_prefix = "asan", + ), + ), builderless = False, + cores = 4, + os = os.MAC_DEFAULT, console_view_entry = consoles.console_view_entry( category = "mac asan", short_name = "rel", ), - cores = 4, - os = os.MAC_DEFAULT, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 2, ), @@ -186,13 +366,30 @@ ci.builder( name = "Mac ASAN Release Media", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_asan", + apply_configs = [ + "mb", + "clobber", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chrome-test-builds/media", + gs_acl = "public-read", + archive_name_prefix = "asan", + ), + ), builderless = False, + cores = 4, + os = os.MAC_DEFAULT, console_view_entry = consoles.console_view_entry( category = "mac asan", short_name = "med", ), - cores = 4, - os = os.MAC_DEFAULT, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 2, ), @@ -200,170 +397,269 @@ ci.builder( name = "TSAN Debug", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_clang", + apply_configs = [ + "mb", + "tsan2", + "clobber", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chromium-browser-tsan", + gs_acl = "public-read", + archive_name_prefix = "tsan", + ), + ), console_view_entry = consoles.console_view_entry( category = "linux tsan", short_name = "dbg", ), + reclient_jobs = 250, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), - reclient_jobs = 250, ) ci.builder( name = "TSAN Release", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_clang", + apply_configs = [ + "mb", + "tsan2", + "clobber", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chromium-browser-tsan", + gs_acl = "public-read", + archive_name_prefix = "tsan", + ), + ), console_view_entry = consoles.console_view_entry( category = "linux tsan", short_name = "rel", ), + reclient_jobs = 250, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 3, ), - reclient_jobs = 250, ) ci.builder( name = "UBSan Release", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_linux_ubsan", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chromium-browser-ubsan", + gs_acl = "public-read", + archive_name_prefix = "ubsan", + ), + ), console_view_entry = consoles.console_view_entry( category = "linux UBSan", short_name = "rel", ), + reclient_jobs = 250, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), - reclient_jobs = 250, ) ci.builder( name = "UBSan vptr Release", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_linux_ubsan_vptr", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chromium-browser-ubsan", + gs_acl = "public-read", + archive_name_prefix = "ubsan-vptr", + archive_subdir = "vptr", + ), + ), console_view_entry = consoles.console_view_entry( category = "linux UBSan", short_name = "vpt", ), + reclient_jobs = 250, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 4, ), - reclient_jobs = 250, ) ci.builder( name = "Win ASan Release", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_win_clang_asan", + apply_configs = [ + "mb", + "clobber", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chromium-browser-asan", + gs_acl = "public-read", + archive_name_prefix = "asan", + ), + ), builderless = False, + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "win asan", short_name = "rel", ), - os = os.WINDOWS_DEFAULT, + reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 7, ), - reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) ci.builder( name = "Win ASan Release Media", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium_win_clang_asan", + apply_configs = [ + "mb", + "clobber", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + ), + clusterfuzz_archive = builder_config.clusterfuzz_archive( + gs_bucket = "chrome-test-builds/media", + gs_acl = "public-read", + archive_name_prefix = "asan", + ), + ), builderless = False, + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "win asan", short_name = "med", ), - os = os.WINDOWS_DEFAULT, + reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 6, ), - reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) ci.builder( name = "Libfuzzer Upload Chrome OS ASan", + executable = "recipe:chromium_libfuzzer", console_view_entry = consoles.console_view_entry( category = "libfuzz", short_name = "chromeos-asan", ), - executable = "recipe:chromium_libfuzzer", execution_timeout = 4 * time.hour, + reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 3, ), - reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) ci.builder( name = "Libfuzzer Upload iOS Catalyst Debug", + executable = "recipe:chromium_libfuzzer", + cores = 4, + os = os.MAC_12, + xcode = xcode.x14main, console_view_entry = consoles.console_view_entry( category = "libfuzz", short_name = "ios", ), - cores = 4, - executable = "recipe:chromium_libfuzzer", execution_timeout = 4 * time.hour, - os = os.MAC_12, - xcode = xcode.x14main, ) ci.builder( name = "Libfuzzer Upload Linux ASan", + executable = "recipe:chromium_libfuzzer", console_view_entry = consoles.console_view_entry( category = "libfuzz", short_name = "linux", ), - executable = "recipe:chromium_libfuzzer", + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 5, ), - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "Libfuzzer Upload Linux ASan Debug", + executable = "recipe:chromium_libfuzzer", console_view_entry = consoles.console_view_entry( category = "libfuzz", short_name = "linux-dbg", ), - executable = "recipe:chromium_libfuzzer", + execution_timeout = 4 * time.hour, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 5, ), - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - execution_timeout = 4 * time.hour, ) ci.builder( name = "Libfuzzer Upload Linux MSan", + executable = "recipe:chromium_libfuzzer", console_view_entry = consoles.console_view_entry( category = "libfuzz", short_name = "linux-msan", ), - executable = "recipe:chromium_libfuzzer", + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 5, ), - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "Libfuzzer Upload Linux UBSan", + executable = "recipe:chromium_libfuzzer", # Do not use builderless for this (crbug.com/980080). builderless = False, console_view_entry = consoles.console_view_entry( category = "libfuzz", short_name = "linux-ubsan", ), - executable = "recipe:chromium_libfuzzer", execution_timeout = 5 * time.hour, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 5, ), - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "Libfuzzer Upload Linux V8-ARM64 ASan", + executable = "recipe:chromium_libfuzzer", console_view_entry = consoles.console_view_entry( category = "libfuzz", short_name = "arm64", ), - executable = "recipe:chromium_libfuzzer", triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 1, ), @@ -371,11 +667,11 @@ ci.builder( name = "Libfuzzer Upload Linux V8-ARM64 ASan Debug", + executable = "recipe:chromium_libfuzzer", console_view_entry = consoles.console_view_entry( category = "libfuzz", short_name = "arm64-dbg", ), - executable = "recipe:chromium_libfuzzer", triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 1, ), @@ -383,51 +679,51 @@ ci.builder( name = "Libfuzzer Upload Linux32 ASan", + executable = "recipe:chromium_libfuzzer", console_view_entry = consoles.console_view_entry( category = "libfuzz", short_name = "linux32", ), - executable = "recipe:chromium_libfuzzer", + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 3, ), - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "Libfuzzer Upload Linux32 ASan Debug", + executable = "recipe:chromium_libfuzzer", console_view_entry = consoles.console_view_entry( category = "libfuzz", short_name = "linux32-dbg", ), - executable = "recipe:chromium_libfuzzer", execution_timeout = 4 * time.hour, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 3, ), - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "Libfuzzer Upload Linux32 V8-ARM ASan", + executable = "recipe:chromium_libfuzzer", console_view_entry = consoles.console_view_entry( category = "libfuzz", short_name = "arm", ), - executable = "recipe:chromium_libfuzzer", + reclient_jobs = reclient.jobs.DEFAULT, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 1, ), - reclient_jobs = reclient.jobs.DEFAULT, ) ci.builder( name = "Libfuzzer Upload Linux32 V8-ARM ASan Debug", + executable = "recipe:chromium_libfuzzer", console_view_entry = consoles.console_view_entry( category = "libfuzz", short_name = "arm-dbg", ), - executable = "recipe:chromium_libfuzzer", triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 1, ), @@ -435,18 +731,20 @@ ci.builder( name = "Libfuzzer Upload Mac ASan", + executable = "recipe:chromium_libfuzzer", + cores = 24, + os = os.MAC_DEFAULT, console_view_entry = consoles.console_view_entry( category = "libfuzz", short_name = "mac-asan", ), - cores = 24, - executable = "recipe:chromium_libfuzzer", execution_timeout = 4 * time.hour, - os = os.MAC_DEFAULT, ) ci.builder( name = "Libfuzzer Upload Windows ASan", + executable = "recipe:chromium_libfuzzer", + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "libfuzz", short_name = "win-asan", @@ -454,10 +752,8 @@ # crbug.com/1175182: Temporarily increase timeout # crbug.com/1372531: Increase timeout again execution_timeout = 6 * time.hour, - executable = "recipe:chromium_libfuzzer", - os = os.WINDOWS_DEFAULT, + reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 3, ), - reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star index 9afa9581..6a696067 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -12,14 +12,14 @@ ci.defaults.set( builder_group = "chromium.fyi", - cores = 8, executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = 10 * time.hour, - reclient_jobs = reclient.jobs.DEFAULT, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, + cores = 8, pool = ci.DEFAULT_POOL, - priority = ci.DEFAULT_FYI_PRIORITY, service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = 10 * time.hour, + priority = ci.DEFAULT_FYI_PRIORITY, + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, ) consoles.console_view( @@ -76,19 +76,43 @@ ci.builder( name = "Linux Viz", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "viz", ), - os = os.LINUX_DEFAULT, ) ci.builder( name = "Site Isolation Android", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "arm64_builder_mb"), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "site_isolation", ), notifies = ["Site Isolation Android"], - os = os.LINUX_DEFAULT, ) ci.builder( @@ -110,34 +134,64 @@ ), build_gs_bucket = "chromium-fyi-archive", ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", ), cq_mirrors_console_view = "mirrors", - os = os.LINUX_DEFAULT, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "android-backuprefptr-arm-fyi-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-fyi-archive", + ), builderless = True, + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "backuprefptr|android", short_name = "32rel", ), notifies = ["chrome-memory-safety"], - os = os.LINUX_DEFAULT, ) ci.builder( name = "android-backuprefptr-arm64-fyi-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-fyi-archive", + ), builderless = True, + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "backuprefptr|android", short_name = "64rel", ), notifies = ["chrome-memory-safety"], - os = os.LINUX_DEFAULT, ) ci.builder( @@ -161,6 +215,7 @@ build_gs_bucket = "chromium-fuchsia-archive", run_tests_serially = True, ), + os = os.LINUX_DEFAULT, console_view_entry = [ consoles.console_view_entry( category = "fuchsia|x64", @@ -173,7 +228,6 @@ short_name = "cfv2", ), ], - os = os.LINUX_DEFAULT, ) ci.builder( @@ -199,6 +253,7 @@ build_gs_bucket = "chromium-fuchsia-archive", run_tests_serially = True, ), + os = os.LINUX_DEFAULT, console_view_entry = [ consoles.console_view_entry( category = "fuchsia|arm64", @@ -211,39 +266,46 @@ short_name = "cfv2", ), ], - os = os.LINUX_DEFAULT, ) ci.builder( name = "lacros-amd64-generic-rel-fyi", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "chromeos", + "checkout_lacros_sdk", + ], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "mb_no_luci_auth", + ], + target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, + target_cros_boards = ["eve"], + cros_boards_with_qemu_images = ["amd64-generic"], + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "lacros", short_name = "lcr", ), - os = os.LINUX_DEFAULT, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "lacros-amd64-generic-rel-skylab-fyi", - console_view_entry = consoles.console_view_entry( - category = "lacros", - short_name = "lsf", - ), - os = os.LINUX_DEFAULT, # Some tests on this bot depend on being unauthenticated with GS, so # don't run the tests inside a luci-auth context to avoid having the # BOTO config setup for the task's service account. # TODO(crbug.com/1217155): Fix this. builder_spec = builder_config.builder_spec( - chromium_config = builder_config.chromium_config( - config = "chromium", - apply_configs = ["mb", "mb_no_luci_auth"], - target_bits = 64, - target_cros_boards = "eve", - cros_boards_with_qemu_images = "amd64-generic", - target_platform = "chromeos", - ), gclient_config = builder_config.gclient_config( config = "chromium", apply_configs = [ @@ -251,33 +313,33 @@ "checkout_lacros_sdk", ], ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb", "mb_no_luci_auth"], + target_bits = 64, + target_platform = "chromeos", + target_cros_boards = "eve", + cros_boards_with_qemu_images = "amd64-generic", + ), + build_gs_bucket = "chromium-fyi-archive", skylab_upload_location = builder_config.skylab_upload_location( gs_bucket = "lacros-amd64-generic-rel-skylab-try", ), - build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "lacros", + short_name = "lsf", ), ) ci.builder( name = "lacros-arm64-generic-rel-skylab-fyi", - console_view_entry = consoles.console_view_entry( - category = "lacros", - short_name = "larsf", - ), - os = os.LINUX_DEFAULT, # Some tests on this bot depend on being unauthenticated with GS, so # don't run the tests inside a luci-auth context to avoid having the # BOTO config setup for the task's service account. # TODO(crbug.com/1217155): Fix this. builder_spec = builder_config.builder_spec( - chromium_config = builder_config.chromium_config( - config = "chromium", - apply_configs = ["mb", "mb_no_luci_auth"], - target_bits = 64, - target_cros_boards = "kevin", - cros_boards_with_qemu_images = "arm64-generic", - target_platform = "chromeos", - ), gclient_config = builder_config.gclient_config( config = "chromium", apply_configs = [ @@ -285,27 +347,49 @@ "checkout_lacros_sdk", ], ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb", "mb_no_luci_auth"], + target_bits = 64, + target_platform = "chromeos", + target_cros_boards = "kevin", + cros_boards_with_qemu_images = "arm64-generic", + ), + build_gs_bucket = "chromium-fyi-archive", skylab_upload_location = builder_config.skylab_upload_location( gs_bucket = "lacros-arm64-generic-rel-skylab-try", ), - build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "lacros", + short_name = "larsf", ), ) ci.builder( name = "linux-annotator-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "network|traffic|annotations", short_name = "lnx", ), notifies = ["annotator-rel"], - os = os.LINUX_DEFAULT, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "linux-chromeos-annotator-rel", - builderless = True, branch_selector = branches.STANDARD_MILESTONE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( @@ -324,30 +408,40 @@ ), build_gs_bucket = "chromium-fyi-archive", ), + builderless = True, + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "release", short_name = "rel", ), execution_timeout = 3 * time.hour, - os = os.LINUX_DEFAULT, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "linux-lacros-version-skew-fyi", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["chromeos"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "default", ), - os = os.LINUX_DEFAULT, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "linux-blink-wpt-reset-rel", - console_view_entry = consoles.console_view_entry( - category = "linux|blink", - short_name = "BIr", - ), builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -362,64 +456,93 @@ ), ), os = os.LINUX_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "linux|blink", + short_name = "BIr", + ), ) ci.builder( name = "linux-blink-animation-use-time-delta", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux|blink", short_name = "TD", ), - os = os.LINUX_DEFAULT, ) ci.builder( name = "linux-blink-heap-verification", - console_view_entry = consoles.console_view_entry( - category = "linux|blink", - short_name = "VF", - ), - notifies = ["linux-blink-fyi-bots"], - os = os.LINUX_DEFAULT, - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, -) - -ci.builder( - name = "linux-fieldtrial-rel", - console_view_entry = consoles.console_view_entry( - category = "linux", - ), - os = os.LINUX_DEFAULT, -) - -ci.thin_tester( - name = "mac-fieldtrial-tester", - console_view_entry = consoles.console_view_entry( - category = "mac", - ), builder_spec = builder_config.builder_spec( - execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config(config = "chromium"), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], build_config = builder_config.build_config.RELEASE, target_bits = 64, ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "linux|blink", + short_name = "VF", + ), + notifies = ["linux-blink-fyi-bots"], + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, +) + +ci.builder( + name = "linux-fieldtrial-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "linux", + ), +) + +ci.thin_tester( + name = "mac-fieldtrial-tester", + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, gclient_config = builder_config.gclient_config( config = "chromium", ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), ), - cores = None, triggered_by = ["ci/mac-arm64-rel"], + cores = None, + console_view_entry = consoles.console_view_entry( + category = "mac", + ), ) ci.builder( name = "android-fieldtrial-rel", - builderless = False, - console_view_entry = consoles.console_view_entry( - category = "android", - ), - os = os.LINUX_BIONIC, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -441,16 +564,20 @@ ), build_gs_bucket = "chromium-android-archive", ), + builderless = False, + os = os.LINUX_BIONIC, + console_view_entry = consoles.console_view_entry( + category = "android", + ), goma_backend = goma.backend.RBE_PROD, ) fyi_ios_builder( name = "ios-fieldtrial-rel", - builderless = False, - console_view_entry = consoles.console_view_entry( - category = "mac", - ), builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "ios", + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = [ @@ -461,63 +588,124 @@ target_bits = 64, target_platform = "ios", ), - gclient_config = builder_config.gclient_config( - config = "ios", - ), + ), + builderless = False, + console_view_entry = consoles.console_view_entry( + category = "mac", ), ) ci.builder( name = "linux-lacros-builder-fyi-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["chromeos"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", ), - os = os.LINUX_DEFAULT, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.thin_tester( name = "linux-lacros-tester-fyi-rel", + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + triggered_by = ["linux-lacros-builder-fyi-rel"], console_view_entry = consoles.console_view_entry( category = "linux", ), - triggered_by = ["linux-lacros-builder-fyi-rel"], ) ci.builder( name = "linux-lacros-dbg-fyi", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["chromeos"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", ), - os = os.LINUX_DEFAULT, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.thin_tester( name = "linux-lacros-dbg-tests-fyi", + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + triggered_by = ["linux-lacros-dbg-fyi"], console_view_entry = consoles.console_view_entry( category = "linux", ), - triggered_by = ["linux-lacros-dbg-fyi"], ) ci.builder( name = "linux-backuprefptr-x64-fyi-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.LINUX, + ), + build_gs_bucket = "chromium-fyi-archive", + ), builderless = True, + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "backuprefptr|linux", short_name = "64rel", ), notifies = ["chrome-memory-safety"], - os = os.LINUX_DEFAULT, ) ci.builder( name = "android-perfetto-rel", - console_view_entry = consoles.console_view_entry( - category = "android", - ), builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), chromium_config = builder_config.chromium_config( config = "android", apply_configs = ["mb"], @@ -525,107 +713,142 @@ target_bits = 64, target_platform = builder_config.target_platform.ANDROID, ), - gclient_config = builder_config.gclient_config( - config = "chromium", - apply_configs = ["android"], - ), android_config = builder_config.android_config( config = "x64_builder", ), ), - builderless = True, - schedule = "triggered", triggered_by = [], + builderless = True, os = os.LINUX_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "android", + ), + schedule = "triggered", ) ci.builder( name = "linux-perfetto-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", ), - os = os.LINUX_DEFAULT, ) ci.builder( name = "mac-perfetto-rel", - console_view_entry = consoles.console_view_entry( - category = "mac", - ), builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], build_config = builder_config.build_config.RELEASE, target_bits = 64, ), - gclient_config = builder_config.gclient_config( - config = "chromium", - ), ), - builderless = True, - schedule = "triggered", triggered_by = [], + builderless = True, os = os.MAC_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "mac", + ), + schedule = "triggered", ) ci.builder( name = "linux-wpt-content-shell-fyi-rel", - console_view_entry = consoles.console_view_entry( - category = "linux", - ), - experimental = True, - os = os.LINUX_DEFAULT, builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], build_config = builder_config.build_config.RELEASE, target_bits = 64, ), - gclient_config = builder_config.gclient_config( - config = "chromium", - ), ), + os = os.LINUX_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "linux", + ), + experimental = True, ) ci.builder( name = "linux-wpt-fyi-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", ), experimental = True, - os = os.LINUX_DEFAULT, ) ci.builder( name = "linux-wpt-identity-fyi-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", ), experimental = True, - os = os.LINUX_DEFAULT, ) ci.builder( name = "linux-wpt-input-fyi-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", ), experimental = True, - os = os.LINUX_DEFAULT, ) fyi_ios_builder( name = "ios-wpt-fyi-rel", - builderless = False, - # TODO(crbug.com/1351820): Enable scheduler when machine has been allocated. - schedule = "triggered", - triggered_by = [], - console_view_entry = consoles.console_view_entry( - category = "mac", - ), builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "ios", + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = [ @@ -636,10 +859,14 @@ target_bits = 64, target_platform = "ios", ), - gclient_config = builder_config.gclient_config( - config = "ios", - ), ), + triggered_by = [], + builderless = False, + console_view_entry = consoles.console_view_entry( + category = "mac", + ), + # TODO(crbug.com/1351820): Enable scheduler when machine has been allocated. + schedule = "triggered", ) # This is launching & collecting entirely isolated tests. @@ -663,52 +890,54 @@ ), build_gs_bucket = "chromium-fyi-archive", ), + triggered_by = ["ci/Mac Builder (dbg)"], + builderless = False, + cores = 12, + os = os.MAC_13, console_view_entry = consoles.console_view_entry( category = "mac", short_name = "beta", ), main_console_view = None, - builderless = False, - os = os.MAC_13, - cores = 12, - triggered_by = ["ci/Mac Builder (dbg)"], ) ci.builder( name = "linux-headless-shell-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", short_name = "hdls", ), notifies = ["headless-owners"], - os = os.LINUX_DEFAULT, ) # TODO(crbug.com/1320004): Remove this builder after experimentation. ci.builder( name = "linux-rel-no-external-ip", - builderless = False, - console_view_entry = consoles.console_view_entry( - category = "linux", - ), - os = os.LINUX_DEFAULT, builder_spec = builder_config.copy_from( "ci/Linux Builder", ), + builderless = False, + os = os.LINUX_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "linux", + ), # Limited test pool is likely to cause long build times. execution_timeout = 24 * time.hour, ) ci.builder( name = "mac-backuprefptr-x64-fyi-rel", - builderless = True, - console_view_entry = consoles.console_view_entry( - category = "backuprefptr|mac", - short_name = "64rel", - ), - cores = None, - notifies = ["chrome-memory-safety"], - os = os.MAC_ANY, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -724,499 +953,559 @@ ), build_gs_bucket = "chromium-fyi-archive", ), + builderless = True, + cores = None, + os = os.MAC_ANY, + console_view_entry = consoles.console_view_entry( + category = "backuprefptr|mac", + short_name = "64rel", + ), + notifies = ["chrome-memory-safety"], ) ci.builder( name = "win-backuprefptr-x86-fyi-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.WIN, + ), + build_gs_bucket = "chromium-fyi-archive", + ), builderless = True, + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "backuprefptr|win", short_name = "32rel", ), notifies = ["chrome-memory-safety"], - os = os.WINDOWS_ANY, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) ci.builder( name = "win-backuprefptr-x64-fyi-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.WIN, + ), + build_gs_bucket = "chromium-fyi-archive", + ), builderless = True, + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "backuprefptr|win", short_name = "64rel", ), notifies = ["chrome-memory-safety"], - os = os.WINDOWS_ANY, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) ci.builder( name = "win-perfetto-rel", - console_view_entry = consoles.console_view_entry( - category = "win", - ), builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], build_config = builder_config.build_config.RELEASE, target_bits = 64, ), - gclient_config = builder_config.gclient_config( - config = "chromium", - ), ), - builderless = True, - schedule = "triggered", triggered_by = [], + builderless = True, os = os.WINDOWS_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "win", + ), + schedule = "triggered", ) # TODO(crbug.com/1320004): Remove this builder after experimentation. ci.builder( name = "win10-rel-no-external-ip", - builderless = False, - console_view_entry = consoles.console_view_entry( - category = "win", - ), - os = os.WINDOWS_ANY, builder_spec = builder_config.copy_from( "ci/Win x64 Builder", ), + builderless = False, + os = os.WINDOWS_ANY, + console_view_entry = consoles.console_view_entry( + category = "win", + ), # Limited test pool is likely to cause long build times. execution_timeout = 24 * time.hour, ) ci.builder( name = "linux-upload-perfetto", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "perfetto", short_name = "lnx", ), - os = os.LINUX_DEFAULT, ) ci.builder( name = "mac-upload-perfetto", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + triggered_by = [], builderless = True, + cores = None, + os = os.MAC_DEFAULT, console_view_entry = consoles.console_view_entry( category = "perfetto", short_name = "mac", ), - cores = None, - os = os.MAC_DEFAULT, schedule = "with 3h interval", - triggered_by = [], ) ci.builder( name = "win-upload-perfetto", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + triggered_by = [], builderless = True, + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "perfetto", short_name = "win", ), - os = os.WINDOWS_DEFAULT, - schedule = "with 3h interval", - triggered_by = [], reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, + schedule = "with 3h interval", ) ci.builder( name = "Comparison Android (reclient)", - console_view_entry = consoles.console_view_entry( - category = "android", - short_name = "cmp", - ), description_html = """\ This builder measures Android build performance with goma vs reclient.<br/>\ The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/ci/Deterministic%20Android%20(dbg)">Deterministic Android (dbg)</a>.\ """, - goma_jobs = 250, executable = "recipe:reclient_goma_comparison", - execution_timeout = 15 * time.hour, - reclient_cache_silo = "Comparison Android - cache siloed", - goma_backend = goma.backend.RBE_PROD, + cores = 16, os = os.LINUX_DEFAULT, # Target luci-chromium-ci-bionic-us-central1-b-ssd-16-*. ssd = True, - cores = 16, + console_view_entry = consoles.console_view_entry( + category = "android", + short_name = "cmp", + ), + execution_timeout = 15 * time.hour, + goma_backend = goma.backend.RBE_PROD, + goma_jobs = 250, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison Android - cache siloed", ) ci.builder( name = "Comparison Android (reclient) (reproxy cache)", - console_view_entry = consoles.console_view_entry( - category = "android|expcache", - short_name = "cmp", - ), description_html = """\ This builder measures Android build performance with goma vs reclient using reproxy's deps cache.<br/>\ The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/ci/Comparison%20Android%20(reclient)">Comparison Android (reclient)</a>.\ """, - goma_jobs = 250, executable = "recipe:reclient_goma_comparison", - execution_timeout = 15 * time.hour, - reclient_cache_silo = "Comparison Android (reproxy cache) - cache siloed", - goma_backend = goma.backend.RBE_PROD, + cores = 16, os = os.LINUX_DEFAULT, # Target luci-chromium-ci-bionic-us-central1-b-ssd-16-*. ssd = True, - cores = 16, + console_view_entry = consoles.console_view_entry( + category = "android|expcache", + short_name = "cmp", + ), + execution_timeout = 15 * time.hour, + goma_backend = goma.backend.RBE_PROD, + goma_jobs = 250, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison Android (reproxy cache) - cache siloed", ) ci.builder( name = "Comparison Linux (reclient)", + executable = "recipe:reclient_goma_comparison", + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", short_name = "cmp", ), - goma_jobs = 250, - executable = "recipe:reclient_goma_comparison", execution_timeout = 6 * time.hour, - reclient_cache_silo = "Comparison Linux - cache siloed", goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_DEFAULT, + goma_jobs = 250, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison Linux - cache siloed", ) ci.builder( name = "Comparison Mac (reclient)", + executable = "recipe:reclient_goma_comparison", builderless = True, + cores = None, + os = os.MAC_DEFAULT, console_view_entry = consoles.console_view_entry( category = "mac", short_name = "cmp", ), - goma_jobs = 250, - executable = "recipe:reclient_goma_comparison", execution_timeout = 10 * time.hour, - reclient_cache_silo = "Comparison Mac - cache siloed", goma_backend = goma.backend.RBE_PROD, - reclient_instance = reclient.instance.TEST_TRUSTED, - os = os.MAC_DEFAULT, - cores = None, + goma_jobs = 250, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "GLOG_vmodule": "bridge*=2", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison Mac - cache siloed", + reclient_instance = reclient.instance.TEST_TRUSTED, ) ci.builder( name = "Comparison Mac arm64 (reclient)", + executable = "recipe:reclient_goma_comparison", builderless = True, + cores = None, + os = os.MAC_DEFAULT, console_view_entry = consoles.console_view_entry( category = "mac", short_name = "cmp", ), - goma_jobs = 250, - executable = "recipe:reclient_goma_comparison", execution_timeout = 10 * time.hour, - reclient_cache_silo = "Comparison Mac - cache siloed", goma_backend = goma.backend.RBE_PROD, - reclient_instance = reclient.instance.TEST_TRUSTED, - os = os.MAC_DEFAULT, - cores = None, + goma_jobs = 250, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "GLOG_vmodule": "bridge*=2", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison Mac - cache siloed", + reclient_instance = reclient.instance.TEST_TRUSTED, ) ci.builder( name = "Comparison Mac arm64 on arm64 (reclient)", + executable = "recipe:reclient_goma_comparison", builderless = True, + cores = None, + os = os.MAC_DEFAULT, + cpu = cpu.ARM64, console_view_entry = consoles.console_view_entry( category = "mac", short_name = "cmp", ), - goma_jobs = 250, - executable = "recipe:reclient_goma_comparison", execution_timeout = 10 * time.hour, - reclient_cache_silo = "Comparison Mac - cache siloed", goma_backend = goma.backend.RBE_PROD, - reclient_instance = reclient.instance.TEST_TRUSTED, - os = os.MAC_DEFAULT, - cores = None, - cpu = cpu.ARM64, + goma_jobs = 250, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "GLOG_vmodule": "bridge*=2", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison Mac - cache siloed", + reclient_instance = reclient.instance.TEST_TRUSTED, ) ci.builder( name = "Comparison Windows (8 cores) (reclient)", + executable = "recipe:reclient_goma_comparison", builderless = True, + cores = 8, + os = os.WINDOWS_DEFAULT, + free_space = builders.free_space.high, console_view_entry = consoles.console_view_entry( category = "win", short_name = "re", ), - cores = 8, - goma_jobs = 80, - executable = "recipe:reclient_goma_comparison", - reclient_cache_silo = "Comparison Windows 8 cores - cache siloed", goma_backend = goma.backend.RBE_PROD, - reclient_jobs = 80, - os = os.WINDOWS_DEFAULT, - free_space = builders.free_space.high, + goma_jobs = 80, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison Windows 8 cores - cache siloed", + reclient_jobs = 80, ) ci.builder( name = "Comparison Windows (reclient)", + executable = "recipe:reclient_goma_comparison", builderless = True, + cores = 32, + os = os.WINDOWS_DEFAULT, + free_space = builders.free_space.high, console_view_entry = consoles.console_view_entry( category = "win", short_name = "re", ), - cores = 32, - goma_jobs = 250, - executable = "recipe:reclient_goma_comparison", execution_timeout = 6 * time.hour, - reclient_cache_silo = "Comparison Windows - cache siloed", goma_backend = goma.backend.RBE_PROD, - os = os.WINDOWS_DEFAULT, - free_space = builders.free_space.high, + goma_jobs = 250, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison Windows - cache siloed", ) ci.builder( name = "Comparison Simple Chrome (reclient)", + executable = "recipe:reclient_goma_comparison", builderless = True, + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "cros x64", short_name = "cmp", ), - goma_jobs = 250, - executable = "recipe:reclient_goma_comparison", execution_timeout = 10 * time.hour, - reclient_cache_silo = "Comparison Simple Chrome - cache siloed", goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_DEFAULT, + goma_jobs = 250, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison Simple Chrome - cache siloed", ) ci.builder( name = "Comparison ios (reclient)", + executable = "recipe:reclient_goma_comparison", builderless = True, + cores = None, + os = os.MAC_DEFAULT, + xcode = xcode.x14main, console_view_entry = consoles.console_view_entry( category = "ios", short_name = "cmp", ), - goma_jobs = 250, - executable = "recipe:reclient_goma_comparison", execution_timeout = 10 * time.hour, - reclient_cache_silo = "Comparison ios - cache siloed", goma_backend = goma.backend.RBE_PROD, - reclient_instance = reclient.instance.TEST_TRUSTED, - os = os.MAC_DEFAULT, - cores = None, - xcode = xcode.x14main, + goma_jobs = 250, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison ios - cache siloed", + reclient_instance = reclient.instance.TEST_TRUSTED, ) ci.builder( name = "Comparison Android (reclient)(CQ)", - console_view_entry = consoles.console_view_entry( - category = "android|cq", - short_name = "cmp", - ), description_html = """\ This builder measures Android build performance with goma vs reclient in cq configuration.<br/>\ The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/android-pie-arm64-rel-compilator">android-pie-arm64-rel-compilator</a>.\ """, - goma_jobs = goma.jobs.J300, executable = "recipe:reclient_goma_comparison", - execution_timeout = 15 * time.hour, - reclient_cache_silo = "Comparison Android CQ - cache siloed", - goma_backend = goma.backend.RBE_PROD, - reclient_instance = reclient.instance.TEST_UNTRUSTED, - reclient_jobs = 300, - os = os.LINUX_DEFAULT, cores = 32, + os = os.LINUX_DEFAULT, ssd = True, + console_view_entry = consoles.console_view_entry( + category = "android|cq", + short_name = "cmp", + ), + execution_timeout = 15 * time.hour, + goma_backend = goma.backend.RBE_PROD, + goma_jobs = goma.jobs.J300, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison Android CQ - cache siloed", + reclient_instance = reclient.instance.TEST_UNTRUSTED, + reclient_jobs = 300, ) ci.builder( name = "Comparison Linux (reclient)(CQ)", - console_view_entry = consoles.console_view_entry( - category = "linux|cq", - short_name = "cmp", - ), description_html = """\ This builder measures Linux build performance with goma vs reclient in cq configuration.<br/>\ The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/linux-rel-compilator">linux-rel-compilator</a>.\ """, - goma_jobs = 150, executable = "recipe:reclient_goma_comparison", - execution_timeout = 6 * time.hour, - reclient_cache_silo = "Comparison Linux CQ - cache siloed", - goma_backend = goma.backend.RBE_PROD, - reclient_instance = reclient.instance.TEST_UNTRUSTED, - reclient_jobs = 150, - os = os.LINUX_DEFAULT, cores = 16, + os = os.LINUX_DEFAULT, ssd = True, + console_view_entry = consoles.console_view_entry( + category = "linux|cq", + short_name = "cmp", + ), + execution_timeout = 6 * time.hour, + goma_backend = goma.backend.RBE_PROD, + goma_jobs = 150, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison Linux CQ - cache siloed", + reclient_instance = reclient.instance.TEST_UNTRUSTED, + reclient_jobs = 150, ) ci.builder( name = "Comparison Mac (reclient)(CQ)", - builderless = True, - console_view_entry = consoles.console_view_entry( - category = "mac|cq", - short_name = "cmp", - ), description_html = """\ This builder measures Mac build performance with goma vs reclient in cq configuration.<br/>\ The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/mac-rel-compilator">mac-rel-compilator</a>.\ """, - goma_jobs = 150, executable = "recipe:reclient_goma_comparison", - execution_timeout = 10 * time.hour, - reclient_cache_silo = "Comparison Mac CQ - cache siloed", - goma_backend = goma.backend.RBE_PROD, - reclient_instance = reclient.instance.TEST_UNTRUSTED, - reclient_jobs = 150, + builderless = True, + cores = None, os = os.MAC_DEFAULT, ssd = True, - cores = None, + console_view_entry = consoles.console_view_entry( + category = "mac|cq", + short_name = "cmp", + ), + execution_timeout = 10 * time.hour, + goma_backend = goma.backend.RBE_PROD, + goma_jobs = 150, reclient_bootstrap_env = { "GLOG_vmodule": "bridge*=2", "RBE_ip_reset_min_delay": "-1s", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison Mac CQ - cache siloed", + reclient_instance = reclient.instance.TEST_UNTRUSTED, + reclient_jobs = 150, ) ci.builder( name = "Comparison Windows (reclient)(CQ)", - builderless = True, - console_view_entry = consoles.console_view_entry( - category = "win|cq", - short_name = "re", - ), description_html = """\ This builder measures Windows build performance with goma vs reclient in cq configuration.<br/>\ The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/win10_chromium_x64_rel_ng-compilator">win10_chromium_x64_rel_ng-compilator</a>.\ """, - goma_jobs = 300, - goma_enable_ats = False, executable = "recipe:reclient_goma_comparison", - execution_timeout = 6 * time.hour, - reclient_cache_silo = "Comparison Windows CQ - cache siloed", - goma_backend = goma.backend.RBE_PROD, - reclient_instance = reclient.instance.TEST_UNTRUSTED, - reclient_jobs = 300, + builderless = True, + cores = 32, os = os.WINDOWS_DEFAULT, ssd = True, - cores = 32, + console_view_entry = consoles.console_view_entry( + category = "win|cq", + short_name = "re", + ), + execution_timeout = 6 * time.hour, + goma_backend = goma.backend.RBE_PROD, + goma_enable_ats = False, + goma_jobs = 300, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison Windows CQ - cache siloed", + reclient_instance = reclient.instance.TEST_UNTRUSTED, + reclient_jobs = 300, ) ci.builder( name = "Comparison Simple Chrome (reclient)(CQ)", - builderless = True, - console_view_entry = consoles.console_view_entry( - category = "cros x64|cq", - short_name = "cmp", - ), description_html = """\ This builder measures Simple Chrome build performance with goma vs reclient in cq configuration.<br/>\ The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-rel-compilator">linux-chromeos-rel-compilator</a>.\ """, - goma_jobs = 300, executable = "recipe:reclient_goma_comparison", - execution_timeout = 10 * time.hour, - reclient_cache_silo = "Comparison Simple Chrome CQ - cache siloed", - goma_backend = goma.backend.RBE_PROD, - reclient_instance = reclient.instance.TEST_UNTRUSTED, - reclient_jobs = 300, - os = os.LINUX_DEFAULT, + builderless = True, cores = 32, + os = os.LINUX_DEFAULT, ssd = True, + console_view_entry = consoles.console_view_entry( + category = "cros x64|cq", + short_name = "cmp", + ), + execution_timeout = 10 * time.hour, + goma_backend = goma.backend.RBE_PROD, + goma_jobs = 300, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison Simple Chrome CQ - cache siloed", + reclient_instance = reclient.instance.TEST_UNTRUSTED, + reclient_jobs = 300, ) ci.builder( name = "Comparison ios (reclient)(CQ)", - builderless = True, - console_view_entry = consoles.console_view_entry( - category = "ios|cq", - short_name = "cmp", - ), description_html = """\ This builder measures iOS build performance with goma vs reclient in cq configuration.<br/>\ The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/ios-simulator">ios-simulator</a>.\ """, - goma_jobs = 150, executable = "recipe:reclient_goma_comparison", - execution_timeout = 10 * time.hour, - reclient_cache_silo = "Comparison ios CQ - cache siloed", - goma_backend = goma.backend.RBE_PROD, - reclient_instance = reclient.instance.TEST_UNTRUSTED, - reclient_jobs = 150, - os = os.MAC_DEFAULT, + builderless = True, cores = None, + os = os.MAC_DEFAULT, ssd = True, xcode = xcode.x14main, + console_view_entry = consoles.console_view_entry( + category = "ios|cq", + short_name = "cmp", + ), + execution_timeout = 10 * time.hour, + goma_backend = goma.backend.RBE_PROD, + goma_jobs = 150, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_experimental_goma_deps_cache": "true", "RBE_deps_cache_mode": "reproxy", }, + reclient_cache_silo = "Comparison ios CQ - cache siloed", + reclient_instance = reclient.instance.TEST_UNTRUSTED, + reclient_jobs = 150, ) # Build Perf builders use CQ reclient instance and high reclient jobs/cores and @@ -1228,7 +1517,7 @@ This builder measures Android build performance with and without remote caches.<br/>\ The build configs and the bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/android-pie-arm64-rel-compilator">android-pie-arm64-rel-compilator</a>.\ """, - builderless = True, + executable = "recipe:build_perf", builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -1250,20 +1539,20 @@ config = "main_builder", ), ), + builderless = True, + cores = 32, + # Target luci-chromium-ci-bionic-us-central1-c-1000-ssd-hm32-*. + os = os.LINUX_DEFAULT, + ssd = True, console_view_entry = consoles.console_view_entry( category = "buildperf", short_name = "and", ), - executable = "recipe:build_perf", - execution_timeout = 10 * time.hour, service_account = "chromium-build-perf-ci-builder@chops-service-accounts.iam.gserviceaccount.com", + execution_timeout = 10 * time.hour, goma_backend = goma.backend.RBE_PROD, reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, - # Target luci-chromium-ci-bionic-us-central1-c-1000-ssd-hm32-*. - os = os.LINUX_DEFAULT, - cores = 32, - ssd = True, ) ci.builder( @@ -1272,7 +1561,7 @@ This builder measures Linux build performance with and without remote caches.<br/>\ The build configs and the bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/linux-rel-compilator">linux-rel-compilator</a>.\ """, - builderless = True, + executable = "recipe:build_perf", builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -1287,21 +1576,21 @@ ], ), ), + builderless = True, + cores = 16, + # Target luci-chromium-ci-bionic-us-central1-b-ssd-16-*. + os = os.LINUX_DEFAULT, + ssd = True, console_view_entry = consoles.console_view_entry( category = "buildperf", short_name = "lnx", ), - executable = "recipe:build_perf", - execution_timeout = 6 * time.hour, service_account = "chromium-build-perf-ci-builder@chops-service-accounts.iam.gserviceaccount.com", + execution_timeout = 6 * time.hour, goma_backend = goma.backend.RBE_PROD, reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, use_clang_coverage = True, - # Target luci-chromium-ci-bionic-us-central1-b-ssd-16-*. - os = os.LINUX_DEFAULT, - cores = 16, - ssd = True, ) ci.builder( @@ -1310,7 +1599,7 @@ This builder measures Windows build performance with and without remote caches.<br/>\ The build configs and the bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/win-rel-compilator">win-rel-compilator</a>.\ """, - builderless = True, + executable = "recipe:build_perf", builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -1325,34 +1614,47 @@ ], ), ), + builderless = True, + cores = 32, + # Target luci-chromium-ci-win10-ssd-32-*. + os = os.WINDOWS_DEFAULT, + ssd = True, console_view_entry = consoles.console_view_entry( category = "buildperf", short_name = "win", ), - executable = "recipe:build_perf", - execution_timeout = 6 * time.hour, service_account = "chromium-build-perf-ci-builder@chops-service-accounts.iam.gserviceaccount.com", + execution_timeout = 6 * time.hour, goma_backend = goma.backend.RBE_PROD, reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, use_clang_coverage = True, - # Target luci-chromium-ci-win10-ssd-32-*. - os = os.WINDOWS_DEFAULT, - cores = 32, - ssd = True, ) ci.builder( name = "Linux Builder (j-500) (reclient)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["use_clang_coverage"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", short_name = "re", ), + reclient_jobs = 500, reclient_rewrapper_env = { "RBE_platform": "container-image=docker://gcr.io/cloud-marketplace/google/rbe-ubuntu16-04@sha256:b4dad0bfc4951d619229ab15343a311f2415a16ef83bcaa55b44f4e2bf1cf635,pool=linux-e2-custom_0", }, - reclient_jobs = 500, - os = os.LINUX_DEFAULT, schedule = "triggered", ) @@ -1369,137 +1671,224 @@ build_gs_bucket = None, ), ), + cores = 32, + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", short_name = "re", ), - cores = 32, + execution_timeout = 14 * time.hour, + reclient_ensure_verified = True, + reclient_jobs = None, reclient_rewrapper_env = { "RBE_compare": "true", }, - reclient_ensure_verified = True, - os = os.LINUX_DEFAULT, - execution_timeout = 14 * time.hour, - reclient_jobs = None, ) # Start - Reclient migration, phase 2, block 1 shadow builders ci.builder( name = "Linux CFI (reclient shadow)", - console_view_entry = consoles.console_view_entry( - category = "cfi", - short_name = "lnx", - ), - cores = 32, - # TODO(thakis): Remove once https://crbug.com/927738 is resolved. - execution_timeout = 5 * time.hour, - os = os.LINUX_DEFAULT, - reclient_jobs = 400, -) -# End - Reclient migration, phase 2, block 1 shadow builders - -ci.builder( - name = "Win x64 Builder (reclient)", - builderless = True, - console_view_entry = consoles.console_view_entry( - category = "win", - short_name = "re", - ), - cores = 32, - os = os.WINDOWS_DEFAULT, - reclient_jobs = None, -) - -ci.builder( - name = "Win x64 Builder (reclient compare)", - builderless = True, builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], build_config = builder_config.build_config.RELEASE, target_bits = 64, ), + build_gs_bucket = "chromium-fyi-archive", + ), + cores = 32, + os = os.LINUX_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "cfi", + short_name = "lnx", + ), + # TODO(thakis): Remove once https://crbug.com/927738 is resolved. + execution_timeout = 5 * time.hour, + reclient_jobs = 400, +) +# End - Reclient migration, phase 2, block 1 shadow builders + +ci.builder( + name = "Win x64 Builder (reclient)", + builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", - apply_configs = ["use_clang_coverage", "reclient_test"], + apply_configs = [ + "use_clang_coverage", + "reclient_test", + ], ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", ), + builderless = True, + cores = 32, + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "win", short_name = "re", ), - cores = 32, - reclient_rewrapper_env = {"RBE_compare": "true"}, - reclient_ensure_verified = True, - description_html = "verify artifacts. should be removed after the migration. crbug.com/1260232", - os = os.WINDOWS_DEFAULT, reclient_jobs = None, ) ci.builder( - name = "Win x64 Builder (reclient)(cross)", + name = "Win x64 Builder (reclient compare)", + description_html = "verify artifacts. should be removed after the migration. crbug.com/1260232", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["use_clang_coverage", "reclient_test"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + ), builderless = True, + cores = 32, + os = os.WINDOWS_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "win", + short_name = "re", + ), + reclient_ensure_verified = True, + reclient_jobs = None, + reclient_rewrapper_env = {"RBE_compare": "true"}, +) + +ci.builder( + name = "Win x64 Builder (reclient)(cross)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "use_clang_coverage", + "reclient_test", + ], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + builderless = True, + cores = 32, + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "win", short_name = "re x", ), - cores = 32, + reclient_jobs = None, reclient_profiler_service = "reclient-win", reclient_publish_trace = True, - os = os.WINDOWS_DEFAULT, - reclient_jobs = None, ) fyi_mac_builder( name = "Mac Builder (reclient)", + description_html = "experiment reclient on mac. should be removed after the migration. crbug.com/1244441", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "use_clang_coverage", + "reclient_test", + ], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), builderless = True, cores = None, # crbug.com/1245114 console_view_entry = consoles.console_view_entry( category = "mac", short_name = "re", ), - description_html = "experiment reclient on mac. should be removed after the migration. crbug.com/1244441", reclient_jobs = None, ) fyi_mac_builder( name = "Mac Builder (reclient compare)", + description_html = "verify artifacts. should be removed after the migration. crbug.com/1260232", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "use_clang_coverage", + "reclient_test", + ], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), builderless = True, cores = None, # crbug.com/1245114 console_view_entry = consoles.console_view_entry( category = "mac", short_name = "cmp", ), - reclient_rewrapper_env = {"RBE_compare": "true"}, - reclient_ensure_verified = True, - description_html = "verify artifacts. should be removed after the migration. crbug.com/1260232", execution_timeout = 14 * time.hour, + reclient_ensure_verified = True, reclient_jobs = None, + reclient_rewrapper_env = {"RBE_compare": "true"}, ) fyi_mac_builder( name = "mac-arm64-on-arm64-rel-reclient", + description_html = "experiment reclient on mac-arm. should be removed after the migration. crbug.com/1252626", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["reclient_test"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.ARM, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), # same with mac-arm64-on-arm64-rel cores = None, # crbug.com/1245114 - cpu = cpu.ARM64, os = os.MAC_12, + cpu = cpu.ARM64, console_view_entry = consoles.console_view_entry( category = "mac", short_name = "re", ), - description_html = "experiment reclient on mac-arm. should be removed after the migration. crbug.com/1252626", reclient_jobs = None, ) fyi_mac_builder( name = "mac-12-wpt-fyi-rel", - builderless = False, - console_view_entry = consoles.console_view_entry( - category = "mac", - ), builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], @@ -1507,111 +1896,237 @@ target_bits = 64, target_platform = builder_config.target_platform.MAC, ), - gclient_config = builder_config.gclient_config( - config = "chromium", - ), + ), + triggered_by = [], + builderless = False, + os = os.MAC_12, + console_view_entry = consoles.console_view_entry( + category = "mac", ), # TODO(crbug.com/1385202): Enable scheduler when machine has been allocated. schedule = "triggered", - triggered_by = [], - os = os.MAC_12, ) ci.builder( name = "chromeos-amd64-generic-rel (reclient)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["chromeos"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, + cros_boards_with_qemu_images = [ + "amd64-generic", + "amd64-generic-vm", + ], + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "cros x64", ), - os = os.LINUX_DEFAULT, - reclient_rewrapper_env = {"RBE_cache_silo": "chromeos-amd64-generic-rel (reclient)"}, reclient_jobs = None, + reclient_rewrapper_env = {"RBE_cache_silo": "chromeos-amd64-generic-rel (reclient)"}, ) # TODO(crbug.com/1235218): remove after the migration. ci.builder( name = "chromeos-amd64-generic-rel (reclient compare)", + description_html = "verify artifacts. should be removed after the migration. crbug.com/1235218", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["chromeos"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, + cros_boards_with_qemu_images = [ + "amd64-generic", + "amd64-generic-vm", + ], + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "cros x64", short_name = "cmp", ), - os = os.LINUX_DEFAULT, - reclient_rewrapper_env = {"RBE_compare": "true"}, - reclient_ensure_verified = True, - description_html = "verify artifacts. should be removed after the migration. crbug.com/1235218", execution_timeout = 14 * time.hour, + reclient_ensure_verified = True, reclient_jobs = None, + reclient_rewrapper_env = {"RBE_compare": "true"}, ) ci.builder( name = "lacros-amd64-generic-rel (reclient)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "chromeos", + "checkout_lacros_sdk", + ], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.INTEL, + target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, + target_cros_boards = ["amd64-generic"], + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "lacros x64", ), - os = os.LINUX_DEFAULT, - reclient_rewrapper_env = {"RBE_cache_silo": "lacros-amd64-generic-rel (reclient)"}, reclient_jobs = None, + reclient_rewrapper_env = {"RBE_cache_silo": "lacros-amd64-generic-rel (reclient)"}, ) ci.builder( name = "linux-lacros-builder-rel (reclient)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["chromeos"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.INTEL, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "lacros rel", ), - os = os.LINUX_DEFAULT, - reclient_rewrapper_env = {"RBE_cache_silo": "linux-lacros-builder-rel (reclient)"}, reclient_jobs = None, + reclient_rewrapper_env = {"RBE_cache_silo": "linux-lacros-builder-rel (reclient)"}, ) ci.builder( name = "win-celab-builder-rel", executable = "recipe:celab", - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + triggered_by = [], + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "celab", ), - os = os.WINDOWS_ANY, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, properties = { "exclude": "chrome_only", "pool_name": "celab-chromium-ci", "pool_size": 20, "tests": "*", }, - schedule = "0 0,6,12,18 * * *", - triggered_by = [], reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, + schedule = "0 0,6,12,18 * * *", ) fyi_coverage_builder( name = "android-code-coverage", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "download_vr_test_apks", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-fyi-archive", + ), + triggered_by = [], + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "code_coverage", short_name = "and", ), - os = os.LINUX_DEFAULT, coverage_test_types = ["overall", "unit"], - schedule = "triggered", - triggered_by = [], - use_java_coverage = True, export_coverage_to_zoss = True, generate_blame_list = True, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, + schedule = "triggered", + use_java_coverage = True, ) fyi_coverage_builder( name = "android-code-coverage-native", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "android", + "use_clang_coverage", + ], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "download_vr_test_apks", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "code_coverage", short_name = "ann", ), - os = os.LINUX_DEFAULT, - use_clang_coverage = True, coverage_test_types = ["overall", "unit"], export_coverage_to_zoss = True, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, + use_clang_coverage = True, ) fyi_coverage_builder( name = "fuchsia-code-coverage", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "fuchsia_x64", + "use_clang_coverage", + ], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.FUCHSIA, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + triggered_by = [], + os = os.LINUX_DEFAULT, console_view_entry = [ consoles.console_view_entry( category = "code_coverage", @@ -1624,54 +2139,77 @@ short_name = "cov", ), ], - os = os.LINUX_DEFAULT, coverage_test_types = ["overall", "unit"], - use_clang_coverage = True, schedule = "triggered", - triggered_by = [], + use_clang_coverage = True, ) fyi_coverage_builder( name = "ios-simulator-code-coverage", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "ios", + apply_configs = ["use_clang_coverage"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "mac_toolchain", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + target_platform = builder_config.target_platform.IOS, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + cores = None, + os = os.MAC_DEFAULT, + xcode = xcode.x14main, console_view_entry = consoles.console_view_entry( category = "code_coverage", short_name = "ios", ), - cores = None, - os = os.MAC_DEFAULT, - use_clang_coverage = True, coverage_exclude_sources = "ios_test_files_and_test_utils", coverage_test_types = ["overall", "unit"], export_coverage_to_zoss = True, - xcode = xcode.x14main, + use_clang_coverage = True, ) fyi_coverage_builder( name = "linux-chromeos-code-coverage", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "chromeos", + "use_clang_coverage", + ], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.INTEL, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + triggered_by = [], + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "code_coverage", short_name = "lcr", ), - os = os.LINUX_DEFAULT, - use_clang_coverage = True, coverage_test_types = ["overall", "unit"], export_coverage_to_zoss = True, - schedule = "triggered", - triggered_by = [], reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, + schedule = "triggered", + use_clang_coverage = True, ) fyi_coverage_builder( name = "linux-js-code-coverage", - console_view_entry = consoles.console_view_entry( - category = "code_coverage", - short_name = "jcr", - ), - os = os.LINUX_DEFAULT, - use_javascript_coverage = True, - schedule = "triggered", - triggered_by = [], - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -1687,59 +2225,123 @@ ), build_gs_bucket = "chromium-fyi-archive", ), + triggered_by = [], + os = os.LINUX_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "code_coverage", + short_name = "jcr", + ), + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, + schedule = "triggered", + use_javascript_coverage = True, ) fyi_coverage_builder( name = "linux-code-coverage", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["use_clang_coverage"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + triggered_by = [], + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "code_coverage", short_name = "lnx", ), - os = os.LINUX_DEFAULT, - use_clang_coverage = True, coverage_test_types = ["overall", "unit"], export_coverage_to_zoss = True, - triggered_by = [], + use_clang_coverage = True, ) fyi_coverage_builder( name = "linux-lacros-code-coverage", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "chromeos", + "use_clang_coverage", + ], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "code_coverage", short_name = "lac", ), - os = os.LINUX_DEFAULT, - use_clang_coverage = True, coverage_test_types = ["overall", "unit"], reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, + use_clang_coverage = True, ) fyi_coverage_builder( name = "mac-code-coverage", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["use_clang_coverage"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), builderless = True, + cores = 24, + os = os.MAC_ANY, console_view_entry = consoles.console_view_entry( category = "code_coverage", short_name = "mac", ), - cores = 24, - os = os.MAC_ANY, coverage_test_types = ["overall", "unit"], export_coverage_to_zoss = True, - use_clang_coverage = True, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, + use_clang_coverage = True, ) fyi_coverage_builder( name = "win10-code-coverage", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["use_clang_coverage"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), builderless = True, + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "code_coverage", short_name = "win", ), - os = os.WINDOWS_DEFAULT, coverage_test_types = ["overall", "unit"], - use_clang_coverage = True, export_coverage_to_zoss = True, + use_clang_coverage = True, ) fyi_ios_builder( @@ -1756,14 +2358,14 @@ target_platform = builder_config.target_platform.IOS, ), ), + triggered_by = [], + os = os.MAC_DEFAULT, + cpu = cpu.ARM64, console_view_entry = consoles.console_view_entry( category = "iOS|iOSM1", short_name = "iosM1", ), - os = os.MAC_DEFAULT, - cpu = cpu.ARM64, schedule = "0 1,5,9,13,17,21 * * *", - triggered_by = [], ) fyi_ios_builder( @@ -1807,17 +2409,31 @@ target_platform = builder_config.target_platform.IOS, ), ), + os = os.MAC_12, + cpu = cpu.ARM64, console_view_entry = consoles.console_view_entry( category = "cronet", short_name = "m1", ), - os = os.MAC_12, - cpu = cpu.ARM64, schedule = "0 1,5,9,13,17,21 * * *", ) fyi_ios_builder( name = "ios-simulator-multi-window", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "ios"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "mac_toolchain", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + target_platform = builder_config.target_platform.IOS, + ), + build_gs_bucket = "chromium-fyi-archive", + ), console_view_entry = consoles.console_view_entry( category = "iOS", short_name = "mwd", @@ -1826,35 +2442,80 @@ fyi_ios_builder( name = "ios-webkit-tot", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "ios", + apply_configs = ["ios_webkit_tot"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "mac_toolchain", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + target_platform = builder_config.target_platform.IOS, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + triggered_by = [], + xcode = xcode.x13wk, console_view_entry = consoles.console_view_entry( category = "iOS", short_name = "wk", ), schedule = "0 1-23/6 * * *", - triggered_by = [], - xcode = xcode.x13wk, ) fyi_ios_builder( name = "ios15-beta-simulator", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "ios"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "mac_toolchain", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + target_platform = builder_config.target_platform.IOS, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.MAC_12, console_view_entry = [ consoles.console_view_entry( category = "iOS|iOS15", short_name = "ios15", ), ], - os = os.MAC_12, ) fyi_ios_builder( name = "ios15-sdk-simulator", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "ios"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "mac_toolchain", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + target_platform = builder_config.target_platform.IOS, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.MAC_12, console_view_entry = [ consoles.console_view_entry( category = "iOS|iOS15", short_name = "sdk15", ), ], - os = os.MAC_12, ) fyi_ios_builder( @@ -1875,13 +2536,13 @@ ), build_gs_bucket = "chromium-fyi-archive", ), + triggered_by = [], + os = os.MAC_DEFAULT, console_view_entry = consoles.console_view_entry( category = "iOS|iOS16", short_name = "ios16", ), - os = os.MAC_DEFAULT, schedule = "0 0,4,8,12,16,20 * * *", - triggered_by = [], ) fyi_ios_builder( @@ -1902,13 +2563,13 @@ ), build_gs_bucket = "chromium-fyi-archive", ), + os = os.MAC_DEFAULT, console_view_entry = [ consoles.console_view_entry( category = "iOS|iOS16", short_name = "dev", ), ], - os = os.MAC_DEFAULT, ) fyi_ios_builder( @@ -1929,14 +2590,14 @@ ), build_gs_bucket = "chromium-fyi-archive", ), + triggered_by = [], + os = os.MAC_DEFAULT, + xcode = xcode.x14betabots, console_view_entry = consoles.console_view_entry( category = "iOS|iOS16", short_name = "sdk16", ), - os = os.MAC_DEFAULT, schedule = "0 2,6,10,14,18,22 * * *", - triggered_by = [], - xcode = xcode.x14betabots, ) ci.builder( @@ -1957,125 +2618,167 @@ build_config = builder_config.build_config.RELEASE, ), ), + os = os.LINUX_FOCAL, console_view_entry = consoles.console_view_entry( category = "msan", short_name = "crs", ), - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - os = os.LINUX_FOCAL, execution_timeout = 16 * time.hour, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) fyi_mac_builder( name = "Mac Builder Next", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.ARM, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + cores = None, + os = os.MAC_13, + cpu = cpu.ARM64, console_view_entry = consoles.console_view_entry( category = "mac", short_name = "bld", ), - cores = None, - cpu = cpu.ARM64, - os = os.MAC_13, ) fyi_mac_builder( name = "Mac deterministic", + executable = "recipe:swarming/deterministic_build", + cores = None, console_view_entry = consoles.console_view_entry( category = "deterministic|mac", short_name = "rel", ), - cores = None, - executable = "recipe:swarming/deterministic_build", execution_timeout = 6 * time.hour, ) fyi_mac_builder( name = "Mac deterministic (dbg)", + executable = "recipe:swarming/deterministic_build", + cores = None, + os = os.MAC_DEFAULT, console_view_entry = consoles.console_view_entry( category = "deterministic|mac", short_name = "dbg", ), - cores = None, - executable = "recipe:swarming/deterministic_build", execution_timeout = 6 * time.hour, - os = os.MAC_DEFAULT, ) fyi_mac_builder( name = "mac-hermetic-upgrade-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + cores = 12, console_view_entry = consoles.console_view_entry( category = "mac", short_name = "herm", ), - cores = 12, ) ci.builder( name = "Win 10 Fast Ring", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + os = os.WINDOWS_10, console_view_entry = consoles.console_view_entry( category = "win10", ), - os = os.WINDOWS_10, notifies = ["Win 10 Fast Ring"], reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) ci.builder( name = "win10-wpt-content-shell-fyi-rel", - builderless = True, - console_view_entry = consoles.console_view_entry( - category = "win10", - ), - os = os.WINDOWS_10, - experimental = True, builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], build_config = builder_config.build_config.RELEASE, target_bits = 64, ), - gclient_config = builder_config.gclient_config( - config = "chromium", - ), ), - schedule = "with 5h interval", triggered_by = [], + builderless = True, + os = os.WINDOWS_10, + console_view_entry = consoles.console_view_entry( + category = "win10", + ), + experimental = True, + schedule = "with 5h interval", ) ci.builder( name = "win11-wpt-content-shell-fyi-rel", - builderless = True, - console_view_entry = consoles.console_view_entry( - category = "win11", - ), - os = os.WINDOWS_ANY, - goma_backend = None, - experimental = True, - reclient_jobs = reclient.jobs.DEFAULT, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], build_config = builder_config.build_config.RELEASE, target_bits = 64, ), - gclient_config = builder_config.gclient_config( - config = "chromium", - ), ), - schedule = "with 5h interval", triggered_by = [], + builderless = True, + os = os.WINDOWS_ANY, + console_view_entry = consoles.console_view_entry( + category = "win11", + ), + experimental = True, + goma_backend = None, + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, + schedule = "with 5h interval", ) ci.builder( name = "win32-arm64-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.ARM, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), + cores = "8|16", + os = os.WINDOWS_DEFAULT, + cpu = cpu.X86, console_view_entry = consoles.console_view_entry( category = "win32|arm64", ), - cores = "8|16", - cpu = cpu.X86, - os = os.WINDOWS_DEFAULT, reclient_jobs = 150, ) @@ -2096,23 +2799,33 @@ ), build_gs_bucket = "chromium-fyi-archive", ), + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "win", ), - os = os.WINDOWS_DEFAULT, goma_backend = goma.backend.RBE_PROD, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) ci.builder( name = "win-annotator-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-fyi-archive", + ), builderless = True, + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "network|traffic|annotations", short_name = "win", ), execution_timeout = 16 * time.hour, notifies = ["annotator-rel"], - os = os.WINDOWS_DEFAULT, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star b/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star index 171d829..d3c1353 100644 --- a/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
@@ -11,15 +11,15 @@ ci.defaults.set( builder_group = "chromium.gpu.fyi", executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = 6 * time.hour, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, - reclient_jobs = reclient.jobs.DEFAULT, pool = ci.gpu.POOL, + sheriff_rotations = sheriff_rotations.CHROMIUM_GPU, + service_account = ci.gpu.SERVICE_ACCOUNT, + execution_timeout = 6 * time.hour, properties = { "perf_dashboard_machine_group": "ChromiumGPUFYI", }, - service_account = ci.gpu.SERVICE_ACCOUNT, - sheriff_rotations = sheriff_rotations.CHROMIUM_GPU, + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, thin_tester_cores = 2, ) @@ -76,11 +76,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Android arm Builder"], console_view_entry = consoles.console_view_entry( category = "Android|P32|NVDA", short_name = "STV", ), - triggered_by = ["GPU FYI Android arm Builder"], ) ci.thin_tester( @@ -104,11 +104,11 @@ config = "arm64_builder_rel_mb", ), ), + triggered_by = ["GPU FYI Android arm64 Builder"], console_view_entry = consoles.console_view_entry( category = "Android|M64|QCOM", short_name = "N5X", ), - triggered_by = ["GPU FYI Android arm64 Builder"], ) ci.thin_tester( @@ -129,11 +129,11 @@ config = "main_builder_rel_mb", ), ), + triggered_by = ["GPU FYI Android arm Builder"], console_view_entry = consoles.console_view_entry( category = "Android|P32|QCOM", short_name = "P2", ), - triggered_by = ["GPU FYI Android arm Builder"], ) ci.thin_tester( @@ -154,18 +154,15 @@ config = "main_builder_rel_mb", ), ), + triggered_by = ["GPU FYI Android arm Builder"], console_view_entry = consoles.console_view_entry( category = "Android|R32|QCOM", short_name = "P4", ), - triggered_by = ["GPU FYI Android arm Builder"], ) ci.thin_tester( name = "Android FYI Release (Pixel 6)", - # TODO(crbug.com/1280418): Revert this to the default once more Pixel 6 - # capacity is deployed. - execution_timeout = 8 * time.hour, builder_spec = builder_config.builder_spec( execution_mode = builder_config.execution_mode.TEST, gclient_config = builder_config.gclient_config( @@ -186,11 +183,14 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Android arm64 Builder"], console_view_entry = consoles.console_view_entry( category = "Android|S64|ARM", short_name = "P6", ), - triggered_by = ["GPU FYI Android arm64 Builder"], + # TODO(crbug.com/1280418): Revert this to the default once more Pixel 6 + # capacity is deployed. + execution_timeout = 8 * time.hour, ) ci.thin_tester( @@ -211,11 +211,11 @@ config = "main_builder_rel_mb", ), ), + triggered_by = ["GPU FYI Android arm Builder"], console_view_entry = consoles.console_view_entry( category = "Android|S32|ARM", short_name = "A13", ), - triggered_by = ["GPU FYI Android arm Builder"], ) ci.thin_tester( @@ -236,11 +236,11 @@ config = "main_builder_rel_mb", ), ), + triggered_by = ["GPU FYI Android arm Builder"], console_view_entry = consoles.console_view_entry( category = "Android|S32|QCOM", short_name = "A23", ), - triggered_by = ["GPU FYI Android arm Builder"], ) ci.gpu.linux_builder( @@ -260,20 +260,20 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.INTEL, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, cros_boards_with_qemu_images = [ "amd64-generic-vm", ], - target_platform = builder_config.target_platform.CHROMEOS, ), run_tests_serially = True, ), - # Runs a lot of tests + VMs are slower than real hardware, so increase the - # timeout. - execution_timeout = 8 * time.hour, console_view_entry = consoles.console_view_entry( category = "ChromeOS|LLVM", short_name = "gen", ), + # Runs a lot of tests + VMs are slower than real hardware, so increase the + # timeout. + execution_timeout = 8 * time.hour, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) @@ -295,10 +295,10 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.ARM, target_bits = 32, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "jacuzzi", ], - target_platform = builder_config.target_platform.CHROMEOS, ), run_tests_serially = True, ), @@ -327,10 +327,10 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.ARM, target_bits = 32, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "kevin", ], - target_platform = builder_config.target_platform.CHROMEOS, ), run_tests_serially = True, ), @@ -359,10 +359,10 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.ARM, target_bits = 32, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "kevin", ], - target_platform = builder_config.target_platform.CHROMEOS, ), run_tests_serially = True, skylab_upload_location = builder_config.skylab_upload_location( @@ -398,10 +398,10 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.INTEL, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "octopus", ], - target_platform = builder_config.target_platform.CHROMEOS, ), run_tests_serially = True, ), @@ -415,6 +415,10 @@ ci.gpu.linux_builder( name = "gpu-fyi-chromeos-zork-exp", builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["chromeos"], + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], @@ -424,10 +428,6 @@ target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = ["zork"], ), - gclient_config = builder_config.gclient_config( - config = "chromium", - apply_configs = ["chromeos"], - ), run_tests_serially = True, ), console_view_entry = consoles.console_view_entry( @@ -439,14 +439,11 @@ ci.gpu.linux_builder( name = "GPU Flake Finder", + executable = "recipe:chromium_expectation_files/expectation_file_scripts", + triggered_by = [], console_view_entry = consoles.console_view_entry( short_name = "flk", ), - executable = "recipe:chromium_expectation_files/expectation_file_scripts", - # This will eventually be set up to run on a schedule, but only support - # manual triggering for now until we get a successful build. - schedule = "triggered", - triggered_by = [], service_account = "chromium-automated-expectation@chops-service-accounts.iam.gserviceaccount.com", properties = { "scripts": [ @@ -467,6 +464,9 @@ }, ], }, + # This will eventually be set up to run on a schedule, but only support + # manual triggering for now until we get a successful build. + schedule = "triggered", ) ci.gpu.linux_builder( @@ -717,11 +717,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Lacros x64 Builder"], console_view_entry = consoles.console_view_entry( category = "Lacros|AMD", short_name = "amd", ), - triggered_by = ["GPU FYI Lacros x64 Builder"], ) ci.thin_tester( @@ -741,11 +741,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Lacros x64 Builder"], console_view_entry = consoles.console_view_entry( category = "Lacros|Intel", short_name = "int", ), - triggered_by = ["GPU FYI Lacros x64 Builder"], ) ci.thin_tester( @@ -765,11 +765,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Linux Builder (dbg)"], console_view_entry = consoles.console_view_entry( category = "Linux|Nvidia", short_name = "dbg", ), - triggered_by = ["GPU FYI Linux Builder (dbg)"], ) ci.thin_tester( @@ -789,13 +789,13 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Linux Builder"], # Uncomment this entry when this experimental tester is actually in use. # console_view_entry = consoles.console_view_entry( # category = "Linux|Intel", # short_name = "exp", # ), list_view = "chromium.gpu.experimental", - triggered_by = ["GPU FYI Linux Builder"], ) ci.thin_tester( @@ -815,13 +815,13 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Linux Builder"], # Uncomment this entry when this experimental tester is actually in use. # console_view_entry = consoles.console_view_entry( # category = "Linux|Nvidia", # short_name = "exp", # ), list_view = "chromium.gpu.experimental", - triggered_by = ["GPU FYI Linux Builder"], ) ci.thin_tester( @@ -841,11 +841,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Linux Builder"], console_view_entry = consoles.console_view_entry( category = "Linux|Nvidia", short_name = "rel", ), - triggered_by = ["GPU FYI Linux Builder"], ) ci.thin_tester( @@ -865,11 +865,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Linux Builder"], console_view_entry = consoles.console_view_entry( category = "Linux|AMD", short_name = "rel", ), - triggered_by = ["GPU FYI Linux Builder"], ) ci.thin_tester( @@ -889,11 +889,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Linux Builder"], console_view_entry = consoles.console_view_entry( category = "Linux|Intel", short_name = "rel", ), - triggered_by = ["GPU FYI Linux Builder"], ) ci.thin_tester( @@ -914,16 +914,20 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Mac Builder (dbg)"], console_view_entry = consoles.console_view_entry( category = "Mac|Intel", short_name = "dbg", ), - triggered_by = ["GPU FYI Mac Builder (dbg)"], ) ci.thin_tester( name = "Mac FYI Experimental Release (Apple M1)", builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config( + config = "chromium", + ), chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], @@ -932,19 +936,15 @@ target_bits = 64, target_platform = builder_config.target_platform.MAC, ), - execution_mode = builder_config.execution_mode.TEST, - gclient_config = builder_config.gclient_config( - config = "chromium", - ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Mac arm64 Builder"], # Uncomment this entry when this experimental tester is actually in use. # console_view_entry = consoles.console_view_entry( # category = "Mac|Apple", # short_name = "exp", # ), list_view = "chromium.gpu.experimental", - triggered_by = ["GPU FYI Mac arm64 Builder"], ) ci.thin_tester( @@ -965,13 +965,13 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Mac Builder"], # Uncomment this entry when this experimental tester is actually in use. # console_view_entry = consoles.console_view_entry( # category = "Mac|Intel", # short_name = "exp", # ), list_view = "chromium.gpu.experimental", - triggered_by = ["GPU FYI Mac Builder"], ) ci.thin_tester( @@ -992,13 +992,13 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Mac Builder"], # Uncomment this entry when this experimental tester is actually in use. # console_view_entry = consoles.console_view_entry( # category = "Mac|AMD|Retina", # short_name = "exp", # ), list_view = "chromium.gpu.experimental", - triggered_by = ["GPU FYI Mac Builder"], ) ci.thin_tester( @@ -1019,6 +1019,7 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Mac Builder"], # Uncomment this entry when this experimental tester is actually in use. # console_view_entry = consoles.console_view_entry( # category = "Mac|Nvidia", @@ -1029,7 +1030,6 @@ # If it gets more, this can be removed. # See crbug.com/853307 for more context. execution_timeout = 12 * time.hour, - triggered_by = ["GPU FYI Mac Builder"], ) ci.thin_tester( @@ -1051,11 +1051,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Mac arm64 Builder"], console_view_entry = consoles.console_view_entry( category = "Mac|Apple", short_name = "rel", ), - triggered_by = ["GPU FYI Mac arm64 Builder"], ) ci.thin_tester( @@ -1076,11 +1076,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Mac Builder (asan)"], console_view_entry = consoles.console_view_entry( category = "Mac|Intel", short_name = "asn", ), - triggered_by = ["GPU FYI Mac Builder (asan)"], ) ci.thin_tester( @@ -1101,11 +1101,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Mac Builder"], console_view_entry = consoles.console_view_entry( category = "Mac|Intel", short_name = "rel", ), - triggered_by = ["GPU FYI Mac Builder"], ) ci.thin_tester( @@ -1126,11 +1126,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Mac Builder (asan)"], console_view_entry = consoles.console_view_entry( category = "Mac|AMD|Retina", short_name = "asn", ), - triggered_by = ["GPU FYI Mac Builder (asan)"], ) ci.thin_tester( @@ -1151,11 +1151,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Mac Builder (dbg)"], console_view_entry = consoles.console_view_entry( category = "Mac|AMD|Retina", short_name = "dbg", ), - triggered_by = ["GPU FYI Mac Builder (dbg)"], ) ci.thin_tester( @@ -1176,11 +1176,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Mac Builder"], console_view_entry = consoles.console_view_entry( category = "Mac|AMD|Retina", short_name = "rel", ), - triggered_by = ["GPU FYI Mac Builder"], ) ci.thin_tester( @@ -1201,11 +1201,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Mac Builder"], console_view_entry = consoles.console_view_entry( category = "Mac|Nvidia", short_name = "rel", ), - triggered_by = ["GPU FYI Mac Builder"], ) ci.thin_tester( @@ -1226,11 +1226,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Mac Builder"], console_view_entry = consoles.console_view_entry( category = "Mac|AMD|Pro", short_name = "rel", ), - triggered_by = ["GPU FYI Mac Builder"], ) ci.thin_tester( @@ -1250,11 +1250,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Win x64 Builder (dbg)"], console_view_entry = consoles.console_view_entry( category = "Windows|10|x64|Nvidia", short_name = "dbg", ), - triggered_by = ["GPU FYI Win x64 Builder (dbg)"], ) ci.thin_tester( @@ -1274,11 +1274,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Win x64 DX12 Vulkan Builder (dbg)"], console_view_entry = consoles.console_view_entry( category = "Windows|10|x64|Nvidia|dx12vk", short_name = "dbg", ), - triggered_by = ["GPU FYI Win x64 DX12 Vulkan Builder (dbg)"], ) ci.thin_tester( @@ -1298,11 +1298,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Win x64 DX12 Vulkan Builder"], console_view_entry = consoles.console_view_entry( category = "Windows|10|x64|Nvidia|dx12vk", short_name = "rel", ), - triggered_by = ["GPU FYI Win x64 DX12 Vulkan Builder"], ) ci.thin_tester( @@ -1322,13 +1322,13 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Win x64 Builder"], # Uncomment this entry when this experimental tester is actually in use. console_view_entry = consoles.console_view_entry( category = "Windows|10|x64|Intel", short_name = "exp", ), list_view = "chromium.gpu.experimental", - triggered_by = ["GPU FYI Win x64 Builder"], ) ci.thin_tester( @@ -1348,13 +1348,13 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Win x64 Builder"], # Uncomment this entry when this experimental tester is actually in use. # console_view_entry = consoles.console_view_entry( # category = "Windows|10|x64|Nvidia", # short_name = "exp", # ), list_view = "chromium.gpu.experimental", - triggered_by = ["GPU FYI Win x64 Builder"], ) ci.thin_tester( @@ -1374,11 +1374,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Win x64 Builder"], console_view_entry = consoles.console_view_entry( category = "Windows|10|x64|AMD", short_name = "rel", ), - triggered_by = ["GPU FYI Win x64 Builder"], ) ci.thin_tester( @@ -1398,11 +1398,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Win x64 Builder"], console_view_entry = consoles.console_view_entry( category = "Windows|10|x64|Intel", short_name = "rel", ), - triggered_by = ["GPU FYI Win x64 Builder"], ) ci.thin_tester( @@ -1422,11 +1422,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Win x64 Builder"], console_view_entry = consoles.console_view_entry( category = "Windows|10|x64|Nvidia", short_name = "rel", ), - triggered_by = ["GPU FYI Win x64 Builder"], ) ci.thin_tester( @@ -1446,11 +1446,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI XR Win x64 Builder"], console_view_entry = consoles.console_view_entry( category = "Windows|10|x64|Nvidia", short_name = "xr", ), - triggered_by = ["GPU FYI XR Win x64 Builder"], ) ci.thin_tester( @@ -1470,11 +1470,11 @@ ), run_tests_serially = True, ), + triggered_by = ["GPU FYI Win Builder"], console_view_entry = consoles.console_view_entry( category = "Windows|10|x86|Nvidia", short_name = "rel", ), - triggered_by = ["GPU FYI Win Builder"], ) gpu_fyi_windows_builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.gpu.star b/infra/config/subprojects/chromium/ci/chromium.gpu.star index 9565320..f151b957 100644 --- a/infra/config/subprojects/chromium/ci/chromium.gpu.star +++ b/infra/config/subprojects/chromium/ci/chromium.gpu.star
@@ -13,15 +13,15 @@ ci.defaults.set( builder_group = "chromium.gpu", executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, pool = ci.gpu.POOL, - reclient_jobs = reclient.jobs.DEFAULT, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, sheriff_rotations = sheriff_rotations.CHROMIUM_GPU, tree_closing = True, - tree_closing_notifiers = ci.gpu.TREE_CLOSING_NOTIFIERS, + service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, thin_tester_cores = 2, + tree_closing_notifiers = ci.gpu.TREE_CLOSING_NOTIFIERS, ) consoles.console_view( @@ -34,6 +34,7 @@ ci.gpu.linux_builder( name = "Android Release (Nexus 5X)", + branch_selector = branches.STANDARD_MILESTONE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -56,7 +57,6 @@ ), build_gs_bucket = "chromium-gpu-archive", ), - branch_selector = branches.STANDARD_MILESTONE, console_view_entry = consoles.console_view_entry( category = "Android", ), @@ -105,11 +105,11 @@ ), build_gs_bucket = "chromium-gpu-archive", ), + sheriff_rotations = args.ignore_default(None), + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "Linux", ), - tree_closing = False, - sheriff_rotations = args.ignore_default(None), ) ci.gpu.mac_builder( @@ -157,11 +157,11 @@ ), build_gs_bucket = "chromium-gpu-archive", ), + sheriff_rotations = args.ignore_default(None), + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "Mac", ), - sheriff_rotations = args.ignore_default(None), - tree_closing = False, ) ci.gpu.windows_builder( @@ -208,11 +208,11 @@ ), build_gs_bucket = "chromium-gpu-archive", ), + sheriff_rotations = args.ignore_default(None), + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "Windows", ), - sheriff_rotations = args.ignore_default(None), - tree_closing = False, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) @@ -233,12 +233,12 @@ ), build_gs_bucket = "chromium-gpu-archive", ), + triggered_by = ["GPU Linux Builder (dbg)"], + sheriff_rotations = args.ignore_default(None), + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "Linux", ), - sheriff_rotations = args.ignore_default(None), - triggered_by = ["GPU Linux Builder (dbg)"], - tree_closing = False, ) ci.thin_tester( @@ -262,11 +262,11 @@ ), build_gs_bucket = "chromium-gpu-archive", ), - cq_mirrors_console_view = "mirrors", + triggered_by = ["ci/GPU Linux Builder"], console_view_entry = consoles.console_view_entry( category = "Linux", ), - triggered_by = ["ci/GPU Linux Builder"], + cq_mirrors_console_view = "mirrors", ) ci.thin_tester( @@ -287,12 +287,12 @@ ), build_gs_bucket = "chromium-gpu-archive", ), + triggered_by = ["GPU Mac Builder (dbg)"], + sheriff_rotations = args.ignore_default(None), + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "Mac", ), - sheriff_rotations = args.ignore_default(None), - triggered_by = ["GPU Mac Builder (dbg)"], - tree_closing = False, ) ci.thin_tester( @@ -315,11 +315,11 @@ ), build_gs_bucket = "chromium-gpu-archive", ), + triggered_by = ["ci/GPU Mac Builder"], console_view_entry = consoles.console_view_entry( category = "Mac", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/GPU Mac Builder"], ) ci.thin_tester( @@ -340,11 +340,11 @@ ), build_gs_bucket = "chromium-gpu-archive", ), + triggered_by = ["GPU Mac Builder (dbg)"], + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "Mac", ), - triggered_by = ["GPU Mac Builder (dbg)"], - tree_closing = False, ) ci.thin_tester( @@ -367,11 +367,11 @@ ), build_gs_bucket = "chromium-gpu-archive", ), + triggered_by = ["ci/GPU Mac Builder"], console_view_entry = consoles.console_view_entry( category = "Mac", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/GPU Mac Builder"], ) ci.thin_tester( @@ -391,11 +391,11 @@ ), build_gs_bucket = "chromium-gpu-archive", ), + triggered_by = ["GPU Win x64 Builder (dbg)"], + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "Windows", ), - triggered_by = ["GPU Win x64 Builder (dbg)"], - tree_closing = False, ) ci.thin_tester( @@ -420,9 +420,9 @@ ), build_gs_bucket = "chromium-gpu-archive", ), + triggered_by = ["ci/GPU Win x64 Builder"], console_view_entry = consoles.console_view_entry( category = "Windows", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/GPU Win x64 Builder"], )
diff --git a/infra/config/subprojects/chromium/ci/chromium.linux.star b/infra/config/subprojects/chromium/ci/chromium.linux.star index 88affcec..6a2fedd 100644 --- a/infra/config/subprojects/chromium/ci/chromium.linux.star +++ b/infra/config/subprojects/chromium/ci/chromium.linux.star
@@ -12,18 +12,18 @@ ci.defaults.set( builder_group = "chromium.linux", - cores = 8, executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - main_console_view = "main", - notifies = ["chromium.linux"], + cores = 8, os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, sheriff_rotations = sheriff_rotations.CHROMIUM, tree_closing = True, + main_console_view = "main", + service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + notifies = ["chromium.linux"], + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) consoles.console_view( @@ -54,11 +54,11 @@ ), build_gs_bucket = "chromium-linux-archive", ), + ssd = True, console_view_entry = consoles.console_view_entry( category = "cast", short_name = "aud", ), - ssd = True, ) ci.builder( @@ -106,14 +106,14 @@ ), build_gs_bucket = "chromium-linux-archive", ), + os = os.LINUX_BIONIC, + # TODO(crbug.com/1173333): Make it tree-closing. + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "cast", short_name = "dbg", ), cq_mirrors_console_view = "mirrors", - os = os.LINUX_BIONIC, - # TODO(crbug.com/1173333): Make it tree-closing. - tree_closing = False, ) ci.builder( @@ -137,47 +137,59 @@ ), build_gs_bucket = "chromium-linux-archive", ), + os = os.LINUX_BIONIC, + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "cast", short_name = "arm64", ), cq_mirrors_console_view = "mirrors", - os = os.LINUX_BIONIC, - tree_closing = False, ) ci.builder( name = "Deterministic Linux", - console_view_entry = consoles.console_view_entry( - category = "release", - short_name = "det", - ), executable = "recipe:swarming/deterministic_build", - execution_timeout = 6 * time.hour, + ssd = True, + free_space = builders.free_space.high, # Set tree_closing to false to disable the defaualt tree closer, which # filters by step name, and instead enable tree closing for any step # failure. tree_closing = False, + console_view_entry = consoles.console_view_entry( + category = "release", + short_name = "det", + ), + execution_timeout = 6 * time.hour, notifies = ["Deterministic Linux", "close-on-any-step-failure"], reclient_jobs = reclient.jobs.DEFAULT, - free_space = builders.free_space.high, - ssd = True, ) ci.builder( name = "Deterministic Linux (dbg)", + executable = "recipe:swarming/deterministic_build", + cores = 32, console_view_entry = consoles.console_view_entry( category = "debug|builder", short_name = "det", ), - cores = 32, - executable = "recipe:swarming/deterministic_build", execution_timeout = 7 * time.hour, reclient_jobs = reclient.jobs.DEFAULT, ) ci.builder( name = "Leak Detection Linux", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-linux-archive", + ), + sheriff_rotations = args.ignore_default(None), + tree_closing = False, console_view_entry = consoles.console_view_entry( console_view = "chromium.fyi", category = "linux", @@ -185,9 +197,7 @@ ), main_console_view = None, notifies = args.ignore_default([]), - tree_closing = False, reclient_jobs = reclient.jobs.DEFAULT, - sheriff_rotations = args.ignore_default(None), ) ci.builder( @@ -289,12 +299,12 @@ ), build_gs_bucket = "chromium-linux-archive", ), + triggered_by = ["ci/Linux Builder"], console_view_entry = consoles.console_view_entry( category = "release", short_name = "tst", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Linux Builder"], # TODO(crbug.com/1249968): Roll this out more broadly. resultdb_bigquery_exports = [ resultdb.export_text_artifacts( @@ -324,12 +334,12 @@ ), build_gs_bucket = "chromium-linux-archive", ), + triggered_by = ["ci/Linux Builder (dbg)"], console_view_entry = consoles.console_view_entry( category = "debug|tester", short_name = "64", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Linux Builder (dbg)"], ) ci.thin_tester( @@ -353,12 +363,12 @@ ), build_gs_bucket = "chromium-linux-archive", ), + triggered_by = ["ci/Linux Builder (Wayland)"], console_view_entry = consoles.console_view_entry( category = "release", short_name = "tst-wl", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Linux Builder (Wayland)"], ) ci.builder( @@ -454,10 +464,10 @@ ), build_gs_bucket = "chromium-linux-archive", ), + os = os.LINUX_FOCAL, console_view_entry = consoles.console_view_entry( category = "release", short_name = "gcc", ), reclient_instance = None, - os = os.LINUX_FOCAL, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.mac.star b/infra/config/subprojects/chromium/ci/chromium.mac.star index 299fd16..aa1dd1a 100644 --- a/infra/config/subprojects/chromium/ci/chromium.mac.star +++ b/infra/config/subprojects/chromium/ci/chromium.mac.star
@@ -13,16 +13,16 @@ ci.defaults.set( builder_group = "chromium.mac", executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - main_console_view = "main", os = os.MAC_DEFAULT, pool = ci.DEFAULT_POOL, + sheriff_rotations = sheriff_rotations.CHROMIUM, + tree_closing = True, + main_console_view = "main", + service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, reclient_instance = reclient.instance.DEFAULT_TRUSTED, reclient_jobs = reclient.jobs.DEFAULT, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, - sheriff_rotations = sheriff_rotations.CHROMIUM, thin_tester_cores = 8, - tree_closing = True, ) consoles.console_view( @@ -102,12 +102,12 @@ ), build_gs_bucket = "chromium-mac-archive", ), + os = os.MAC_ANY, console_view_entry = consoles.console_view_entry( category = "debug", short_name = "bld", ), cq_mirrors_console_view = "mirrors", - os = os.MAC_ANY, ) ci.builder( @@ -130,12 +130,12 @@ target_bits = 64, ), ), + os = os.MAC_DEFAULT, + cpu = cpu.ARM64, console_view_entry = consoles.console_view_entry( category = "release|arm64", short_name = "a64", ), - cpu = cpu.ARM64, - os = os.MAC_DEFAULT, ) ci.builder( @@ -156,11 +156,11 @@ target_platform = builder_config.target_platform.MAC, ), ), + os = os.MAC_DEFAULT, console_view_entry = consoles.console_view_entry( category = "release|arm64", short_name = "bld", ), - os = os.MAC_DEFAULT, ) ci.thin_tester( @@ -182,12 +182,12 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["ci/mac-arm64-rel"], + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "release|arm64", short_name = "11", ), - tree_closing = False, - triggered_by = ["ci/mac-arm64-rel"], ) ci.thin_tester( @@ -209,12 +209,12 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["ci/mac-arm64-rel"], + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "release|arm64", short_name = "12", ), - tree_closing = False, - triggered_by = ["ci/mac-arm64-rel"], ) ci.thin_tester( @@ -240,12 +240,12 @@ ), build_gs_bucket = "chromium-mac-archive", ), + triggered_by = ["ci/Mac Builder"], console_view_entry = consoles.console_view_entry( category = "release", short_name = "13", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Mac Builder"], ) ci.thin_tester( @@ -268,12 +268,12 @@ ), build_gs_bucket = "chromium-mac-archive", ), + triggered_by = ["ci/Mac Builder"], console_view_entry = consoles.console_view_entry( category = "release", short_name = "14", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Mac Builder"], ) ci.thin_tester( @@ -296,12 +296,12 @@ ), build_gs_bucket = "chromium-mac-archive", ), + triggered_by = ["ci/Mac Builder"], console_view_entry = consoles.console_view_entry( category = "release", short_name = "15", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Mac Builder"], ) ci.thin_tester( @@ -323,11 +323,11 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["ci/Mac Builder"], console_view_entry = consoles.console_view_entry( category = "mac", short_name = "11", ), - triggered_by = ["ci/Mac Builder"], ) ci.thin_tester( @@ -349,11 +349,11 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["ci/Mac Builder"], console_view_entry = consoles.console_view_entry( category = "mac", short_name = "12", ), - triggered_by = ["ci/Mac Builder"], ) ci.thin_tester( @@ -375,13 +375,13 @@ ), build_gs_bucket = "chromium-mac-archive", ), + triggered_by = ["ci/Mac Builder (dbg)"], + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "debug", short_name = "12", ), cq_mirrors_console_view = "mirrors", - sheriff_rotations = args.ignore_default(None), - triggered_by = ["ci/Mac Builder (dbg)"], ) ios_builder( @@ -404,6 +404,7 @@ ), build_gs_bucket = "chromium-mac-archive", ), + tree_closing = False, console_view_entry = [ consoles.console_view_entry( category = "ios|default", @@ -416,7 +417,6 @@ short_name = "ctl", ), ], - tree_closing = False, ) ios_builder( @@ -543,6 +543,9 @@ ), build_gs_bucket = "chromium-mac-archive", ), + # We don't have necessary capacity to run this configuration in CQ, but it + # is part of the main waterfall + xcode = xcode.x14main, console_view_entry = [ consoles.console_view_entry( category = "ios|default", @@ -555,7 +558,4 @@ short_name = "non", ), ], - # We don't have necessary capacity to run this configuration in CQ, but it - # is part of the main waterfall - xcode = xcode.x14main, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.memory.fyi.star b/infra/config/subprojects/chromium/ci/chromium.memory.fyi.star index 250ad00..b8660b0 100644 --- a/infra/config/subprojects/chromium/ci/chromium.memory.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.memory.fyi.star
@@ -48,6 +48,7 @@ short_name = "fyi", ), builderless = 1, + execution_timeout = 4 * time.hour, schedule = "with 12h interval", reclient_jobs = reclient.jobs.DEFAULT, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.memory.star b/infra/config/subprojects/chromium/ci/chromium.memory.star index 1a906dc..fd49965 100644 --- a/infra/config/subprojects/chromium/ci/chromium.memory.star +++ b/infra/config/subprojects/chromium/ci/chromium.memory.star
@@ -12,17 +12,17 @@ ci.defaults.set( builder_group = "chromium.memory", - cores = 8, executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + cores = 8, os = os.LINUX_DEFAULT, - main_console_view = "main", pool = ci.DEFAULT_POOL, - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, sheriff_rotations = sheriff_rotations.CHROMIUM, tree_closing = True, + main_console_view = "main", + service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) consoles.console_view( @@ -62,23 +62,18 @@ ), build_gs_bucket = "chromium-memory-archive", ), + os = os.LINUX_BIONIC, + ssd = True, console_view_entry = consoles.console_view_entry( category = "linux|asan lsan", short_name = "bld", ), cq_mirrors_console_view = "mirrors", - os = os.LINUX_BIONIC, - ssd = True, ) linux_memory_builder( name = "Linux ASan LSan Tests (1)", branch_selector = branches.STANDARD_MILESTONE, - console_view_entry = consoles.console_view_entry( - category = "linux|asan lsan", - short_name = "tst", - ), - cq_mirrors_console_view = "mirrors", builder_spec = builder_config.builder_spec( execution_mode = builder_config.execution_mode.TEST, gclient_config = builder_config.gclient_config( @@ -97,6 +92,11 @@ ), triggered_by = ["ci/Linux ASan LSan Builder"], os = os.LINUX_BIONIC, + console_view_entry = consoles.console_view_entry( + category = "linux|asan lsan", + short_name = "tst", + ), + cq_mirrors_console_view = "mirrors", reclient_instance = None, ) @@ -118,17 +118,18 @@ ), build_gs_bucket = "chromium-memory-archive", ), + triggered_by = ["ci/Linux ASan LSan Builder"], console_view_entry = consoles.console_view_entry( category = "linux|asan lsan", short_name = "sbx", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Linux ASan LSan Builder"], reclient_instance = None, ) linux_memory_builder( name = "Linux TSan Builder", + branch_selector = branches.STANDARD_MILESTONE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -145,7 +146,6 @@ ), build_gs_bucket = "chromium-memory-archive", ), - branch_selector = branches.STANDARD_MILESTONE, console_view_entry = consoles.console_view_entry( category = "linux|TSan v2", short_name = "bld", @@ -169,11 +169,11 @@ ), build_gs_bucket = "chromium-memory-archive", ), + cores = 32, console_view_entry = consoles.console_view_entry( category = "cfi", short_name = "lnx", ), - cores = 32, # TODO(thakis): Remove once https://crbug.com/927738 is resolved. execution_timeout = 5 * time.hour, ) @@ -198,6 +198,8 @@ ), build_gs_bucket = "chromium-memory-archive", ), + cores = 16, + ssd = True, console_view_entry = consoles.console_view_entry( category = "cros|asan", short_name = "bld", @@ -205,8 +207,6 @@ # TODO(crbug.com/1030593): Builds take more than 3 hours sometimes. Remove # once the builds are faster. execution_timeout = 6 * time.hour, - ssd = True, - cores = 16, ) linux_memory_builder( @@ -230,20 +230,16 @@ ), build_gs_bucket = "chromium-memory-archive", ), + triggered_by = ["Linux Chromium OS ASan LSan Builder"], console_view_entry = consoles.console_view_entry( category = "cros|asan", short_name = "tst", ), - triggered_by = ["Linux Chromium OS ASan LSan Builder"], reclient_instance = None, ) linux_memory_builder( name = "Linux ChromiumOS MSan Builder", - console_view_entry = consoles.console_view_entry( - category = "cros|msan", - short_name = "bld", - ), builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -261,17 +257,17 @@ ), build_gs_bucket = "chromium-memory-archive", ), - execution_timeout = 4 * time.hour, - ssd = True, cores = 16, + ssd = True, + console_view_entry = consoles.console_view_entry( + category = "cros|msan", + short_name = "bld", + ), + execution_timeout = 4 * time.hour, ) linux_memory_builder( name = "Linux ChromiumOS MSan Tests", - console_view_entry = consoles.console_view_entry( - category = "cros|msan", - short_name = "tst", - ), builder_spec = builder_config.builder_spec( execution_mode = builder_config.execution_mode.TEST, gclient_config = builder_config.gclient_config( @@ -290,8 +286,12 @@ ), build_gs_bucket = "chromium-memory-archive", ), - execution_timeout = 4 * time.hour, triggered_by = ["Linux ChromiumOS MSan Builder"], + console_view_entry = consoles.console_view_entry( + category = "cros|msan", + short_name = "tst", + ), + execution_timeout = 4 * time.hour, reclient_instance = None, ) @@ -313,12 +313,12 @@ ), build_gs_bucket = "chromium-memory-archive", ), + os = os.LINUX_FOCAL, + ssd = True, console_view_entry = consoles.console_view_entry( category = "linux|msan", short_name = "bld", ), - ssd = True, - os = os.LINUX_FOCAL, ) linux_memory_builder( @@ -340,13 +340,13 @@ ), build_gs_bucket = "chromium-memory-archive", ), + triggered_by = ["Linux MSan Builder"], + os = os.LINUX_FOCAL, console_view_entry = consoles.console_view_entry( category = "linux|msan", short_name = "tst", ), reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, - triggered_by = ["Linux MSan Builder"], - os = os.LINUX_FOCAL, ) linux_memory_builder( @@ -369,15 +369,15 @@ ), build_gs_bucket = "chromium-memory-archive", ), - console_view_entry = consoles.console_view_entry( - category = "lacros|asan", - short_name = "asan", - ), cores = 16, ssd = True, # TODO(crbug.com/1324240) Enable when it's stable. sheriff_rotations = args.ignore_default(None), tree_closing = False, + console_view_entry = consoles.console_view_entry( + category = "lacros|asan", + short_name = "asan", + ), ) ci.builder( @@ -397,12 +397,12 @@ build_gs_bucket = "chromium-memory-archive", ), builderless = False, + cores = None, # Swapping between 8 and 24 + os = os.MAC_DEFAULT, console_view_entry = consoles.console_view_entry( category = "mac", short_name = "bld", ), - cores = None, # Swapping between 8 and 24 - os = os.MAC_DEFAULT, triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 2, ), @@ -410,6 +410,7 @@ linux_memory_builder( name = "Linux TSan Tests", + branch_selector = branches.STANDARD_MILESTONE, builder_spec = builder_config.builder_spec( execution_mode = builder_config.execution_mode.TEST, gclient_config = builder_config.gclient_config( @@ -427,13 +428,12 @@ ), build_gs_bucket = "chromium-memory-archive", ), - branch_selector = branches.STANDARD_MILESTONE, + triggered_by = ["ci/Linux TSan Builder"], console_view_entry = consoles.console_view_entry( category = "linux|TSan v2", short_name = "tst", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Linux TSan Builder"], reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) @@ -454,14 +454,14 @@ ), build_gs_bucket = "chromium-memory-archive", ), + triggered_by = ["Mac ASan 64 Builder"], builderless = False, + cores = 12, + os = os.MAC_DEFAULT, console_view_entry = consoles.console_view_entry( category = "mac", short_name = "tst", ), - cores = 12, - os = os.MAC_DEFAULT, - triggered_by = ["Mac ASan 64 Builder"], reclient_instance = None, ) @@ -541,13 +541,28 @@ ci.builder( name = "android-asan", - console_view_entry = consoles.console_view_entry( - category = "android", - short_name = "asn", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android_asan", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-memory-archive", ), os = os.LINUX_DEFAULT, sheriff_rotations = args.ignore_default(None), tree_closing = False, + console_view_entry = consoles.console_view_entry( + category = "android", + short_name = "asn", + ), ) ci.builder( @@ -568,13 +583,13 @@ ), build_gs_bucket = "chromium-memory-archive", ), + builderless = 1, + cores = 32, + tree_closing = False, console_view_entry = consoles.console_view_entry( category = "linux|ubsan", short_name = "vpt", ), - builderless = 1, - cores = 32, - tree_closing = False, reclient_jobs = reclient.jobs.DEFAULT, ) @@ -594,16 +609,16 @@ ), build_gs_bucket = "chromium-memory-archive", ), + builderless = True, + cores = 32, + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "win", short_name = "asn", ), - cores = 32, # This builder is normally using 2.5 hours to run with a cached builder. And # 1.5 hours additional setup time without cache, https://crbug.com/1311134. execution_timeout = 5 * time.hour, - builderless = True, - os = os.WINDOWS_DEFAULT, reclient_jobs = reclient.jobs.DEFAULT, ) @@ -630,12 +645,12 @@ archive_subdir = "ios-asan", ), ), + cores = None, + os = os.MAC_12, + xcode = xcode.x14main, + sheriff_rotations = args.ignore_default(sheriff_rotations.IOS), console_view_entry = consoles.console_view_entry( category = "iOS", short_name = "asn", ), - sheriff_rotations = args.ignore_default(sheriff_rotations.IOS), - cores = None, - os = os.MAC_12, - xcode = xcode.x14main, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.packager.star b/infra/config/subprojects/chromium/ci/chromium.packager.star index 83f215b..8f5d81bb 100644 --- a/infra/config/subprojects/chromium/ci/chromium.packager.star +++ b/infra/config/subprojects/chromium/ci/chromium.packager.star
@@ -10,10 +10,10 @@ ci.defaults.set( builder_group = "chromium.packager", cores = 8, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, service_account = "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com", + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, ) consoles.console_view( @@ -22,12 +22,13 @@ ci.builder( name = "3pp-linux-amd64-packager", + executable = "recipe:chromium_3pp", + triggered_by = [], builderless = False, console_view_entry = consoles.console_view_entry( category = "3pp|linux", short_name = "amd64", ), - executable = "recipe:chromium_3pp", notifies = ["chromium-3pp-packager"], properties = { "$build/chromium_3pp": { @@ -46,19 +47,19 @@ }, # Every 6 hours starting at 5am UTC. schedule = "0 5/6 * * * *", - triggered_by = [], ) ci.builder( name = "3pp-mac-amd64-packager", - os = os.MAC_DEFAULT, + executable = "recipe:chromium_3pp", + triggered_by = [], builderless = True, + cores = None, + os = os.MAC_DEFAULT, console_view_entry = consoles.console_view_entry( category = "3pp|mac", short_name = "amd64", ), - cores = None, - executable = "recipe:chromium_3pp", notifies = ["chromium-3pp-packager"], properties = { "$build/chromium_3pp": { @@ -68,29 +69,29 @@ }, # TODO(crbug.com/1267449): Trigger builds routinely once works fine. schedule = "triggered", - triggered_by = [], ) ci.builder( name = "android-androidx-packager", + executable = "recipe:android/androidx_packager", + triggered_by = [], + sheriff_rotations = sheriff_rotations.ANDROID, console_view_entry = consoles.console_view_entry( category = "android", short_name = "androidx", ), notifies = ["chromium-androidx-packager"], - executable = "recipe:android/androidx_packager", schedule = "0 7,14,22 * * * *", - sheriff_rotations = sheriff_rotations.ANDROID, - triggered_by = [], ) ci.builder( name = "android-avd-packager", + executable = "recipe:android/avd_packager", + triggered_by = [], console_view_entry = consoles.console_view_entry( category = "android", short_name = "avd", ), - executable = "recipe:android/avd_packager", properties = { "$build/avd_packager": { "avd_configs": [ @@ -122,16 +123,16 @@ # Triggered manually through the scheduler UI # https://luci-scheduler.appspot.com/jobs/chromium/android-avd-packager schedule = "triggered", - triggered_by = [], ) ci.builder( name = "android-sdk-packager", + executable = "recipe:android/sdk_packager", + triggered_by = [], console_view_entry = consoles.console_view_entry( category = "android", short_name = "sdk", ), - executable = "recipe:android/sdk_packager", properties = { # We still package part of build-tools;25.0.2 to support # http://bit.ly/2KNUygZ @@ -268,18 +269,18 @@ ], }, schedule = "0 7 * * *", - triggered_by = [], ) ci.builder( name = "rts-model-packager", + executable = "recipe:chromium_rts/create_model", + triggered_by = [], builderless = False, + cores = None, console_view_entry = consoles.console_view_entry( category = "rts", short_name = "create-model", ), - cores = None, - executable = "recipe:chromium_rts/create_model", execution_timeout = 10 * time.hour, notifies = [ luci.notifier( @@ -289,5 +290,4 @@ ), ], schedule = "0 9 * * *", # at 1AM or 2AM PT (depending on DST), once a day. - triggered_by = [], )
diff --git a/infra/config/subprojects/chromium/ci/chromium.rust.star b/infra/config/subprojects/chromium/ci/chromium.rust.star index 977f1a1..97bb282 100644 --- a/infra/config/subprojects/chromium/ci/chromium.rust.star +++ b/infra/config/subprojects/chromium/ci/chromium.rust.star
@@ -3,22 +3,23 @@ # found in the LICENSE file. """Definitions of builders in the chromium.rust builder group.""" +load("//lib/builder_config.star", "builder_config") load("//lib/builders.star", "os", "reclient") load("//lib/ci.star", "ci") load("//lib/consoles.star", "consoles") ci.defaults.set( builder_group = "chromium.rust", + executable = ci.DEFAULT_EXECUTABLE, builderless = False, cores = 8, - executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - pool = ci.DEFAULT_POOL, - reclient_jobs = reclient.jobs.DEFAULT, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, os = os.LINUX_DEFAULT, + pool = ci.DEFAULT_POOL, + service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, notifies = ["chrome-rust-experiments"], + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, ) consoles.console_view( @@ -27,6 +28,24 @@ ci.builder( name = "android-rust-arm-dbg", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "use_rust", + "android", + ], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = ["android"], + build_config = builder_config.build_config.DEBUG, + target_arch = builder_config.target_arch.ARM, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "base_config"), + ), console_view_entry = consoles.console_view_entry( category = "Android", short_name = "dbg", @@ -35,6 +54,24 @@ ci.builder( name = "android-rust-arm-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "use_rust", + "android", + ], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = ["android"], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.ARM, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "base_config"), + ), console_view_entry = consoles.console_view_entry( category = "Android", short_name = "rel", @@ -43,6 +80,18 @@ ci.builder( name = "linux-rust-x64-dbg", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["use_rust"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + ), + ), console_view_entry = consoles.console_view_entry( category = "Linux", short_name = "dbg", @@ -51,6 +100,18 @@ ci.builder( name = "linux-rust-x64-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["use_rust"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + ), console_view_entry = consoles.console_view_entry( category = "Linux", short_name = "rel",
diff --git a/infra/config/subprojects/chromium/ci/chromium.star b/infra/config/subprojects/chromium/ci/chromium.star index 1bdb599..153ad96c 100644 --- a/infra/config/subprojects/chromium/ci/chromium.star +++ b/infra/config/subprojects/chromium/ci/chromium.star
@@ -13,14 +13,14 @@ ci.defaults.set( builder_group = "chromium", executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - reclient_jobs = reclient.jobs.DEFAULT, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, - main_console_view = "main", os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, sheriff_rotations = sheriff_rotations.CHROMIUM, + main_console_view = "main", + service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, ) consoles.console_view( @@ -56,21 +56,21 @@ "mb", ], build_config = builder_config.build_config.DEBUG, - target_platform = builder_config.target_platform.ANDROID, target_arch = builder_config.target_arch.ARM, + target_platform = builder_config.target_platform.ANDROID, ), android_config = builder_config.android_config( config = "main_builder", ), ), + cores = 8, + tree_closing = True, # Bump to 32 if needed. console_view_entry = consoles.console_view_entry( category = "android", short_name = "dbg", ), - cores = 8, execution_timeout = 4 * time.hour, - tree_closing = True, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) @@ -90,18 +90,19 @@ "mb", ], build_config = builder_config.build_config.RELEASE, - target_platform = builder_config.target_platform.ANDROID, target_arch = builder_config.target_arch.ARM, + target_platform = builder_config.target_platform.ANDROID, ), android_config = builder_config.android_config( config = "main_builder", ), ), + cores = 32, + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "android", short_name = "rel", ), - cores = 32, properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -113,7 +114,6 @@ ], }, }, - tree_closing = True, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) @@ -133,19 +133,20 @@ "mb", ], build_config = builder_config.build_config.RELEASE, - target_platform = builder_config.target_platform.ANDROID, target_arch = builder_config.target_arch.ARM, target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, ), android_config = builder_config.android_config( config = "main_builder", ), ), + cores = 32, + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "android|arm", short_name = "arm64", ), - cores = 32, properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -157,7 +158,6 @@ ], }, }, - tree_closing = True, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) @@ -176,24 +176,24 @@ apply_configs = [ "mb", ], - target_platform = builder_config.target_platform.ANDROID, target_arch = builder_config.target_arch.ARM, + target_platform = builder_config.target_platform.ANDROID, ), android_config = builder_config.android_config( config = "main_builder", ), ), builderless = False, + cores = 32, + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "android", short_name = "off", ), - cores = 32, # See https://crbug.com/1153349#c22, as we update symbol_level=2, build # needs longer time to complete. execution_timeout = 7 * time.hour, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - sheriff_rotations = args.ignore_default(None), ) ci.builder( @@ -216,6 +216,8 @@ ), ), builderless = False, + cores = 32, + sheriff_rotations = args.ignore_default(None), console_view_entry = [ consoles.console_view_entry( category = "fuchsia", @@ -228,20 +230,14 @@ short_name = "off", ), ], - cores = 32, # TODO: Change this back down to something reasonable once these builders # have populated their cached by getting through the compile step execution_timeout = 10 * time.hour, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, - sheriff_rotations = args.ignore_default(None), ) ci.builder( name = "lacros64-archive-rel", - console_view_entry = consoles.console_view_entry( - category = "lacros", - short_name = "rel", - ), builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -258,13 +254,18 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.INTEL, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "amd64-generic", ], - target_platform = builder_config.target_platform.CHROMEOS, ), ), cores = 32, + tree_closing = True, + console_view_entry = consoles.console_view_entry( + category = "lacros", + short_name = "rel", + ), properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -276,16 +277,11 @@ ], }, }, - tree_closing = True, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "lacros-arm-archive-rel", - console_view_entry = consoles.console_view_entry( - category = "lacros", - short_name = "arm", - ), builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -302,13 +298,18 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.ARM, target_bits = 32, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "arm-generic", ], - target_platform = builder_config.target_platform.CHROMEOS, ), ), cores = 32, + tree_closing = True, + console_view_entry = consoles.console_view_entry( + category = "lacros", + short_name = "arm", + ), properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -320,16 +321,11 @@ ], }, }, - tree_closing = True, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.builder( name = "lacros-arm64-archive-rel", - console_view_entry = consoles.console_view_entry( - category = "lacros", - short_name = "arm64", - ), builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -346,13 +342,20 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.ARM, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "arm64-generic", ], - target_platform = builder_config.target_platform.CHROMEOS, ), ), cores = 32, + sheriff_rotations = args.ignore_default(None), + # TODO(crbug.com/1363272): Enable tree_closing/sheriff when stable. + tree_closing = False, + console_view_entry = consoles.console_view_entry( + category = "lacros", + short_name = "arm64", + ), properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -364,9 +367,6 @@ ], }, }, - # TODO(crbug.com/1363272): Enable tree_closing/sheriff when stable. - tree_closing = False, - sheriff_rotations = args.ignore_default(None), reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) @@ -388,13 +388,13 @@ target_bits = 64, ), ), + # Bump to 32 if needed. + cores = 8, + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "linux", short_name = "dbg", ), - # Bump to 32 if needed. - cores = 8, - tree_closing = True, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) @@ -416,11 +416,12 @@ target_bits = 64, ), ), + cores = 32, + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "linux", short_name = "rel", ), - cores = 32, notifies = ["linux-archive-rel"], properties = { # The format of these properties is defined at archive/properties.proto @@ -433,7 +434,6 @@ ], }, }, - tree_closing = True, ) ci.builder( @@ -455,13 +455,13 @@ ), ), builderless = False, + cores = 32, + sheriff_rotations = args.ignore_default(None), console_view_entry = consoles.console_view_entry( category = "linux", short_name = "off", ), - cores = 32, execution_timeout = 7 * time.hour, - sheriff_rotations = args.ignore_default(None), ) ci.builder( @@ -480,14 +480,14 @@ target_bits = 64, ), ), - console_view_entry = consoles.console_view_entry( - category = "mac", - short_name = "dbg", - ), # Bump to 8 cores if needed. cores = 4, os = os.MAC_DEFAULT, tree_closing = True, + console_view_entry = consoles.console_view_entry( + category = "mac", + short_name = "dbg", + ), ) ci.builder( @@ -507,12 +507,13 @@ target_bits = 64, ), ), + cores = 12, + os = os.MAC_DEFAULT, + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "mac", short_name = "rel", ), - cores = 12, - os = os.MAC_DEFAULT, properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -524,7 +525,6 @@ ], }, }, - tree_closing = True, ) ci.builder( @@ -543,13 +543,13 @@ target_bits = 64, ), ), + cores = 12, + os = os.MAC_DEFAULT, + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "mac|arm", short_name = "dbg", ), - cores = 12, - os = os.MAC_DEFAULT, - tree_closing = True, ) ci.builder( @@ -569,12 +569,13 @@ target_bits = 64, ), ), + cores = 12, + os = os.MAC_DEFAULT, + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "mac|arm", short_name = "rel", ), - cores = 12, - os = os.MAC_DEFAULT, properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -586,7 +587,6 @@ ], }, }, - tree_closing = True, ) ci.builder( @@ -608,6 +608,7 @@ ), ), builderless = False, + os = os.MAC_ANY, console_view_entry = consoles.console_view_entry( category = "mac", short_name = "off", @@ -615,17 +616,28 @@ # TODO(crbug.com/1279290) builds with PGO change take long time. # Keep in sync with mac-official in try/chromium.star. execution_timeout = 9 * time.hour, - os = os.MAC_ANY, ) ci.builder( name = "win-archive-dbg", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "clobber", + "mb", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + ), + ), + cores = 32, + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "win|dbg", short_name = "64", ), - cores = 32, - os = os.WINDOWS_DEFAULT, ) ci.builder( @@ -644,12 +656,13 @@ target_bits = 64, ), ), + cores = 32, + os = os.WINDOWS_DEFAULT, + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "win|rel", short_name = "64", ), - cores = 32, - os = os.WINDOWS_DEFAULT, properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -661,7 +674,6 @@ ], }, }, - tree_closing = True, ) ci.builder( @@ -682,14 +694,14 @@ target_bits = 64, ), ), + cores = 32, + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "win|off", short_name = "64", ), - cores = 32, # TODO(crbug.com/1155416) builds with PGO change take long time. execution_timeout = 7 * time.hour, - os = os.WINDOWS_DEFAULT, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) @@ -709,12 +721,12 @@ target_bits = 32, ), ), + cores = 32, + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "win|dbg", short_name = "32", ), - cores = 32, - os = os.WINDOWS_DEFAULT, ) ci.builder( @@ -733,12 +745,13 @@ target_bits = 32, ), ), + cores = 32, + os = os.WINDOWS_DEFAULT, + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "win|rel", short_name = "32", ), - cores = 32, - os = os.WINDOWS_DEFAULT, properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -750,20 +763,11 @@ ], }, }, - tree_closing = True, ) ci.builder( name = "win32-official", branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, - console_view_entry = consoles.console_view_entry( - category = "win|off", - short_name = "32", - ), - cores = 32, - # TODO(crbug.com/1155416) builds with PGO change take long time. - execution_timeout = 7 * time.hour, - os = os.WINDOWS_DEFAULT, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -779,5 +783,13 @@ target_bits = 32, ), ), + cores = 32, + os = os.WINDOWS_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "win|off", + short_name = "32", + ), + # TODO(crbug.com/1155416) builds with PGO change take long time. + execution_timeout = 7 * time.hour, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.swangle.star b/infra/config/subprojects/chromium/ci/chromium.swangle.star index dbef9ea..09db3f0 100644 --- a/infra/config/subprojects/chromium/ci/chromium.swangle.star +++ b/infra/config/subprojects/chromium/ci/chromium.swangle.star
@@ -11,12 +11,12 @@ ci.defaults.set( builder_group = "chromium.swangle", executable = "recipe:angle_chromium", + pool = ci.gpu.POOL, + sheriff_rotations = sheriff_rotations.CHROMIUM_GPU, + service_account = ci.gpu.SERVICE_ACCOUNT, execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, reclient_instance = reclient.instance.DEFAULT_TRUSTED, reclient_jobs = reclient.jobs.DEFAULT, - pool = ci.gpu.POOL, - service_account = ci.gpu.SERVICE_ACCOUNT, - sheriff_rotations = sheriff_rotations.CHROMIUM_GPU, ) consoles.console_view( @@ -37,6 +37,7 @@ ci.gpu.linux_builder( name = "linux-swangle-chromium-x64", + executable = ci.DEFAULT_EXECUTABLE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -60,7 +61,6 @@ category = "Chromium|Linux", short_name = "x64", ), - executable = ci.DEFAULT_EXECUTABLE, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) @@ -93,6 +93,7 @@ ci.gpu.linux_builder( name = "linux-swangle-x64", + executable = ci.DEFAULT_EXECUTABLE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -112,12 +113,12 @@ category = "DEPS|Linux", short_name = "x64", ), - executable = ci.DEFAULT_EXECUTABLE, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CI, ) ci.gpu.mac_builder( name = "mac-swangle-chromium-x64", + executable = ci.DEFAULT_EXECUTABLE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -141,11 +142,11 @@ category = "Chromium|Mac", short_name = "x64", ), - executable = ci.DEFAULT_EXECUTABLE, ) ci.gpu.windows_builder( name = "win-swangle-chromium-x86", + executable = ci.DEFAULT_EXECUTABLE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -169,7 +170,6 @@ category = "Chromium|Windows", short_name = "x86", ), - executable = ci.DEFAULT_EXECUTABLE, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) @@ -229,6 +229,7 @@ ci.gpu.windows_builder( name = "win-swangle-x64", + executable = ci.DEFAULT_EXECUTABLE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -248,12 +249,12 @@ category = "DEPS|Windows", short_name = "x64", ), - executable = ci.DEFAULT_EXECUTABLE, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) ci.gpu.windows_builder( name = "win-swangle-x86", + executable = ci.DEFAULT_EXECUTABLE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -273,6 +274,5 @@ category = "DEPS|Windows", short_name = "x86", ), - executable = ci.DEFAULT_EXECUTABLE, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.updater.star b/infra/config/subprojects/chromium/ci/chromium.updater.star index dd1f1c1..f59ea70 100644 --- a/infra/config/subprojects/chromium/ci/chromium.updater.star +++ b/infra/config/subprojects/chromium/ci/chromium.updater.star
@@ -11,14 +11,14 @@ ci.defaults.set( builder_group = "chromium.updater", - cores = 8, executable = ci.DEFAULT_EXECUTABLE, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + cores = 8, os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, + service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, reclient_instance = reclient.instance.DEFAULT_TRUSTED, reclient_jobs = reclient.jobs.DEFAULT, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, ) consoles.console_view( @@ -27,8 +27,8 @@ # The chromium.updater console includes some entries from official chrome builders. [branches.console_view_entry( - builder = "chrome:official/{}".format(name), console_view = "chromium.updater", + builder = "chrome:official/{}".format(name), category = category, short_name = short_name, ) for name, category, short_name in ( @@ -56,12 +56,12 @@ ), ), builderless = True, + cores = None, + os = os.MAC_ANY, console_view_entry = consoles.console_view_entry( category = "debug|mac", short_name = "bld", ), - cores = None, - os = os.MAC_ANY, ) ci.builder( @@ -81,12 +81,12 @@ ), ), builderless = True, + cores = None, + os = os.MAC_ANY, console_view_entry = consoles.console_view_entry( category = "release|mac", short_name = "bld", ), - cores = None, - os = os.MAC_ANY, ) ci.builder( @@ -106,13 +106,13 @@ ), ), builderless = True, + cores = None, + os = os.MAC_ANY, + cpu = cpu.ARM64, console_view_entry = consoles.console_view_entry( category = "debug|mac", short_name = "bld", ), - cores = None, - cpu = cpu.ARM64, - os = os.MAC_ANY, ) ci.builder( @@ -132,13 +132,13 @@ ), ), builderless = True, + cores = None, + os = os.MAC_ANY, + cpu = cpu.ARM64, console_view_entry = consoles.console_view_entry( category = "release|mac", short_name = "bld", ), - cores = None, - cpu = cpu.ARM64, - os = os.MAC_ANY, ) ci.builder( @@ -158,12 +158,12 @@ ), ), builderless = True, + cores = None, + os = os.MAC_ANY, console_view_entry = consoles.console_view_entry( category = "debug|mac", short_name = "bld-asan", ), - cores = None, - os = os.MAC_ANY, ) ci.thin_tester( @@ -183,11 +183,11 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["mac-updater-builder-dbg"], console_view_entry = consoles.console_view_entry( category = "debug|mac", short_name = "10.13", ), - triggered_by = ["mac-updater-builder-dbg"], ) ci.thin_tester( @@ -207,11 +207,11 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["mac-updater-builder-rel"], console_view_entry = consoles.console_view_entry( category = "release|mac", short_name = "10.13", ), - triggered_by = ["mac-updater-builder-rel"], ) ci.thin_tester( @@ -231,11 +231,11 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["mac-updater-builder-dbg"], console_view_entry = consoles.console_view_entry( category = "debug|mac", short_name = "10.14", ), - triggered_by = ["mac-updater-builder-dbg"], ) ci.thin_tester( @@ -255,11 +255,11 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["mac-updater-builder-rel"], console_view_entry = consoles.console_view_entry( category = "release|mac", short_name = "10.14", ), - triggered_by = ["mac-updater-builder-rel"], ) ci.thin_tester( @@ -279,11 +279,11 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["mac-updater-builder-dbg"], console_view_entry = consoles.console_view_entry( category = "debug|mac", short_name = "10.15", ), - triggered_by = ["mac-updater-builder-dbg"], ) ci.thin_tester( @@ -303,11 +303,11 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["mac-updater-builder-rel"], console_view_entry = consoles.console_view_entry( category = "release|mac", short_name = "10.15", ), - triggered_by = ["mac-updater-builder-rel"], ) ci.thin_tester( @@ -327,11 +327,11 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["mac-updater-builder-dbg"], console_view_entry = consoles.console_view_entry( category = "debug|mac", short_name = "11.0", ), - triggered_by = ["mac-updater-builder-dbg"], ) ci.thin_tester( @@ -351,11 +351,11 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["mac-updater-builder-rel"], console_view_entry = consoles.console_view_entry( category = "release|mac", short_name = "11.0", ), - triggered_by = ["mac-updater-builder-rel"], ) ci.thin_tester( @@ -375,11 +375,11 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["mac-updater-builder-arm64-dbg"], console_view_entry = consoles.console_view_entry( category = "debug|mac", short_name = "11.0 arm64", ), - triggered_by = ["mac-updater-builder-arm64-dbg"], ) ci.thin_tester( @@ -399,11 +399,11 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["mac-updater-builder-arm64-rel"], console_view_entry = consoles.console_view_entry( category = "release|mac", short_name = "11.0 arm64", ), - triggered_by = ["mac-updater-builder-arm64-rel"], ) # TODO(crbug.com/1381588): move to macOS 12 once crbug.com/1394839 is resolved. @@ -424,11 +424,11 @@ target_platform = builder_config.target_platform.MAC, ), ), + triggered_by = ["mac-updater-builder-asan-dbg"], console_view_entry = consoles.console_view_entry( category = "debug|mac", short_name = "11.0 asan", ), - triggered_by = ["mac-updater-builder-asan-dbg"], ) ci.builder( @@ -448,11 +448,11 @@ ), ), builderless = True, + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "debug|win (64)", short_name = "bld", ), - os = os.WINDOWS_DEFAULT, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) @@ -473,14 +473,14 @@ ), ), builderless = True, + os = os.WINDOWS_DEFAULT, + free_space = builders.free_space.high, console_view_entry = consoles.console_view_entry( category = "debug|win (32)", short_name = "bld", ), execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT * 2, - os = os.WINDOWS_DEFAULT, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, - free_space = builders.free_space.high, ) ci.builder( @@ -500,11 +500,11 @@ ), ), builderless = True, + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "release|win (64)", short_name = "bld", ), - os = os.WINDOWS_DEFAULT, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) @@ -525,11 +525,11 @@ ), ), builderless = True, + os = os.WINDOWS_DEFAULT, console_view_entry = consoles.console_view_entry( category = "release|win (32)", short_name = "bld", ), - os = os.WINDOWS_DEFAULT, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CI, ) @@ -550,11 +550,11 @@ target_platform = builder_config.target_platform.WIN, ), ), + triggered_by = ["win-updater-builder-rel"], console_view_entry = consoles.console_view_entry( category = "release|win (64)", short_name = "7", ), - triggered_by = ["win-updater-builder-rel"], ) ci.thin_tester( @@ -574,11 +574,11 @@ target_platform = builder_config.target_platform.WIN, ), ), + triggered_by = ["win32-updater-builder-rel"], console_view_entry = consoles.console_view_entry( category = "release|win (32)", short_name = "7", ), - triggered_by = ["win32-updater-builder-rel"], ) ci.thin_tester( @@ -598,11 +598,11 @@ target_platform = builder_config.target_platform.WIN, ), ), + triggered_by = ["win-updater-builder-dbg"], console_view_entry = consoles.console_view_entry( category = "debug|win (64)", short_name = "10", ), - triggered_by = ["win-updater-builder-dbg"], ) ci.thin_tester( @@ -622,11 +622,11 @@ target_platform = builder_config.target_platform.WIN, ), ), + triggered_by = ["win32-updater-builder-dbg"], console_view_entry = consoles.console_view_entry( category = "debug|win (32)", short_name = "10 (x64)", ), - triggered_by = ["win32-updater-builder-dbg"], ) ci.thin_tester( @@ -646,11 +646,11 @@ target_platform = builder_config.target_platform.WIN, ), ), + triggered_by = ["win-updater-builder-dbg"], console_view_entry = consoles.console_view_entry( category = "debug|win (64)", short_name = "UAC10", ), - triggered_by = ["win-updater-builder-dbg"], ) ci.thin_tester( @@ -670,11 +670,11 @@ target_platform = builder_config.target_platform.WIN, ), ), + triggered_by = ["win-updater-builder-rel"], console_view_entry = consoles.console_view_entry( category = "release|win (64)", short_name = "10", ), - triggered_by = ["win-updater-builder-rel"], ) ci.thin_tester( @@ -694,11 +694,11 @@ target_platform = builder_config.target_platform.WIN, ), ), + triggered_by = ["win-updater-builder-dbg"], console_view_entry = consoles.console_view_entry( category = "debug|win (64)", short_name = "UAC11", ), - triggered_by = ["win-updater-builder-dbg"], ) ci.thin_tester( @@ -718,9 +718,9 @@ target_platform = builder_config.target_platform.WIN, ), ), + triggered_by = ["win-updater-builder-rel"], console_view_entry = consoles.console_view_entry( category = "release|win (64)", short_name = "11", ), - triggered_by = ["win-updater-builder-rel"], )
diff --git a/infra/config/subprojects/chromium/ci/chromium.win.star b/infra/config/subprojects/chromium/ci/chromium.win.star index 03e1df1..9b4c3f5 100644 --- a/infra/config/subprojects/chromium/ci/chromium.win.star +++ b/infra/config/subprojects/chromium/ci/chromium.win.star
@@ -12,17 +12,17 @@ ci.defaults.set( builder_group = "chromium.win", - cores = 8, executable = ci.DEFAULT_EXECUTABLE, + cores = 8, + os = os.WINDOWS_DEFAULT, + pool = ci.DEFAULT_POOL, + sheriff_rotations = sheriff_rotations.CHROMIUM, + tree_closing = True, + main_console_view = "main", + service_account = ci.DEFAULT_SERVICE_ACCOUNT, execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, reclient_instance = reclient.instance.DEFAULT_TRUSTED, reclient_jobs = reclient.jobs.DEFAULT, - main_console_view = "main", - os = os.WINDOWS_DEFAULT, - pool = ci.DEFAULT_POOL, - service_account = ci.DEFAULT_SERVICE_ACCOUNT, - sheriff_rotations = sheriff_rotations.CHROMIUM, - tree_closing = True, ) consoles.console_view( @@ -56,11 +56,11 @@ ), build_gs_bucket = "chromium-win-archive", ), + triggered_by = ["Win Builder"], console_view_entry = consoles.console_view_entry( category = "misc", short_name = "wbk", ), - triggered_by = ["Win Builder"], ) ci.builder( @@ -81,12 +81,12 @@ ), build_gs_bucket = "chromium-win-archive", ), + cores = 32, + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "release|builder", short_name = "32", ), - cores = 32, - os = os.WINDOWS_ANY, ) ci.builder( @@ -106,12 +106,12 @@ build_gs_bucket = "chromium-win-archive", ), builderless = True, + cores = 32, + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "debug|builder", short_name = "64", ), - cores = 32, - os = os.WINDOWS_ANY, ) ci.builder( @@ -131,14 +131,14 @@ ), build_gs_bucket = "chromium-win-archive", ), - console_view_entry = consoles.console_view_entry( - category = "debug|tester", - short_name = "10", - ), triggered_by = ["Win x64 Builder (dbg)"], # Too flaky. See crbug.com/876224 for more details. sheriff_rotations = args.ignore_default(None), tree_closing = False, + console_view_entry = consoles.console_view_entry( + category = "debug|tester", + short_name = "10", + ), ) ci.builder( @@ -158,13 +158,13 @@ ), build_gs_bucket = "chromium-win-archive", ), + cores = 32, + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "debug|builder", short_name = "32", ), - cores = 32, cq_mirrors_console_view = "mirrors", - os = os.WINDOWS_ANY, ) ci.builder( @@ -188,13 +188,13 @@ ), build_gs_bucket = "chromium-win-archive", ), + cores = 32, + os = os.WINDOWS_ANY, console_view_entry = consoles.console_view_entry( category = "release|builder", short_name = "64", ), - cores = 32, cq_mirrors_console_view = "mirrors", - os = os.WINDOWS_ANY, ) ci.builder( @@ -219,12 +219,12 @@ ), build_gs_bucket = "chromium-win-archive", ), + triggered_by = ["ci/Win x64 Builder"], console_view_entry = consoles.console_view_entry( category = "release|tester", short_name = "w10", ), cq_mirrors_console_view = "mirrors", - triggered_by = ["ci/Win x64 Builder"], ) ci.thin_tester( @@ -248,22 +248,22 @@ ), build_gs_bucket = "chromium-win-archive", ), - console_view_entry = consoles.console_view_entry( - category = "release|tester", - short_name = "w11", - ), triggered_by = ["ci/Win x64 Builder"], # TODO(kuanhuang): Add back to sheriff rotation after verified green. sheriff_rotations = args.ignore_default(None), tree_closing = False, + console_view_entry = consoles.console_view_entry( + category = "release|tester", + short_name = "w11", + ), ) ci.builder( name = "Windows deterministic", + executable = "recipe:swarming/deterministic_build", console_view_entry = consoles.console_view_entry( category = "misc", short_name = "det", ), - executable = "recipe:swarming/deterministic_build", execution_timeout = 12 * time.hour, )
diff --git a/infra/config/subprojects/chromium/ci/metadata.exporter.star b/infra/config/subprojects/chromium/ci/metadata.exporter.star index d22e1b5..ce7a15d3 100644 --- a/infra/config/subprojects/chromium/ci/metadata.exporter.star +++ b/infra/config/subprojects/chromium/ci/metadata.exporter.star
@@ -9,9 +9,9 @@ ci.defaults.set( cores = 8, - execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, + execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, ) consoles.console_view( @@ -29,11 +29,11 @@ ci.builder( name = "metadata-exporter", + description_html = description, + executable = "recipe:chromium_export_metadata", console_view_entry = consoles.console_view_entry( console_view = "metadata.exporter", ), - executable = "recipe:chromium_export_metadata", - notifies = "metadata-mapping", service_account = "component-mapping-updater@chops-service-accounts.iam.gserviceaccount.com", - description_html = description, + notifies = "metadata-mapping", )
diff --git a/infra/config/subprojects/chromium/gpu.try.star b/infra/config/subprojects/chromium/gpu.try.star index 90ad0da..51f3f108 100644 --- a/infra/config/subprojects/chromium/gpu.try.star +++ b/infra/config/subprojects/chromium/gpu.try.star
@@ -7,6 +7,12 @@ try_.defaults.set( bucket = "try", + executable = "recipe:chromium_trybot", + cores = 8, + os = os.LINUX_DEFAULT, + cpu = cpu.X86_64, + pool = "luci.chromium.try", + service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com", build_numbers = True, caches = [ swarming.cache( @@ -14,19 +20,13 @@ path = "win_toolchain", ), ], - cores = 8, - cpu = cpu.X86_64, cq_group = "cq", - executable = "recipe:chromium_trybot", execution_timeout = 6 * time.hour, # Max. pending time for builds. CQ considers builds pending >2h as timed # out: http://shortn/_8PaHsdYmlq. Keep this in sync. expiration_timeout = 2 * time.hour, goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_DEFAULT, - pool = "luci.chromium.try", reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, - service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com", subproject_list_view = "luci.chromium.try", task_template_canary_percentage = 5, ) @@ -55,60 +55,60 @@ gpu_android_builder( name = "gpu-fyi-try-android-m-nexus-5x-64", - pool = "luci.chromium.gpu.android.nexus5x.try", mirrors = [ "ci/GPU FYI Android arm64 Builder", "ci/Android FYI Release (Nexus 5X)", ], + pool = "luci.chromium.gpu.android.nexus5x.try", goma_backend = None, ) gpu_android_builder( name = "gpu-fyi-try-android-nvidia-shield-tv", - pool = "luci.chromium.gpu.android.nvidia.shield.tv.try", mirrors = [ "ci/GPU FYI Android arm Builder", "ci/Android FYI Release (NVIDIA Shield TV)", ], + pool = "luci.chromium.gpu.android.nvidia.shield.tv.try", goma_backend = None, ) gpu_android_builder( name = "gpu-fyi-try-android-p-pixel-2-32", - pool = "luci.chromium.gpu.android.pixel2.chromium.try", mirrors = [ "ci/GPU FYI Android arm Builder", "ci/Android FYI Release (Pixel 2)", ], + pool = "luci.chromium.gpu.android.pixel2.chromium.try", goma_backend = None, ) gpu_android_builder( name = "gpu-fyi-try-android-r-pixel-4-32", - pool = "luci.chromium.gpu.android.pixel4.try", mirrors = [ "ci/GPU FYI Android arm Builder", "ci/Android FYI Release (Pixel 4)", ], + pool = "luci.chromium.gpu.android.pixel4.try", goma_backend = None, ) gpu_android_builder( name = "gpu-fyi-try-android-pixel-6-64", - pool = "luci.chromium.gpu.android.pixel6.try", mirrors = [ "ci/GPU FYI Android arm64 Builder", "ci/Android FYI Release (Pixel 6)", ], + pool = "luci.chromium.gpu.android.pixel6.try", goma_backend = None, ) gpu_android_builder( name = "gpu-try-android-m-nexus-5x-64", - pool = "luci.chromium.gpu.android.nexus5x.try", mirrors = [ "ci/Android Release (Nexus 5X)", ], + pool = "luci.chromium.gpu.android.nexus5x.try", ) def gpu_chromeos_builder(*, name, **kwargs): @@ -123,37 +123,37 @@ gpu_chromeos_builder( name = "gpu-fyi-try-chromeos-amd64-generic", - pool = "luci.chromium.gpu.chromeos.amd64.generic.try", mirrors = [ "ci/ChromeOS FYI Release (amd64-generic)", ], + pool = "luci.chromium.gpu.chromeos.amd64.generic.try", goma_backend = None, ) gpu_chromeos_builder( name = "gpu-fyi-try-chromeos-jacuzzi-exp", - pool = "luci.chromium.gpu.chromeos.jacuzzi.try", mirrors = [ "ci/gpu-fyi-chromeos-jacuzzi-exp", ], + pool = "luci.chromium.gpu.chromeos.jacuzzi.try", goma_backend = None, ) gpu_chromeos_builder( name = "gpu-fyi-try-chromeos-kevin", - pool = "luci.chromium.gpu.chromeos.kevin.try", mirrors = [ "ci/ChromeOS FYI Release (kevin)", ], + pool = "luci.chromium.gpu.chromeos.kevin.try", goma_backend = None, ) gpu_chromeos_builder( name = "gpu-fyi-try-chromeos-octopus-exp", - pool = "luci.chromium.gpu.chromeos.octopus.try", mirrors = [ "ci/gpu-fyi-chromeos-octopus-exp", ], + pool = "luci.chromium.gpu.chromeos.octopus.try", goma_backend = None, ) @@ -176,109 +176,109 @@ gpu_linux_builder( name = "gpu-fyi-try-lacros-amd-rel", - pool = "luci.chromium.gpu.linux.amd.try", mirrors = [ "ci/GPU FYI Lacros x64 Builder", "ci/Lacros FYI x64 Release (AMD)", ], + pool = "luci.chromium.gpu.linux.amd.try", goma_backend = None, ) gpu_linux_builder( name = "gpu-fyi-try-lacros-intel-rel", - pool = "luci.chromium.gpu.linux.intel.try", mirrors = [ "ci/GPU FYI Lacros x64 Builder", "ci/Lacros FYI x64 Release (Intel)", ], + pool = "luci.chromium.gpu.linux.intel.try", goma_backend = None, ) gpu_linux_builder( name = "gpu-fyi-try-linux-amd-rel", - pool = "luci.chromium.gpu.linux.amd.try", mirrors = [ "ci/GPU FYI Linux Builder", "ci/Linux FYI Release (AMD RX 5500 XT)", ], + pool = "luci.chromium.gpu.linux.amd.try", goma_backend = None, ) gpu_linux_builder( name = "gpu-fyi-try-linux-intel-exp", - pool = "luci.chromium.gpu.linux.intel.try", mirrors = [ "ci/GPU FYI Linux Builder", "ci/Linux FYI Experimental Release (Intel UHD 630)", ], + pool = "luci.chromium.gpu.linux.intel.try", goma_backend = None, ) gpu_linux_builder( name = "gpu-fyi-try-linux-intel-rel", - pool = "luci.chromium.gpu.linux.intel.try", mirrors = [ "ci/GPU FYI Linux Builder", "ci/Linux FYI Release (Intel UHD 630)", ], + pool = "luci.chromium.gpu.linux.intel.try", goma_backend = None, ) gpu_linux_builder( name = "gpu-fyi-try-linux-nvidia-dbg", - pool = "luci.chromium.gpu.linux.nvidia.try", mirrors = [ "ci/GPU FYI Linux Builder (dbg)", "ci/Linux FYI Debug (NVIDIA)", ], + pool = "luci.chromium.gpu.linux.nvidia.try", goma_backend = None, ) gpu_linux_builder( name = "gpu-fyi-try-linux-nvidia-exp", - pool = "luci.chromium.gpu.linux.nvidia.try", mirrors = [ "ci/GPU FYI Linux Builder", "ci/Linux FYI Experimental Release (NVIDIA)", ], + pool = "luci.chromium.gpu.linux.nvidia.try", goma_backend = None, ) gpu_linux_builder( name = "gpu-fyi-try-linux-nvidia-rel", - pool = "luci.chromium.gpu.linux.nvidia.try", mirrors = [ "ci/GPU FYI Linux Builder", "ci/Linux FYI Release (NVIDIA)", ], + pool = "luci.chromium.gpu.linux.nvidia.try", goma_backend = None, ) gpu_linux_builder( name = "gpu-fyi-try-linux-nvidia-tsn", - pool = "luci.chromium.gpu.linux.nvidia.try", mirrors = [ "ci/Linux FYI GPU TSAN Release", ], + pool = "luci.chromium.gpu.linux.nvidia.try", goma_backend = None, ) gpu_linux_builder( name = "gpu-try-linux-nvidia-dbg", - pool = "luci.chromium.gpu.linux.nvidia.try", mirrors = [ "ci/GPU Linux Builder (dbg)", "ci/Linux Debug (NVIDIA)", ], + pool = "luci.chromium.gpu.linux.nvidia.try", ) gpu_linux_builder( name = "gpu-try-linux-nvidia-rel", - pool = "luci.chromium.gpu.linux.nvidia.try", mirrors = [ "ci/GPU Linux Builder", "ci/Linux Release (NVIDIA)", ], + pool = "luci.chromium.gpu.linux.nvidia.try", ) def gpu_mac_builder(*, name, **kwargs): @@ -294,141 +294,141 @@ gpu_mac_builder( name = "gpu-fyi-try-mac-amd-pro-rel", - pool = "luci.chromium.gpu.mac.pro.amd.try", mirrors = [ "ci/GPU FYI Mac Builder", "ci/Mac Pro FYI Release (AMD)", ], + pool = "luci.chromium.gpu.mac.pro.amd.try", ) gpu_mac_builder( name = "gpu-fyi-try-mac-amd-retina-asan", - pool = "luci.chromium.gpu.mac.retina.amd.try", mirrors = [ "ci/GPU FYI Mac Builder (asan)", "ci/Mac FYI Retina ASAN (AMD)", ], + pool = "luci.chromium.gpu.mac.retina.amd.try", ) gpu_mac_builder( name = "gpu-fyi-try-mac-amd-retina-dbg", - pool = "luci.chromium.gpu.mac.retina.amd.try", mirrors = [ "ci/GPU FYI Mac Builder (dbg)", "ci/Mac FYI Retina Debug (AMD)", ], + pool = "luci.chromium.gpu.mac.retina.amd.try", ) gpu_mac_builder( name = "gpu-fyi-try-mac-amd-retina-exp", - pool = "luci.chromium.gpu.mac.retina.amd.try", mirrors = [ "ci/GPU FYI Mac Builder", "ci/Mac FYI Experimental Retina Release (AMD)", ], + pool = "luci.chromium.gpu.mac.retina.amd.try", ) gpu_mac_builder( name = "gpu-fyi-try-mac-amd-retina-rel", - pool = "luci.chromium.gpu.mac.retina.amd.try", mirrors = [ "ci/GPU FYI Mac Builder", "ci/Mac FYI Retina Release (AMD)", ], + pool = "luci.chromium.gpu.mac.retina.amd.try", ) gpu_mac_builder( name = "gpu-fyi-try-mac-arm64-apple-m1-exp", - pool = "luci.chromium.gpu.mac.arm64.apple.m1.try", mirrors = [ "ci/GPU FYI Mac arm64 Builder", "ci/Mac FYI Experimental Release (Apple M1)", ], + pool = "luci.chromium.gpu.mac.arm64.apple.m1.try", ) gpu_mac_builder( name = "gpu-fyi-try-mac-arm64-apple-m1-rel", - pool = "luci.chromium.gpu.mac.arm64.apple.m1.try", mirrors = [ "ci/GPU FYI Mac arm64 Builder", "ci/Mac FYI Release (Apple M1)", ], + pool = "luci.chromium.gpu.mac.arm64.apple.m1.try", ) gpu_mac_builder( name = "gpu-fyi-try-mac-intel-asan", - pool = "luci.chromium.gpu.mac.mini.intel.try", mirrors = [ "ci/GPU FYI Mac Builder (asan)", "ci/Mac FYI ASAN (Intel)", ], + pool = "luci.chromium.gpu.mac.mini.intel.try", ) gpu_mac_builder( name = "gpu-fyi-try-mac-intel-dbg", - pool = "luci.chromium.gpu.mac.mini.intel.try", mirrors = [ "ci/GPU FYI Mac Builder (dbg)", "ci/Mac FYI Debug (Intel)", ], + pool = "luci.chromium.gpu.mac.mini.intel.try", ) gpu_mac_builder( name = "gpu-fyi-try-mac-intel-exp", - pool = "luci.chromium.gpu.mac.mini.intel.try", mirrors = [ "ci/GPU FYI Mac Builder", "ci/Mac FYI Experimental Release (Intel)", ], + pool = "luci.chromium.gpu.mac.mini.intel.try", ) gpu_mac_builder( name = "gpu-fyi-try-mac-intel-rel", - pool = "luci.chromium.gpu.mac.mini.intel.try", mirrors = [ "ci/GPU FYI Mac Builder", "ci/Mac FYI Release (Intel)", ], + pool = "luci.chromium.gpu.mac.mini.intel.try", ) gpu_mac_builder( name = "gpu-fyi-try-mac-nvidia-retina-exp", - # This bot has one machine backing its tests at the moment. - # If it gets more, the modified execution_timeout should be removed. - # See crbug.com/853307 for more context. - execution_timeout = 12 * time.hour, - pool = "luci.chromium.gpu.mac.retina.nvidia.try", mirrors = [ "ci/GPU FYI Mac Builder", "ci/Mac FYI Experimental Retina Release (NVIDIA)", ], + pool = "luci.chromium.gpu.mac.retina.nvidia.try", + # This bot has one machine backing its tests at the moment. + # If it gets more, the modified execution_timeout should be removed. + # See crbug.com/853307 for more context. + execution_timeout = 12 * time.hour, ) gpu_mac_builder( name = "gpu-fyi-try-mac-nvidia-retina-rel", - pool = "luci.chromium.gpu.mac.retina.nvidia.try", mirrors = [ "ci/GPU FYI Mac Builder", "ci/Mac FYI Retina Release (NVIDIA)", ], + pool = "luci.chromium.gpu.mac.retina.nvidia.try", ) gpu_mac_builder( name = "gpu-try-mac-amd-retina-dbg", - pool = "luci.chromium.gpu.mac.retina.amd.try", mirrors = [ "ci/GPU Mac Builder (dbg)", "ci/Mac Retina Debug (AMD)", ], + pool = "luci.chromium.gpu.mac.retina.amd.try", ) gpu_mac_builder( name = "gpu-try-mac-intel-dbg", - pool = "luci.chromium.gpu.mac.mini.intel.try", mirrors = [ "ci/GPU Mac Builder (dbg)", "ci/Mac Debug (Intel)", ], + pool = "luci.chromium.gpu.mac.mini.intel.try", ) def gpu_win_builder(*, name, **kwargs): @@ -444,90 +444,90 @@ gpu_win_builder( name = "gpu-fyi-try-win10-amd-rel-64", - pool = "luci.chromium.gpu.win10.amd.try", mirrors = [ "ci/GPU FYI Win x64 Builder", "ci/Win10 FYI x64 Release (AMD RX 5500 XT)", ], + pool = "luci.chromium.gpu.win10.amd.try", goma_backend = None, ) gpu_win_builder( name = "gpu-fyi-try-win10-intel-exp-64", - pool = "luci.chromium.gpu.win10.intel.try", mirrors = [ "ci/GPU FYI Win x64 Builder", "ci/Win10 FYI x64 Exp Release (Intel HD 630)", ], + pool = "luci.chromium.gpu.win10.intel.try", goma_backend = None, ) gpu_win_builder( name = "gpu-fyi-try-win10-intel-rel-64", - pool = "luci.chromium.gpu.win10.intel.try", mirrors = [ "ci/GPU FYI Win x64 Builder", "ci/Win10 FYI x64 Release (Intel HD 630)", ], + pool = "luci.chromium.gpu.win10.intel.try", goma_backend = None, ) gpu_win_builder( name = "gpu-fyi-try-win10-nvidia-dbg-64", - pool = "luci.chromium.gpu.win10.nvidia.try", mirrors = [ "ci/GPU FYI Win x64 Builder (dbg)", "ci/Win10 FYI x64 Debug (NVIDIA)", ], + pool = "luci.chromium.gpu.win10.nvidia.try", goma_backend = None, ) gpu_win_builder( name = "gpu-fyi-try-win10-nvidia-dx12vk-dbg-64", - pool = "luci.chromium.gpu.win10.nvidia.try", mirrors = [ "ci/GPU FYI Win x64 DX12 Vulkan Builder (dbg)", "ci/Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)", ], + pool = "luci.chromium.gpu.win10.nvidia.try", goma_backend = None, ) gpu_win_builder( name = "gpu-fyi-try-win10-nvidia-dx12vk-rel-64", - pool = "luci.chromium.gpu.win10.nvidia.try", mirrors = [ "ci/GPU FYI Win x64 DX12 Vulkan Builder", "ci/Win10 FYI x64 DX12 Vulkan Release (NVIDIA)", ], + pool = "luci.chromium.gpu.win10.nvidia.try", goma_backend = None, ) gpu_win_builder( name = "gpu-fyi-try-win10-nvidia-exp-64", - pool = "luci.chromium.gpu.win10.nvidia.try", mirrors = [ "ci/GPU FYI Win x64 Builder", "ci/Win10 FYI x64 Exp Release (NVIDIA)", ], + pool = "luci.chromium.gpu.win10.nvidia.try", goma_backend = None, ) gpu_win_builder( name = "gpu-fyi-try-win10-nvidia-rel-32", - pool = "luci.chromium.gpu.win10.nvidia.try", mirrors = [ "ci/GPU FYI Win Builder", "ci/Win10 FYI x86 Release (NVIDIA)", ], + pool = "luci.chromium.gpu.win10.nvidia.try", goma_backend = None, ) gpu_win_builder( name = "gpu-fyi-try-win10-nvidia-rel-64", - pool = "luci.chromium.gpu.win10.nvidia.try", mirrors = [ "ci/GPU FYI Win x64 Builder", "ci/Win10 FYI x64 Release (NVIDIA)", ], + pool = "luci.chromium.gpu.win10.nvidia.try", goma_backend = None, )
diff --git a/infra/config/subprojects/chromium/swangle.try.star b/infra/config/subprojects/chromium/swangle.try.star index bf4c6d7..b2c1b55 100644 --- a/infra/config/subprojects/chromium/swangle.try.star +++ b/infra/config/subprojects/chromium/swangle.try.star
@@ -9,28 +9,28 @@ try_.defaults.set( bucket = "try", - build_numbers = True, - builderless = True, builder_group = "tryserver.chromium.swangle", + executable = "recipe:angle_chromium_trybot", + builderless = True, + os = os.LINUX_DEFAULT, + cpu = cpu.X86_64, + pool = "luci.chromium.try", + service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com", + build_numbers = True, caches = [ swarming.cache( name = "win_toolchain", path = "win_toolchain", ), ], - cpu = cpu.X86_64, cq_group = "cq", - executable = "recipe:angle_chromium_trybot", execution_timeout = 2 * time.hour, # Max. pending time for builds. CQ considers builds pending >2h as timed # out: http://shortn/_8PaHsdYmlq. Keep this in sync. expiration_timeout = 2 * time.hour, goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_DEFAULT, - pool = "luci.chromium.try", reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, - service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com", subproject_list_view = "luci.chromium.try", task_template_canary_percentage = 5, ) @@ -55,97 +55,96 @@ swangle_linux_builder( name = "linux-swangle-chromium-try-x64", - pool = "luci.chromium.swangle.chromium.linux.x64.try", executable = "recipe:chromium_trybot", - execution_timeout = 6 * time.hour, - goma_backend = None, mirrors = [ "ci/linux-swangle-chromium-x64", ], try_settings = builder_config.try_settings( retry_failed_shards = False, ), + pool = "luci.chromium.swangle.chromium.linux.x64.try", + execution_timeout = 6 * time.hour, + goma_backend = None, ) swangle_linux_builder( name = "linux-swangle-try-tot-swiftshader-x64", - pool = "luci.chromium.swangle.sws.linux.x64.try", - goma_backend = None, mirrors = [ "ci/linux-swangle-tot-swiftshader-x64", ], try_settings = builder_config.try_settings( retry_failed_shards = False, ), + pool = "luci.chromium.swangle.sws.linux.x64.try", + goma_backend = None, ) swangle_linux_builder( name = "linux-swangle-try-x64", - pool = "luci.chromium.swangle.deps.linux.x64.try", executable = "recipe:chromium_trybot", - goma_backend = None, mirrors = [ "ci/linux-swangle-x64", ], try_settings = builder_config.try_settings( retry_failed_shards = False, ), + pool = "luci.chromium.swangle.deps.linux.x64.try", + goma_backend = None, ) swangle_mac_builder( name = "mac-swangle-chromium-try-x64", - pool = "luci.chromium.swangle.chromium.mac.x64.try", executable = "recipe:chromium_trybot", - execution_timeout = 6 * time.hour, mirrors = [ "ci/mac-swangle-chromium-x64", ], try_settings = builder_config.try_settings( retry_failed_shards = False, ), + pool = "luci.chromium.swangle.chromium.mac.x64.try", + execution_timeout = 6 * time.hour, ) swangle_windows_builder( name = "win-swangle-chromium-try-x86", - pool = "luci.chromium.swangle.chromium.win.x86.try", executable = "recipe:chromium_trybot", - execution_timeout = 6 * time.hour, mirrors = [ "ci/win-swangle-chromium-x86", ], try_settings = builder_config.try_settings( retry_failed_shards = False, ), + pool = "luci.chromium.swangle.chromium.win.x86.try", + execution_timeout = 6 * time.hour, goma_backend = None, ) swangle_windows_builder( name = "win-swangle-try-tot-swiftshader-x64", - pool = "luci.chromium.swangle.win.x64.try", mirrors = [ "ci/win-swangle-tot-swiftshader-x64", ], try_settings = builder_config.try_settings( retry_failed_shards = False, ), + pool = "luci.chromium.swangle.win.x64.try", goma_backend = None, ) swangle_windows_builder( name = "win-swangle-try-tot-swiftshader-x86", - pool = "luci.chromium.swangle.sws.win.x86.try", mirrors = [ "ci/win-swangle-tot-swiftshader-x86", ], try_settings = builder_config.try_settings( retry_failed_shards = False, ), + pool = "luci.chromium.swangle.sws.win.x86.try", goma_backend = None, ) swangle_windows_builder( name = "win-swangle-try-x64", - pool = "luci.chromium.swangle.win.x64.try", executable = "recipe:chromium_trybot", mirrors = [ "ci/win-swangle-x64", @@ -153,12 +152,12 @@ try_settings = builder_config.try_settings( retry_failed_shards = False, ), + pool = "luci.chromium.swangle.win.x64.try", goma_backend = None, ) swangle_windows_builder( name = "win-swangle-try-x86", - pool = "luci.chromium.swangle.deps.win.x86.try", executable = "recipe:chromium_trybot", mirrors = [ "ci/win-swangle-x86", @@ -166,5 +165,6 @@ try_settings = builder_config.try_settings( retry_failed_shards = False, ), + pool = "luci.chromium.swangle.deps.win.x86.try", goma_backend = None, )
diff --git a/infra/config/subprojects/chromium/try.star b/infra/config/subprojects/chromium/try.star index 252021f..5020ad5 100644 --- a/infra/config/subprojects/chromium/try.star +++ b/infra/config/subprojects/chromium/try.star
@@ -11,6 +11,7 @@ try_.defaults.set( bucket = "try", + cpu = cpu.X86_64, build_numbers = True, caches = [ swarming.cache( @@ -18,7 +19,6 @@ path = "win_toolchain", ), ], - cpu = cpu.X86_64, cq_group = "cq", # Max. pending time for builds. CQ considers builds pending >2h as timed # out: http://shortn/_8PaHsdYmlq. Keep this in sync. @@ -37,10 +37,6 @@ ), acl.entry( roles = acl.BUILDBUCKET_TRIGGERER, - users = [ - "findit-for-me@appspot.gserviceaccount.com", - "tricium-prod@appspot.gserviceaccount.com", - ], groups = [ "project-chromium-tryjob-access", # Allow Pinpoint to trigger builds for bisection @@ -54,6 +50,10 @@ "swiftshader", "v8", ] if settings.is_main else None, + users = [ + "findit-for-me@appspot.gserviceaccount.com", + "tricium-prod@appspot.gserviceaccount.com", + ], ), acl.entry( roles = acl.BUILDBUCKET_OWNER, @@ -64,15 +64,6 @@ luci.cq_group( name = "cq", - retry_config = cq.RETRY_ALL_FAILURES, - tree_status_host = "chromium-status.appspot.com" if settings.is_main else None, - watch = cq.refset( - repo = "https://chromium.googlesource.com/chromium/src", - # The chromium project's CQ covers all of the refs under refs/heads, - # which includes refs/heads/main, for projects running out of a branch - # the CQ only runs for that ref - refs = ["refs/heads/.+" if settings.is_main else settings.ref], - ), acls = [ acl.entry( acl.CQ_COMMITTER, @@ -86,6 +77,15 @@ additional_modes = [ cq.run_mode(cq.MODE_QUICK_DRY_RUN, 1, "Quick-Run", 1), ], + retry_config = cq.RETRY_ALL_FAILURES, + tree_status_host = "chromium-status.appspot.com" if settings.is_main else None, + watch = cq.refset( + repo = "https://chromium.googlesource.com/chromium/src", + # The chromium project's CQ covers all of the refs under refs/heads, + # which includes refs/heads/main, for projects running out of a branch + # the CQ only runs for that ref + refs = ["refs/heads/.+" if settings.is_main else settings.ref], + ), ) # Declare a CQ group that watches all branch heads, excluding the active @@ -96,15 +96,6 @@ # proper CQ group set up for the ref). branches.cq_group( name = fallback_cq.GROUP, - retry_config = cq.RETRY_ALL_FAILURES, - watch = cq.refset( - repo = "https://chromium.googlesource.com/chromium/src", - refs = ["refs/branch-heads/.*"], - refs_exclude = [ - details.ref - for details in ACTIVE_MILESTONES.values() - ], - ), acls = [ acl.entry( acl.CQ_COMMITTER, @@ -115,6 +106,15 @@ groups = "project-chromium-tryjob-access", ), ], + retry_config = cq.RETRY_ALL_FAILURES, + watch = cq.refset( + repo = "https://chromium.googlesource.com/chromium/src", + refs = ["refs/branch-heads/.*"], + refs_exclude = [ + details.ref + for details in ACTIVE_MILESTONES.values() + ], + ), ) consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/presubmit.star b/infra/config/subprojects/chromium/try/presubmit.star index 28dfea8..5b9cc9c3 100644 --- a/infra/config/subprojects/chromium/try/presubmit.star +++ b/infra/config/subprojects/chromium/try/presubmit.star
@@ -12,20 +12,20 @@ try_.defaults.set( cores = 8, - execution_timeout = 15 * time.minute, - list_view = "presubmit", - main_list_view = "try", os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, + main_list_view = "try", + list_view = "presubmit", + service_account = try_.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = 15 * time.minute, + + # TODO(crbug.com/1362440): remove this. + omit_python2 = False, # Default priority for buildbucket is 30, see # https://chromium.googlesource.com/infra/infra/+/bb68e62b4380ede486f65cd32d9ff3f1bbe288e4/appengine/cr-buildbucket/creation.py#42 # This will improve our turnaround time for landing infra/config changes # when addressing outages priority = 25, - service_account = try_.DEFAULT_SERVICE_ACCOUNT, - - # TODO(crbug.com/1362440): remove this. - omit_python2 = False, ) consoles.list_view( @@ -144,8 +144,8 @@ presubmit_builder( name = "requires-testing-checker", - cq_group = fallback_cq.GROUP, description_html = "prevents CLs that requires testing from landing on branches with no CQ", executable = "recipe:requires_testing_checker", + cq_group = fallback_cq.GROUP, tryjob = try_.job(), )
diff --git a/infra/config/subprojects/chromium/try/tryserver.blink.star b/infra/config/subprojects/chromium/try/tryserver.blink.star index 7856d71..5140f3d 100644 --- a/infra/config/subprojects/chromium/try/tryserver.blink.star +++ b/infra/config/subprojects/chromium/try/tryserver.blink.star
@@ -11,11 +11,11 @@ try_.defaults.set( builder_group = "tryserver.blink", - cores = 8, executable = try_.DEFAULT_EXECUTABLE, - execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, + cores = 8, pool = try_.DEFAULT_POOL, service_account = try_.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, ) consoles.list_view( @@ -54,10 +54,10 @@ try_settings = builder_config.try_settings( retry_failed_shards = False, ), + os = os.LINUX_DEFAULT, + main_list_view = "try", goma_backend = goma.backend.RBE_PROD, reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, - main_list_view = "try", - os = os.LINUX_DEFAULT, tryjob = try_.job( location_filters = [ "cc/.+", @@ -88,11 +88,11 @@ try_settings = builder_config.try_settings( retry_failed_shards = False, ), + builderless = True, + os = os.WINDOWS_ANY, goma_backend = None, reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, - os = os.WINDOWS_ANY, - builderless = True, ) try_.builder( @@ -114,8 +114,8 @@ try_settings = builder_config.try_settings( retry_failed_shards = True, ), - os = os.WINDOWS_ANY, builderless = True, + os = os.WINDOWS_ANY, reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.accessibility.star b/infra/config/subprojects/chromium/try/tryserver.chromium.accessibility.star index e273777..c402ff0 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.accessibility.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.accessibility.star
@@ -9,15 +9,15 @@ try_.defaults.set( builder_group = "tryserver.chromium.accessibility", - cores = 8, - compilator_cores = 16, executable = try_.DEFAULT_EXECUTABLE, - execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, + cores = 8, os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, + service_account = try_.DEFAULT_SERVICE_ACCOUNT, + compilator_cores = 16, + execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, reclient_jobs = 150, - service_account = try_.DEFAULT_SERVICE_ACCOUNT, ) consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star index 3a7ad5d3..5ade0a75 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -12,18 +12,18 @@ try_.defaults.set( builder_group = "tryserver.chromium.android", - cores = 8, - compilator_cores = 32, - orchestrator_cores = 4, executable = try_.DEFAULT_EXECUTABLE, - execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, - goma_backend = goma.backend.RBE_PROD, - compilator_goma_jobs = goma.jobs.J300, + cores = 8, os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, + service_account = try_.DEFAULT_SERVICE_ACCOUNT, + compilator_cores = 32, + compilator_goma_jobs = goma.jobs.J300, + execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, + goma_backend = goma.backend.RBE_PROD, + orchestrator_cores = 4, reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, - service_account = try_.DEFAULT_SERVICE_ACCOUNT, ) consoles.list_view( @@ -89,20 +89,20 @@ try_.orchestrator_builder( name = "android-arm64-rel", + description_html = "This builder may trigger tests on multiple Android versions.", + branch_selector = branches.STANDARD_MILESTONE, + compilator = "android-arm64-rel-compilator", mirrors = [ "ci/Android Release (Nexus 5X)", # Nexus 5X on Nougat "ci/android-pie-arm64-rel", # Pixel 1, 2 on Pie ], - description_html = "This builder may trigger tests on multiple Android versions.", try_settings = builder_config.try_settings( rts_config = builder_config.rts_config( condition = builder_config.rts_condition.QUICK_RUN_ONLY, ), ), - compilator = "android-arm64-rel-compilator", - check_for_flakiness = True, - branch_selector = branches.STANDARD_MILESTONE, main_list_view = "try", + check_for_flakiness = True, tryjob = try_.job(), # TODO(crbug.com/1372179): Use orchestrator pool once overloaded test pools # are addressed @@ -111,6 +111,7 @@ try_.orchestrator_builder( name = "android-arm64-rel-inverse-fyi", + compilator = "android-arm64-rel-compilator", mirrors = [ "ci/Android Release (Nexus 5X)", # Nexus 5X on Nougat "ci/android-pie-arm64-rel", # Pixel 1, 2 on Pie @@ -120,24 +121,24 @@ condition = builder_config.rts_condition.QUICK_RUN_ONLY, ), ), + check_for_flakiness = True, experiments = { "chromium_rts.inverted_rts": 100, "chromium_rts.inverted_rts_bail_early": 100, }, - compilator = "android-arm64-rel-compilator", - check_for_flakiness = True, use_orchestrator_pool = True, ) try_.compilator_builder( name = "android-arm64-rel-compilator", branch_selector = branches.STANDARD_MILESTONE, - check_for_flakiness = True, main_list_view = "try", + check_for_flakiness = True, ) try_.builder( name = "android-asan", + mirrors = ["ci/android-asan"], goma_backend = None, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) @@ -154,11 +155,15 @@ try_.builder( name = "android-binary-size", branch_selector = branches.STANDARD_MILESTONE, + executable = "recipe:binary_size_trybot", builderless = not settings.is_main, cores = 16, - executable = "recipe:binary_size_trybot", - goma_backend = None, + ssd = True, main_list_view = "try", + goma_backend = None, + + # TODO(crbug.com/1362440): remove this. + omit_python2 = False, properties = { "$build/binary_size": { "analyze_targets": [ @@ -176,10 +181,6 @@ }, }, tryjob = try_.job(), - ssd = True, - - # TODO(crbug.com/1362440): remove this. - omit_python2 = False, ) try_.builder( @@ -189,33 +190,36 @@ "ci/android-cronet-arm-dbg", ], main_list_view = "try", + goma_backend = None, + reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, tryjob = try_.job( location_filters = [ "components/cronet/.+", "components/grpc_support/.+", "build/android/.+", "build/config/android/.+", - cq.location_filter(path_regexp = "components/cronet/ios/.+", exclude = True), + cq.location_filter(exclude = True, path_regexp = "components/cronet/ios/.+"), ], ), - goma_backend = None, - reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) try_.builder( name = "android-cronet-arm64-dbg", + mirrors = ["ci/android-cronet-arm64-dbg"], goma_backend = None, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) try_.builder( name = "android-cronet-arm64-rel", + mirrors = ["ci/android-cronet-arm64-rel"], goma_backend = None, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) try_.builder( name = "android-cronet-asan-arm-rel", + mirrors = ["ci/android-cronet-asan-arm-rel"], goma_backend = None, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) @@ -231,6 +235,7 @@ try_.builder( name = "android-cronet-x86-rel", + mirrors = ["ci/android-cronet-x86-rel"], goma_backend = None, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) @@ -242,19 +247,19 @@ "ci/android-cronet-x86-dbg", "ci/android-cronet-x86-dbg-10-tests", ], - check_for_flakiness = True, main_list_view = "try", + check_for_flakiness = True, + goma_backend = None, + reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, tryjob = try_.job( location_filters = [ "components/cronet/.+", "components/grpc_support/.+", "build/android/.+", "build/config/android/.+", - cq.location_filter(path_regexp = "components/cronet/ios/.+", exclude = True), + cq.location_filter(exclude = True, path_regexp = "components/cronet/ios/.+"), ], ), - goma_backend = None, - reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) try_.builder( @@ -289,6 +294,10 @@ try_.builder( name = "android-cronet-x86-rel-kitkat-tests", + mirrors = [ + "ci/android-cronet-x86-rel", + "ci/android-cronet-x86-rel-kitkat-tests", + ], goma_backend = None, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) @@ -323,6 +332,8 @@ try_.orchestrator_builder( name = "android-nougat-x86-rel", + branch_selector = branches.STANDARD_MILESTONE, + compilator = "android-nougat-x86-rel-compilator", mirrors = [ "ci/android-nougat-x86-rel", ], @@ -331,10 +342,8 @@ condition = builder_config.rts_condition.QUICK_RUN_ONLY, ), ), - check_for_flakiness = True, - compilator = "android-nougat-x86-rel-compilator", - branch_selector = branches.STANDARD_MILESTONE, main_list_view = "try", + check_for_flakiness = True, tryjob = try_.job(), # TODO(crbug.com/1372179): Use orchestrator pool once overloaded test pools # are addressed @@ -343,6 +352,7 @@ try_.orchestrator_builder( name = "android-nougat-x86-rel-inverse-fyi", + compilator = "android-nougat-x86-rel-compilator", mirrors = [ "ci/android-nougat-x86-rel", ], @@ -352,7 +362,6 @@ ), ), check_for_flakiness = True, - compilator = "android-nougat-x86-rel-compilator", experiments = { "chromium_rts.inverted_rts": 100, "chromium_rts.inverted_rts_bail_early": 100, @@ -363,9 +372,9 @@ try_.compilator_builder( name = "android-nougat-x86-rel-compilator", branch_selector = branches.STANDARD_MILESTONE, - check_for_flakiness = True, - main_list_view = "try", cores = 64 if settings.is_main else 32, + main_list_view = "try", + check_for_flakiness = True, ) try_.builder( @@ -389,11 +398,15 @@ try_.builder( name = "android-pie-arm64-dbg", branch_selector = branches.STANDARD_MILESTONE, + mirrors = [ + "ci/Android arm64 Builder (dbg)", + "ci/android-pie-arm64-dbg", + ], builderless = False, - check_for_flakiness = True, cores = 16, - goma_backend = None, main_list_view = "try", + check_for_flakiness = True, + goma_backend = None, tryjob = try_.job( location_filters = [ "chrome/android/features/vr/.+", @@ -408,24 +421,21 @@ "third_party/arcore-android-sdk-client/.+", ], ), - mirrors = [ - "ci/Android arm64 Builder (dbg)", - "ci/android-pie-arm64-dbg", - ], ) # TODO(crbug/1182468) Remove when experiment is done. try_.builder( name = "android-pie-arm64-coverage-experimental-rel", + mirrors = ["ci/android-pie-arm64-coverage-experimental-rel"], builderless = True, cores = 16, - goma_backend = None, ssd = True, main_list_view = "try", - use_clang_coverage = True, + goma_backend = None, tryjob = try_.job( experiment_percentage = 3, ), + use_clang_coverage = True, ) try_.builder( @@ -439,9 +449,10 @@ # TODO(crbug/1182468) Remove when coverage is enabled on CQ. try_.builder( name = "android-pie-arm64-coverage-rel", + mirrors = ["ci/android-code-coverage-native"], cores = 16, - goma_backend = None, ssd = True, + goma_backend = None, use_clang_coverage = True, ) @@ -456,10 +467,12 @@ try_.builder( name = "android-pie-arm64-wpt-rel-non-cq", + mirrors = ["ci/android-pie-arm64-wpt-rel-non-cq"], ) try_.builder( name = "android-chrome-pie-x86-wpt-fyi-rel", + mirrors = ["ci/android-chrome-pie-x86-wpt-fyi-rel"], ) try_.builder( @@ -474,6 +487,7 @@ try_.builder( name = "android-webview-pie-x86-wpt-fyi-rel", + mirrors = ["ci/android-webview-pie-x86-wpt-fyi-rel"], goma_backend = None, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) @@ -574,7 +588,6 @@ try_.builder( name = "android_compile_dbg", branch_selector = branches.STANDARD_MILESTONE, - cores = "8|16", mirrors = [ "ci/Android arm64 Builder (dbg)", ], @@ -583,8 +596,9 @@ is_compile_only = True, ), builderless = not settings.is_main, - goma_backend = None, + cores = "8|16", main_list_view = "try", + goma_backend = None, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, tryjob = try_.job(), ) @@ -605,6 +619,7 @@ cores = 16, ssd = True, main_list_view = "try", + goma_backend = None, tryjob = try_.job( location_filters = [ "chrome/android/java/src/org/chromium/chrome/browser/vr/.+", @@ -617,7 +632,6 @@ "third_party/gvr-android-sdk/.+", ], ), - goma_backend = None, ) try_.builder( @@ -633,6 +647,7 @@ cores = 16, ssd = True, main_list_view = "try", + goma_backend = None, tryjob = try_.job( location_filters = [ "chrome/android/java/src/org/chromium/chrome/browser/vr/.+", @@ -645,22 +660,21 @@ "third_party/gvr-android-sdk/.+", ], ), - goma_backend = None, ) try_.builder( name = "android_cronet", + branch_selector = branches.STANDARD_MILESTONE, mirrors = [ "ci/android-cronet-arm-rel", ], try_settings = builder_config.try_settings( is_compile_only = True, ), - branch_selector = branches.STANDARD_MILESTONE, builderless = not settings.is_main, main_list_view = "try", - tryjob = try_.job(), goma_backend = None, + tryjob = try_.job(), ) try_.builder( @@ -703,9 +717,10 @@ try_settings = builder_config.try_settings( retry_failed_shards = False, ), - check_for_flakiness = True, - goma_jobs = goma.jobs.J150, main_list_view = "try", + check_for_flakiness = True, + goma_backend = None, + goma_jobs = goma.jobs.J150, tryjob = try_.job( location_filters = [ cq.location_filter(path_regexp = "cc/.+"), @@ -734,5 +749,4 @@ cq.location_filter(path_regexp = "ui/gl/.+"), ], ), - goma_backend = None, )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star b/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star index 69510fc9..ae2bb0c 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star
@@ -10,17 +10,17 @@ try_.defaults.set( builder_group = "tryserver.chromium.angle", + executable = try_.DEFAULT_EXECUTABLE, builderless = False, cores = 8, - executable = try_.DEFAULT_EXECUTABLE, + os = os.LINUX_DEFAULT, + pool = try_.DEFAULT_POOL, + service_account = try_.gpu.SERVICE_ACCOUNT, execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, goma_jobs = goma.jobs.J150, reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, - os = os.LINUX_DEFAULT, - pool = try_.DEFAULT_POOL, - service_account = try_.gpu.SERVICE_ACCOUNT, ) consoles.list_view( @@ -30,7 +30,6 @@ try_.builder( name = "android-angle-chromium-try", executable = "recipe:angle_chromium_trybot", - goma_backend = None, mirrors = [ "ci/android-angle-chromium-arm64-builder", "ci/android-angle-chromium-arm64-nexus5x", @@ -38,6 +37,7 @@ try_settings = builder_config.try_settings( retry_failed_shards = False, ), + goma_backend = None, ) try_.builder( @@ -55,6 +55,7 @@ try_.builder( name = "linux-angle-chromium-try", + executable = "recipe:angle_chromium_trybot", mirrors = [ "ci/linux-angle-chromium-builder", "ci/linux-angle-chromium-intel", @@ -63,13 +64,10 @@ try_settings = builder_config.try_settings( retry_failed_shards = False, ), - executable = "recipe:angle_chromium_trybot", ) try_.builder( name = "mac-angle-chromium-try", - cores = None, - os = os.MAC_ANY, executable = "recipe:angle_chromium_trybot", mirrors = [ # Not enough capacity on Mac AMD https://crbug.com/1380184. @@ -80,11 +78,12 @@ try_settings = builder_config.try_settings( retry_failed_shards = False, ), + cores = None, + os = os.MAC_ANY, ) try_.builder( name = "win-angle-chromium-x64-try", - os = os.WINDOWS_ANY, executable = "recipe:angle_chromium_trybot", mirrors = [ "ci/win-angle-chromium-x64-builder", @@ -94,12 +93,12 @@ try_settings = builder_config.try_settings( retry_failed_shards = False, ), + os = os.WINDOWS_ANY, goma_backend = None, ) try_.builder( name = "win-angle-chromium-x86-try", - os = os.WINDOWS_ANY, executable = "recipe:angle_chromium_trybot", mirrors = [ "ci/win-angle-chromium-x86-builder", @@ -109,5 +108,6 @@ is_compile_only = True, retry_failed_shards = False, ), + os = os.WINDOWS_ANY, goma_backend = None, )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.cft.star b/infra/config/subprojects/chromium/try/tryserver.chromium.cft.star index 4eeb19f..da2ba1c 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.cft.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.cft.star
@@ -9,14 +9,14 @@ try_.defaults.set( builder_group = "tryserver.chromium.cft", - builderless = True, executable = try_.DEFAULT_EXECUTABLE, + builderless = True, + ssd = True, + pool = try_.DEFAULT_POOL, + service_account = try_.DEFAULT_SERVICE_ACCOUNT, execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, goma_jobs = goma.jobs.J150, - pool = try_.DEFAULT_POOL, - service_account = try_.DEFAULT_SERVICE_ACCOUNT, - ssd = True, ) consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star index e901c3c..e0b65856 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
@@ -12,18 +12,18 @@ try_.defaults.set( builder_group = "tryserver.chromium.chromiumos", - cores = 8, - orchestrator_cores = 2, - compilator_cores = 16, executable = try_.DEFAULT_EXECUTABLE, - execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, - goma_backend = goma.backend.RBE_PROD, + cores = 8, os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, + service_account = try_.DEFAULT_SERVICE_ACCOUNT, + compilator_cores = 16, + compilator_reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, + execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, + goma_backend = goma.backend.RBE_PROD, + orchestrator_cores = 2, reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, - compilator_reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, - service_account = try_.DEFAULT_SERVICE_ACCOUNT, ) consoles.list_view( @@ -46,19 +46,19 @@ "ci/chromeos-amd64-generic-dbg", ], main_list_view = "try", + goma_backend = None, tryjob = try_.job( location_filters = [ "content/gpu/.+", "media/.+", ], ), - goma_backend = None, ) try_.orchestrator_builder( name = "chromeos-amd64-generic-rel", - compilator = "chromeos-amd64-generic-rel-compilator", branch_selector = branches.CROS_LTS_MILESTONE, + compilator = "chromeos-amd64-generic-rel-compilator", mirrors = ["ci/chromeos-amd64-generic-rel"], main_list_view = "try", tryjob = try_.job(), @@ -70,8 +70,8 @@ try_.compilator_builder( name = "chromeos-amd64-generic-rel-compilator", branch_selector = branches.CROS_LTS_MILESTONE, - main_list_view = "try", cores = 8, + main_list_view = "try", goma_backend = None, ) @@ -89,8 +89,8 @@ mirrors = ["ci/chromeos-arm-generic-rel"], builderless = not settings.is_main, main_list_view = "try", - tryjob = try_.job(), goma_backend = None, + tryjob = try_.job(), ) try_.builder( @@ -108,17 +108,17 @@ ], builderless = not settings.is_main, main_list_view = "try", - tryjob = try_.job(), goma_backend = None, + tryjob = try_.job(), ) try_.orchestrator_builder( name = "lacros-amd64-generic-rel-orchestrator", branch_selector = branches.STANDARD_MILESTONE, + compilator = "lacros-amd64-generic-rel-compilator", mirrors = [ "ci/lacros-amd64-generic-rel", ], - compilator = "lacros-amd64-generic-rel-compilator", main_list_view = "try", use_orchestrator_pool = True, ) @@ -142,17 +142,17 @@ build_config = builder_config.build_config.RELEASE, target_arch = builder_config.target_arch.INTEL, target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, target_cros_boards = [ "amd64-generic", ], - target_platform = builder_config.target_platform.CHROMEOS, ), + build_gs_bucket = "chromium-chromiumos-archive", # TODO(https://crbug.com/1399919): change skylab_upload_location # as a property. Change try builder as CI mirrors skylab_upload_location = builder_config.skylab_upload_location( gs_bucket = "chromium-try-skylab", ), - build_gs_bucket = "chromium-chromiumos-archive", ), goma_backend = None, ) @@ -160,24 +160,16 @@ try_.compilator_builder( name = "lacros-amd64-generic-rel-compilator", branch_selector = branches.STANDARD_MILESTONE, - main_list_view = "try", + cores = None, # TODO (crbug.com/1287228): Set correct values once bots are set up ssd = None, - cores = None, + main_list_view = "try", ) try_.builder( name = "lacros-amd64-generic-rel-skylab-fyi", branch_selector = branches.STANDARD_MILESTONE, builder_spec = builder_config.builder_spec( - chromium_config = builder_config.chromium_config( - config = "chromium", - apply_configs = ["mb", "mb_no_luci_auth"], - target_bits = 64, - target_cros_boards = "eve", - cros_boards_with_qemu_images = "amd64-generic", - target_platform = "chromeos", - ), gclient_config = builder_config.gclient_config( config = "chromium", apply_configs = [ @@ -185,10 +177,18 @@ "checkout_lacros_sdk", ], ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb", "mb_no_luci_auth"], + target_bits = 64, + target_platform = "chromeos", + target_cros_boards = "eve", + cros_boards_with_qemu_images = "amd64-generic", + ), + build_gs_bucket = "chromium-fyi-archive", skylab_upload_location = builder_config.skylab_upload_location( gs_bucket = "gs://lacros-amd64-generic-rel-skylab-try", ), - build_gs_bucket = "chromium-fyi-archive", ), builderless = not settings.is_main, main_list_view = "try", @@ -204,27 +204,28 @@ try_.builder( name = "lacros-arm-generic-rel", + branch_selector = branches.STANDARD_MILESTONE, mirrors = [ "ci/lacros-arm-generic-rel", ], - branch_selector = branches.STANDARD_MILESTONE, builderless = not settings.is_main, main_list_view = "try", - tryjob = try_.job(), goma_backend = None, + tryjob = try_.job(), ) try_.builder( name = "lacros-arm64-generic-rel", + branch_selector = branches.STANDARD_MILESTONE, mirrors = [ "ci/lacros-arm64-generic-rel", ], - branch_selector = branches.STANDARD_MILESTONE, main_list_view = "try", ) try_.builder( name = "linux-chromeos-compile-dbg", + branch_selector = branches.STANDARD_MILESTONE, mirrors = [ "ci/linux-chromeos-dbg", ], @@ -232,12 +233,11 @@ include_all_triggered_testers = True, is_compile_only = True, ), - branch_selector = branches.STANDARD_MILESTONE, builderless = not settings.is_main, main_list_view = "try", + goma_backend = None, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, tryjob = try_.job(), - goma_backend = None, ) try_.builder( @@ -266,15 +266,15 @@ try_.orchestrator_builder( name = "linux-chromeos-rel", + branch_selector = branches.CROS_LTS_MILESTONE, + compilator = "linux-chromeos-rel-compilator", mirrors = [ "ci/linux-chromeos-rel", ], - compilator = "linux-chromeos-rel-compilator", - branch_selector = branches.CROS_LTS_MILESTONE, main_list_view = "try", - use_clang_coverage = True, coverage_test_types = ["unit", "overall"], tryjob = try_.job(), + use_clang_coverage = True, # TODO(crbug.com/1372179): Use orchestrator pool once overloaded test pools # are addressed # use_orchestrator_pool = True, @@ -298,14 +298,14 @@ try_.orchestrator_builder( name = "linux-lacros-rel", + branch_selector = branches.STANDARD_MILESTONE, + compilator = "linux-lacros-rel-compilator", mirrors = [ "ci/linux-lacros-builder-rel", "ci/linux-lacros-tester-rel", ], - branch_selector = branches.STANDARD_MILESTONE, - compilator = "linux-lacros-rel-compilator", - check_for_flakiness = True, main_list_view = "try", + check_for_flakiness = True, tryjob = try_.job(), # TODO(crbug.com/1372179): Use orchestrator pool once overloaded test pools # are addressed @@ -315,19 +315,19 @@ try_.compilator_builder( name = "linux-lacros-rel-compilator", branch_selector = branches.STANDARD_MILESTONE, + cores = 32, main_list_view = "try", goma_backend = None, - cores = 32, ) try_.builder( name = "linux-chromeos-dbg", - mirrors = [ - "ci/linux-chromeos-dbg", - ], # The CI builder that this mirrors is enabled on branches, so this will # allow testing changes that would break it before submitting branch_selector = branches.STANDARD_MILESTONE, + mirrors = [ + "ci/linux-chromeos-dbg", + ], goma_backend = None, ) @@ -344,6 +344,9 @@ mirrors = [ "ci/linux-cfm-rel", ], + goma_backend = None, + reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, + reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, tryjob = try_.job( location_filters = [ "chromeos/ash/components/chromebox_for_meetings/.+", @@ -355,9 +358,6 @@ "chrome/test/data/webui/chromeos/chromebox_for_meetings/.+", ], ), - goma_backend = None, - reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, - reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) # RTS builders @@ -373,10 +373,10 @@ ), ), builderless = False, - use_clang_coverage = True, coverage_test_types = ["unit", "overall"], + goma_backend = None, tryjob = try_.job( experiment_percentage = 5, ), - goma_backend = None, + use_clang_coverage = True, )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star b/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star index b35ff064..7e28a54 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star
@@ -10,15 +10,15 @@ try_.defaults.set( builder_group = "tryserver.chromium.dawn", - builderless = False, executable = try_.DEFAULT_EXECUTABLE, - execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, - goma_backend = goma.backend.RBE_PROD, + builderless = False, os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, + service_account = try_.gpu.SERVICE_ACCOUNT, + execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, + goma_backend = goma.backend.RBE_PROD, reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, - service_account = try_.gpu.SERVICE_ACCOUNT, ) consoles.list_view( @@ -33,6 +33,9 @@ "ci/Dawn Android arm DEPS Release (Pixel 4)", ], main_list_view = "try", + test_presentation = resultdb.test_presentation( + grouping_keys = ["status", "v.test_suite", "v.gpu"], + ), tryjob = try_.job( location_filters = [ cq.location_filter(path_regexp = "content/test/gpu/.+"), @@ -48,9 +51,6 @@ cq.location_filter(path_regexp = "ui/gl/features.gni"), ], ), - test_presentation = resultdb.test_presentation( - grouping_keys = ["status", "v.test_suite", "v.gpu"], - ), ) try_.builder( @@ -62,6 +62,10 @@ "ci/Dawn Linux x64 DEPS Release (NVIDIA)", ], main_list_view = "try", + goma_backend = None, + test_presentation = resultdb.test_presentation( + grouping_keys = ["status", "v.test_suite", "v.gpu"], + ), tryjob = try_.job( location_filters = [ cq.location_filter(path_regexp = "content/test/gpu/.+"), @@ -77,10 +81,6 @@ cq.location_filter(path_regexp = "ui/gl/features.gni"), ], ), - test_presentation = resultdb.test_presentation( - grouping_keys = ["status", "v.test_suite", "v.gpu"], - ), - goma_backend = None, ) try_.builder( @@ -92,8 +92,11 @@ # "ci/Dawn Mac x64 DEPS Release (AMD)", "ci/Dawn Mac x64 DEPS Release (Intel)", ], - main_list_view = "try", os = os.MAC_ANY, + main_list_view = "try", + test_presentation = resultdb.test_presentation( + grouping_keys = ["status", "v.test_suite", "v.gpu"], + ), tryjob = try_.job( location_filters = [ cq.location_filter(path_regexp = "content/test/gpu/.+"), @@ -109,9 +112,6 @@ cq.location_filter(path_regexp = "ui/gl/features.gni"), ], ), - test_presentation = resultdb.test_presentation( - grouping_keys = ["status", "v.test_suite", "v.gpu"], - ), ) try_.builder( @@ -122,8 +122,12 @@ "ci/Dawn Win10 x64 DEPS Release (Intel HD 630)", "ci/Dawn Win10 x64 DEPS Release (NVIDIA)", ], - main_list_view = "try", os = os.WINDOWS_ANY, + main_list_view = "try", + goma_backend = None, + test_presentation = resultdb.test_presentation( + grouping_keys = ["status", "v.test_suite", "v.gpu"], + ), tryjob = try_.job( location_filters = [ cq.location_filter(path_regexp = "content/test/gpu/.+"), @@ -139,23 +143,22 @@ cq.location_filter(path_regexp = "ui/gl/features.gni"), ], ), - test_presentation = resultdb.test_presentation( - grouping_keys = ["status", "v.test_suite", "v.gpu"], - ), - goma_backend = None, ) try_.builder( name = "dawn-win10-x86-deps-rel", branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, - goma_backend = None, mirrors = [ "ci/Dawn Win10 x86 DEPS Builder", "ci/Dawn Win10 x86 DEPS Release (Intel HD 630)", "ci/Dawn Win10 x86 DEPS Release (NVIDIA)", ], - main_list_view = "try", os = os.WINDOWS_ANY, + main_list_view = "try", + goma_backend = None, + test_presentation = resultdb.test_presentation( + grouping_keys = ["status", "v.test_suite", "v.gpu"], + ), tryjob = try_.job( location_filters = [ cq.location_filter(path_regexp = "content/test/gpu/.+"), @@ -171,9 +174,6 @@ cq.location_filter(path_regexp = "ui/gl/features.gni"), ], ), - test_presentation = resultdb.test_presentation( - grouping_keys = ["status", "v.test_suite", "v.gpu"], - ), ) try_.builder( @@ -193,21 +193,21 @@ "ci/Dawn Linux x64 Release (Intel UHD 630)", "ci/Dawn Linux x64 Release (NVIDIA)", ], + goma_backend = None, test_presentation = resultdb.test_presentation( grouping_keys = ["status", "v.test_suite", "v.gpu"], ), - goma_backend = None, ) try_.builder( name = "mac-dawn-rel", - os = os.MAC_ANY, mirrors = [ "ci/Dawn Mac x64 Builder", # Not enough capacity on Mac AMD https://crbug.com/1380184. # "ci/Dawn Mac x64 Release (AMD)", "ci/Dawn Mac x64 Release (Intel)", ], + os = os.MAC_ANY, test_presentation = resultdb.test_presentation( grouping_keys = ["status", "v.test_suite", "v.gpu"], ), @@ -215,13 +215,13 @@ try_.builder( name = "dawn-try-mac-amd-exp", - builderless = True, - os = os.MAC_ANY, - pool = "luci.chromium.gpu.mac.retina.amd.try", mirrors = [ "ci/Dawn Mac x64 Builder", "ci/Dawn Mac x64 Experimental Release (AMD)", ], + builderless = True, + os = os.MAC_ANY, + pool = "luci.chromium.gpu.mac.retina.amd.try", test_presentation = resultdb.test_presentation( grouping_keys = ["status", "v.test_suite", "v.gpu"], ), @@ -229,13 +229,13 @@ try_.builder( name = "dawn-try-mac-intel-exp", - builderless = True, - os = os.MAC_ANY, - pool = "luci.chromium.gpu.mac.mini.intel.try", mirrors = [ "ci/Dawn Mac x64 Builder", "ci/Dawn Mac x64 Experimental Release (Intel)", ], + builderless = True, + os = os.MAC_ANY, + pool = "luci.chromium.gpu.mac.mini.intel.try", test_presentation = resultdb.test_presentation( grouping_keys = ["status", "v.test_suite", "v.gpu"], ), @@ -243,70 +243,70 @@ try_.builder( name = "dawn-try-win-x64-intel-exp", - builderless = True, - os = os.WINDOWS_ANY, - pool = "luci.chromium.gpu.win10.intel.try", mirrors = [ "ci/Dawn Win10 x64 Builder", "ci/Dawn Win10 x64 Experimental Release (Intel)", ], + builderless = True, + os = os.WINDOWS_ANY, + pool = "luci.chromium.gpu.win10.intel.try", + goma_backend = None, test_presentation = resultdb.test_presentation( grouping_keys = ["status", "v.test_suite", "v.gpu"], ), - goma_backend = None, ) try_.builder( name = "dawn-try-win-x86-intel-exp", - builderless = True, - os = os.WINDOWS_ANY, - pool = "luci.chromium.gpu.win10.intel.try", mirrors = [ "ci/Dawn Win10 x86 Builder", "ci/Dawn Win10 x86 Experimental Release (Intel)", ], + builderless = True, + os = os.WINDOWS_ANY, + pool = "luci.chromium.gpu.win10.intel.try", + goma_backend = None, test_presentation = resultdb.test_presentation( grouping_keys = ["status", "v.test_suite", "v.gpu"], ), - goma_backend = None, ) try_.builder( name = "win-dawn-rel", - os = os.WINDOWS_ANY, mirrors = [ "ci/Dawn Win10 x64 Builder", "ci/Dawn Win10 x64 Release (Intel HD 630)", "ci/Dawn Win10 x64 Release (NVIDIA)", ], + os = os.WINDOWS_ANY, + goma_backend = None, test_presentation = resultdb.test_presentation( grouping_keys = ["status", "v.test_suite", "v.gpu"], ), - goma_backend = None, ) try_.builder( name = "dawn-try-win10-x86-rel", - os = os.WINDOWS_ANY, mirrors = [ "ci/Dawn Win10 x86 Builder", "ci/Dawn Win10 x86 Release (Intel HD 630)", "ci/Dawn Win10 x86 Release (NVIDIA)", ], + os = os.WINDOWS_ANY, + goma_backend = None, test_presentation = resultdb.test_presentation( grouping_keys = ["status", "v.test_suite", "v.gpu"], ), - goma_backend = None, ) try_.builder( name = "dawn-try-win10-x64-asan-rel", - os = os.WINDOWS_ANY, mirrors = [ "ci/Dawn Win10 x64 ASAN Release", ], + os = os.WINDOWS_ANY, + goma_backend = None, test_presentation = resultdb.test_presentation( grouping_keys = ["status", "v.test_suite", "v.gpu"], ), - goma_backend = None, )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star b/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star index c7e7f08..26420a0 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star
@@ -12,33 +12,37 @@ try_.defaults.set( builder_group = "tryserver.chromium.fuchsia", - cores = 8, - orchestrator_cores = 2, - compilator_cores = 8, executable = try_.DEFAULT_EXECUTABLE, - execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, - goma_backend = goma.backend.RBE_PROD, - compilator_goma_jobs = goma.jobs.J150, + cores = 8, os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, - reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, - compilator_reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, service_account = try_.DEFAULT_SERVICE_ACCOUNT, + compilator_cores = 8, + compilator_goma_jobs = goma.jobs.J150, + compilator_reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, + execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, + goma_backend = goma.backend.RBE_PROD, # TODO(crbug.com/1362440): remove this. omit_python2 = False, + orchestrator_cores = 2, + reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, ) consoles.list_view( - branch_selector = branches.FUCHSIA_LTS_MILESTONE, name = "tryserver.chromium.fuchsia", + branch_selector = branches.FUCHSIA_LTS_MILESTONE, ) try_.builder( name = "fuchsia-arm64-cast-receiver-rel", branch_selector = branches.FUCHSIA_LTS_MILESTONE, + mirrors = [ + "ci/fuchsia-arm64-cast-receiver-rel", + ], main_list_view = "try", + goma_backend = None, # This is the only bot that builds //chromecast code for Fuchsia on ARM64 # so trigger it when changes are made. tryjob = try_.job( @@ -46,10 +50,6 @@ "chromecast/.+", ], ), - mirrors = [ - "ci/fuchsia-arm64-cast-receiver-rel", - ], - goma_backend = None, ) try_.builder( @@ -61,12 +61,12 @@ try_.orchestrator_builder( name = "fuchsia-arm64-rel", - compilator = "fuchsia-arm64-rel-compilator", branch_selector = branches.FUCHSIA_LTS_MILESTONE, - main_list_view = "try", + compilator = "fuchsia-arm64-rel-compilator", mirrors = [ "ci/fuchsia-arm64-rel", ], + main_list_view = "try", experiments = { "enable_weetbix_queries": 100, "weetbix.retry_weak_exonerations": 100, @@ -85,9 +85,10 @@ try_.builder( name = "fuchsia-binary-size", branch_selector = branches.FUCHSIA_LTS_MILESTONE, + executable = "recipe:binary_size_fuchsia_trybot", builderless = not settings.is_main, cores = 16 if settings.is_main else 8, - executable = "recipe:binary_size_fuchsia_trybot", + goma_backend = None, goma_jobs = goma.jobs.J150, properties = { "$build/binary_size": { @@ -100,18 +101,10 @@ }, }, tryjob = try_.job(), - goma_backend = None, ) try_.builder( name = "fuchsia-compile-x64-dbg", - tryjob = try_.job( - location_filters = [ - "base/fuchsia/.+", - "fuchsia/.+", - "media/fuchsia/.+", - ], - ), mirrors = [ "ci/fuchsia-x64-dbg", ], @@ -120,6 +113,13 @@ is_compile_only = True, ), goma_backend = None, + tryjob = try_.job( + location_filters = [ + "base/fuchsia/.+", + "fuchsia/.+", + "media/fuchsia/.+", + ], + ), ) try_.builder( @@ -142,18 +142,18 @@ try_.orchestrator_builder( name = "fuchsia-x64-cast-receiver-rel", - compilator = "fuchsia-x64-cast-receiver-rel-compilator", branch_selector = branches.FUCHSIA_LTS_MILESTONE, - main_list_view = "try", - tryjob = try_.job(), + compilator = "fuchsia-x64-cast-receiver-rel-compilator", mirrors = [ "ci/fuchsia-x64-cast-receiver-rel", ], + main_list_view = "try", experiments = { "enable_weetbix_queries": 100, "weetbix.retry_weak_exonerations": 100, "weetbix.enable_weetbix_exonerations": 100, }, + tryjob = try_.job(), ) try_.compilator_builder( @@ -175,10 +175,10 @@ try_.builder( name = "fuchsia-x64-rel", branch_selector = branches.FUCHSIA_LTS_MILESTONE, - main_list_view = "try", mirrors = [ "ci/fuchsia-x64-rel", ], + main_list_view = "try", experiments = { "enable_weetbix_queries": 100, "weetbix.retry_weak_exonerations": 100,
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star index eb0fed49..02ea84ef 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
@@ -12,18 +12,18 @@ try_.defaults.set( builder_group = "tryserver.chromium.linux", - cores = 8, - orchestrator_cores = 2, - compilator_cores = 8, executable = try_.DEFAULT_EXECUTABLE, - execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, - goma_backend = goma.backend.RBE_PROD, - compilator_goma_jobs = goma.jobs.J300, - reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, - compilator_reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, + cores = 8, os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, service_account = try_.DEFAULT_SERVICE_ACCOUNT, + compilator_cores = 8, + compilator_goma_jobs = goma.jobs.J300, + compilator_reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, + execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, + goma_backend = goma.backend.RBE_PROD, + orchestrator_cores = 2, + reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, ) consoles.list_view( @@ -40,6 +40,7 @@ try_.builder( name = "leak_detection_linux", + mirrors = ["ci/Leak Detection Linux"], goma_backend = None, ) @@ -54,19 +55,20 @@ ), builderless = False, goma_jobs = goma.jobs.J150, - reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, - tryjob = try_.job( - experiment_percentage = 5, - ), properties = { "bot_update_experiments": [ "no_sync", ], }, + reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, + tryjob = try_.job( + experiment_percentage = 5, + ), ) try_.builder( name = "linux-annotator-rel", + mirrors = ["ci/linux-annotator-rel"], ) try_.builder( @@ -75,13 +77,13 @@ mirrors = [ "ci/Cast Linux ARM64", ], + os = os.LINUX_BIONIC, main_list_view = "try", tryjob = try_.job( location_filters = [ "chromecast/.+", ], ), - os = os.LINUX_BIONIC, ) try_.builder( @@ -95,6 +97,7 @@ try_.builder( name = "linux-blink-heap-verification-try", + mirrors = ["ci/linux-blink-heap-verification"], goma_backend = None, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) @@ -118,12 +121,13 @@ mirrors = [ "ci/linux-gcc-rel", ], - goma_backend = None, os = os.LINUX_FOCAL, + goma_backend = None, ) try_.builder( name = "linux-headless-shell-rel", + mirrors = ["ci/linux-headless-shell-rel"], goma_backend = None, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) @@ -135,6 +139,7 @@ try_.builder( name = "linux-fieldtrial-rel", + mirrors = ["ci/linux-fieldtrial-rel"], ) try_.builder( @@ -151,29 +156,46 @@ try_.builder( name = "linux-lacros-fyi-rel", + mirrors = [ + "ci/linux-lacros-builder-fyi-rel", + "ci/linux-lacros-tester-fyi-rel", + ], goma_backend = None, ) try_.builder( name = "linux-lacros-version-skew-fyi", + mirrors = ["ci/linux-lacros-version-skew-fyi"], goma_backend = None, ) try_.builder( name = "linux-layout-tests-edit-ng", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + ), ) try_.builder( name = "linux-libfuzzer-asan-rel", branch_selector = branches.STANDARD_MILESTONE, - builderless = not settings.is_main, executable = "recipe:chromium_libfuzzer_trybot", + builderless = not settings.is_main, main_list_view = "try", tryjob = try_.job(), ) try_.builder( name = "linux-perfetto-rel", + mirrors = ["ci/linux-perfetto-rel"], + goma_backend = None, + reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, tryjob = try_.job( location_filters = [ "base/trace_event/.+", @@ -183,15 +205,12 @@ "services/tracing/.+", ], ), - goma_backend = None, - reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) try_.orchestrator_builder( name = "linux-rel", - compilator = "linux-rel-compilator", branch_selector = branches.STANDARD_MILESTONE, - check_for_flakiness = True, + compilator = "linux-rel-compilator", mirrors = [ "ci/Linux Builder", "ci/Linux Tests", @@ -204,9 +223,10 @@ ), ), main_list_view = "try", - use_clang_coverage = True, + check_for_flakiness = True, coverage_test_types = ["unit", "overall"], tryjob = try_.job(), + use_clang_coverage = True, # TODO(crbug.com/1372179): Use orchestrator pool once overloaded test pools # are addressed # use_orchestrator_pool = True, @@ -215,8 +235,8 @@ try_.compilator_builder( name = "linux-rel-compilator", branch_selector = branches.STANDARD_MILESTONE, - check_for_flakiness = True, main_list_view = "try", + check_for_flakiness = True, ) # TODO(crbug.com/1394755): Remove this builder after burning down failures @@ -252,8 +272,8 @@ try_.orchestrator_builder( name = "linux-wayland-rel", - compilator = "linux-wayland-rel-compilator", branch_selector = branches.STANDARD_MILESTONE, + compilator = "linux-wayland-rel-compilator", mirrors = [ "ci/Linux Builder (Wayland)", "ci/Linux Tests (Wayland)", @@ -270,12 +290,13 @@ try_.compilator_builder( name = "linux-wayland-rel-compilator", branch_selector = branches.STANDARD_MILESTONE, - main_list_view = "try", ssd = True, + main_list_view = "try", ) try_.builder( name = "linux-viz-rel", + mirrors = ["ci/Linux Viz"], ) try_.builder( @@ -296,18 +317,21 @@ try_.builder( name = "linux-wpt-fyi-rel", + mirrors = ["ci/linux-wpt-fyi-rel"], goma_backend = None, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) try_.builder( name = "linux-wpt-identity-fyi-rel", + mirrors = ["ci/linux-wpt-identity-fyi-rel"], goma_backend = None, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) try_.builder( name = "linux-wpt-input-fyi-rel", + mirrors = ["ci/linux-wpt-input-fyi-rel"], goma_backend = None, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) @@ -355,10 +379,8 @@ try_.orchestrator_builder( name = "linux_chromium_asan_rel_ng", - compilator = "linux_chromium_asan_rel_ng-compilator", branch_selector = branches.STANDARD_MILESTONE, - main_list_view = "try", - tryjob = try_.job(), + compilator = "linux_chromium_asan_rel_ng-compilator", mirrors = [ "ci/Linux ASan LSan Builder", "ci/Linux ASan LSan Tests (1)", @@ -368,6 +390,8 @@ condition = builder_config.rts_condition.QUICK_RUN_ONLY, ), ), + main_list_view = "try", + tryjob = try_.job(), # TODO (crbug.com/1372179): Use orchestrator pool once overloaded test pools # are addressed # use_orchestrator_pool = True, @@ -416,12 +440,12 @@ "ci/Linux Chromium OS ASan LSan Builder", "ci/Linux Chromium OS ASan LSan Tests (1)", ], - goma_backend = None, - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, + ssd = True, # TODO(crbug/1144484): Remove this timeout once we figure out the # regression in compiler or toolchain. execution_timeout = 7 * time.hour, - ssd = True, + goma_backend = None, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, ) try_.builder( @@ -429,10 +453,10 @@ mirrors = [ "ci/Linux ChromiumOS MSan Focal", ], - goma_backend = None, - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, os = os.LINUX_FOCAL, execution_timeout = 16 * time.hour, + goma_backend = None, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, ) try_.builder( @@ -441,10 +465,10 @@ "ci/Linux ChromiumOS MSan Builder", "ci/Linux ChromiumOS MSan Tests", ], + cores = 16, + ssd = True, goma_backend = None, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, - ssd = True, - cores = 16, ) try_.builder( @@ -473,6 +497,7 @@ is_compile_only = True, ), builderless = not settings.is_main, + main_list_view = "try", caches = [ swarming.cache( name = "builder", @@ -480,7 +505,6 @@ ), ], reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, - main_list_view = "try", tryjob = try_.job(), ) @@ -504,20 +528,20 @@ "ci/Linux Builder (dbg)", "Linux Tests (dbg)(1)", ], + main_list_view = "try", caches = [ swarming.cache( name = "builder", path = "linux_debug", ), ], - main_list_view = "try", + goma_backend = None, + reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, tryjob = try_.job( location_filters = [ "build/.*check_gn_headers.*", ], ), - goma_backend = None, - reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) try_.builder( @@ -526,14 +550,16 @@ "ci/Linux MSan Builder", "ci/Linux MSan Tests", ], + os = os.LINUX_FOCAL, execution_timeout = 6 * time.hour, goma_backend = None, - os = os.LINUX_FOCAL, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, ) try_.orchestrator_builder( name = "linux_chromium_tsan_rel_ng", + branch_selector = branches.STANDARD_MILESTONE, + compilator = "linux_chromium_tsan_rel_ng-compilator", mirrors = [ "ci/Linux TSan Builder", "ci/Linux TSan Tests", @@ -543,8 +569,6 @@ condition = builder_config.rts_condition.QUICK_RUN_ONLY, ), ), - compilator = "linux_chromium_tsan_rel_ng-compilator", - branch_selector = branches.STANDARD_MILESTONE, main_list_view = "try", tryjob = try_.job(), # TODO (crbug.com/1372179): Use orchestrator pool once overloaded test pools @@ -554,6 +578,7 @@ try_.orchestrator_builder( name = "linux_chromium_tsan_rel_ng-inverse-fyi", + compilator = "linux_chromium_tsan_rel_ng-compilator", mirrors = [ "ci/Linux TSan Builder", "ci/Linux TSan Tests", @@ -563,7 +588,6 @@ condition = builder_config.rts_condition.QUICK_RUN_ONLY, ), ), - compilator = "linux_chromium_tsan_rel_ng-compilator", experiments = { "chromium_rts.inverted_rts": 100, "chromium_rts.inverted_rts_bail_early": 100, @@ -591,10 +615,10 @@ mirrors = [ "ci/linux-lacros-asan-lsan-rel", ], - goma_backend = None, - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, cores = 16, ssd = True, + goma_backend = None, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, ) try_.builder( @@ -629,16 +653,16 @@ try_.builder( name = "linux_upload_clang", + executable = "recipe:chromium_upload_clang", builderless = True, cores = 32, - executable = "recipe:chromium_upload_clang", - goma_backend = None, # This builder produces the clang binaries used on all builders. Since it # uses the system's sysroot when compiling, the builder needs to run on the # OS version that's the oldest used on any bot. os = os.LINUX_BIONIC, - notifies = ["chrome-rust-toolchain"], execution_timeout = 5 * time.hour, + goma_backend = None, + notifies = ["chrome-rust-toolchain"], ) try_.builder( @@ -648,14 +672,14 @@ "ci/VR Linux", ], main_list_view = "try", + goma_backend = None, + reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, tryjob = try_.job( location_filters = [ "chrome/browser/vr/.+", "content/browser/xr/.+", ], ), - goma_backend = None, - reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) try_.builder( @@ -685,6 +709,7 @@ try_.gpu.optional_tests_builder( name = "linux_optional_gpu_tests_rel", + branch_selector = branches.STANDARD_MILESTONE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -705,7 +730,6 @@ try_settings = builder_config.try_settings( retry_failed_shards = False, ), - branch_selector = branches.STANDARD_MILESTONE, main_list_view = "try", tryjob = try_.job( location_filters = [ @@ -738,7 +762,6 @@ try_.orchestrator_builder( name = "linux-rel-inverse-fyi", compilator = "linux-rel-compilator", - check_for_flakiness = True, mirrors = [ "ci/Linux Builder", "ci/Linux Tests", @@ -750,12 +773,13 @@ condition = builder_config.rts_condition.QUICK_RUN_ONLY, ), ), - use_clang_coverage = True, + check_for_flakiness = True, coverage_test_types = ["unit", "overall"], experiments = { "chromium_rts.inverted_rts": 100, "chromium_rts.inverted_rts_bail_early": 100, }, + use_clang_coverage = True, use_orchestrator_pool = True, ) @@ -763,18 +787,18 @@ try_.builder( name = "linux-rel-ml", mirrors = builder_config.copy_from("linux-rel"), - tryjob = try_.job( - experiment_percentage = 5, - ), try_settings = builder_config.try_settings( rts_config = builder_config.rts_config( condition = builder_config.rts_condition.ALWAYS, ), ), - cores = 16, builderless = False, + cores = 16, experiments = {"chromium_rts.experimental_model": 100}, goma_backend = None, + tryjob = try_.job( + experiment_percentage = 5, + ), ) try_.builder(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star index 6bd4f9d..5bbb5fd 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
@@ -11,16 +11,16 @@ try_.defaults.set( builder_group = "tryserver.chromium.mac", - builderless = True, - orchestrator_cores = 2, executable = try_.DEFAULT_EXECUTABLE, - execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, - goma_backend = goma.backend.RBE_PROD, - compilator_goma_jobs = goma.jobs.J150, + builderless = True, os = os.MAC_ANY, + ssd = True, pool = try_.DEFAULT_POOL, service_account = try_.DEFAULT_SERVICE_ACCOUNT, - ssd = True, + compilator_goma_jobs = goma.jobs.J150, + execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, + goma_backend = goma.backend.RBE_PROD, + orchestrator_cores = 2, ) def ios_builder(*, name, **kwargs): @@ -41,8 +41,8 @@ "ci/mac-arm64-on-arm64-rel", ], builderless = False, - cpu = cpu.ARM64, os = os.MAC_DEFAULT, + cpu = cpu.ARM64, ) try_.builder( @@ -70,17 +70,18 @@ try_.builder( name = "mac-fieldtrial-tester", - os = os.MAC_DEFAULT, mirrors = [ "ci/mac-arm64-rel", "ci/mac-fieldtrial-tester", ], + os = os.MAC_DEFAULT, ) try_.builder( name = "mac-builder-next-rel", - os = os.MAC_13, + mirrors = ["ci/Mac Builder Next"], builderless = False, + os = os.MAC_13, ) try_.builder( @@ -92,9 +93,8 @@ try_.orchestrator_builder( name = "mac-rel", - compilator = "mac-rel-compilator", - check_for_flakiness = True, branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, + compilator = "mac-rel-compilator", mirrors = [ "ci/Mac Builder", "ci/Mac12 Tests", @@ -110,9 +110,10 @@ ), ), main_list_view = "try", - use_clang_coverage = True, + check_for_flakiness = True, coverage_test_types = ["overall", "unit"], tryjob = try_.job(), + use_clang_coverage = True, # TODO (crbug.com/1372179): Use orchestrator pool once overloaded test pools # are addressed #use_orchestrator_pool = True, @@ -121,7 +122,6 @@ try_.orchestrator_builder( name = "mac-rel-inverse-fyi", compilator = "mac-rel-compilator", - check_for_flakiness = True, mirrors = builder_config.copy_from("try/mac-rel"), try_settings = builder_config.try_settings( rts_config = builder_config.rts_config( @@ -129,43 +129,44 @@ ), ), main_list_view = "try", - use_clang_coverage = True, + check_for_flakiness = True, coverage_test_types = ["overall", "unit"], experiments = { "chromium_rts.inverted_rts": 100, "chromium_rts.inverted_rts_bail_early": 100, }, + use_clang_coverage = True, use_orchestrator_pool = True, ) try_.compilator_builder( name = "mac-rel-compilator", - check_for_flakiness = True, branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, - main_list_view = "try", os = os.MAC_DEFAULT, + main_list_view = "try", + check_for_flakiness = True, goma_jobs = goma.jobs.J300, ) try_.builder( name = "mac11-arm64-rel", - builderless = True, - check_for_flakiness = True, mirrors = [ "ci/mac-arm64-rel", "ci/mac11-arm64-rel-tests", ], + builderless = True, + check_for_flakiness = True, ) try_.orchestrator_builder( name = "mac12-arm64-rel", - check_for_flakiness = True, compilator = "mac12-arm64-rel-compilator", mirrors = [ "ci/mac-arm64-rel", "ci/mac12-arm64-rel-tests", ], main_list_view = "try", + check_for_flakiness = True, tryjob = try_.job( experiment_percentage = 100, ), @@ -173,9 +174,9 @@ try_.compilator_builder( name = "mac12-arm64-rel-compilator", - check_for_flakiness = True, - main_list_view = "try", os = os.MAC_12, + main_list_view = "try", + check_for_flakiness = True, # TODO (crbug.com/1245171): Revert when root issue is fixed grace_period = 4 * time.minute, ) @@ -250,9 +251,9 @@ include_all_triggered_testers = True, is_compile_only = True, ), - goma_jobs = goma.jobs.J150, os = os.MAC_DEFAULT, main_list_view = "try", + goma_jobs = goma.jobs.J150, tryjob = try_.job(), ) @@ -277,16 +278,16 @@ try_.builder( name = "mac_upload_clang", - builderless = False, executable = "recipe:chromium_upload_clang", + builderless = False, execution_timeout = 6 * time.hour, goma_backend = None, # Does not use Goma. ) try_.builder( name = "mac_upload_clang_arm", - builderless = False, executable = "recipe:chromium_upload_clang", + builderless = False, execution_timeout = 6 * time.hour, goma_backend = None, # Does not use Goma. ) @@ -314,8 +315,8 @@ ios_builder( name = "ios-fieldtrial-rel", - builderless = True, mirrors = ["ci/ios-fieldtrial-rel"], + builderless = True, ) ios_builder( @@ -334,34 +335,34 @@ try_.orchestrator_builder( name = "ios-simulator", - compilator = "ios-simulator-compilator", branch_selector = branches.STANDARD_MILESTONE, + compilator = "ios-simulator-compilator", mirrors = [ "ci/ios-simulator", ], - check_for_flakiness = True, - main_list_view = "try", - use_clang_coverage = True, - coverage_exclude_sources = "ios_test_files_and_test_utils", - coverage_test_types = ["overall", "unit"], - tryjob = try_.job(), # TODO (crbug.com/1372179): Move back to orchestrator bots once they can be # properly rate limited # use_orchestrator_pool = True, cores = 2, os = os.LINUX_DEFAULT, + main_list_view = "try", + check_for_flakiness = True, + coverage_exclude_sources = "ios_test_files_and_test_utils", + coverage_test_types = ["overall", "unit"], + tryjob = try_.job(), + use_clang_coverage = True, ) try_.compilator_builder( name = "ios-simulator-compilator", + branch_selector = branches.STANDARD_MILESTONE, # Set builderless to False so that branch builders use builderful bots builderless = False, - check_for_flakiness = True, - branch_selector = branches.STANDARD_MILESTONE, - main_list_view = "try", os = os.MAC_DEFAULT, ssd = None, xcode = xcode.x14main, + main_list_view = "try", + check_for_flakiness = True, ) ios_builder( @@ -370,14 +371,14 @@ mirrors = [ "ci/ios-simulator-cronet", ], - check_for_flakiness = True, main_list_view = "try", + check_for_flakiness = True, tryjob = try_.job( location_filters = [ "components/cronet/.+", "components/grpc_support/.+", "ios/.+", - cq.location_filter(path_regexp = "components/cronet/android/.+", exclude = True), + cq.location_filter(exclude = True, path_regexp = "components/cronet/android/.+"), ], ), ) @@ -388,9 +389,8 @@ mirrors = [ "ci/ios-simulator-full-configs", ], - check_for_flakiness = True, main_list_view = "try", - use_clang_coverage = True, + check_for_flakiness = True, coverage_exclude_sources = "ios_test_files_and_test_utils", coverage_test_types = ["overall", "unit"], tryjob = try_.job( @@ -398,6 +398,7 @@ "ios/.+", ], ), + use_clang_coverage = True, ) ios_builder( @@ -407,6 +408,7 @@ ios_builder( name = "ios-simulator-multi-window", + mirrors = ["ci/ios-simulator-multi-window"], ) ios_builder( @@ -423,27 +425,29 @@ ios_builder( name = "ios15-beta-simulator", + mirrors = ["ci/ios15-beta-simulator"], ) ios_builder( name = "ios15-sdk-simulator", + mirrors = ["ci/ios15-sdk-simulator"], os = os.MAC_12, ) ios_builder( name = "ios16-beta-simulator", - os = os.MAC_DEFAULT, mirrors = [ "ci/ios16-beta-simulator", ], + os = os.MAC_DEFAULT, ) ios_builder( name = "ios16-sdk-simulator", - os = os.MAC_DEFAULT, mirrors = [ "ci/ios16-sdk-simulator", ], + os = os.MAC_DEFAULT, xcode = xcode.x14betabots, ) @@ -467,8 +471,8 @@ ), build_gs_bucket = "chromium-gpu-fyi-archive", ), - main_list_view = "try", ssd = None, + main_list_view = "try", tryjob = try_.job( location_filters = [ cq.location_filter(path_regexp = "chrome/browser/vr/.+"), @@ -509,7 +513,7 @@ ), builderless = False, check_for_flakiness = True, - use_clang_coverage = True, coverage_exclude_sources = "ios_test_files_and_test_utils", coverage_test_types = ["overall", "unit"], + use_clang_coverage = True, )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.packager.star b/infra/config/subprojects/chromium/try/tryserver.chromium.packager.star index 31dbf044..eb23dc31 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.packager.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.packager.star
@@ -10,9 +10,9 @@ try_.defaults.set( builder_group = "tryserver.chromium.packager", executable = "recipe:chromium_3pp", - execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, pool = try_.DEFAULT_POOL, service_account = "chromium-cipd-try-builder@chops-service-accounts.iam.gserviceaccount.com", + execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, ) consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.rust.star b/infra/config/subprojects/chromium/try/tryserver.chromium.rust.star index 2abc6d6e..3b6f123 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.rust.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.rust.star
@@ -9,16 +9,16 @@ try_.defaults.set( builder_group = "tryserver.chromium.rust", + executable = try_.DEFAULT_EXECUTABLE, builderless = False, cores = 8, - executable = try_.DEFAULT_EXECUTABLE, - execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, - goma_backend = goma.backend.RBE_PROD, os = os.LINUX_DEFAULT, - reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, - reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, pool = try_.DEFAULT_POOL, service_account = try_.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, + goma_backend = goma.backend.RBE_PROD, + reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, + reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, ) consoles.list_view( @@ -27,24 +27,29 @@ try_.builder( name = "android-rust-arm-dbg", + mirrors = ["ci/android-rust-arm-dbg"], goma_backend = None, ) try_.builder( name = "android-rust-arm-rel", + mirrors = ["ci/android-rust-arm-rel"], goma_backend = None, ) try_.builder( name = "linux-rust-x64-rel", + mirrors = ["ci/linux-rust-x64-rel"], goma_backend = None, ) try_.builder( name = "linux-rust-x64-rel-android-toolchain", + mirrors = ["ci/linux-rust-x64-rel"], ) try_.builder( name = "linux-rust-x64-dbg", + mirrors = ["ci/linux-rust-x64-dbg"], goma_backend = None, )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.star b/infra/config/subprojects/chromium/try/tryserver.chromium.star index dc4d2b4..a561234 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.star
@@ -10,16 +10,16 @@ try_.defaults.set( builder_group = "tryserver.chromium", + executable = try_.DEFAULT_EXECUTABLE, builderless = True, cores = 32, - executable = try_.DEFAULT_EXECUTABLE, - execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, - goma_backend = None, os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, + service_account = try_.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, + goma_backend = None, reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, - service_account = try_.DEFAULT_SERVICE_ACCOUNT, ) consoles.list_view( @@ -61,11 +61,11 @@ "ci/mac-official", ], cores = None, + os = os.MAC_ANY, # TODO(crbug.com/1279290) builds with PGO change take long time. # Keep in sync with mac-official in ci/chromium.star. execution_timeout = 9 * time.hour, goma_backend = goma.backend.RBE_PROD, - os = os.MAC_ANY, reclient_instance = None, ) @@ -82,9 +82,9 @@ try_.builder( name = "win32-official", branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, - os = os.WINDOWS_DEFAULT, - execution_timeout = 6 * time.hour, mirrors = [ "ci/win32-official", ], + os = os.WINDOWS_DEFAULT, + execution_timeout = 6 * time.hour, )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.tricium.star b/infra/config/subprojects/chromium/try/tryserver.chromium.tricium.star index 241bf818..afbfe89 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.tricium.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.tricium.star
@@ -9,17 +9,17 @@ try_.defaults.set( builder_group = "tryserver.chromium.tricium", + executable = try_.DEFAULT_EXECUTABLE, builderless = True, cores = 8, - orchestrator_cores = 2, - executable = try_.DEFAULT_EXECUTABLE, + pool = try_.DEFAULT_POOL, + service_account = try_.DEFAULT_SERVICE_ACCOUNT, execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, goma_jobs = goma.jobs.J150, + orchestrator_cores = 2, reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, - pool = try_.DEFAULT_POOL, - service_account = try_.DEFAULT_SERVICE_ACCOUNT, # Make each bot specify its own OS, since we have a variety of these in this # file. @@ -41,10 +41,10 @@ name = "tricium-clang-tidy", executable = "recipe:tricium_clang_tidy_orchestrator", builderless = False, - # src checkouts are only required by bots spawned by this builder. - caches = SOURCELESS_BUILDER_CACHES, cores = try_.defaults.orchestrator_cores.get(), os = os.LINUX_DEFAULT, + # src checkouts are only required by bots spawned by this builder. + caches = SOURCELESS_BUILDER_CACHES, goma_backend = None, ) @@ -100,8 +100,8 @@ try_.builder( name = "mac-clang-tidy-rel", executable = "recipe:tricium_clang_tidy_wrapper", - os = os.MAC_DEFAULT, cores = None, + os = os.MAC_DEFAULT, ssd = True, # TODO(gbiv): Determine why this needs a system xcode and things like `Mac # Builder` don't.
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.updater.star b/infra/config/subprojects/chromium/try/tryserver.chromium.updater.star index ecc6a49..bfac244 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.updater.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.updater.star
@@ -9,12 +9,12 @@ try_.defaults.set( builder_group = "tryserver.chromium.updater", - builderless = True, executable = try_.DEFAULT_EXECUTABLE, - execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, - goma_backend = goma.backend.RBE_PROD, + builderless = True, pool = try_.DEFAULT_POOL, service_account = try_.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, + goma_backend = goma.backend.RBE_PROD, ) consoles.list_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star index 438ba42..0a749bd 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
@@ -11,20 +11,20 @@ try_.defaults.set( builder_group = "tryserver.chromium.win", + executable = try_.DEFAULT_EXECUTABLE, builderless = True, cores = 8, - orchestrator_cores = 2, - compilator_cores = 16, - executable = try_.DEFAULT_EXECUTABLE, - execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, - goma_backend = goma.backend.RBE_PROD, - compilator_goma_jobs = goma.jobs.J300, - compilator_reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, os = os.WINDOWS_DEFAULT, pool = try_.DEFAULT_POOL, + service_account = try_.DEFAULT_SERVICE_ACCOUNT, + compilator_cores = 16, + compilator_goma_jobs = goma.jobs.J300, + compilator_reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, + execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, + goma_backend = goma.backend.RBE_PROD, + orchestrator_cores = 2, reclient_instance = reclient.instance.DEFAULT_UNTRUSTED, reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ, - service_account = try_.DEFAULT_SERVICE_ACCOUNT, ) consoles.list_view( @@ -34,6 +34,7 @@ try_.builder( name = "win-annotator-rel", + mirrors = ["ci/win-annotator-rel"], ) try_.builder( @@ -49,32 +50,31 @@ try_.builder( name = "win-celab-try-rel", executable = "recipe:celab", + goma_backend = None, properties = { "exclude": "chrome_only", "pool_name": "celab-chromium-try", "pool_size": 20, "tests": "*", }, - goma_backend = None, ) try_.builder( name = "win-libfuzzer-asan-rel", branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, - builderless = False, executable = "recipe:chromium_libfuzzer_trybot", - main_list_view = "try", + builderless = False, os = os.WINDOWS_ANY, - tryjob = try_.job(), + main_list_view = "try", goma_backend = None, reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, + tryjob = try_.job(), ) try_.orchestrator_builder( name = "win-rel", - check_for_flakiness = True, - compilator = "win-rel-compilator", branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, + compilator = "win-rel-compilator", mirrors = [ "ci/Win x64 Builder", "ci/Win10 Tests x64", @@ -86,10 +86,11 @@ condition = builder_config.rts_condition.QUICK_RUN_ONLY, ), ), - use_clang_coverage = True, - coverage_test_types = ["unit", "overall"], main_list_view = "try", + check_for_flakiness = True, + coverage_test_types = ["unit", "overall"], tryjob = try_.job(), + use_clang_coverage = True, # TODO (crbug.com/1372179): Use orchestrator pool once overloaded test pools # are addressed #use_orchestrator_pool = True, @@ -97,9 +98,9 @@ try_.compilator_builder( name = "win-rel-compilator", - check_for_flakiness = True, branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, main_list_view = "try", + check_for_flakiness = True, # TODO (crbug.com/1245171): Revert when root issue is fixed grace_period = 4 * time.minute, ) @@ -122,17 +123,17 @@ include_all_triggered_testers = True, is_compile_only = True, ), - goma_backend = None, + builderless = False, + cores = 16, + ssd = True, main_list_view = "try", + goma_backend = None, + reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, tryjob = try_.job( # TODO(crbug.com/1335555) Remove once cancelling doesn't wipe # out builder cache cancel_stale = False, ), - builderless = False, - cores = 16, - ssd = True, - reclient_jobs = reclient.jobs.HIGH_JOBS_FOR_CQ, ) try_.builder( @@ -157,12 +158,12 @@ try_.builder( name = "win_upload_clang", + executable = "recipe:chromium_upload_clang", builderless = False, cores = 32, - executable = "recipe:chromium_upload_clang", - goma_backend = None, os = os.WINDOWS_ANY, execution_timeout = 6 * time.hour, + goma_backend = None, reclient_instance = None, ) @@ -206,10 +207,10 @@ "ci/Win11 Tests x64", ], builderless = True, - use_clang_coverage = True, - coverage_test_types = ["unit", "overall"], os = os.WINDOWS_10, + coverage_test_types = ["unit", "overall"], goma_backend = None, + use_clang_coverage = True, ) try_.builder( @@ -225,7 +226,6 @@ try_.orchestrator_builder( name = "win-rel-inverse-fyi", - check_for_flakiness = True, compilator = "win-rel-compilator", mirrors = [ "ci/Win x64 Builder", @@ -238,19 +238,20 @@ condition = builder_config.rts_condition.QUICK_RUN_ONLY, ), ), - use_clang_coverage = True, + check_for_flakiness = True, coverage_test_types = ["unit", "overall"], experiments = { "chromium_rts.inverted_rts": 100, "chromium_rts.inverted_rts_bail_early": 100, }, + use_clang_coverage = True, use_orchestrator_pool = True, ) try_.builder( name = "win-fieldtrial-rel", - os = os.WINDOWS_DEFAULT, mirrors = ["ci/win-fieldtrial-rel"], + os = os.WINDOWS_DEFAULT, ) try_.builder( @@ -262,6 +263,7 @@ try_.gpu.optional_tests_builder( name = "win_optional_gpu_tests_rel", + branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", @@ -282,9 +284,9 @@ try_settings = builder_config.try_settings( retry_failed_shards = False, ), - branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, - main_list_view = "try", os = os.WINDOWS_DEFAULT, + main_list_view = "try", + goma_backend = None, tryjob = try_.job( location_filters = [ cq.location_filter(path_regexp = "chrome/browser/vr/.+"), @@ -313,7 +315,6 @@ cq.location_filter(path_regexp = "ui/gl/.+"), ], ), - goma_backend = None, ) try_.builder(
diff --git a/infra/config/subprojects/flakiness/flakiness.star b/infra/config/subprojects/flakiness/flakiness.star index b2e2433..ce4abed5 100644 --- a/infra/config/subprojects/flakiness/flakiness.star +++ b/infra/config/subprojects/flakiness/flakiness.star
@@ -8,14 +8,14 @@ ci.defaults.set( bucket = "flakiness", - build_numbers = True, - execution_timeout = 3 * time.hour, os = os.LINUX_DEFAULT, pool = "luci.chromium.ci", + free_space = builders.free_space.standard, # TODO(jeffyoon): replace with smaller scoped service account, and update # below for bucket ACL service_account = "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com", - free_space = builders.free_space.standard, + build_numbers = True, + execution_timeout = 3 * time.hour, ) luci.bucket( @@ -46,11 +46,11 @@ ci.builder( name = "flakiness-data-packager", + executable = "recipe:flakiness/generate_builder_test_data", console_view_entry = consoles.console_view_entry( console_view = "chromium.flakiness", category = "flakiness", short_name = "model", ), - executable = "recipe:flakiness/generate_builder_test_data", schedule = "0 */1 * * *", )
diff --git a/infra/config/subprojects/flakiness/reproducer.star b/infra/config/subprojects/flakiness/reproducer.star index 4990675..7097fa3 100644 --- a/infra/config/subprojects/flakiness/reproducer.star +++ b/infra/config/subprojects/flakiness/reproducer.star
@@ -27,14 +27,14 @@ name = "runner", bucket = "flaky-reproducer", executable = "recipe:flakiness/reproducer", - build_numbers = False, - execution_timeout = 2 * time.hour, os = os.LINUX_DEFAULT, pool = "luci.chromium.try", - service_account = "flaky-reproducer-builder@chops-service-accounts.iam.gserviceaccount.com", console_view_entry = consoles.console_view_entry( console_view = "chromium.flakiness", category = "flakiness", short_name = "reproducer", ), + service_account = "flaky-reproducer-builder@chops-service-accounts.iam.gserviceaccount.com", + build_numbers = False, + execution_timeout = 2 * time.hour, )
diff --git a/infra/config/subprojects/goma/goma.star b/infra/config/subprojects/goma/goma.star index fffdb43..62a2167 100644 --- a/infra/config/subprojects/goma/goma.star +++ b/infra/config/subprojects/goma/goma.star
@@ -98,8 +98,8 @@ ), ), cores = 4, - goma_jobs = goma.jobs.J80, os = os.MAC_DEFAULT, + goma_jobs = goma.jobs.J80, ) fyi_goma_rbe_canary_builder( @@ -119,18 +119,56 @@ ), ), cores = None, - goma_jobs = goma.jobs.J80, os = os.MAC_DEFAULT, cpu = cpu.ARM64, + goma_jobs = goma.jobs.J80, ) fyi_goma_rbe_canary_builder( name = "android-archive-dbg-goma-rbe-ats-canary", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "mb", + "download_vr_test_apks", + "goma_canary", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-fyi-archive", + ), goma_enable_ats = True, ) fyi_goma_rbe_canary_builder( name = "android-archive-dbg-goma-rbe-canary", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "mb", + "download_vr_test_apks", + "goma_canary", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-fyi-archive", + ), ) fyi_goma_rbe_canary_builder( @@ -221,8 +259,8 @@ ), ), cores = 4, - goma_jobs = goma.jobs.J80, os = os.MAC_DEFAULT, + goma_jobs = goma.jobs.J80, ) fyi_goma_rbe_canary_builder( @@ -240,8 +278,8 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - goma_enable_ats = False, os = os.WINDOWS_DEFAULT, + goma_enable_ats = False, ) fyi_goma_rbe_canary_builder( @@ -260,8 +298,8 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - goma_enable_ats = False, os = os.WINDOWS_DEFAULT, + goma_enable_ats = False, ) fyi_goma_rbe_canary_builder( @@ -281,8 +319,8 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - goma_enable_ats = False, os = os.WINDOWS_DEFAULT, + goma_enable_ats = False, ) fyi_goma_rbe_canary_builder( @@ -300,8 +338,8 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - goma_enable_ats = True, os = os.WINDOWS_DEFAULT, + goma_enable_ats = True, ) fyi_goma_rbe_canary_builder( @@ -320,8 +358,8 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - goma_enable_ats = True, os = os.WINDOWS_DEFAULT, + goma_enable_ats = True, ) def fyi_goma_rbe_latest_client_builder( @@ -374,8 +412,8 @@ ), ), cores = 4, - goma_jobs = goma.jobs.J80, os = os.MAC_DEFAULT, + goma_jobs = goma.jobs.J80, ) fyi_goma_rbe_latest_client_builder( @@ -393,8 +431,8 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - goma_enable_ats = False, os = os.WINDOWS_DEFAULT, + goma_enable_ats = False, ) fyi_goma_rbe_latest_client_builder( @@ -413,8 +451,8 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - goma_enable_ats = False, os = os.WINDOWS_DEFAULT, + goma_enable_ats = False, ) fyi_goma_rbe_latest_client_builder( @@ -432,8 +470,8 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - goma_enable_ats = True, os = os.WINDOWS_DEFAULT, + goma_enable_ats = True, ) fyi_goma_rbe_latest_client_builder( @@ -452,17 +490,55 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - goma_enable_ats = True, os = os.WINDOWS_DEFAULT, + goma_enable_ats = True, ) fyi_goma_rbe_latest_client_builder( name = "android-archive-dbg-goma-rbe-ats-latest", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "mb", + "download_vr_test_apks", + "goma_latest_client", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-fyi-archive", + ), goma_enable_ats = True, ) fyi_goma_rbe_latest_client_builder( name = "android-archive-dbg-goma-rbe-latest", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "mb", + "download_vr_test_apks", + "goma_latest_client", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-fyi-archive", + ), ) fyi_goma_rbe_latest_client_builder( @@ -553,8 +629,8 @@ ), ), cores = 4, - goma_jobs = goma.jobs.J80, os = os.MAC_DEFAULT, + goma_jobs = goma.jobs.J80, ) def goma_builder( @@ -573,41 +649,134 @@ goma_builder( name = "Chromium Android ARM 32-bit Goma RBE Staging", - goma_backend = goma.backend.RBE_STAGING, + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["goma_failfast"], + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder_mb"), + ), execution_timeout = 5 * time.hour, + goma_backend = goma.backend.RBE_STAGING, ) goma_builder( name = "Chromium Android ARM 32-bit Goma RBE ToT", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "goma_failfast", + "goma_client_candidate", + "clobber", + ], + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder_mb"), + ), + execution_timeout = 5 * time.hour, goma_backend = goma.backend.RBE_TOT, goma_enable_ats = False, - execution_timeout = 5 * time.hour, ) goma_builder( name = "Chromium Android ARM 32-bit Goma RBE ToT (ATS)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "goma_failfast", + "goma_client_candidate", + "clobber", + ], + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder_mb"), + ), + execution_timeout = 5 * time.hour, goma_backend = goma.backend.RBE_TOT, goma_enable_ats = True, - execution_timeout = 5 * time.hour, ) goma_builder( name = "Chromium Linux Goma RBE Staging", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_STAGING, ) goma_builder( name = "Chromium Linux Goma RBE Staging (clobber)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + "clobber", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_STAGING, ) goma_builder( name = "Chromium Linux Goma RBE Staging (dbg)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_STAGING, ) goma_builder( name = "Chromium Linux Goma RBE Staging (dbg) (clobber)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + "clobber", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_STAGING, ) @@ -620,12 +789,38 @@ goma_builder( name = "Chromium Linux Goma RBE ToT", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + "goma_client_candidate", + "clobber", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_TOT, goma_enable_ats = False, ) goma_builder( name = "Chromium Linux Goma RBE ToT (ATS)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + "goma_client_candidate", + "clobber", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_TOT, goma_enable_ats = True, ) @@ -661,28 +856,90 @@ goma_mac_builder( name = "Chromium iOS Goma RBE ToT", - goma_backend = goma.backend.RBE_TOT, + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "ios"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "mac_toolchain", + "goma_failfast", + "goma_client_candidate", + "clobber", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.IOS, + ), + ), os = os.MAC_DEFAULT, xcode = xcode.x14main, + goma_backend = goma.backend.RBE_TOT, ) goma_mac_builder( name = "Chromium Mac Goma RBE Staging", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_STAGING, ) goma_mac_builder( name = "Chromium Mac Goma RBE Staging (clobber)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + "clobber", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_STAGING, ) goma_mac_builder( name = "Chromium Mac Goma RBE Staging (dbg)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_STAGING, ) goma_mac_builder( name = "Chromium Mac Goma RBE ToT", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + "goma_client_candidate", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_TOT, ) @@ -701,36 +958,106 @@ goma_windows_builder( name = "Chromium Win Goma RBE Staging", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_STAGING, goma_enable_ats = False, ) goma_windows_builder( name = "Chromium Win Goma RBE Staging (clobber)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + "clobber", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_STAGING, goma_enable_ats = False, ) goma_windows_builder( name = "Chromium Win Goma RBE ToT", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + "goma_client_candidate", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_TOT, goma_enable_ats = False, ) goma_windows_builder( name = "Chromium Win Goma RBE ATS Staging", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_STAGING, goma_enable_ats = True, ) goma_windows_builder( name = "Chromium Win Goma RBE ATS Staging (clobber)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + "clobber", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_STAGING, goma_enable_ats = True, ) goma_windows_builder( name = "Chromium Win Goma RBE ATS ToT", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "goma_failfast", + "goma_client_candidate", + ], + target_bits = 64, + ), + ), goma_backend = goma.backend.RBE_TOT, goma_enable_ats = True, )
diff --git a/infra/config/subprojects/reclient/reclient.star b/infra/config/subprojects/reclient/reclient.star index 99b556f..5a95839 100644 --- a/infra/config/subprojects/reclient/reclient.star +++ b/infra/config/subprojects/reclient/reclient.star
@@ -29,26 +29,26 @@ ci.defaults.set( bucket = "reclient", - build_numbers = True, builder_group = "chromium.reclient.fyi", + executable = "recipe:chromium", + triggered_by = ["chromium-gitiles-trigger"], cores = 8, cpu = cpu.X86_64, - executable = "recipe:chromium", - execution_timeout = 3 * time.hour, - goma_backend = None, pool = "luci.chromium.ci", + free_space = builders.free_space.standard, service_account = ( "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" ), - triggered_by = ["chromium-gitiles-trigger"], - free_space = builders.free_space.standard, + build_numbers = True, + execution_timeout = 3 * time.hour, + goma_backend = None, ) consoles.console_view( name = "chromium.reclient.fyi", header = HEADER, - include_experimental_builds = True, repo = "https://chromium.googlesource.com/chromium/src", + include_experimental_builds = True, ) def fyi_reclient_staging_builder( @@ -130,8 +130,8 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - console_view_category = "linux", os = os.LINUX_DEFAULT, + console_view_category = "linux", ) fyi_reclient_test_builder( @@ -149,8 +149,8 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - console_view_category = "linux", os = os.LINUX_DEFAULT, + console_view_category = "linux", ) fyi_reclient_staging_builder( @@ -168,10 +168,10 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - console_view_category = "mac", - os = os.MAC_DEFAULT, builderless = True, cores = None, + os = os.MAC_DEFAULT, + console_view_category = "mac", priority = 35, reclient_bootstrap_env = { "GLOG_vmodule": "bridge*=2", @@ -193,10 +193,10 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - console_view_category = "mac", - os = os.MAC_DEFAULT, builderless = True, cores = None, + os = os.MAC_DEFAULT, + console_view_category = "mac", priority = 35, reclient_bootstrap_env = { "GLOG_vmodule": "bridge*=2", @@ -220,10 +220,10 @@ ), ), builderless = True, - console_view_category = "win", cores = 32, - execution_timeout = 5 * time.hour, os = os.WINDOWS_ANY, + console_view_category = "win", + execution_timeout = 5 * time.hour, ) fyi_reclient_test_builder( @@ -242,38 +242,19 @@ ), ), builderless = True, - console_view_category = "win", cores = 32, - execution_timeout = 5 * time.hour, os = os.WINDOWS_ANY, + console_view_category = "win", + execution_timeout = 5 * time.hour, ) fyi_reclient_staging_builder( name = "Simple Chrome Builder reclient staging", - console_view_category = "linux", - os = os.LINUX_DEFAULT, builder_spec = builder_config.builder_spec( - chromium_config = builder_config.chromium_config( - config = "chromium", - apply_configs = ["mb"], - build_config = builder_config.build_config.RELEASE, - target_arch = builder_config.target_arch.INTEL, - target_bits = 64, - target_platform = builder_config.target_platform.CHROMEOS, - cros_boards_with_qemu_images = "amd64-generic-vm", - ), gclient_config = builder_config.gclient_config( config = "chromium", apply_configs = ["chromeos", "reclient_staging"], ), - ), -) - -fyi_reclient_test_builder( - name = "Simple Chrome Builder reclient test", - console_view_category = "linux", - os = os.LINUX_DEFAULT, - builder_spec = builder_config.builder_spec( chromium_config = builder_config.chromium_config( config = "chromium", apply_configs = ["mb"], @@ -283,11 +264,30 @@ target_platform = builder_config.target_platform.CHROMEOS, cros_boards_with_qemu_images = "amd64-generic-vm", ), + ), + os = os.LINUX_DEFAULT, + console_view_category = "linux", +) + +fyi_reclient_test_builder( + name = "Simple Chrome Builder reclient test", + builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( config = "chromium", apply_configs = ["chromeos", "reclient_test"], ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = ["mb"], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.INTEL, + target_bits = 64, + target_platform = builder_config.target_platform.CHROMEOS, + cros_boards_with_qemu_images = "amd64-generic-vm", + ), ), + os = os.LINUX_DEFAULT, + console_view_category = "linux", ) fyi_reclient_test_builder( @@ -305,11 +305,11 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - console_view_category = "ios", - os = os.MAC_DEFAULT, builderless = True, cores = None, + os = os.MAC_DEFAULT, xcode = xcode.x14main, + console_view_category = "ios", priority = 35, reclient_bootstrap_env = { "GLOG_vmodule": "bridge*=2", @@ -331,11 +331,11 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - console_view_category = "ios", - os = os.MAC_DEFAULT, builderless = True, cores = None, + os = os.MAC_DEFAULT, xcode = xcode.x14main, + console_view_category = "ios", priority = 35, reclient_bootstrap_env = { "GLOG_vmodule": "bridge*=2", @@ -357,10 +357,10 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - console_view_category = "mac", - os = os.MAC_DEFAULT, builderless = True, cores = None, + os = os.MAC_DEFAULT, + console_view_category = "mac", priority = 35, reclient_bootstrap_env = { "GLOG_vmodule": "bridge*=2", @@ -382,10 +382,10 @@ build_gs_bucket = "chromium-fyi-archive", ), ), - console_view_category = "mac", - os = os.MAC_DEFAULT, builderless = True, cores = None, + os = os.MAC_DEFAULT, + console_view_category = "mac", priority = 35, reclient_bootstrap_env = { "GLOG_vmodule": "bridge*=2", @@ -394,76 +394,76 @@ ci.builder( name = "Comparison Linux (reclient vs reclient remote links)", + executable = "recipe:reclient_reclient_comparison", + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", short_name = "cmp", ), - executable = "recipe:reclient_reclient_comparison", execution_timeout = 6 * time.hour, - reclient_cache_silo = "Comparison Linux remote links - cache siloed", - os = os.LINUX_DEFAULT, - reclient_jobs = reclient.jobs.DEFAULT, - reclient_instance = reclient.instance.DEFAULT_TRUSTED, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_deps_cache_dir": "", "RBE_clang_depscan_archive": "true", }, + reclient_cache_silo = "Comparison Linux remote links - cache siloed", + reclient_instance = reclient.instance.DEFAULT_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, ) ci.builder( name = "Comparison Linux (reclient vs reclient remote links)(small)", + executable = "recipe:reclient_reclient_comparison", + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", short_name = "cmp", ), - executable = "recipe:reclient_reclient_comparison", execution_timeout = 6 * time.hour, - reclient_cache_silo = "Comparison Linux remote links - cache siloed", - os = os.LINUX_DEFAULT, - reclient_jobs = reclient.jobs.DEFAULT, - reclient_instance = reclient.instance.TEST_TRUSTED, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_deps_cache_dir": "", "RBE_clang_depscan_archive": "true", }, + reclient_cache_silo = "Comparison Linux remote links - cache siloed", + reclient_instance = reclient.instance.TEST_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, ) ci.builder( name = "Comparison Linux (reclient vs reclient remote links)(medium)", + executable = "recipe:reclient_reclient_comparison", + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", short_name = "cmp", ), - executable = "recipe:reclient_reclient_comparison", execution_timeout = 6 * time.hour, - reclient_cache_silo = "Comparison Linux remote links - cache siloed", - os = os.LINUX_DEFAULT, - reclient_jobs = reclient.jobs.DEFAULT, - reclient_instance = reclient.instance.TEST_TRUSTED, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_deps_cache_dir": "", "RBE_clang_depscan_archive": "true", }, + reclient_cache_silo = "Comparison Linux remote links - cache siloed", + reclient_instance = reclient.instance.TEST_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, ) ci.builder( name = "Comparison Linux (reclient vs reclient remote links)(large)", + executable = "recipe:reclient_reclient_comparison", + os = os.LINUX_DEFAULT, console_view_entry = consoles.console_view_entry( category = "linux", short_name = "cmp", ), - executable = "recipe:reclient_reclient_comparison", execution_timeout = 6 * time.hour, - reclient_cache_silo = "Comparison Linux remote links - cache siloed", - os = os.LINUX_DEFAULT, - reclient_jobs = reclient.jobs.DEFAULT, - reclient_instance = reclient.instance.TEST_TRUSTED, reclient_bootstrap_env = { "RBE_ip_reset_min_delay": "-1s", "RBE_deps_cache_dir": "", "RBE_clang_depscan_archive": "true", }, + reclient_cache_silo = "Comparison Linux remote links - cache siloed", + reclient_instance = reclient.instance.TEST_TRUSTED, + reclient_jobs = reclient.jobs.DEFAULT, )
diff --git a/infra/config/subprojects/reviver/reviver.star b/infra/config/subprojects/reviver/reviver.star index dfaf6c6b..c6c36e2 100644 --- a/infra/config/subprojects/reviver/reviver.star +++ b/infra/config/subprojects/reviver/reviver.star
@@ -37,10 +37,10 @@ defaults.set( bucket = "reviver", - list_view = "reviver", - service_account = "reviver-builder@chops-service-accounts.iam.gserviceaccount.com", os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, + list_view = "reviver", + service_account = "reviver-builder@chops-service-accounts.iam.gserviceaccount.com", # TODO(crbug.com/1362440): remove this. omit_python2 = False, @@ -54,9 +54,9 @@ "ci/android-pie-x86-rel", "ci/android-12-x64-rel", ], + cores = 8, os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, - cores = 8, # To avoid peak hours, we run it at 2 AM, 5 AM, 8 AM, 11AM, 2 PM UTC. schedule = "0 2,5,8,11,14 * * *", ) @@ -95,9 +95,9 @@ polymorphic.target_builder( builder = "ci/Win x64 Builder", dimensions = dimensions.dimensions( + builderless = True, os = os.WINDOWS_DEFAULT, cpu = cpu.X86_64, - builderless = True, pool = ci.DEFAULT_POOL, free_space = free_space.standard, ), @@ -117,9 +117,9 @@ polymorphic.target_builder( builder = "ci/Mac Builder", dimensions = dimensions.dimensions( + builderless = True, os = os.MAC_DEFAULT, cpu = cpu.X86_64, - builderless = True, pool = ci.DEFAULT_POOL, free_space = free_space.standard, ), @@ -172,19 +172,19 @@ name = "runner", executable = "recipe:reviver/chromium/runner", auto_builder_dimension = False, - execution_timeout = 6 * time.hour, + builderless = 1, + os = os.LINUX_DEFAULT, + cpu = cpu.X86_64, + ssd = False, pool = ci.DEFAULT_POOL, + free_space = free_space.standard, # TODO(crbug/1346396) Remove this once the reviver service account has # necessary permissions service_account = ci.DEFAULT_SERVICE_ACCOUNT, + execution_timeout = 6 * time.hour, resultdb_bigquery_exports = [ resultdb.export_test_results( bq_table = "chrome-luci-data.chromium.reviver_test_results", ), ], - builderless = 1, - cpu = cpu.X86_64, - free_space = free_space.standard, - os = os.LINUX_DEFAULT, - ssd = False, )
diff --git a/infra/config/subprojects/webrtc/webrtc.fyi.star b/infra/config/subprojects/webrtc/webrtc.fyi.star index 074e565..96f24e6 100644 --- a/infra/config/subprojects/webrtc/webrtc.fyi.star +++ b/infra/config/subprojects/webrtc/webrtc.fyi.star
@@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +load("//lib/builder_config.star", "builder_config") load("//lib/builders.star", "builder", "cpu", "defaults", "goma", "os", "xcode") luci.bucket( @@ -49,82 +50,315 @@ builder( name = "WebRTC Chromium FYI Android Builder", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium_webrtc_tot", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + "android", + ], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.ARM, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "base_config"), + build_gs_bucket = "chromium-webrtc", + ), goma_backend = goma.backend.RBE_PROD, ) builder( name = "WebRTC Chromium FYI Android Builder (dbg)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium_webrtc_tot", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + "android", + ], + build_config = builder_config.build_config.DEBUG, + target_arch = builder_config.target_arch.ARM, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "base_config"), + build_gs_bucket = "chromium-webrtc", + ), goma_backend = goma.backend.RBE_PROD, ) builder( name = "WebRTC Chromium FYI Android Builder ARM64 (dbg)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium_webrtc_tot", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + "android", + ], + build_config = builder_config.build_config.DEBUG, + target_arch = builder_config.target_arch.ARM, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "base_config"), + build_gs_bucket = "chromium-webrtc", + ), goma_backend = goma.backend.RBE_PROD, ) builder( name = "WebRTC Chromium FYI Android Tests (dbg)", + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config( + config = "chromium_webrtc_tot", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + "android", + ], + build_config = builder_config.build_config.DEBUG, + target_arch = builder_config.target_arch.ARM, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "base_config"), + build_gs_bucket = "chromium-webrtc", + ), triggered_by = ["WebRTC Chromium FYI Android Builder (dbg)"], ) builder( name = "WebRTC Chromium FYI Android Tests ARM64 (dbg)", + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config( + config = "chromium_webrtc_tot", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + "android", + ], + build_config = builder_config.build_config.DEBUG, + target_arch = builder_config.target_arch.ARM, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "base_config"), + build_gs_bucket = "chromium-webrtc", + ), triggered_by = ["WebRTC Chromium FYI Android Builder ARM64 (dbg)"], ) builder( name = "WebRTC Chromium FYI Linux Builder", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium_webrtc_tot", + apply_configs = ["webrtc_test_resources"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-webrtc", + ), goma_backend = goma.backend.RBE_PROD, ) builder( name = "WebRTC Chromium FYI Linux Builder (dbg)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium_webrtc_tot"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + ), + build_gs_bucket = "chromium-webrtc", + ), goma_backend = goma.backend.RBE_PROD, ) builder( name = "WebRTC Chromium FYI Linux Tester", + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config(config = "chromium_webrtc_tot"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-webrtc", + ), triggered_by = ["WebRTC Chromium FYI Linux Builder"], ) builder( name = "WebRTC Chromium FYI Mac Builder", - goma_backend = goma.backend.RBE_PROD, + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium_webrtc_tot", + apply_configs = ["webrtc_test_resources"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + "mac_toolchain", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-webrtc", + ), os = os.MAC_ANY, xcode = xcode.x14main, + goma_backend = goma.backend.RBE_PROD, ) builder( name = "WebRTC Chromium FYI Mac Builder (dbg)", - goma_backend = goma.backend.RBE_PROD, + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium_webrtc_tot"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + ), + build_gs_bucket = "chromium-webrtc", + ), os = os.MAC_ANY, + goma_backend = goma.backend.RBE_PROD, ) builder( name = "WebRTC Chromium FYI Mac Tester", - os = os.MAC_ANY, + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config(config = "chromium_webrtc_tot"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + "mac_toolchain", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-webrtc", + ), triggered_by = ["WebRTC Chromium FYI Mac Builder"], + os = os.MAC_ANY, xcode = xcode.x14main, ) builder( name = "WebRTC Chromium FYI Win Builder", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium_webrtc_tot", + apply_configs = ["webrtc_test_resources"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + ), + build_gs_bucket = "chromium-webrtc", + ), + os = os.WINDOWS_DEFAULT, goma_backend = goma.backend.RBE_PROD, goma_enable_ats = True, - os = os.WINDOWS_DEFAULT, ) builder( name = "WebRTC Chromium FYI Win Builder (dbg)", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "chromium_webrtc_tot"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 32, + ), + build_gs_bucket = "chromium-webrtc", + ), + os = os.WINDOWS_DEFAULT, goma_backend = goma.backend.RBE_PROD, goma_enable_ats = True, - os = os.WINDOWS_DEFAULT, ) builder( name = "WebRTC Chromium FYI Win10 Tester", - os = os.WINDOWS_DEFAULT, + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config(config = "chromium_webrtc_tot"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + ), + build_gs_bucket = "chromium-webrtc", + ), triggered_by = ["WebRTC Chromium FYI Win Builder"], + os = os.WINDOWS_DEFAULT, ) # Builders run on the default Win OS version offered @@ -133,14 +367,42 @@ # dimensions. builder( name = "WebRTC Chromium FYI ios-device", - goma_backend = goma.backend.RBE_PROD, + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "ios"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "mac_toolchain", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.IOS, + ), + build_gs_bucket = "chromium-webrtc", + ), os = os.MAC_ANY, xcode = xcode.x14main, + goma_backend = goma.backend.RBE_PROD, ) builder( name = "WebRTC Chromium FYI ios-simulator", - goma_backend = goma.backend.RBE_PROD, + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config(config = "ios"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + "mac_toolchain", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + target_platform = builder_config.target_platform.IOS, + ), + build_gs_bucket = "chromium-webrtc", + ), os = os.MAC_ANY, xcode = xcode.x14main, + goma_backend = goma.backend.RBE_PROD, )
diff --git a/infra/config/subprojects/webrtc/webrtc.star b/infra/config/subprojects/webrtc/webrtc.star index 0ebc5073..ddfb40b 100644 --- a/infra/config/subprojects/webrtc/webrtc.star +++ b/infra/config/subprojects/webrtc/webrtc.star
@@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +load("//lib/builder_config.star", "builder_config") load("//lib/builders.star", "builder", "cpu", "defaults", "goma", "os", "xcode") luci.bucket( @@ -45,45 +46,178 @@ builder( name = "WebRTC Chromium Android Builder", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium_webrtc", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + "android", + ], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.ARM, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "base_config"), + build_gs_bucket = "chromium-webrtc", + ), goma_backend = goma.backend.RBE_PROD, ) builder( name = "WebRTC Chromium Android Tester", + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config( + config = "chromium_webrtc", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + "android", + ], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.ARM, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "base_config"), + build_gs_bucket = "chromium-webrtc", + ), triggered_by = ["WebRTC Chromium Android Builder"], ) builder( name = "WebRTC Chromium Linux Builder", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium_webrtc", + apply_configs = ["webrtc_test_resources"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-webrtc", + ), goma_backend = goma.backend.RBE_PROD, ) builder( name = "WebRTC Chromium Linux Tester", + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config(config = "chromium_webrtc"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-webrtc", + ), triggered_by = ["WebRTC Chromium Linux Builder"], ) builder( name = "WebRTC Chromium Mac Builder", - goma_backend = goma.backend.RBE_PROD, + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium_webrtc", + apply_configs = ["webrtc_test_resources"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + "mac_toolchain", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-webrtc", + ), os = os.MAC_ANY, xcode = xcode.x14main, + goma_backend = goma.backend.RBE_PROD, ) builder( name = "WebRTC Chromium Mac Tester", + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config(config = "chromium_webrtc"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + "mac_toolchain", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-webrtc", + ), triggered_by = ["WebRTC Chromium Mac Builder"], xcode = xcode.x14main, ) builder( name = "WebRTC Chromium Win Builder", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium_webrtc", + apply_configs = ["webrtc_test_resources"], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + ), + build_gs_bucket = "chromium-webrtc", + ), + os = os.WINDOWS_ANY, goma_backend = goma.backend.RBE_PROD, goma_enable_ats = True, - os = os.WINDOWS_ANY, ) builder( name = "WebRTC Chromium Win10 Tester", + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config(config = "chromium_webrtc"), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "dcheck", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + ), + build_gs_bucket = "chromium-webrtc", + ), triggered_by = ["WebRTC Chromium Win Builder"], )
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index f1af7fd..d01eab5 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -3358,7 +3358,7 @@ Create new Incognito tab. </message> <message name="IDS_IOS_TAB_GRID_CREATE_NEW_TAB" desc="The accessibility label for the button that creates new regular tabs (as opposed to Incognito tabs). [iOS only]"> - Create new tab. + Create New Tab </message> <message name="IDS_IOS_TAB_STRIP_ENTER_TAB_SWITCHER" desc="The accessibility label of the tab strip button to enter the tab switcher. The tab switcher is a view showing the opened tabs, and allows users to switch, close, and open new tabs. [iOS only]"> Enter Tab Switcher
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TAB_GRID_CREATE_NEW_TAB.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TAB_GRID_CREATE_NEW_TAB.png.sha1 new file mode 100644 index 0000000..63bb427 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TAB_GRID_CREATE_NEW_TAB.png.sha1
@@ -0,0 +1 @@ +c757405c1e2732c3ac291e98eb0929ec392169cf \ No newline at end of file
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state.h b/ios/chrome/browser/browser_state/chrome_browser_state.h index d99f5d53..6427f2d 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state.h +++ b/ios/chrome/browser/browser_state/chrome_browser_state.h
@@ -11,6 +11,7 @@ #include "base/callback_forward.h" #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" #include "ios/chrome/browser/net/net_types.h" #include "ios/web/public/browser_state.h" #include "net/url_request/url_request_job_factory.h" @@ -123,6 +124,9 @@ virtual net::URLRequestContextGetter* CreateRequestContext( ProtocolHandlerMap* protocol_handlers) = 0; + // Returns a weak pointer to the current instance. + virtual base::WeakPtr<ChromeBrowserState> AsWeakPtr() = 0; + // web::BrowserState net::URLRequestContextGetter* GetRequestContext() override; void UpdateCorsExemptHeader(
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_impl.h b/ios/chrome/browser/browser_state/chrome_browser_state_impl.h index 924838b..7ad4542 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state_impl.h +++ b/ios/chrome/browser/browser_state/chrome_browser_state_impl.h
@@ -48,6 +48,7 @@ base::OnceClosure completion) override; net::URLRequestContextGetter* CreateRequestContext( ProtocolHandlerMap* protocol_handlers) override; + base::WeakPtr<ChromeBrowserState> AsWeakPtr() override; // BrowserState: bool IsOffTheRecord() const override; @@ -94,6 +95,8 @@ std::unique_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_; + base::WeakPtrFactory<ChromeBrowserStateImpl> weak_ptr_factory_{this}; + // STOP!!!! DO NOT ADD ANY MORE ITEMS HERE!!!! // // Instead, make your Service/Manager/whatever object you're hanging off the
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_impl.mm b/ios/chrome/browser/browser_state/chrome_browser_state_impl.mm index a39350cf..009c07f 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state_impl.mm +++ b/ios/chrome/browser/browser_state/chrome_browser_state_impl.mm
@@ -242,6 +242,10 @@ .get(); } +base::WeakPtr<ChromeBrowserState> ChromeBrowserStateImpl::AsWeakPtr() { + return weak_ptr_factory_.GetWeakPtr(); +} + void ChromeBrowserStateImpl::ClearNetworkingHistorySince( base::Time time, base::OnceClosure completion) {
diff --git a/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_impl.h b/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_impl.h index 7e8a8c8c..a086550 100644 --- a/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_impl.h +++ b/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_impl.h
@@ -43,6 +43,7 @@ base::OnceClosure completion) override; net::URLRequestContextGetter* CreateRequestContext( ProtocolHandlerMap* protocol_handlers) override; + base::WeakPtr<ChromeBrowserState> AsWeakPtr() override; // BrowserState: bool IsOffTheRecord() const override; @@ -68,6 +69,9 @@ std::unique_ptr<OffTheRecordChromeBrowserStateIOData::Handle> io_data_; std::unique_ptr<PrefProxyConfigTracker> pref_proxy_config_tracker_; + + base::WeakPtrFactory<OffTheRecordChromeBrowserStateImpl> weak_ptr_factory_{ + this}; }; #endif // IOS_CHROME_BROWSER_BROWSER_STATE_OFF_THE_RECORD_CHROME_BROWSER_STATE_IMPL_H_
diff --git a/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_impl.mm b/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_impl.mm index 01c2e14e..d4fbb195 100644 --- a/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_impl.mm +++ b/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_impl.mm
@@ -125,6 +125,11 @@ return io_data_->CreateMainRequestContextGetter(protocol_handlers).get(); } +base::WeakPtr<ChromeBrowserState> +OffTheRecordChromeBrowserStateImpl::AsWeakPtr() { + return weak_ptr_factory_.GetWeakPtr(); +} + void OffTheRecordChromeBrowserStateImpl::ClearNetworkingHistorySince( base::Time time, base::OnceClosure completion) {
diff --git a/ios/chrome/browser/browser_state/test_chrome_browser_state.h b/ios/chrome/browser/browser_state/test_chrome_browser_state.h index b9ea035..e109a57 100644 --- a/ios/chrome/browser/browser_state/test_chrome_browser_state.h +++ b/ios/chrome/browser/browser_state/test_chrome_browser_state.h
@@ -62,6 +62,7 @@ base::OnceClosure completion) override; net::URLRequestContextGetter* CreateRequestContext( ProtocolHandlerMap* protocol_handlers) override; + base::WeakPtr<ChromeBrowserState> AsWeakPtr() override; scoped_refptr<network::SharedURLLoaderFactory> GetSharedURLLoaderFactory() override; policy::UserCloudPolicyManager* GetUserCloudPolicyManager() override; @@ -190,6 +191,8 @@ // non-incognito ChromeBrowserState instance. std::unique_ptr<TestChromeBrowserState> otr_browser_state_; TestChromeBrowserState* original_browser_state_; + + base::WeakPtrFactory<TestChromeBrowserState> weak_ptr_factory_{this}; }; #endif // IOS_CHROME_BROWSER_BROWSER_STATE_TEST_CHROME_BROWSER_STATE_H_
diff --git a/ios/chrome/browser/browser_state/test_chrome_browser_state.mm b/ios/chrome/browser/browser_state/test_chrome_browser_state.mm index e7d1739..7d29f386 100644 --- a/ios/chrome/browser/browser_state/test_chrome_browser_state.mm +++ b/ios/chrome/browser/browser_state/test_chrome_browser_state.mm
@@ -236,6 +236,10 @@ return new net::TestURLRequestContextGetter(web::GetIOThreadTaskRunner({})); } +base::WeakPtr<ChromeBrowserState> TestChromeBrowserState::AsWeakPtr() { + return weak_ptr_factory_.GetWeakPtr(); +} + sync_preferences::TestingPrefServiceSyncable* TestChromeBrowserState::GetTestingPrefService() { DCHECK(prefs_);
diff --git a/ios/chrome/browser/discover_feed/discover_feed_view_controller_configuration.h b/ios/chrome/browser/discover_feed/discover_feed_view_controller_configuration.h index ccee62b..768b9be 100644 --- a/ios/chrome/browser/discover_feed/discover_feed_view_controller_configuration.h +++ b/ios/chrome/browser/discover_feed/discover_feed_view_controller_configuration.h
@@ -9,6 +9,7 @@ class Browser; @protocol DiscoverFeedPreviewDelegate; +@protocol FeedSignInPromoDelegate; @protocol UIScrollViewDelegate; // Configuration object used to create and configure a @@ -24,6 +25,9 @@ // DiscoverFeedPreviewDelegate used by Discover Feed ViewController. @property(nonatomic, weak) id<DiscoverFeedPreviewDelegate> previewDelegate; +// FeedSignInPromoDelegate used by Discover Feed ViewController. +@property(nonatomic, weak) id<FeedSignInPromoDelegate> signInPromoDelegate; + @end #endif // IOS_CHROME_BROWSER_DISCOVER_FEED_DISCOVER_FEED_VIEW_CONTROLLER_CONFIGURATION_H_
diff --git a/ios/chrome/browser/overlays/public/web_content_area/BUILD.gn b/ios/chrome/browser/overlays/public/web_content_area/BUILD.gn index c8a512c..ce22afa 100644 --- a/ios/chrome/browser/overlays/public/web_content_area/BUILD.gn +++ b/ios/chrome/browser/overlays/public/web_content_area/BUILD.gn
@@ -12,6 +12,8 @@ "http_auth_overlay.mm", "java_script_alert_dialog_overlay.h", "java_script_alert_dialog_overlay.mm", + "java_script_confirm_dialog_overlay.h", + "java_script_confirm_dialog_overlay.mm", "java_script_dialog_overlay.h", "java_script_dialog_overlay.mm", "java_script_dialog_overlay_utils.h", @@ -48,6 +50,7 @@ "app_launcher_overlay_unittest.mm", "http_auth_overlay_unittest.mm", "java_script_alert_dialog_overlay_unittest.mm", + "java_script_confirm_dialog_overlay_unittest.mm", "java_script_dialog_overlay_unittest.mm", "java_script_dialog_overlay_utils_unittest.mm", ]
diff --git a/ios/chrome/browser/overlays/public/web_content_area/java_script_confirm_dialog_overlay.h b/ios/chrome/browser/overlays/public/web_content_area/java_script_confirm_dialog_overlay.h new file mode 100644 index 0000000..bc25ab8 --- /dev/null +++ b/ios/chrome/browser/overlays/public/web_content_area/java_script_confirm_dialog_overlay.h
@@ -0,0 +1,64 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_WEB_CONTENT_AREA_JAVA_SCRIPT_CONFIRM_DIALOG_OVERLAY_H_ +#define IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_WEB_CONTENT_AREA_JAVA_SCRIPT_CONFIRM_DIALOG_OVERLAY_H_ + +#import "base/memory/weak_ptr.h" +#import "ios/chrome/browser/overlays/public/overlay_request_config.h" +#import "ios/chrome/browser/overlays/public/overlay_response_info.h" +#import "ios/web/public/web_state.h" +#import "url/gurl.h" + +// Configuration object for OverlayRequests for JavaScript confirm dialogs. +class JavaScriptConfirmDialogRequest + : public OverlayRequestConfig<JavaScriptConfirmDialogRequest> { + public: + ~JavaScriptConfirmDialogRequest() override; + + web::WebState* web_state() const { return weak_web_state_.get(); } + const GURL& url() const { return url_; } + bool is_main_frame() const { return is_main_frame_; } + NSString* message() const { return message_; } + + private: + OVERLAY_USER_DATA_SETUP(JavaScriptConfirmDialogRequest); + JavaScriptConfirmDialogRequest(web::WebState* web_state, + const GURL& url, + bool is_main_frame, + NSString* message); + + // OverlayUserData: + void CreateAuxiliaryData(base::SupportsUserData* user_data) override; + + base::WeakPtr<web::WebState> weak_web_state_; + const GURL url_; + bool is_main_frame_; + NSString* message_ = nil; +}; + +// Response type used for JavaScript confirm dialogs. +class JavaScriptConfirmDialogResponse + : public OverlayResponseInfo<JavaScriptConfirmDialogResponse> { + public: + ~JavaScriptConfirmDialogResponse() override; + + // The action selected by the user. + enum class Action : short { + kConfirm, // Used when the user taps the OK button on a dialog. + kCancel, // Used when the user taps the Cancel button on a dialog. + kBlockDialogs // Used when the user taps the blocking option on a dialog, + // indicating that subsequent dialogs from the page should be + // blocked. + }; + Action action() const { return action_; } + + private: + OVERLAY_USER_DATA_SETUP(JavaScriptConfirmDialogResponse); + JavaScriptConfirmDialogResponse(Action action); + + Action action_; +}; + +#endif // IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_WEB_CONTENT_AREA_JAVA_SCRIPT_CONFIRM_DIALOG_OVERLAY_H_
diff --git a/ios/chrome/browser/overlays/public/web_content_area/java_script_confirm_dialog_overlay.mm b/ios/chrome/browser/overlays/public/web_content_area/java_script_confirm_dialog_overlay.mm new file mode 100644 index 0000000..4138a54b --- /dev/null +++ b/ios/chrome/browser/overlays/public/web_content_area/java_script_confirm_dialog_overlay.mm
@@ -0,0 +1,98 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_confirm_dialog_overlay.h" + +#import "base/bind.h" +#import "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/overlays/public/overlay_response.h" +#import "ios/chrome/browser/overlays/public/web_content_area/alert_constants.h" +#import "ios/chrome/browser/overlays/public/web_content_area/alert_overlay.h" +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_overlay_utils.h" +#import "ui/base/l10n/l10n_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using alert_overlays::AlertRequest; +using alert_overlays::AlertResponse; +using alert_overlays::ButtonConfig; +using java_script_dialog_overlay::BlockDialogsButtonConfig; +using java_script_dialog_overlay::DialogMessage; +using java_script_dialog_overlay::DialogTitle; +using java_script_dialog_overlay::kButtonIndexOk; +using java_script_dialog_overlay::ShouldAddBlockDialogsButton; + +namespace { + +// The index of the block button for JS confirm dialogs. +const size_t kConfirmBlockButtonIndex = 2; + +// Creates a JavaScriptConfirmDialogResponse from a response created with an +// AlertResponse. +std::unique_ptr<OverlayResponse> CreateDialogResponse( + std::unique_ptr<OverlayResponse> response) { + AlertResponse* alert_response = response->GetInfo<AlertResponse>(); + if (!alert_response) + return nullptr; + + JavaScriptConfirmDialogResponse::Action action = + JavaScriptConfirmDialogResponse::Action::kCancel; + size_t button_index = alert_response->tapped_button_index(); + if (button_index == kButtonIndexOk) { + action = JavaScriptConfirmDialogResponse::Action::kConfirm; + } else if (button_index == kConfirmBlockButtonIndex) { + action = JavaScriptConfirmDialogResponse::Action::kBlockDialogs; + } + + return OverlayResponse::CreateWithInfo<JavaScriptConfirmDialogResponse>( + action); +} + +} // namespace + +#pragma mark - JavaScriptConfirmDialogRequest + +OVERLAY_USER_DATA_SETUP_IMPL(JavaScriptConfirmDialogRequest); + +JavaScriptConfirmDialogRequest::JavaScriptConfirmDialogRequest( + web::WebState* web_state, + const GURL& url, + bool is_main_frame, + NSString* message) + : weak_web_state_(web_state->GetWeakPtr()), + url_(url), + is_main_frame_(is_main_frame), + message_(message) {} + +JavaScriptConfirmDialogRequest::~JavaScriptConfirmDialogRequest() = default; + +void JavaScriptConfirmDialogRequest::CreateAuxiliaryData( + base::SupportsUserData* user_data) { + NSString* alert_title = DialogTitle(is_main_frame_, message()); + NSString* alert_message = DialogMessage(is_main_frame_, message()); + + std::vector<ButtonConfig> button_configs{ + ButtonConfig(l10n_util::GetNSString(IDS_OK)), + ButtonConfig(l10n_util::GetNSString(IDS_CANCEL), + UIAlertActionStyleCancel)}; + if (ShouldAddBlockDialogsButton(web_state())) { + button_configs.push_back(BlockDialogsButtonConfig()); + } + + AlertRequest::CreateForUserData(user_data, alert_title, alert_message, + kJavaScriptDialogAccessibilityIdentifier, + /*text_field_configs=*/nil, button_configs, + base::BindRepeating(&CreateDialogResponse)); +} + +#pragma mark - JavaScriptConfirmDialogResponse + +OVERLAY_USER_DATA_SETUP_IMPL(JavaScriptConfirmDialogResponse); + +JavaScriptConfirmDialogResponse::JavaScriptConfirmDialogResponse(Action action) + : action_(action) {} + +JavaScriptConfirmDialogResponse::~JavaScriptConfirmDialogResponse() = default;
diff --git a/ios/chrome/browser/overlays/public/web_content_area/java_script_confirm_dialog_overlay_unittest.mm b/ios/chrome/browser/overlays/public/web_content_area/java_script_confirm_dialog_overlay_unittest.mm new file mode 100644 index 0000000..430541dd --- /dev/null +++ b/ios/chrome/browser/overlays/public/web_content_area/java_script_confirm_dialog_overlay_unittest.mm
@@ -0,0 +1,187 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/overlays/public/web_content_area/java_script_confirm_dialog_overlay.h" + +#import "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/overlays/public/overlay_request.h" +#import "ios/chrome/browser/overlays/public/overlay_response.h" +#import "ios/chrome/browser/overlays/public/web_content_area/alert_overlay.h" +#import "ios/chrome/browser/ui/dialogs/java_script_dialog_blocking_state.h" +#import "ios/chrome/grit/ios_strings.h" +#import "ios/web/public/test/fakes/fake_web_state.h" +#import "testing/gtest_mac.h" +#import "testing/platform_test.h" +#import "ui/base/l10n/l10n_util.h" +#import "url/gurl.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using alert_overlays::AlertRequest; +using alert_overlays::AlertResponse; +using alert_overlays::ButtonConfig; + +// Test fixture for JavaScript confirmation dialog overlays. +class JavaScriptConfirmDialogOverlayTest : public PlatformTest { + protected: + JavaScriptConfirmDialogOverlayTest() + : url_("http://www.chromium.test"), message_(@"message") {} + + std::unique_ptr<OverlayRequest> CreateRequest(bool is_main_frame = true) { + return OverlayRequest::CreateWithConfig<JavaScriptConfirmDialogRequest>( + &web_state_, url_, is_main_frame, message_); + } + + web::FakeWebState web_state_; + GURL url_; + NSString* message_ = nil; +}; + +// Tests that the alert config's values are set correctly for dialogs from the +// main frame. +TEST_F(JavaScriptConfirmDialogOverlayTest, MainFrameDialogTitleAndMessage) { + std::unique_ptr<OverlayRequest> request = CreateRequest(); + AlertRequest* config = request->GetConfig<AlertRequest>(); + ASSERT_TRUE(config); + + // Check the title and message strings. + EXPECT_NSEQ(message_, config->title()); + EXPECT_FALSE(config->message()); +} + +// Tests that the alert config's values are set correctly for dialogs from an +// iframe. +TEST_F(JavaScriptConfirmDialogOverlayTest, IFrameDialogTitleAndMessage) { + std::unique_ptr<OverlayRequest> request = + CreateRequest(/*is_main_frame=*/false); + AlertRequest* config = request->GetConfig<AlertRequest>(); + ASSERT_TRUE(config); + + // Check the title and message strings. + NSString* iframe_title = l10n_util::GetNSString( + IDS_JAVASCRIPT_MESSAGEBOX_TITLE_NONSTANDARD_URL_IFRAME); + EXPECT_NSEQ(iframe_title, config->title()); + EXPECT_NSEQ(message_, config->message()); +} + +// Tests that the confirm dialog has no text field. +TEST_F(JavaScriptConfirmDialogOverlayTest, TextFieldConfigSetup) { + std::unique_ptr<OverlayRequest> confirm_request = CreateRequest(); + AlertRequest* confirm_config = confirm_request->GetConfig<AlertRequest>(); + ASSERT_TRUE(confirm_config); + EXPECT_FALSE([confirm_config->text_field_configs() firstObject]); +} + +// Tests that the confirmation dialog buttons are set up correctly. +TEST_F(JavaScriptConfirmDialogOverlayTest, ButtonConfigSetup) { + std::unique_ptr<OverlayRequest> confirm_request = CreateRequest(); + AlertRequest* confirm_config = confirm_request->GetConfig<AlertRequest>(); + ASSERT_TRUE(confirm_config); + const std::vector<ButtonConfig>& confirm_button_configs = + confirm_config->button_configs(); + ASSERT_EQ(2U, confirm_button_configs.size()); + EXPECT_NSEQ(l10n_util::GetNSString(IDS_OK), confirm_button_configs[0].title); + EXPECT_EQ(UIAlertActionStyleDefault, confirm_button_configs[0].style); + EXPECT_NSEQ(l10n_util::GetNSString(IDS_CANCEL), + confirm_button_configs[1].title); + EXPECT_EQ(UIAlertActionStyleCancel, confirm_button_configs[1].style); +} + +// Tests that the blocking option is successfully added. +TEST_F(JavaScriptConfirmDialogOverlayTest, BlockingOptionSetup) { + JavaScriptDialogBlockingState::CreateForWebState(&web_state_); + JavaScriptDialogBlockingState::FromWebState(&web_state_) + ->JavaScriptDialogWasShown(); + NSString* blocking_option_title = + l10n_util::GetNSString(IDS_IOS_JAVA_SCRIPT_DIALOG_BLOCKING_BUTTON_TEXT); + + std::unique_ptr<OverlayRequest> confirm_request = CreateRequest(); + AlertRequest* confirm_config = confirm_request->GetConfig<AlertRequest>(); + ASSERT_TRUE(confirm_config); + const std::vector<ButtonConfig>& confirm_button_configs = + confirm_config->button_configs(); + ASSERT_FALSE(confirm_button_configs.empty()); + EXPECT_NSEQ(blocking_option_title, confirm_button_configs.back().title); + EXPECT_EQ(UIAlertActionStyleDestructive, confirm_button_configs.back().style); +} + +// Tests that a confirmation alert is correctly converted to a +// JavaScriptConfirmDialogResponse after tapping the OK button. +TEST_F(JavaScriptConfirmDialogOverlayTest, ResponseConversionOk) { + std::unique_ptr<OverlayRequest> request = CreateRequest(); + AlertRequest* config = request->GetConfig<AlertRequest>(); + ASSERT_TRUE(config); + + // Simulate a response where the OK button is tapped. + std::unique_ptr<OverlayResponse> alert_response = + OverlayResponse::CreateWithInfo<AlertResponse>( + /*tapped_button_index=*/0, @[ @"" ]); + + std::unique_ptr<OverlayResponse> response = + config->response_converter().Run(std::move(alert_response)); + ASSERT_TRUE(response.get()); + + JavaScriptConfirmDialogResponse* dialog_response = + response->GetInfo<JavaScriptConfirmDialogResponse>(); + ASSERT_TRUE(dialog_response); + + EXPECT_EQ(JavaScriptConfirmDialogResponse::Action::kConfirm, + dialog_response->action()); +} + +// Tests that a confirmation alert response is correctly converted to a +// JavaScriptConfirmDialogResponse after tapping the Cancel button. +TEST_F(JavaScriptConfirmDialogOverlayTest, ResponseConversionCancel) { + std::unique_ptr<OverlayRequest> request = CreateRequest(); + AlertRequest* config = request->GetConfig<AlertRequest>(); + ASSERT_TRUE(config); + + // Simulate a response where the Cancel button is tapped. + std::unique_ptr<OverlayResponse> alert_response = + OverlayResponse::CreateWithInfo<AlertResponse>( + /*tapped_button_index=*/1, @[ @"" ]); + + std::unique_ptr<OverlayResponse> response = + config->response_converter().Run(std::move(alert_response)); + ASSERT_TRUE(response.get()); + + JavaScriptConfirmDialogResponse* dialog_response = + response->GetInfo<JavaScriptConfirmDialogResponse>(); + ASSERT_TRUE(dialog_response); + + EXPECT_EQ(JavaScriptConfirmDialogResponse::Action::kCancel, + dialog_response->action()); +} + +// Tests that an alert response after tapping the blocking option is correctly +// converted to a JavaScriptDialogResponse. +TEST_F(JavaScriptConfirmDialogOverlayTest, + ConfirmationResponseConversionBlockDialogs) { + JavaScriptDialogBlockingState::CreateForWebState(&web_state_); + JavaScriptDialogBlockingState::FromWebState(&web_state_) + ->JavaScriptDialogWasShown(); + + std::unique_ptr<OverlayRequest> request = CreateRequest(); + AlertRequest* config = request->GetConfig<AlertRequest>(); + ASSERT_TRUE(config); + + // Simulate a response where the blocking option is tapped. + size_t blocking_option_button_index = config->button_configs().size() - 1; + std::unique_ptr<OverlayResponse> alert_response = + OverlayResponse::CreateWithInfo<AlertResponse>( + blocking_option_button_index, @[ @"" ]); + + std::unique_ptr<OverlayResponse> response = + config->response_converter().Run(std::move(alert_response)); + ASSERT_TRUE(response.get()); + + JavaScriptConfirmDialogResponse* dialog_response = + response->GetInfo<JavaScriptConfirmDialogResponse>(); + ASSERT_TRUE(dialog_response); + + EXPECT_EQ(JavaScriptConfirmDialogResponse::Action::kBlockDialogs, + dialog_response->action()); +}
diff --git a/ios/chrome/browser/signin/BUILD.gn b/ios/chrome/browser/signin/BUILD.gn index ac0646e..e4288d8 100644 --- a/ios/chrome/browser/signin/BUILD.gn +++ b/ios/chrome/browser/signin/BUILD.gn
@@ -161,6 +161,26 @@ frameworks = [ "Foundation.framework" ] } +source_set("system_identity_manager") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "refresh_access_token_error.h", + "system_identity_interaction_manager.h", + "system_identity_manager.h", + "system_identity_manager.mm", + "system_identity_manager_observer.h", + ] + frameworks = [ "Foundation.framework" ] + public_deps = [ + "//base", + "//third_party/abseil-cpp:absl", + ] + deps = [ + ":system_identity", + "//components/signin/internal/identity_manager", + ] +} + source_set("fake_account_details_view_controller") { testonly = true visibility = [ "//ios/public/provider/chrome/browser/signin:test_support" ]
diff --git a/ios/chrome/browser/signin/refresh_access_token_error.h b/ios/chrome/browser/signin/refresh_access_token_error.h new file mode 100644 index 0000000..c64494f --- /dev/null +++ b/ios/chrome/browser/signin/refresh_access_token_error.h
@@ -0,0 +1,22 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_SIGNIN_REFRESH_ACCESS_TOKEN_ERROR_H_ +#define IOS_CHROME_BROWSER_SIGNIN_REFRESH_ACCESS_TOKEN_ERROR_H_ + +#import <Foundation/Foundation.h> + +// Stores information about error that happens during refreshing the +// access token for a given identity. +@protocol RefreshAccessTokenError + +// Is the access token refresh failure due to an invalid grant error. +@property(nonatomic, readonly) BOOL isInvalidGrantError; + +// Returns whether `error` is identical to `self`. +- (BOOL)isEqualToError:(id<RefreshAccessTokenError>)error; + +@end + +#endif // IOS_CHROME_BROWSER_SIGNIN_REFRESH_ACCESS_TOKEN_ERROR_H_
diff --git a/ios/chrome/browser/signin/system_identity_interaction_manager.h b/ios/chrome/browser/signin/system_identity_interaction_manager.h new file mode 100644 index 0000000..74f78f66 --- /dev/null +++ b/ios/chrome/browser/signin/system_identity_interaction_manager.h
@@ -0,0 +1,44 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_SIGNIN_SYSTEM_IDENTITY_INTERACTION_MANAGER_H_ +#define IOS_CHROME_BROWSER_SIGNIN_SYSTEM_IDENTITY_INTERACTION_MANAGER_H_ + +#import <UIKit/UIKit.h> + +#import "base/ios/block_types.h" + +@protocol SystemIdentity; + +// Callback for the signin operation methods. +using SigninCompletionBlock = void (^)(id<SystemIdentity>, NSError*); + +// Protocol abstracting the interaction for adding identities on iOS. +@protocol SystemIdentityInteractionManager + +// Starts the activity to add an account (if `userEmail` is nil or empty) +// or to re-authenticate an account (if `userEmail` is not empty). For the +// re-authentication, the screen to enter the credential will have the email +// field pre-entered. +// +// The activity will fail is there already an authentication activity in +// progress. +// +// The activity will be displayed in `viewController`, if `userEmail` is set +// it will be used for re-authentication and will be pre-entered in the screen +// presented. The `completion` will be invoked on the calling sequence when +// the activity completes. +- (void)startAuthActivityWithViewController:(UIViewController*)viewController + userEmail:(NSString*)userEmail + completion:(SigninCompletionBlock)completion; + +// Cancels and dismisses any currently active operation. `animated` controls +// whether the dimissal is animated or not. The `completion` will be invoked +// on the calling sequence when the operation completes. +- (void)cancelAuthActivityAnimated:(BOOL)animated + completion:(ProceduralBlock)completion; + +@end + +#endif // IOS_CHROME_BROWSER_SIGNIN_SYSTEM_IDENTITY_INTERACTION_MANAGER_H_
diff --git a/ios/chrome/browser/signin/system_identity_manager.h b/ios/chrome/browser/signin/system_identity_manager.h new file mode 100644 index 0000000..51e184f --- /dev/null +++ b/ios/chrome/browser/signin/system_identity_manager.h
@@ -0,0 +1,235 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_SIGNIN_SYSTEM_IDENTITY_MANAGER_H_ +#define IOS_CHROME_BROWSER_SIGNIN_SYSTEM_IDENTITY_MANAGER_H_ + +#import <UIKit/UIKit.h> + +#include <map> +#include <set> +#include <string> + +#include "base/callback.h" +#include "base/observer_list.h" +#include "base/sequence_checker.h" +#include "base/time/time.h" +#include "base/types/expected.h" +#include "ios/chrome/browser/signin/system_identity_manager_observer.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +@protocol RefreshAccessTokenError; +@protocol SystemIdentity; +@protocol SystemIdentityInteractionManager; +class SystemIdentityManagerObserver; + +// SystemIdentityManager abstracts the signin flow on iOS. +class SystemIdentityManager { + public: + // Value returned by IdentityIteratorCallback. + enum class IteratorResult { + kContinueIteration, + kInterruptIteration, + }; + + // Value representing account capabilities. The enumerator values must not + // be changed as they correspond to the value exchanged on the wire with + // the server. + enum class CapabilityResult { + kFalse = 0, // Capability not allowed for identity. + kTrue = 1, // Capability allowed for identity. + kUnknown = 2, // Capability not set for identity. + }; + + // Value representing a refresh access token. + struct AccessTokenInfo { + // The access token itself. + std::string token; + + // The time at which this access token will expire. This will be set to the + // NULL time value of `base::Time()` when no expiration time is available. + base::Time expiration_time; + }; + + // Callback invoked for each id<SystemIdentity> when iterating over them + // with `IterateOverIdentities()`. The returned value can be used to stop + // the iteration prematurely. + using IdentityIteratorCallback = + base::RepeatingCallback<IteratorResult(id<SystemIdentity>)>; + + // Callback returned when presenting an account detail view. This callback + // can be invoked to dismiss the view (with animation if `animated` is true). + using DismissViewCallback = base::OnceCallback<void(bool animated)>; + + // Callback invoked when the `ForgetIdentity()` operation completes. + using ForgetIdentityCallback = base::OnceCallback<void(NSError*)>; + + // Callback invoked when the `GetAccessToken()` operation completes. + using AccessTokenCallback = + base::OnceCallback<void(absl::optional<AccessTokenInfo>, NSError*)>; + + // Callback invoked when the `GetHostedDomain()` operation completes. + using HostedDomainCallback = base::OnceCallback<void(NSString*, NSError*)>; + + // Callback invoked when the `CanOfferExtendedSyncPromos()` or + // `IsSubjectToParentalControls()` operations complete. + using FetchCapabilityCallback = base::OnceCallback<void(CapabilityResult)>; + + // Callback invoked when the `FetchCapabilitie()` operation completes. + using FetchCapabilitiesCallback = + base::OnceCallback<void(std::map<std::string, CapabilityResult>)>; + + // Callback invoked when `HandleMDMNotification` completes. Is is invoked + // with a boolean indicating whether the device is blocked or not. + using HandleMDMCallback = base::OnceCallback<void(bool)>; + + SystemIdentityManager(); + + SystemIdentityManager(const SystemIdentityManager&) = delete; + SystemIdentityManager& operator=(const SystemIdentityManager&) = delete; + + virtual ~SystemIdentityManager(); + + // Asynchronously returns the value of the account capability that determines + // whether Chrome should offer extended sync promos to `identity`. This value + // will have a refresh period of 24 hours, meaning that at retrieval it may be + // stale. If the value is not populated, as in a fresh install, the capability + // will be considered as not allowed for identity. + // + // This is a wrapper around `FetchCapabilities()`. + void CanOfferExtendedSyncPromos(id<SystemIdentity> identity, + FetchCapabilityCallback callback); + + // Asynchronously returns the value of the account capability that determines + // whether parental controls should be applied to `identity`. + // + // This is a wrapper around `FetchCapabilities()`. + void IsSubjectToParentalControls(id<SystemIdentity> identity, + FetchCapabilityCallback callback); + + // Adds/removes observers. + void AddObserver(SystemIdentityManagerObserver* observer); + void RemoveObserver(SystemIdentityManagerObserver* observer); + + // Handles open URL authentication callback. Should be called within + // `-[UISceneDelegate application:openURLContexts:]` context. Returns + // whether one the URLs was actually handled. + virtual bool HandleSessionOpenURLContexts( + UIScene* scene, + NSSet<UIOpenURLContext*>* url_contexts) = 0; + + // Discards scene session data. Should be called within + // `-[UIApplicationDelegate application:didDiscardSceneSessions:]`. + virtual void ApplicationDidDiscardSceneSessions( + NSSet<UISceneSession*>* scene_sessions) = 0; + + // Dismisses all the dialogs created by the abstracted flows. + virtual void DismissDialogs() = 0; + + // Presents a new Account Details view and returns a callback that can be + // used to dismiss the view (can be ignore if not needed). `identity` is the + // identity used to present the view, `view_controller` is the view used to + // present the details, `animated` controls whether the view is presented + // with an animation + virtual DismissViewCallback PresentAccountDetailsController( + id<SystemIdentity> identity, + UIViewController* view_controller, + bool animated) = 0; + + // Presents a new Web and App Setting Details view and returns a callback + // that can be used to dismiss the view (can be ignore if not needed). + // `identity` is the identity used to present the view, `view_controller` + // is the view used to present the details, `animated` controls whether the + // view is presented with an animation. + virtual DismissViewCallback PresentWebAndAppSettingDetailsController( + id<SystemIdentity> identity, + UIViewController* view_controller, + bool animated) = 0; + + // Creates a new SystemIdentityInteractionManager instance. + virtual id<SystemIdentityInteractionManager> CreateInteractionManager() = 0; + + // Iterates over all known identities, sortted by the ordering used in + // account manager, which is typically based on the keychain ordering + // of the accounts. + virtual void IterateOverIdentities(IdentityIteratorCallback callback) = 0; + + // Asynchronously forgets `identity` and logs the user out. The callback + // is invoked on the calling sequence when the operation completes. + virtual void ForgetIdentity(id<SystemIdentity> identity, + ForgetIdentityCallback callback) = 0; + + // Asynchronously retrieves access tokens for `identity` with `scopes`. The + // callback is invoked on the calling sequence when the operation completes. + // Uses the default client id and client secret. + virtual void GetAccessToken(id<SystemIdentity> identity, + const std::set<std::string>& scopes, + AccessTokenCallback callback) = 0; + + // Asynchronously retrieves access tokens for `identity` with `scopes`. The + // callback is invoked on the calling sequence when the operation completes. + virtual void GetAccessToken(id<SystemIdentity> identity, + const std::string& client_id, + const std::set<std::string>& scopes, + AccessTokenCallback callback) = 0; + + // Asynchronously fetches the avatar for `identity` from the network and + // store it in the cache. The image can be large to avoid pixelation on + // high resolution devices. Observers will be notified when the avatar is + // available by the `OnIdentityUpdated()` method. + virtual void FetchAvatarForIdentity(id<SystemIdentity> identity) = 0; + + // Synchronously returns the last cached avatar for `identity`. Should be + // preceded by a call to `FetchAvatarForIdentity()` to populate the cache. + virtual UIImage* GetCachedAvatarForIdentity(id<SystemIdentity> identity) = 0; + + // Asynchronously fetch the identity hosted domain. The callback is invoked + // on the calling sequence when the operation completes. + virtual void GetHostedDomain(id<SystemIdentity> identity, + HostedDomainCallback callback) = 0; + + // Returns the hosted domain for `identity` from the cache. Returns: + // + nil if the hosted domain value has not been fetched from the server, + // + an empty string if this is a consumer account (e.g. foo@gmail.com), + // + the hosted domain as a non-empty string otherwise. + virtual NSString* GetCachedHostedDomainForIdentity( + id<SystemIdentity> identity) = 0; + + // Asynchronously returns the capabilities for `identity`. + virtual void FetchCapabilities(id<SystemIdentity> identity, + const std::set<std::string>& names, + FetchCapabilitiesCallback callback) = 0; + + // Asynchronously handles a potential MDM (Mobile Device Management) event. + // The callback is invoked on the calling sequence when the operation + // completes. + virtual bool HandleMDMNotification(id<SystemIdentity> identity, + id<RefreshAccessTokenError> error, + HandleMDMCallback callback) = 0; + + // Returns whether the `error` associated with `identity` is due to MDM + // (Mobile Device Management) or not. + virtual bool IsMDMError(id<SystemIdentity> identity, NSError* error) = 0; + + protected: + // Invokes `OnIdentityListChanged(...)` for all observers. + void FireIdentityListChanged(bool notify_user); + + // Invokes `OnIdentityUpdated(...)` for all observers. + void FireIdentityUpdated(id<SystemIdentity> identity); + + // Invokes OnIdentityAccessTokenRefreshFailed(...)` for all observers. + void FireIdentityAccessTokenRefreshFailed(id<SystemIdentity> identity, + id<RefreshAccessTokenError> error); + + // The SystemIdentityManager is sequence-affine. This is protected to + // allow sub-classes access to the member field for use in DCHECK(). + SEQUENCE_CHECKER(sequence_checker_); + + private: + // Registered observers. + base::ObserverList<SystemIdentityManagerObserver, true> observers_; +}; + +#endif // IOS_CHROME_BROWSER_SIGNIN_SYSTEM_IDENTITY_MANAGER_H_
diff --git a/ios/chrome/browser/signin/system_identity_manager.mm b/ios/chrome/browser/signin/system_identity_manager.mm new file mode 100644 index 0000000..5c7bbb78 --- /dev/null +++ b/ios/chrome/browser/signin/system_identity_manager.mm
@@ -0,0 +1,86 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/signin/system_identity_manager.h" + +#import "base/bind.h" +#import "base/callback.h" +#import "components/signin/internal/identity_manager/account_capabilities_constants.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +using CapabilityResult = SystemIdentityManager::CapabilityResult; + +// Helper function used to extract the capability from `capabilities` in +// `CanOfferExtendedSyncPromos` and `IsSubjectToParentalControls`. +CapabilityResult FetchCapabilityCompleted( + std::map<std::string, CapabilityResult> capabilities) { + DCHECK_EQ(capabilities.size(), 1u); + return capabilities.begin()->second; +} + +} // anonymous namespace + +SystemIdentityManager::SystemIdentityManager() = default; + +SystemIdentityManager::~SystemIdentityManager() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); +} + +void SystemIdentityManager::CanOfferExtendedSyncPromos( + id<SystemIdentity> identity, + FetchCapabilityCallback callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + FetchCapabilities( + identity, {kCanOfferExtendedChromeSyncPromosCapabilityName}, + base::BindOnce(&FetchCapabilityCompleted).Then(std::move(callback))); +} + +void SystemIdentityManager::IsSubjectToParentalControls( + id<SystemIdentity> identity, + FetchCapabilityCallback callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + FetchCapabilities( + identity, {kIsSubjectToParentalControlsCapabilityName}, + base::BindOnce(&FetchCapabilityCompleted).Then(std::move(callback))); +} + +void SystemIdentityManager::AddObserver( + SystemIdentityManagerObserver* observer) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + observers_.AddObserver(observer); +} + +void SystemIdentityManager::RemoveObserver( + SystemIdentityManagerObserver* observer) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + observers_.RemoveObserver(observer); +} + +void SystemIdentityManager::FireIdentityListChanged(bool notify_user) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + for (auto& observer : observers_) { + observer.OnIdentityListChanged(notify_user); + } +} + +void SystemIdentityManager::FireIdentityUpdated(id<SystemIdentity> identity) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + for (auto& observer : observers_) { + observer.OnIdentityUpdated(identity); + } +} + +void SystemIdentityManager::FireIdentityAccessTokenRefreshFailed( + id<SystemIdentity> identity, + id<RefreshAccessTokenError> error) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + for (auto& observer : observers_) { + observer.OnIdentityAccessTokenRefreshFailed(identity, error); + } +}
diff --git a/ios/chrome/browser/signin/system_identity_manager_observer.h b/ios/chrome/browser/signin/system_identity_manager_observer.h new file mode 100644 index 0000000..fd17ccf --- /dev/null +++ b/ios/chrome/browser/signin/system_identity_manager_observer.h
@@ -0,0 +1,39 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_SIGNIN_SYSTEM_IDENTITY_MANAGER_OBSERVER_H_ +#define IOS_CHROME_BROWSER_SIGNIN_SYSTEM_IDENTITY_MANAGER_OBSERVER_H_ + +#import <Foundation/Foundation.h> + +#include "base/observer_list_types.h" + +@protocol RefreshAccessTokenError; +@protocol SystemIdentity; +class SystemIdentityManager; + +// Observer handling events related to SystemIdentityManager. +class SystemIdentityManagerObserver : public base::CheckedObserver { + public: + SystemIdentityManagerObserver() = default; + ~SystemIdentityManagerObserver() override = default; + + // Called when the list of identity has changed. If `notify_user` is true, + // the identity changed due to an external source; this means that a first + // party Google application has added or removed identies, or the identity + // token is invalid. + virtual void OnIdentityListChanged(bool notify_user) {} + + // Called when information about `identity` (such as the name or the image) + // have been updated. + virtual void OnIdentityUpdated(id<SystemIdentity> identity) {} + + // Called when refreshing access token for `identity` fails with `error`. + // The error can be handled by calling `HandleMDMNotification`. + virtual void OnIdentityAccessTokenRefreshFailed( + id<SystemIdentity> identity, + id<RefreshAccessTokenError> error) {} +}; + +#endif // IOS_CHROME_BROWSER_SIGNIN_SYSTEM_IDENTITY_MANAGER_OBSERVER_H_
diff --git a/ios/chrome/browser/ui/authentication/BUILD.gn b/ios/chrome/browser/ui/authentication/BUILD.gn index 7e18e6a0..656c507 100644 --- a/ios/chrome/browser/ui/authentication/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/BUILD.gn
@@ -191,6 +191,7 @@ "//ios/chrome/browser/ui/main:scene_state_header", "//ios/chrome/browser/ui/util", "//ios/chrome/test/app:test_support", + "//ios/public/provider/chrome/browser/signin:capabilities_types", "//ios/public/provider/chrome/browser/signin:test_support", "//ios/testing/earl_grey:eg_app_support+eg2", "//ios/third_party/earl_grey2:app_framework+link", @@ -230,6 +231,7 @@ "//ios/chrome/browser/ui/settings/google_services:constants", "//ios/chrome/test:eg_test_support+eg2", "//ios/chrome/test/earl_grey:eg_test_support+eg2", + "//ios/public/provider/chrome/browser/signin:capabilities_types", "//ios/public/provider/chrome/browser/signin:constants", "//ios/testing/earl_grey:eg_test_support+eg2", "//ios/third_party/earl_grey2:test_lib",
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm b/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm index 44be920..889f208f 100644 --- a/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm +++ b/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm
@@ -93,9 +93,9 @@ // through the fake identity service. [SigninEarlGrey addFakeIdentity:identity]; - NSDictionary* capabilities = @{ - @(kIsSubjectToParentalControlsCapabilityName) : [NSNumber - numberWithInt:(int)ios::ChromeIdentityCapabilityResult::kTrue], + ios::CapabilitiesDict* capabilities = @{ + @(kIsSubjectToParentalControlsCapabilityName) : + @(static_cast<int>(ios::ChromeIdentityCapabilityResult::kTrue)) }; [SigninEarlGrey setCapabilities:capabilities forIdentity:identity]; }
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/upgrade_signin_promo_egtest.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/upgrade_signin_promo_egtest.mm index 18559e9..648ca40 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/upgrade_signin_promo_egtest.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/upgrade_signin_promo_egtest.mm
@@ -47,7 +47,7 @@ @"Sign-in promo not visible"); } -NSDictionary<NSString*, NSNumber*>* GetCapabilitiesDictionary( +ios::CapabilitiesDict* GetCapabilitiesDictionary( ios::ChromeIdentityCapabilityResult result) { int intResult = static_cast<int>(result); return @{
diff --git a/ios/chrome/browser/ui/authentication/signin_earl_grey.h b/ios/chrome/browser/ui/authentication/signin_earl_grey.h index f03e57b..d92c80b3 100644 --- a/ios/chrome/browser/ui/authentication/signin_earl_grey.h +++ b/ios/chrome/browser/ui/authentication/signin_earl_grey.h
@@ -7,7 +7,8 @@ #import <Foundation/Foundation.h> -#include "base/compiler_specific.h" +#import "base/compiler_specific.h" +#import "ios/public/provider/chrome/browser/signin/capabilities_dict.h" #import "ios/testing/earl_grey/base_eg_test_helper_impl.h" @protocol GREYMatcher; @@ -29,7 +30,8 @@ // Maps `capabilities` to the `fakeIdentity`. Check fails if the // `fakeIdentity` has not been added to the fake identity service. -- (void)setCapabilities:(NSDictionary*)capabilities forIdentity:fakeIdentity; +- (void)setCapabilities:(ios::CapabilitiesDict*)capabilities + forIdentity:fakeIdentity; // Removes `fakeIdentity` from the fake identity service asynchronously to // simulate identity removal from the device.
diff --git a/ios/chrome/browser/ui/authentication/signin_earl_grey.mm b/ios/chrome/browser/ui/authentication/signin_earl_grey.mm index f9222499..6bcfee1 100644 --- a/ios/chrome/browser/ui/authentication/signin_earl_grey.mm +++ b/ios/chrome/browser/ui/authentication/signin_earl_grey.mm
@@ -25,7 +25,7 @@ [SigninEarlGreyAppInterface addFakeIdentity:fakeIdentity]; } -- (void)setCapabilities:(NSDictionary*)capabilities +- (void)setCapabilities:(ios::CapabilitiesDict*)capabilities forIdentity:(FakeSystemIdentity*)fakeIdentity { [SigninEarlGreyAppInterface setCapabilities:capabilities forIdentity:fakeIdentity];
diff --git a/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.h b/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.h index 07a1c5e8..fc745e0 100644 --- a/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.h +++ b/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.h
@@ -7,6 +7,7 @@ #import <UIKit/UIKit.h> +#import "ios/public/provider/chrome/browser/signin/capabilities_dict.h" #import "url/gurl.h" @class FakeSystemIdentity; @@ -26,7 +27,7 @@ // Maps `capabilities` to the `fakeIdentity`. // Must be called after `addFakeIdentity`. -+ (void)setCapabilities:(NSDictionary*)capabilities ++ (void)setCapabilities:(ios::CapabilitiesDict*)capabilities forIdentity:(FakeSystemIdentity*)fakeIdentity; // Removes `fakeIdentity` from the fake chrome identity service asynchronously
diff --git a/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm b/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm index 133cba03..5a1f106 100644 --- a/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm +++ b/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm
@@ -39,7 +39,7 @@ fakeIdentity); } -+ (void)setCapabilities:(NSDictionary*)capabilities ++ (void)setCapabilities:(ios::CapabilitiesDict*)capabilities forIdentity:(FakeSystemIdentity*)fakeIdentity { ios::FakeChromeIdentityService::GetInstanceFromChromeProvider() ->SetCapabilities(fakeIdentity, capabilities);
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm index 4b2f48f..9e0789e 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -1206,9 +1206,9 @@ FakeSystemIdentity* identity = [FakeSystemIdentity fakeIdentity1]; [SigninEarlGrey addFakeIdentity:identity]; - NSDictionary* capabilities = @{ - @(kIsSubjectToParentalControlsCapabilityName) : [NSNumber - numberWithInt:(int)ios::ChromeIdentityCapabilityResult::kTrue], + ios::CapabilitiesDict* capabilities = @{ + @(kIsSubjectToParentalControlsCapabilityName) : + @(static_cast<int>(ios::ChromeIdentityCapabilityResult::kTrue)) }; [SigninEarlGrey setCapabilities:capabilities forIdentity:identity];
diff --git a/ios/chrome/browser/ui/ntp/BUILD.gn b/ios/chrome/browser/ui/ntp/BUILD.gn index eae1d77..8dd76f2 100644 --- a/ios/chrome/browser/ui/ntp/BUILD.gn +++ b/ios/chrome/browser/ui/ntp/BUILD.gn
@@ -12,6 +12,7 @@ "discover_feed_preview_delegate.h", "feed_control_delegate.h", "feed_delegate.h", + "feed_sign_in_promo_delegate.h", "new_tab_page_configuring.h", "new_tab_page_content_delegate.h", "new_tab_page_controller_delegate.h",
diff --git a/ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_coordinator.mm b/ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_coordinator.mm index d69b3c8..860c661 100644 --- a/ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_coordinator.mm
@@ -75,20 +75,31 @@ #pragma mark - ConfirmationAlertActionHandler - (void)confirmationAlertPrimaryAction { - id<ApplicationCommands> handler = HandlerForProtocol( - self.browser->GetCommandDispatcher(), ApplicationCommands); - ShowSigninCommand* command = [[ShowSigninCommand alloc] - initWithOperation:AuthenticationOperationSigninAndSync - accessPoint:signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN]; - [handler showSignin:command baseViewController:self.baseViewController]; + if (self.baseViewController.presentedViewController) { + __weak __typeof(self) weakSelf = self; + [self.baseViewController dismissViewControllerAnimated:YES + completion:^{ + [weakSelf showSignInFlow]; + }]; + } // TODO(crbug.com/1382615): add metrics. } - (void)confirmationAlertSecondaryAction { - if (self.baseViewController.presentedViewController) { - [self.baseViewController dismissViewControllerAnimated:YES completion:nil]; - } + [self stop]; // TODO(crbug.com/1382615): add metrics. } +#pragma mark - Helpers + +- (void)showSignInFlow { + using AccessPoint = signin_metrics::AccessPoint; + id<ApplicationCommands> handler = HandlerForProtocol( + self.browser->GetCommandDispatcher(), ApplicationCommands); + ShowSigninCommand* command = [[ShowSigninCommand alloc] + initWithOperation:AuthenticationOperationSigninAndSync + accessPoint:AccessPoint::ACCESS_POINT_UNKNOWN]; + [handler showSignin:command baseViewController:self.baseViewController]; +} + @end
diff --git a/ios/chrome/browser/ui/ntp/feed_sign_in_promo_delegate.h b/ios/chrome/browser/ui/ntp/feed_sign_in_promo_delegate.h new file mode 100644 index 0000000..611a350 --- /dev/null +++ b/ios/chrome/browser/ui/ntp/feed_sign_in_promo_delegate.h
@@ -0,0 +1,19 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_NTP_FEED_SIGN_IN_PROMO_DELEGATE_H_ +#define IOS_CHROME_BROWSER_UI_NTP_FEED_SIGN_IN_PROMO_DELEGATE_H_ + +// Protocol for actions relating to the feed sign-in promo. +@protocol FeedSignInPromoDelegate + +// Shows a sign in promote UI. +- (void)showSignInPromoUI; + +// Shows a sign in flow. +- (void)showSignInUI; + +@end + +#endif // IOS_CHROME_BROWSER_UI_NTP_FEED_SIGN_IN_PROMO_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm index 308c554..9044abb 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
@@ -46,6 +46,7 @@ #import "ios/chrome/browser/ui/commands/lens_commands.h" #import "ios/chrome/browser/ui/commands/omnibox_commands.h" #import "ios/chrome/browser/ui/commands/open_new_tab_command.h" +#import "ios/chrome/browser/ui/commands/show_signin_command.h" #import "ios/chrome/browser/ui/commands/snackbar_commands.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h" @@ -67,6 +68,8 @@ #import "ios/chrome/browser/ui/ntp/feed_management/feed_management_coordinator.h" #import "ios/chrome/browser/ui/ntp/feed_management/feed_management_navigation_delegate.h" #import "ios/chrome/browser/ui/ntp/feed_menu_commands.h" +#import "ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_coordinator.h" +#import "ios/chrome/browser/ui/ntp/feed_sign_in_promo_delegate.h" #import "ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.h" #import "ios/chrome/browser/ui/ntp/feed_wrapper_view_controller.h" #import "ios/chrome/browser/ui/ntp/incognito_view_controller.h" @@ -110,6 +113,7 @@ FeedDelegate, FeedManagementNavigationDelegate, FeedMenuCommands, + FeedSignInPromoDelegate, FeedWrapperViewControllerDelegate, IdentityManagerObserverBridgeDelegate, NewTabPageContentDelegate, @@ -190,6 +194,10 @@ // handles the actions related to them. @property(nonatomic, strong) LinkPreviewCoordinator* linkPreviewCoordinator; +// The Coordinator to display Sign In promo UI. +@property(nonatomic, strong) + FeedSignInPromoCoordinator* feedSignInPromoCoordinator; + // The view controller representing the NTP feed header. @property(nonatomic, strong) FeedHeaderViewController* feedHeaderViewController; @@ -319,6 +327,11 @@ [self.feedTopSectionCoordinator stop]; self.feedTopSectionCoordinator = nil; + if (self.feedSignInPromoCoordinator) { + [self.feedSignInPromoCoordinator stop]; + self.feedSignInPromoCoordinator = nil; + } + self.alertCoordinator = nil; self.authService = nil; self.templateURLService = nil; @@ -953,6 +966,28 @@ [self.ntpMediator handleVisitSiteFromFollowManagementList:url]; } +#pragma mark - FeedSignInPromoDelegate + +- (void)showSignInPromoUI { + // Show a sign-in promo half sheet. + self.feedSignInPromoCoordinator = [[FeedSignInPromoCoordinator alloc] + initWithBaseViewController:self.ntpViewController + browser:self.browser]; + [self.feedSignInPromoCoordinator start]; + // TODO (crbug.com/1382615): add metrics. +} + +- (void)showSignInUI { + // Show sign-in and sync page. + id<ApplicationCommands> handler = HandlerForProtocol( + self.browser->GetCommandDispatcher(), ApplicationCommands); + ShowSigninCommand* command = [[ShowSigninCommand alloc] + initWithOperation:AuthenticationOperationSigninAndSync + accessPoint:signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN]; + [handler showSignin:command baseViewController:self.ntpViewController]; + // TODO (crbug.com/1382615): add metrics. +} + #pragma mark - FeedWrapperViewControllerDelegate - (void)updateTheme { @@ -1355,6 +1390,7 @@ viewControllerConfig.browser = self.browser; viewControllerConfig.scrollDelegate = self.ntpViewController; viewControllerConfig.previewDelegate = self; + viewControllerConfig.signInPromoDelegate = self; return viewControllerConfig; }
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_egtest.mm b/ios/chrome/browser/ui/omnibox/omnibox_egtest.mm index 6108620..ac78caa9 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_egtest.mm +++ b/ios/chrome/browser/ui/omnibox/omnibox_egtest.mm
@@ -94,7 +94,7 @@ return nil; } -// Returns visit Copied Link button matcher from UIMenuController. +// Returns Visit Copied Link button matcher from UIMenuController. id<GREYMatcher> VisitCopiedLinkButton() { NSString* a11yLabelCopiedLink = l10n_util::GetNSString(IDS_IOS_VISIT_COPIED_LINK); @@ -159,6 +159,20 @@ return grey_accessibilityHint(a11yHintPasteButton); } +// Returns Copy button from the context menu. +id<GREYMatcher> CopyContextMenuButton() { + return grey_allOf( + grey_accessibilityLabel(l10n_util::GetNSString(IDS_IOS_SHARE_MENU_COPY)), + grey_accessibilityTrait(UIAccessibilityTraitButton), nil); +} + +// Returns Visit Copied Link button from the context menu. +id<GREYMatcher> VisitCopiedLinkContextMenuButton() { + return grey_allOf(grey_accessibilityLabel( + l10n_util::GetNSString(IDS_IOS_VISIT_COPIED_LINK)), + grey_accessibilityTrait(UIAccessibilityTraitButton), nil); +} + // Taps the fake omnibox and waits for the real omnibox to be visible. void FocusFakebox() { [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()] @@ -169,7 +183,10 @@ } // namespace -@interface OmniboxTestCase : ChromeTestCase +@interface OmniboxTestCase : ChromeTestCase { + GURL _URL1; +} + @end @implementation OmniboxTestCase @@ -181,6 +198,9 @@ self.testServer->RegisterRequestHandler( base::BindRepeating(&StandardResponse)); GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); + + _URL1 = self.testServer->GetURL(kPage1URL); + [ChromeEarlGrey clearPasteboard]; [ChromeEarlGrey clearBrowsingHistory]; } @@ -292,9 +312,7 @@ - (void)testOmniboxMenuPasteURLToSearch { FocusFakebox(); // Copy URL into clipboard. - NSString* URL = - base::SysUTF8ToNSString(self.testServer->GetURL(kPage1URL).spec()); - [ChromeEarlGrey copyTextToPasteboard:URL]; + [ChromeEarlGrey copyTextToPasteboard:base::SysUTF8ToNSString(_URL1.spec())]; // Tap Visit Copied Link menu button. [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()] performAction:grey_longPress()]; @@ -306,8 +324,7 @@ // Tests that Search Copied Image menu button is shown with an image in the // clipboard and is starting an image search. -// Flaky. crbug.com/1361857 -- (void)DISABLED_testOmniboxMenuPasteImageToSearch { +- (void)testOmniboxMenuPasteImageToSearch { [self copyImageIntoClipboard]; // Wait for the context menu to dismiss, so the omnibox can be tapped. @@ -321,6 +338,7 @@ performAction:grey_longPress()]; [[EarlGrey selectElementWithMatcher:SearchCopiedImageButton()] performAction:grey_tap()]; + // Check that the omnibox started a google search. [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()] assertWithMatcher:chrome_test_util::OmniboxContainingText("google")]; @@ -358,9 +376,7 @@ disabled:{} relaunchPolicy:ForceRelaunchByCleanShutdown]; FocusFakebox(); - NSString* URL = - base::SysUTF8ToNSString(self.testServer->GetURL(kPage1URL).spec()); - [ChromeEarlGrey copyTextToPasteboard:URL]; + [ChromeEarlGrey copyTextToPasteboard:base::SysUTF8ToNSString(_URL1.spec())]; [[EarlGrey selectElementWithMatcher:PasteToSearchButton()] performAction:grey_tap()]; @@ -398,8 +414,11 @@ #pragma mark - Steady state tests -@interface LocationBarSteadyStateTestCase : ChromeTestCase -- (void)testFocusingOmniboxDismissesEditMenu; +@interface LocationBarSteadyStateTestCase : ChromeTestCase { + GURL _URL1; + GURL _URL2; +} + @end @implementation LocationBarSteadyStateTestCase @@ -412,6 +431,9 @@ base::BindRepeating(&StandardResponse)); GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); + _URL1 = self.testServer->GetURL(kPage1URL); + _URL2 = self.testServer->GetURL(kPage2URL); + [ChromeEarlGrey clearBrowsingHistory]; // Clear the pasteboard in case there is a URL copied. @@ -419,16 +441,6 @@ [pasteboard setValue:@"" forPasteboardType:UIPasteboardNameGeneral]; } -- (AppLaunchConfiguration)appConfigurationForTestCase { - AppLaunchConfiguration config; - - if ([self isRunningTest:@selector(testFocusingOmniboxDismissesEditMenu)]) { - config.features_disabled.push_back(kIOSLocationBarUseNativeContextMenu); - } - - return config; -} - // Tapping on steady view starts editing. - (void)testTapSwitchesToEditing { [self openPage1]; @@ -440,9 +452,7 @@ // Tests that in compact, a share button is visible. // Voice search is not enabled on the bots, so the voice search button is // not tested here. -// TODO(crbug.com/996541) Starting in Xcode 11 beta 6, the share button does -// not appear (even with a delay) flakily. -- (void)DISABLED_testTrailingButton { +- (void)testTrailingButton { [self openPage1]; if ([ChromeEarlGrey isCompactWidth]) { @@ -451,22 +461,20 @@ } } -// TODO(crbug.com/1056700): Test is flaky -- (void)DISABLED_testCopyPaste { +- (void)testCopyPaste { [self openPage1]; // Long pressing should allow copying. [[EarlGrey selectElementWithMatcher:chrome_test_util::DefocusedLocationView()] performAction:grey_longPress()]; - // Verify that system text selection callout is displayed. - [[EarlGrey selectElementWithMatcher:chrome_test_util:: - SystemSelectionCalloutCopyButton()] + // Verify that the Copy button is displayed. + [[EarlGrey selectElementWithMatcher:CopyContextMenuButton()] assertWithMatcher:grey_notNil()]; // Pressing should not allow pasting when pasteboard is empty. // Verify that system text selection callout is not displayed. - [[EarlGrey selectElementWithMatcher:VisitCopiedLinkButton()] + [[EarlGrey selectElementWithMatcher:VisitCopiedLinkContextMenuButton()] assertWithMatcher:grey_nil()]; [[EarlGrey selectElementWithMatcher:SearchCopiedTextButton()] assertWithMatcher:grey_nil()]; @@ -476,21 +484,9 @@ [self checkLocationBarSteadyState]; // Tapping it should copy the URL. - [[EarlGrey selectElementWithMatcher:chrome_test_util:: - SystemSelectionCalloutCopyButton()] + [[EarlGrey selectElementWithMatcher:CopyContextMenuButton()] performAction:grey_tap()]; - - // Edit menu takes a while to copy, and not waiting here will cause Page 2 to - // load before the copy happens, so Page 2 URL may be copied. - GREYCondition* copyCondition = [GREYCondition - conditionWithName:@"page1 URL copied condition" - block:^BOOL { - return [UIPasteboard.generalPasteboard.string - hasSuffix:base::SysUTF8ToNSString(kPage1URL)]; - }]; - // Wait for copy to happen or timeout after 5 seconds. - GREYAssertTrue([copyCondition waitWithTimeout:5], - @"Copying page 1 URL failed"); + [ChromeEarlGrey verifyStringCopied:base::SysUTF8ToNSString(_URL1.spec())]; // Go to another web page. [self openPage2]; @@ -498,37 +494,47 @@ // Visit copied link should now be available. [[EarlGrey selectElementWithMatcher:chrome_test_util::DefocusedLocationView()] performAction:grey_longPress()]; - [[EarlGrey selectElementWithMatcher:VisitCopiedLinkButton()] + [[EarlGrey selectElementWithMatcher:VisitCopiedLinkContextMenuButton()] assertWithMatcher:grey_notNil()]; [self checkLocationBarSteadyState]; // Tapping it should navigate to Page 1. - [[EarlGrey selectElementWithMatcher:VisitCopiedLinkButton()] + [[EarlGrey selectElementWithMatcher:VisitCopiedLinkContextMenuButton()] performAction:grey_tap()]; [ChromeEarlGrey waitForPageToFinishLoading]; [ChromeEarlGrey waitForWebStateContainingText:kPage1]; } -- (void)testFocusingOmniboxDismissesEditMenu { +- (void)testDismissesEditMenu { [self openPage1]; // Long pressing should open edit menu. [[EarlGrey selectElementWithMatcher:chrome_test_util::DefocusedLocationView()] performAction:grey_longPress()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util:: - SystemSelectionCalloutCopyButton()] + [[EarlGrey selectElementWithMatcher:CopyContextMenuButton()] assertWithMatcher:grey_notNil()]; - // Focus omnibox. - [ChromeEarlGreyUI focusOmnibox]; - [self checkLocationBarEditState]; + // Dismiss context menu. + GREYAssertTrue([ChromeEarlGreyUI dismissContextMenuIfPresent], + @"Failed to dismiss context menu."); - // Verify that the edit menu disappeared. - [[EarlGrey selectElementWithMatcher:chrome_test_util:: - SystemSelectionCalloutCopyButton()] - assertWithMatcher:grey_nil()]; + GREYCondition* contextMenuDismissed = [GREYCondition + conditionWithName:@"Wait for context menu to be dismissed" + block:^BOOL { + NSError* error; + [[EarlGrey selectElementWithMatcher:CopyContextMenuButton()] + assertWithMatcher:grey_nil() + error:&error]; + return error == nil; + }]; + + // Verify that the context menu disappeared. + GREYAssertTrue([contextMenuDismissed + waitWithTimeout:base::test::ios::kWaitForUIElementTimeout + .InSecondsF()], + @"Context menu is still visible."); } // Copies and pastes a URL, then performs an undo of the paste, and attempts to @@ -605,17 +611,7 @@ [ChromeEarlGrey simulatePhysicalKeyboardEvent:@"X" flags:UIKeyModifierCommand]; - - // It takes a while to copy, and not waiting here will cause the test to fail. - GREYCondition* copyCondition = [GREYCondition - conditionWithName:@"page1 URL copied condition" - block:^BOOL { - return [UIPasteboard.generalPasteboard.string - hasSuffix:base::SysUTF8ToNSString(kPage1URL)]; - }]; - // Wait for copy to happen or timeout after 5 seconds. - GREYAssertTrue([copyCondition waitWithTimeout:5], - @"Copying page 1 URL failed"); + [ChromeEarlGrey verifyStringCopied:base::SysUTF8ToNSString(_URL1.spec())]; // Verify that the omnibox is empty. [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()] @@ -692,14 +688,14 @@ // Navigates to Page 1 in a tab and waits for it to load. - (void)openPage1 { // Go to a web page to have a normal location bar. - [ChromeEarlGrey loadURL:self.testServer->GetURL(kPage1URL)]; + [ChromeEarlGrey loadURL:_URL1]; [ChromeEarlGrey waitForWebStateContainingText:kPage1]; } // Navigates to Page 2 in a tab and waits for it to load. - (void)openPage2 { // Go to a web page to have a normal location bar. - [ChromeEarlGrey loadURL:self.testServer->GetURL(kPage2URL)]; + [ChromeEarlGrey loadURL:_URL2]; [ChromeEarlGrey waitForWebStateContainingText:kPage2]; } @@ -791,8 +787,7 @@ // displayed. Paste button should be hidden when pasteboard is empty otherwise // it should be displayed. Select & SelectAll buttons should be hidden when the // omnibox is empty. -// TODO(crbug.com/1209342): test failing on device -- (void)DISABLED_testEmptyOmnibox { +- (void)testEmptyOmnibox { // Focus omnibox. [self focusFakebox]; [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()] @@ -888,12 +883,6 @@ // If the selected text is the entire omnibox field, select & SelectAll button // should be hidden. - (void)testSelection { -// TODO(crbug.com/1209342): test failing on ipad device -#if !TARGET_IPHONE_SIMULATOR - if ([ChromeEarlGrey isIPadIdiom]) { - EARL_GREY_TEST_SKIPPED(@"This test doesn't pass on iPad device."); - } -#endif // Focus omnibox. [self focusFakebox]; [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm index 45b3594..9f81c21c 100644 --- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm +++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
@@ -171,7 +171,7 @@ } UITableViewStyle style = IsOmniboxActionsVisualTreatment2() ? UITableViewStyleInsetGrouped - : UITableViewStylePlain; + : UITableViewStyleGrouped; self.tableView = [[SelfSizingTableView alloc] initWithFrame:CGRectZero style:style]; self.tableView.delegate = self;
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm index 1215ef2f..8793ca9 100644 --- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm +++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
@@ -4,6 +4,8 @@ #import "ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.h" +#import <objc/runtime.h> + #import "base/check_op.h" #import "base/mac/foundation_util.h" #import "base/metrics/histogram_macros.h" @@ -959,6 +961,11 @@ return [sessionSectionIdentifiers containsObject:sectionIdentifierObject]; } +// Returns YES if the recent tabs is presented modally. +- (BOOL)isPresentedModally { + return self.navigationController.presentingViewController; +} + #pragma mark - Consumer Protocol - (void)refreshUserState:(SessionsSyncUserState)newSessionState { @@ -1773,6 +1780,12 @@ return @[ UIKeyCommand.cr_close ]; } +- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { + if (sel_isEqual(action, @selector(keyCommand_close))) { + return [self isPresentedModally]; + } + return [super canPerformAction:action withSender:sender]; +} - (void)keyCommand_close { base::RecordAction(base::UserMetricsAction("MobileKeyCommandClose")); [self.presentationDelegate showActiveRegularTabFromRecentTabs];
diff --git a/ios/chrome/browser/ui/settings/translate_table_view_controller.h b/ios/chrome/browser/ui/settings/translate_table_view_controller.h index 1826f925..c4fce384 100644 --- a/ios/chrome/browser/ui/settings/translate_table_view_controller.h +++ b/ios/chrome/browser/ui/settings/translate_table_view_controller.h
@@ -5,13 +5,15 @@ #ifndef IOS_CHROME_BROWSER_UI_SETTINGS_TRANSLATE_TABLE_VIEW_CONTROLLER_H_ #define IOS_CHROME_BROWSER_UI_SETTINGS_TRANSLATE_TABLE_VIEW_CONTROLLER_H_ +#import "ios/chrome/browser/ui/settings/settings_controller_protocol.h" #import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h" class PrefService; @protocol SnackbarCommands; // Controller for the UI that allows the user to control Translate settings. -@interface TranslateTableViewController : SettingsRootTableViewController +@interface TranslateTableViewController + : SettingsRootTableViewController <SettingsControllerProtocol> // SnackbarCommands handler. @property(nonatomic, weak) id<SnackbarCommands> snackbarCommandsHandler;
diff --git a/ios/chrome/browser/ui/settings/translate_table_view_controller.mm b/ios/chrome/browser/ui/settings/translate_table_view_controller.mm index df40751b..c8ac305 100644 --- a/ios/chrome/browser/ui/settings/translate_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/translate_table_view_controller.mm
@@ -11,6 +11,8 @@ #import <MaterialComponents/MaterialSnackbar.h> #import "base/mac/foundation_util.h" +#import "base/metrics/user_metrics.h" +#import "base/metrics/user_metrics_action.h" #import "components/google/core/common/google_util.h" #import "components/prefs/pref_member.h" #import "components/prefs/pref_service.h" @@ -64,6 +66,9 @@ PrefBackedBoolean* _translationEnabled; // The item related to the switch for the translation setting. TableViewSwitchItem* _translationItem; + + // Whether Settings have been dismissed. + BOOL _settingsAreDismissed; } @end @@ -95,10 +100,38 @@ self.tableView.estimatedSectionFooterHeight = kSettingsCellDefaultHeight; } +#pragma mark - SettingsControllerProtocol + +- (void)reportDismissalUserAction { + base::RecordAction(base::UserMetricsAction("MobileTranslateSettingsClose")); +} + +- (void)reportBackUserAction { + base::RecordAction(base::UserMetricsAction("MobileTranslateSettingsBack")); +} + +- (void)settingsWillBeDismissed { + DCHECK(!_settingsAreDismissed); + + // Stop observable prefs. + [_translationEnabled stop]; + _translationEnabled.observer = nil; + _translationEnabled = nil; + + // Clear C++ ivars. + _translationItem = nullptr; + _prefs = nullptr; + + _settingsAreDismissed = YES; +} + #pragma mark - SettingsRootTableViewController - (void)loadModel { [super loadModel]; + if (_settingsAreDismissed) + return; + TableViewModel<TableViewItem*>* model = self.tableViewModel; // Translate Section @@ -169,6 +202,9 @@ - (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath { + if (_settingsAreDismissed) + return; + NSInteger itemType = [self.tableViewModel itemTypeForIndexPath:indexPath]; if (itemType == ItemTypeResetTranslate) {
diff --git a/ios/chrome/browser/ui/settings/translate_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/translate_table_view_controller_unittest.mm index c56fde5..5b0d308 100644 --- a/ios/chrome/browser/ui/settings/translate_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/translate_table_view_controller_unittest.mm
@@ -8,6 +8,7 @@ #import "base/compiler_specific.h" #import "base/files/file_path.h" +#import "base/mac/foundation_util.h" #import "base/test/task_environment.h" #import "base/threading/thread_task_runner_handle.h" #import "components/language/core/browser/language_prefs.h" @@ -66,6 +67,12 @@ return factory.Create(registry.get()); } + void TearDown() override { + [base::mac::ObjCCastStrict<TranslateTableViewController>(controller()) + settingsWillBeDismissed]; + ChromeTableViewControllerTest::TearDown(); + } + base::test::TaskEnvironment task_environment_; std::unique_ptr<PrefService> pref_service_; };
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn index 6831df7..ed4c7bc 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn
@@ -58,6 +58,7 @@ "//ios/chrome/browser/ui/incognito_reauth:incognito_reauth_scene_agent", "//ios/chrome/browser/ui/main", "//ios/chrome/browser/ui/main:default_browser_scene_agent", + "//ios/chrome/browser/ui/main:layout_guide_util", "//ios/chrome/browser/ui/menu", "//ios/chrome/browser/ui/menu:context_menu_delegate", "//ios/chrome/browser/ui/recent_tabs",
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm index a98648a..fb124b3 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm
@@ -42,6 +42,7 @@ #import "ios/chrome/browser/ui/incognito_reauth/incognito_reauth_scene_agent.h" #import "ios/chrome/browser/ui/main/bvc_container_view_controller.h" #import "ios/chrome/browser/ui/main/default_browser_scene_agent.h" +#import "ios/chrome/browser/ui/main/layout_guide_util.h" #import "ios/chrome/browser/ui/main/scene_state_browser_agent.h" #import "ios/chrome/browser/ui/menu/tab_context_menu_delegate.h" #import "ios/chrome/browser/ui/recent_tabs/recent_tabs_mediator.h" @@ -65,6 +66,7 @@ #import "ios/chrome/browser/ui/ui_feature_flags.h" #import "ios/chrome/browser/ui/util/named_guide.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" +#import "ios/chrome/browser/ui/util/util_swift.h" #import "ios/chrome/browser/url/chrome_url_constants.h" #import "ios/chrome/browser/url_loading/url_loading_browser_agent.h" #import "ios/chrome/browser/url_loading/url_loading_params.h" @@ -623,6 +625,8 @@ HandlerForProtocol(self.dispatcher, IncognitoReauthCommands); baseViewController.reauthAgent = reauthAgent; baseViewController.tabPresentationDelegate = self; + baseViewController.layoutGuideCenter = + LayoutGuideCenterForBrowser(self.browser); baseViewController.delegate = self; _baseViewController = baseViewController; @@ -1153,7 +1157,7 @@ #pragma mark - SnackbarCoordinatorDelegate - (CGFloat)bottomOffsetForCurrentlyPresentedView { - NamedGuide* bottomToolbarGuide = nil; + UILayoutGuide* bottomToolbarGuide = nil; if ([self.bvcContainer currentBVC]) { // Use the BVC bottom bar as the offset as it is currently presented. bottomToolbarGuide = @@ -1161,16 +1165,12 @@ view:self.bvcContainer.currentBVC.view]; } else { // The tab grid is being show so use tab grid bottom bar. - bottomToolbarGuide = - [NamedGuide guideWithName:kTabGridBottomToolbarGuide - view:self.baseViewController.view]; + bottomToolbarGuide = [LayoutGuideCenterForBrowser(self.browser) + makeLayoutGuideNamed:kTabGridBottomToolbarGuide]; + [self.baseViewController.view addLayoutGuide:bottomToolbarGuide]; } - if (!bottomToolbarGuide) { - return 0.0; - } - - return bottomToolbarGuide.constrainedView.frame.size.height; + return CGRectGetHeight(bottomToolbarGuide.layoutFrame); } @end
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm index 819f17b..c7fb6c29 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm
@@ -194,6 +194,11 @@ return nullptr; } +// Records the number of Tabs closed after a bulk or a "Close All" operation. +void RecordTabGridCloseTabsCount(int count) { + base::UmaHistogramCounts100("IOS.TabGrid.CloseTabs", count); +} + } // namespace @interface TabGridMediator () <CRWWebStateObserver, @@ -528,6 +533,7 @@ __block bool allTabsClosed = true; base::UmaHistogramCounts100("IOS.TabGrid.Selection.CloseTabs", itemIDs.count); + RecordTabGridCloseTabsCount(itemIDs.count); self.webStateList->PerformBatchOperation( base::BindOnce(^(WebStateList* list) { @@ -552,6 +558,7 @@ } - (void)closeAllItems { + RecordTabGridCloseTabsCount(self.webStateList->count()); if (!self.browserState->IsOffTheRecord()) { base::RecordAction( base::UserMetricsAction("MobileTabGridCloseAllRegularTabs")); @@ -565,8 +572,10 @@ } - (void)saveAndCloseAllItems { + RecordTabGridCloseTabsCount(self.webStateList->count()); base::RecordAction( base::UserMetricsAction("MobileTabGridCloseAllRegularTabs")); + if (self.webStateList->empty()) return; self.closedSessionWindow = SerializeWebStateList(self.webStateList, nil);
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_thumb_strip_egtest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_thumb_strip_egtest.mm index c1e6d61..b544819b 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_thumb_strip_egtest.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_thumb_strip_egtest.mm
@@ -117,7 +117,7 @@ [[EarlGrey selectElementWithMatcher:grey_allOf( grey_kindOfClassName(@"PlusSignCell"), - grey_accessibilityLabel(@"Create new tab."), + grey_accessibilityLabel(@"Create New Tab"), nil)] assertWithMatcher:grey_minimumVisiblePercent(1)]; @@ -142,7 +142,7 @@ [[EarlGrey selectElementWithMatcher:grey_allOf( grey_kindOfClassName(@"PlusSignCell"), - grey_accessibilityLabel(@"Create new tab."), + grey_accessibilityLabel(@"Create New Tab"), nil)] assertWithMatcher:grey_minimumVisiblePercent(1)]; [[EarlGrey @@ -159,7 +159,7 @@ [[EarlGrey selectElementWithMatcher:grey_allOf( grey_kindOfClassName(@"PlusSignCell"), - grey_accessibilityLabel(@"Create new tab."), + grey_accessibilityLabel(@"Create New Tab"), nil)] assertWithMatcher:grey_notVisible()]; // Even when visible, this button has a visibility percent of around 0.15 // because it is mostly a gradient. @@ -282,7 +282,7 @@ [[EarlGrey selectElementWithMatcher:grey_allOf( grey_kindOfClassName(@"PlusSignCell"), - grey_accessibilityLabel(@"Create new tab."), + grey_accessibilityLabel(@"Create New Tab"), nil)] assertWithMatcher:grey_minimumVisiblePercent(1)]; @@ -353,7 +353,7 @@ [[[EarlGrey selectElementWithMatcher:grey_allOf( grey_kindOfClassName(@"PlusSignCell"), - grey_accessibilityLabel(@"Create new tab."), + grey_accessibilityLabel(@"Create New Tab"), nil)] assertWithMatcher:grey_minimumVisiblePercent(1)] performAction:grey_tap()];
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.h index 1a6a90d..385a9ad 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.h +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.h
@@ -23,6 +23,7 @@ class GURL; @protocol IncognitoReauthCommands; @protocol IncognitoReauthConsumer; +@class LayoutGuideCenter; @protocol PopupMenuCommands; @protocol RecentTabsConsumer; @class RecentTabsTableViewController; @@ -164,6 +165,9 @@ @property(nonatomic, weak) id<GridContextMenuProvider> incognitoTabsContextMenuProvider; +// The layout guide center to use to refer to the bottom toolbar. +@property(nonatomic, strong) LayoutGuideCenter* layoutGuideCenter; + // Init with tab grid view configuration, which decides which sub view // controller should be added. - (instancetype)initWithPageConfiguration:
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm index fd4c0edf..b0281be 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
@@ -48,9 +48,9 @@ #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h" #import "ios/chrome/browser/ui/ui_feature_flags.h" #import "ios/chrome/browser/ui/util/layout_guide_names.h" -#import "ios/chrome/browser/ui/util/named_guide.h" #import "ios/chrome/browser/ui/util/rtl_geometry.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" +#import "ios/chrome/browser/ui/util/util_swift.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" #import "ios/chrome/grit/ios_strings.h" @@ -1494,10 +1494,8 @@ [bottomToolbar setShareTabsButtonTarget:self action:@selector(shareSelectedTabs:)]; - NamedGuide* guide = - [[NamedGuide alloc] initWithName:kTabGridBottomToolbarGuide]; - [self.view addLayoutGuide:guide]; - guide.constrainedView = bottomToolbar; + [self.layoutGuideCenter referenceView:bottomToolbar + underName:kTabGridBottomToolbarGuide]; } // Adds the foreground view and sets constraints. @@ -2693,6 +2691,7 @@ return @[ UIKeyCommand.cr_openNewRegularTab, UIKeyCommand.cr_undo, + UIKeyCommand.cr_close, // TODO(crbug.com/1385469): Move it to the menu builder once we have the // strings. UIKeyCommand.cr_select2, @@ -2786,4 +2785,9 @@ [self closeAllButtonTapped:nil]; } +- (void)keyCommand_close { + base::RecordAction(base::UserMetricsAction("MobileKeyCommandClose")); + [self doneButtonTapped:nil]; +} + @end
diff --git a/ios/chrome/browser/web_state_list/web_state_list.h b/ios/chrome/browser/web_state_list/web_state_list.h index 9427223..bd1f513 100644 --- a/ios/chrome/browser/web_state_list/web_state_list.h +++ b/ios/chrome/browser/web_state_list/web_state_list.h
@@ -54,6 +54,9 @@ // If set, the WebState opener is set to the active WebState, otherwise // it must be explicitly passed. INSERT_INHERIT_OPENER = 1 << 2, + + // Used to indicate that the WebState should be pinned on insertion. + INSERT_PINNED = 1 << 3, }; // Constants used when closing WebStates. @@ -112,6 +115,11 @@ // non-active WebState with that URL exists. int GetIndexOfInactiveWebStateWithURL(const GURL& url) const; + // Returns the index of the first non-pinned WebState in the WebStateList. + // Returns 0 in case no pinned WebStates are present. + // Returns `count()` in case only pinned WebStates are present. + int GetIndexOfFirstNonPinnedWebState() const; + // Returns information about the opener of the WebState at the specified // index. The structure `opener` will be null if there is no opener. WebStateOpener GetOpenerOfWebStateAt(int index) const; @@ -125,6 +133,7 @@ // from the specified WebState after `start_index`, or kInvalidIndex if there // are no such WebState. If `use_group` is true, the opener's navigation index // is used to detect navigation changes within the same session. + // If `exclude_pinned` is true, pinned WebStates are removed from search. int GetIndexOfNextWebStateOpenedBy(const web::WebState* opener, int start_index, bool use_group) const; @@ -133,10 +142,19 @@ // from the specified WebState after `start_index`, or kInvalidIndex if there // are no such WebState. If `use_group` is true, the opener's navigation index // is used to detect navigation changes within the same session. + // If `exclude_pinned` is true, pinned WebStates are removed from search. int GetIndexOfLastWebStateOpenedBy(const web::WebState* opener, int start_index, bool use_group) const; + // Changes the pinned state of the WebState at `index`. Returns the index the + // WebState is now at (it may have been moved to maintain contiguity of pinned + // WebStates at the beginning of the list). + int SetWebStatePinnedAt(int index, bool pinned); + + // Returns true if the WebState at |index| is pinned. + bool IsWebStatePinnedAt(int index) const; + // Inserts the specified WebState at the best position in the WebStateList // given the specified opener, recommended index, insertion flags, ... The // `insertion_flags` is a bitwise combination of InsertionFlags values. @@ -257,11 +275,29 @@ // the element have been rearranged), or kInvalidIndex if there are no such // WebState. If `use_group` is true, the opener's navigation index is used // to detect navigation changes within the same session. + // If `exclude_pinned` is true, pinned WebStates are removed from search. int GetIndexOfNthWebStateOpenedBy(const web::WebState* opener, int start_index, bool use_group, int n) const; + // Changes the pinned state of the WebState at `index`, moving the tab to the + // end of the pinned/unpinned section in the process if necessary. Returns + // the new index of the WebState. + int SetWebStatePinnedImpl(int index, bool pinned); + + // Verifies that WebState's insertion `index` is within the proper index + // range. `pinned` WebStates `index` should be within the pinned WebStates + // range. Regular WebState `index` should be outside of the pinned WebStates + // range. Returns an updated insertion `index` of the WebState. + int ConstrainInsertionIndex(int index, bool pinned) const; + + // Verifies that WebState's move `index` is within the proper index range. + // `pinned` WebStates `index` should be within the pinned WebStates range. + // Regular WebState `index` should be outside of the pinned WebStates range. + // Returns an updated move `index` of the WebState. + int ConstrainMoveIndex(int index, bool pinned) const; + // Returns the wrapper of the currently active WebState or null if there // is none. WebStateWrapper* GetActiveWebStateWrapper() const;
diff --git a/ios/chrome/browser/web_state_list/web_state_list.mm b/ios/chrome/browser/web_state_list/web_state_list.mm index c8e5147..dc0f8139 100644 --- a/ios/chrome/browser/web_state_list/web_state_list.mm +++ b/ios/chrome/browser/web_state_list/web_state_list.mm
@@ -9,6 +9,8 @@ #import "base/auto_reset.h" #import "base/check_op.h" +#import "base/containers/adapters.h" +#import "base/cxx17_backports.h" #import "ios/chrome/browser/web_state_list/web_state_list_delegate.h" #import "ios/chrome/browser/web_state_list/web_state_list_observer.h" #import "ios/chrome/browser/web_state_list/web_state_list_order_controller.h" @@ -38,7 +40,7 @@ // Wrapper around a WebState stored in a WebStateList. class WebStateList::WebStateWrapper { public: - explicit WebStateWrapper(std::unique_ptr<web::WebState> web_state); + WebStateWrapper(std::unique_ptr<web::WebState> web_state, bool pinned); WebStateWrapper(const WebStateWrapper&) = delete; WebStateWrapper& operator=(const WebStateWrapper&) = delete; @@ -60,6 +62,10 @@ WebStateOpener opener() const { return opener_; } void SetOpener(WebStateOpener opener); + // Gets and sets information about this WebState being pinned. + bool pinned() const { return pinned_; } + void set_pinned(bool pinned) { pinned_ = pinned; } + // Gets and sets whether this WebState opener must be clear when the active // WebState changes. bool ShouldResetOpenerOnActiveWebStateChange() const; @@ -76,11 +82,13 @@ std::unique_ptr<web::WebState> web_state_; WebStateOpener opener_; bool should_reset_opener_ = false; + bool pinned_ = false; }; WebStateList::WebStateWrapper::WebStateWrapper( - std::unique_ptr<web::WebState> web_state) - : web_state_(std::move(web_state)), opener_(nullptr) { + std::unique_ptr<web::WebState> web_state, + bool pinned) + : web_state_(std::move(web_state)), opener_(nullptr), pinned_(pinned) { DCHECK(web_state_); } @@ -223,6 +231,19 @@ return GetIndexOfNthWebStateOpenedBy(opener, start_index, use_group, INT_MAX); } +int WebStateList::SetWebStatePinnedAt(int index, bool pinned) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(ContainsIndex(index)); + auto lock = LockForMutation(); + return SetWebStatePinnedImpl(index, pinned); +} + +bool WebStateList::IsWebStatePinnedAt(int index) const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(ContainsIndex(index)); + return web_state_wrappers_[index]->pinned(); +} + int WebStateList::InsertWebState(int index, std::unique_ptr<web::WebState> web_state, int insertion_flags, @@ -236,6 +257,7 @@ void WebStateList::MoveWebStateAt(int from_index, int to_index) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); auto lock = LockForMutation(); + to_index = ConstrainMoveIndex(to_index, IsWebStatePinnedAt(from_index)); return MoveWebStateAtImpl(from_index, to_index); } @@ -289,6 +311,8 @@ DCHECK(locked_); DCHECK(web_state); const bool activating = IsInsertionFlagSet(insertion_flags, INSERT_ACTIVATE); + const bool forced = IsInsertionFlagSet(insertion_flags, INSERT_FORCE_INDEX); + const bool pinned = IsInsertionFlagSet(insertion_flags, INSERT_PINNED); if (IsInsertionFlagSet(insertion_flags, INSERT_INHERIT_OPENER)) { for (const auto& wrapper : web_state_wrappers_) { @@ -297,12 +321,9 @@ opener = WebStateOpener(GetActiveWebState()); } - if (!IsInsertionFlagSet(insertion_flags, INSERT_FORCE_INDEX)) { - WebStateListOrderController order_controller(*this); - index = order_controller.DetermineInsertionIndex(opener.opener); - if (index < 0 || count() < index) - index = count(); - } + WebStateListOrderController order_controller(*this); + index = order_controller.DetermineInsertionIndex(index, opener.opener, forced, + pinned); DCHECK(ContainsIndex(index) || index == count()); delegate_->WillAddWebState(web_state.get()); @@ -310,7 +331,7 @@ web::WebState* web_state_ptr = web_state.get(); web_state_wrappers_.insert( web_state_wrappers_.begin() + index, - std::make_unique<WebStateWrapper>(std::move(web_state))); + std::make_unique<WebStateWrapper>(std::move(web_state), pinned)); if (active_index_ >= index) ++active_index_; @@ -337,6 +358,7 @@ DCHECK(locked_); DCHECK(ContainsIndex(from_index)); DCHECK(ContainsIndex(to_index)); + if (from_index == to_index) return; @@ -565,6 +587,48 @@ return found_index; } +int WebStateList::SetWebStatePinnedImpl(int index, bool pinned) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (web_state_wrappers_[index]->pinned() == pinned) + return index; + + // The tab's position may have to change as the pinned tab state is changing. + int non_pinned_web_state_index = GetIndexOfFirstNonPinnedWebState(); + web_state_wrappers_[index]->set_pinned(pinned); + + if (pinned && index != non_pinned_web_state_index) { + MoveWebStateAtImpl(index, non_pinned_web_state_index); + index = non_pinned_web_state_index; + } else if (!pinned && index + 1 != non_pinned_web_state_index) { + MoveWebStateAtImpl(index, non_pinned_web_state_index - 1); + index = non_pinned_web_state_index - 1; + } + + for (auto& observer : observers_) { + observer.WebStatePinnedStateChanged( + this, web_state_wrappers_[index]->web_state(), index); + } + + return index; +} + +int WebStateList::GetIndexOfFirstNonPinnedWebState() const { + for (size_t index = 0; index < web_state_wrappers_.size(); ++index) { + if (!web_state_wrappers_[index]->pinned()) { + return static_cast<int>(index); + } + } + // There are only pinned WebStates. + return count(); +} + +int WebStateList::ConstrainMoveIndex(int index, bool pinned) const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + return pinned ? base::clamp(index, 0, GetIndexOfFirstNonPinnedWebState() - 1) + : base::clamp(index, GetIndexOfFirstNonPinnedWebState(), + count() - 1); +} + WebStateList::WebStateWrapper* WebStateList::GetActiveWebStateWrapper() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (active_index_ != kInvalidIndex)
diff --git a/ios/chrome/browser/web_state_list/web_state_list_observer.h b/ios/chrome/browser/web_state_list/web_state_list_observer.h index b6b917d7..ef92a399 100644 --- a/ios/chrome/browser/web_state_list/web_state_list_observer.h +++ b/ios/chrome/browser/web_state_list/web_state_list_observer.h
@@ -92,6 +92,11 @@ int active_index, ActiveWebStateChangeReason reason); + // Invoked when the pinned state of a tab changes. + virtual void WebStatePinnedStateChanged(WebStateList* web_state_list, + web::WebState* web_state, + int index); + // Invoked before a batched operations begins. The observer can use this // notification if it is interested in considering all those individual // operations as a single mutation of the WebStateList (e.g. considering
diff --git a/ios/chrome/browser/web_state_list/web_state_list_observer.mm b/ios/chrome/browser/web_state_list/web_state_list_observer.mm index 6a151d0..0adff9e 100644 --- a/ios/chrome/browser/web_state_list/web_state_list_observer.mm +++ b/ios/chrome/browser/web_state_list/web_state_list_observer.mm
@@ -55,6 +55,11 @@ int active_index, ActiveWebStateChangeReason reason) {} +void WebStateListObserver::WebStatePinnedStateChanged( + WebStateList* web_state_list, + web::WebState* web_state, + int index) {} + void WebStateListObserver::WillBeginBatchOperation( WebStateList* web_state_list) {}
diff --git a/ios/chrome/browser/web_state_list/web_state_list_order_controller.h b/ios/chrome/browser/web_state_list/web_state_list_order_controller.h index 8f6a815..0806f5c9 100644 --- a/ios/chrome/browser/web_state_list/web_state_list_order_controller.h +++ b/ios/chrome/browser/web_state_list/web_state_list_order_controller.h
@@ -20,18 +20,25 @@ ~WebStateListOrderController(); // Determines where to place a newly opened WebState given its opener. - int DetermineInsertionIndex(const web::WebState* opener) const; + // Logic diagram: crbug.com/1395319 + int DetermineInsertionIndex(int desired_index, + const web::WebState* opener, + bool forced, + bool pinned) const; // Determines where to shift the active index after a WebState is closed. // The returned index will either be WebStateList::kInvalidIndex or in be // in range for the WebStateList once the element has been removed (i.e. // this function accounts for the fact that the element at `removing_index` // will be removed from the WebStateList). + // Logic diagram: crbug.com/1395319 int DetermineNewActiveIndex( int active_index, WebStateListRemovingIndexes removing_indexes) const; private: + int ConstrainInsertionIndex(int index, bool pinned) const; + const WebStateList& web_state_list_; };
diff --git a/ios/chrome/browser/web_state_list/web_state_list_order_controller.mm b/ios/chrome/browser/web_state_list/web_state_list_order_controller.mm index 1127af94..1cb61d23 100644 --- a/ios/chrome/browser/web_state_list/web_state_list_order_controller.mm +++ b/ios/chrome/browser/web_state_list/web_state_list_order_controller.mm
@@ -8,6 +8,7 @@ #import <set> #import "base/check_op.h" +#import "base/cxx17_backports.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/chrome/browser/web_state_list/web_state_list_removing_indexes.h" #import "ios/chrome/browser/web_state_list/web_state_opener.h" @@ -62,9 +63,20 @@ WebStateListOrderController::~WebStateListOrderController() = default; int WebStateListOrderController::DetermineInsertionIndex( - const web::WebState* opener) const { + int desired_index, + const web::WebState* opener, + bool forced, + bool pinned) const { + // Forced index has superiority over anything else. The only thing that should + // be checked here if `desired_index` is within the proper range of WebStates + // (e.g. pinned or regular). + if (forced) + return ConstrainInsertionIndex(desired_index, pinned); + + // If there is no opener, WebState should be added at the end of the list of + // the same kind of WebStates (e.g. pinned or regular). if (!opener) - return web_state_list_.count(); + return ConstrainInsertionIndex(WebStateList::kInvalidIndex, pinned); int opener_index = web_state_list_.GetIndexOfWebState(opener); DCHECK_NE(WebStateList::kInvalidIndex, opener_index); @@ -78,7 +90,7 @@ // Check for overflows (just a DCHECK as INT_MAX open WebState is unlikely). DCHECK_LT(reference_index, INT_MAX); - return reference_index + 1; + return ConstrainInsertionIndex(reference_index + 1, pinned); } int WebStateListOrderController::DetermineNewActiveIndex( @@ -134,14 +146,38 @@ return opener_index_after_removal; } - // Look for the closest non-removed WebState after the active WebState, or - // if none, use the closest non-removed WebState before the active WebState. + const bool is_pinned = web_state_list_.IsWebStatePinnedAt(active_index); + + const int first_non_pinned_tab = + web_state_list_.GetIndexOfFirstNonPinnedWebState(); + + const int start = is_pinned ? 0 : first_non_pinned_tab; + const int end = is_pinned ? first_non_pinned_tab : count; + + // Look for the closest non-removed WebState after the active WebState in the + // same pinned/regular group. + for (int index = active_index + 1; index < end; ++index) { + const int index_after_removal = removing_indexes.IndexAfterRemoval(index); + if (index_after_removal != WebStateList::kInvalidIndex) + return index_after_removal; + } + + // Look for the closest non-removed WebState before the active WebState in the + // same pinned/regular group. + for (int index = active_index - 1; index >= start; --index) { + const int index_after_removal = removing_indexes.IndexAfterRemoval(index); + if (index_after_removal != WebStateList::kInvalidIndex) + return index_after_removal; + } + + // Look for the closest non-removed WebState after the active WebState. for (int index = active_index + 1; index < count; ++index) { const int index_after_removal = removing_indexes.IndexAfterRemoval(index); if (index_after_removal != WebStateList::kInvalidIndex) return index_after_removal; } + // Look for the closest non-removed WebState before the active WebState. for (int index = active_index - 1; index >= 0; --index) { const int index_after_removal = removing_indexes.IndexAfterRemoval(index); if (index_after_removal != WebStateList::kInvalidIndex) @@ -151,3 +187,16 @@ NOTREACHED() << "No active WebState selected by WebStateList not empty"; return WebStateList::kInvalidIndex; } + +int WebStateListOrderController::ConstrainInsertionIndex(int index, + bool pinned) const { + int min = pinned ? 0 : web_state_list_.GetIndexOfFirstNonPinnedWebState(); + int max = pinned ? web_state_list_.GetIndexOfFirstNonPinnedWebState() + : web_state_list_.count(); + + if (index < min || index > max) { + return max; + } + + return index; +}
diff --git a/ios/chrome/browser/web_state_list/web_state_list_order_controller_unittest.mm b/ios/chrome/browser/web_state_list/web_state_list_order_controller_unittest.mm index 25737e8..9dee6564 100644 --- a/ios/chrome/browser/web_state_list/web_state_list_order_controller_unittest.mm +++ b/ios/chrome/browser/web_state_list/web_state_list_order_controller_unittest.mm
@@ -65,22 +65,148 @@ // Verify that first child WebState is inserted after `opener` if there are // no other children. - EXPECT_EQ(1, order_controller_.DetermineInsertionIndex(opener)); + EXPECT_EQ(1, order_controller_.DetermineInsertionIndex( + WebStateList::kInvalidIndex, opener, false, false)); // Verify that WebState is inserted at the end if it has no opener. - EXPECT_EQ(2, order_controller_.DetermineInsertionIndex(nullptr)); + EXPECT_EQ(2, order_controller_.DetermineInsertionIndex( + WebStateList::kInvalidIndex, nullptr, false, false)); // Add a child WebState to `opener`, and verify that a second child would be // inserted after the first. InsertNewWebState(2, WebStateOpener(opener)); - EXPECT_EQ(3, order_controller_.DetermineInsertionIndex(opener)); + EXPECT_EQ(3, order_controller_.DetermineInsertionIndex( + WebStateList::kInvalidIndex, opener, false, false)); // Add a grand-child to `opener`, and verify that adding another child to // `opener` would be inserted before the grand-child. InsertNewWebState(3, WebStateOpener(web_state_list_.GetWebStateAt(1))); - EXPECT_EQ(3, order_controller_.DetermineInsertionIndex(opener)); + EXPECT_EQ(3, order_controller_.DetermineInsertionIndex( + WebStateList::kInvalidIndex, opener, false, false)); +} + +// Tests determination of insertion index for pinned and non-pinned WebStates +// when no opener is provided and insertion index is forced (FORCE_INDEX flag is +// set). +TEST_F(WebStateListOrderControllerTest, DetermineInsertionIndex_HasForceIndex) { + InsertNewWebState(0, WebStateOpener()); + InsertNewWebState(1, WebStateOpener()); + InsertNewWebState(2, WebStateOpener()); + InsertNewWebState(3, WebStateOpener()); + InsertNewWebState(4, WebStateOpener()); + + // Pin first three WebStates. + web_state_list_.SetWebStatePinnedAt(0, true); + web_state_list_.SetWebStatePinnedAt(1, true); + web_state_list_.SetWebStatePinnedAt(2, true); + + // Verify that insertion index of pinned WebState, added within pinned + // WebStates range equals the forced index. + EXPECT_EQ(1, + order_controller_.DetermineInsertionIndex(1, nullptr, true, true)); + + // Verify that insertion index of non-pinned WebState, added within non-pinned + // WebStates range equals the forced index. + EXPECT_EQ(3, + order_controller_.DetermineInsertionIndex(3, nullptr, true, false)); + + // Verify that insertion index of pinned WebState, added outside of pinned + // WebStates range equals the index of first non-pinned WebState (end of + // pinned WebStates list). + EXPECT_EQ(3, + order_controller_.DetermineInsertionIndex(4, nullptr, true, true)); + + // Verify that insertion index of non-pinned WebState, added outside of + // non-pinned WebStates range equals the count of WebStates (end of non-pinned + // WebStates list). + EXPECT_EQ(5, + order_controller_.DetermineInsertionIndex(0, nullptr, true, false)); +} + +// Tests determination of insertion index for pinned and non-pinned WebStates +// when opener is provied and insertion index is not forced (FORCE_INDEX flag +// is not set). +TEST_F(WebStateListOrderControllerTest, DetermineInsertionIndex_HasOpener) { + InsertNewWebState(0, WebStateOpener()); + InsertNewWebState(1, WebStateOpener()); + InsertNewWebState(2, WebStateOpener()); + InsertNewWebState(3, WebStateOpener()); + InsertNewWebState(4, WebStateOpener()); + + // Pin first three WebStates. + web_state_list_.SetWebStatePinnedAt(0, true); + web_state_list_.SetWebStatePinnedAt(1, true); + web_state_list_.SetWebStatePinnedAt(2, true); + + // Create pinned and non-pinned range openers. + web::WebState* opener = web_state_list_.GetWebStateAt(1); + web::WebState* opener2 = web_state_list_.GetWebStateAt(4); + + // Verify that insertion index of pinned WebState, added within pinned + // WebStates range equals the opener index + 1. + EXPECT_EQ(2, + order_controller_.DetermineInsertionIndex(0, opener, false, true)); + + // Verify that insertion index of non-pinned WebState, added within non-pinned + // WebStates range equals the opener index + 1. + EXPECT_EQ( + 5, order_controller_.DetermineInsertionIndex(3, opener2, false, false)); + + // Verify that insertion index of pinned WebState, added outside of pinned + // WebStates range equals the index of first non-pinned WebState (end of + // pinned WebStates list). + EXPECT_EQ(3, + order_controller_.DetermineInsertionIndex(4, opener2, false, true)); + + // Verify that insertion index of non-pinned WebState, added outside of + // non-pinned WebStates range equals the count of WebStates (end of non-pinned + // WebStates list). + EXPECT_EQ(5, + order_controller_.DetermineInsertionIndex(0, opener, false, false)); +} + +// Tests determination of insertion index for pinned and non-pinned WebStates +// when opener is provied and it has children WebStates. +TEST_F(WebStateListOrderControllerTest, + DetermineInsertionIndex_HasOpenerChildren) { + InsertNewWebState(0, WebStateOpener()); + InsertNewWebState(1, WebStateOpener(web_state_list_.GetWebStateAt(0))); + InsertNewWebState(2, WebStateOpener()); + InsertNewWebState(3, WebStateOpener(web_state_list_.GetWebStateAt(2))); + InsertNewWebState(4, WebStateOpener()); + + // Pin first three WebStates. + web_state_list_.SetWebStatePinnedAt(0, true); + web_state_list_.SetWebStatePinnedAt(1, true); + web_state_list_.SetWebStatePinnedAt(2, true); + + // Create pinned and non-pinned range openers. + web::WebState* opener = web_state_list_.GetWebStateAt(0); + web::WebState* opener2 = web_state_list_.GetWebStateAt(2); + + // Verify that insertion index of pinned WebState, added within pinned + // WebStates range equals the opener last child index + 1. + EXPECT_EQ(2, + order_controller_.DetermineInsertionIndex(0, opener, false, true)); + + // Verify that insertion index of non-pinned WebState, added within non-pinned + // WebStates range equals the opener last child index + 1. + EXPECT_EQ( + 4, order_controller_.DetermineInsertionIndex(3, opener2, false, false)); + + // Verify that insertion index of pinned WebState, added outside of pinned + // WebStates range equals the index of first non-pinned WebState (end of + // pinned WebStates list). + EXPECT_EQ(3, + order_controller_.DetermineInsertionIndex(4, opener2, false, true)); + + // Verify that insertion index of non-pinned WebState, added outside of + // non-pinned WebStates range equals the count of WebStates (end of non-pinned + // WebStates list). + EXPECT_EQ(5, + order_controller_.DetermineInsertionIndex(0, opener, false, false)); } // Test that the selection of the next tab to show when closing a tab respect
diff --git a/ios/chrome/browser/web_state_list/web_state_list_unittest.mm b/ios/chrome/browser/web_state_list/web_state_list_unittest.mm index e7ea5a2..c0524ac 100644 --- a/ios/chrome/browser/web_state_list/web_state_list_unittest.mm +++ b/ios/chrome/browser/web_state_list/web_state_list_unittest.mm
@@ -759,3 +759,338 @@ EXPECT_FALSE(web_state_list_.IsBatchInProgress()); EXPECT_TRUE(captured_batch_in_progress); } + +// Tests WebStates are pinned correctly while their order in the WebStateList +// doesn't change. +TEST_F(WebStateListTest, SetWebStatePinned_KeepingExisitingOrder) { + EXPECT_TRUE(web_state_list_.empty()); + + AppendNewWebState(kURL0); + AppendNewWebState(kURL1); + AppendNewWebState(kURL2); + AppendNewWebState(kURL3); + + // Pin kURL0 WebState. + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(0, true), 0); + // Pin kURL1 WebState. + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(1, true), 1); + // Pin kURL2 WebState. + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(2, true), 2); + + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(0)); + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(1)); + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(2)); + EXPECT_FALSE(web_state_list_.IsWebStatePinnedAt(3)); + + EXPECT_EQ(web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec(), kURL0); + EXPECT_EQ(web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec(), kURL1); + EXPECT_EQ(web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec(), kURL2); + EXPECT_EQ(web_state_list_.GetWebStateAt(3)->GetVisibleURL().spec(), kURL3); +} + +// Tests WebStates are pinned correctly while their order in the WebStateList +// change. +TEST_F(WebStateListTest, SetWebStatePinned_InRandomOrder) { + EXPECT_TRUE(web_state_list_.empty()); + + AppendNewWebState(kURL0); + AppendNewWebState(kURL1); + AppendNewWebState(kURL2); + AppendNewWebState(kURL3); + + // Pin kURL2 WebState. + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(2, true), 0); + // Pin kURL3 WebState. + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(3, true), 1); + // Pin kURL0 WebState. + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(2, true), 2); + // Unpin kURL3 WebState. + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(1, false), 2); + + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(0)); + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(1)); + EXPECT_FALSE(web_state_list_.IsWebStatePinnedAt(2)); + EXPECT_FALSE(web_state_list_.IsWebStatePinnedAt(3)); + + EXPECT_EQ(web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec(), kURL2); + EXPECT_EQ(web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec(), kURL0); + EXPECT_EQ(web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec(), kURL3); + EXPECT_EQ(web_state_list_.GetWebStateAt(3)->GetVisibleURL().spec(), kURL1); +} + +// Tests GetIndexOfFirstNonPinnedWebState returns correct index. +TEST_F(WebStateListTest, GetIndexOfFirstNonPinnedWebState) { + EXPECT_TRUE(web_state_list_.empty()); + + AppendNewWebState(kURL0); + AppendNewWebState(kURL1); + AppendNewWebState(kURL2); + AppendNewWebState(kURL3); + + EXPECT_EQ(web_state_list_.GetIndexOfFirstNonPinnedWebState(), 0); + + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(0, true), 0); + EXPECT_EQ(web_state_list_.GetIndexOfFirstNonPinnedWebState(), 1); + + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(3, true), 1); + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(3, true), 2); + EXPECT_EQ(web_state_list_.GetIndexOfFirstNonPinnedWebState(), 3); + + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(3, true), 3); + EXPECT_EQ(web_state_list_.GetIndexOfFirstNonPinnedWebState(), 4); + + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(0, false), 3); + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(0, false), 2); + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(0, false), 1); + EXPECT_EQ(web_state_list_.GetIndexOfFirstNonPinnedWebState(), 1); + + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(0, false), 0); + EXPECT_EQ(web_state_list_.GetIndexOfFirstNonPinnedWebState(), 0); +} + +// Tests InsertWebState method correctly updates insertion index if it is in the +// pinned WebStates range. +TEST_F(WebStateListTest, InsertWebState_InsertionInPinnedRange) { + const char testURL0[] = "https://chromium.org/test_0"; + const char testURL1[] = "https://chromium.org/test_1"; + const char testURL2[] = "https://chromium.org/test_2"; + + EXPECT_TRUE(web_state_list_.empty()); + + AppendNewWebState(kURL0); + AppendNewWebState(kURL1); + AppendNewWebState(kURL2); + AppendNewWebState(kURL3); + + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(0, true), 0); + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(1, true), 1); + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(2, true), 2); + + // Insert a WebState into pinned WebStates range. + web_state_list_.InsertWebState(0, CreateWebState(testURL0), + WebStateList::INSERT_NO_FLAGS, + WebStateOpener()); + // Expect a WebState to be added at the end of the WebStateList. + EXPECT_EQ(web_state_list_.GetWebStateAt(4)->GetVisibleURL().spec(), testURL0); + + // Insert a WebState into pinned WebStates range. + web_state_list_.InsertWebState(2, CreateWebState(testURL1), + WebStateList::INSERT_NO_FLAGS, + WebStateOpener()); + // Expect a WebState to be added at the end of the WebStateList. + EXPECT_EQ(web_state_list_.GetWebStateAt(5)->GetVisibleURL().spec(), testURL1); + + // Insert a WebState into pinned WebStates range. + web_state_list_.InsertWebState(1, CreateWebState(testURL2), + WebStateList::INSERT_NO_FLAGS, + WebStateOpener()); + // Expect a WebState to be added at the end of the WebStateList. + EXPECT_EQ(web_state_list_.GetWebStateAt(6)->GetVisibleURL().spec(), testURL2); +} + +// Tests InsertWebState method correctly updates insertion index if it is in the +// pinned WebStates range and the flag is INSERT_FORCE_INDEX. +TEST_F(WebStateListTest, InsertWebState_ForceInsertionInPinnedRange) { + const char testURL0[] = "https://chromium.org/test_0"; + const char testURL1[] = "https://chromium.org/test_1"; + const char testURL2[] = "https://chromium.org/test_2"; + + EXPECT_TRUE(web_state_list_.empty()); + + AppendNewWebState(kURL0); + AppendNewWebState(kURL1); + AppendNewWebState(kURL2); + AppendNewWebState(kURL3); + + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(0, true), 0); + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(1, true), 1); + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(2, true), 2); + + // Insert a WebState into pinned WebStates range. + web_state_list_.InsertWebState(0, CreateWebState(testURL0), + WebStateList::INSERT_FORCE_INDEX, + WebStateOpener()); + // Expect a WebState to be added at the end of WebStates list. + EXPECT_EQ(web_state_list_.GetWebStateAt(4)->GetVisibleURL().spec(), testURL0); + + // Insert a WebState into pinned WebStates range. + web_state_list_.InsertWebState(2, CreateWebState(testURL1), + WebStateList::INSERT_FORCE_INDEX, + WebStateOpener()); + // Expect a WebState to be added at the end of WebStates list. + EXPECT_EQ(web_state_list_.GetWebStateAt(5)->GetVisibleURL().spec(), testURL1); + + // Insert a WebState into pinned WebStates range. + web_state_list_.InsertWebState(1, CreateWebState(testURL2), + WebStateList::INSERT_FORCE_INDEX, + WebStateOpener()); + // Expect a WebState to be added at the end of WebStates list. + EXPECT_EQ(web_state_list_.GetWebStateAt(6)->GetVisibleURL().spec(), testURL2); +} + +// Tests InsertWebState method correctly updates insertion index when the flag +// is INSERT_PINNED. +TEST_F(WebStateListTest, InsertWebState_InsertWebStatePinned) { + const char testURL0[] = "https://chromium.org/test_0"; + const char testURL1[] = "https://chromium.org/test_1"; + const char testURL2[] = "https://chromium.org/test_2"; + + EXPECT_TRUE(web_state_list_.empty()); + + AppendNewWebState(kURL0); + AppendNewWebState(kURL1); + AppendNewWebState(kURL2); + AppendNewWebState(kURL3); + + // Insert a pinned WebState at invalid index. + web_state_list_.InsertWebState(WebStateList::kInvalidIndex, + CreateWebState(testURL0), + WebStateList::INSERT_PINNED, WebStateOpener()); + // Expect a WebState to be added into pinned WebStates range. + EXPECT_EQ(web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec(), testURL0); + // Expect a WebState to be pinned. + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(0)); + + // Insert a pinned WebState to the non-pinned WebStates range. + web_state_list_.InsertWebState(2, CreateWebState(testURL1), + WebStateList::INSERT_PINNED, WebStateOpener()); + // Expect a WebState to be added at the end of the pinned WebStates range. + EXPECT_EQ(web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec(), testURL1); + // Expect a WebState to be pinned. + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(1)); + + // Insert a pinned WebState to the pinned WebStates range. + web_state_list_.InsertWebState(0, CreateWebState(testURL2), + WebStateList::INSERT_PINNED, WebStateOpener()); + // Expect a WebState to be added at the end of the pinned WebStates range. + EXPECT_EQ(web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec(), testURL2); + // Expect a WebState to be pinned. + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(2)); + + // Final check that only first three WebStates were pinned. + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(0)); + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(1)); + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(2)); + EXPECT_FALSE(web_state_list_.IsWebStatePinnedAt(3)); +} + +// Tests InsertWebState method correctly updates insertion index when the flags +// are INSERT_PINNED and INSERT_FORCE_INDEX. +TEST_F(WebStateListTest, InsertWebState_InsertWebStatePinnedForceIndex) { + const char testURL0[] = "https://chromium.org/test_0"; + const char testURL1[] = "https://chromium.org/test_1"; + const char testURL2[] = "https://chromium.org/test_2"; + + EXPECT_TRUE(web_state_list_.empty()); + + AppendNewWebState(kURL0); + AppendNewWebState(kURL1); + AppendNewWebState(kURL2); + AppendNewWebState(kURL3); + + // Insert a pinned WebState at invalid index. + web_state_list_.InsertWebState( + WebStateList::kInvalidIndex, CreateWebState(testURL0), + WebStateList::INSERT_PINNED | WebStateList::INSERT_FORCE_INDEX, + WebStateOpener()); + // Expect a WebState to be added into pinned WebStates range. + EXPECT_EQ(web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec(), testURL0); + // Expect a WebState to be pinned. + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(0)); + + // Insert a pinned WebState to the non-pinned WebStates range. + web_state_list_.InsertWebState( + 2, CreateWebState(testURL1), + WebStateList::INSERT_PINNED | WebStateList::INSERT_FORCE_INDEX, + WebStateOpener()); + // Expect a WebState to be added at the end of the pinned WebStates range. + EXPECT_EQ(web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec(), testURL1); + // Expect a WebState to be pinned. + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(1)); + + // Insert a pinned WebState to the pinned WebStates range. + web_state_list_.InsertWebState( + 0, CreateWebState(testURL2), + WebStateList::INSERT_PINNED | WebStateList::INSERT_FORCE_INDEX, + WebStateOpener()); + // Expect a WebState to be added at the same index. + EXPECT_EQ(web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec(), testURL2); + // Expect a WebState to be pinned. + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(0)); + + // Final check that only first three WebStates were pinned. + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(0)); + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(1)); + EXPECT_TRUE(web_state_list_.IsWebStatePinnedAt(2)); + EXPECT_FALSE(web_state_list_.IsWebStatePinnedAt(3)); +} + +// Tests MoveWebStateAt method moves the pinned WebStates within pinned +// WebStates range only. +TEST_F(WebStateListTest, MoveWebStateAt_KeepsPinnedWebStateWithinPinnedRange) { + EXPECT_TRUE(web_state_list_.empty()); + + AppendNewWebState(kURL0); + AppendNewWebState(kURL1); + AppendNewWebState(kURL2); + AppendNewWebState(kURL3); + + // Pin first three WebStates. + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(0, true), 0); + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(1, true), 1); + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(2, true), 2); + + // Check the WebStates order. + EXPECT_EQ(web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec(), kURL0); + EXPECT_EQ(web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec(), kURL1); + EXPECT_EQ(web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec(), kURL2); + EXPECT_EQ(web_state_list_.GetWebStateAt(3)->GetVisibleURL().spec(), kURL3); + + // Try to move first pinned WebState inside of the pinned WebStates range. + web_state_list_.MoveWebStateAt(0, 2); + + // Try to move first pinned WebState outside of the pinned WebStates range. + web_state_list_.MoveWebStateAt(0, 3); + + // Expect the pinned WebStates to be moved within pinned WebStates range only. + EXPECT_EQ(web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec(), kURL2); + EXPECT_EQ(web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec(), kURL0); + EXPECT_EQ(web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec(), kURL1); + EXPECT_EQ(web_state_list_.GetWebStateAt(3)->GetVisibleURL().spec(), kURL3); +} + +// Tests MoveWebStateAt method moves the non-pinned WebStates within non-pinned +// WebStates range only. +TEST_F(WebStateListTest, + MoveWebStateAt_KeepsNonPinnedWebStatesWithinNonPinnedRange) { + EXPECT_TRUE(web_state_list_.empty()); + + AppendNewWebState(kURL0); + AppendNewWebState(kURL1); + AppendNewWebState(kURL2); + AppendNewWebState(kURL3); + + // Pin first two WebStates. + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(0, true), 0); + EXPECT_EQ(web_state_list_.SetWebStatePinnedAt(1, true), 1); + + // Check WebStates order. + EXPECT_EQ(web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec(), kURL0); + EXPECT_EQ(web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec(), kURL1); + EXPECT_EQ(web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec(), kURL2); + EXPECT_EQ(web_state_list_.GetWebStateAt(3)->GetVisibleURL().spec(), kURL3); + + // Try to move first non-pinned WebState inside of the non-pinned WebStates + // range. + web_state_list_.MoveWebStateAt(2, 3); + + // Try to move first non-pinned WebState to the pinned WebStates range. + web_state_list_.MoveWebStateAt(2, 1); + + // Expect the non-pinned WebStates to be moved within non-pinned WebStates + // range only. + EXPECT_EQ(web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec(), kURL0); + EXPECT_EQ(web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec(), kURL1); + EXPECT_EQ(web_state_list_.GetWebStateAt(2)->GetVisibleURL().spec(), kURL3); + EXPECT_EQ(web_state_list_.GetWebStateAt(3)->GetVisibleURL().spec(), kURL2); +}
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.mm b/ios/chrome/test/earl_grey/chrome_earl_grey.mm index ade093d..ab2ab404 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey.mm +++ b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
@@ -18,6 +18,7 @@ #import "ios/testing/earl_grey/app_launch_configuration.h" #import "ios/testing/earl_grey/app_launch_manager.h" #import "ios/testing/earl_grey/earl_grey_test.h" +#import "ios/testing/earl_grey/system_alert_handler.h" #import "ios/testing/nserror_util.h" #import "ios/web/public/test/element_selector.h" #import "net/base/mac/url_conversions.h" @@ -373,6 +374,8 @@ EG_TEST_HELPER_ASSERT_TRUE( [ChromeEarlGreyAppInterface waitForWindowIDInjectionIfNeeded], @"WindowID failed to inject"); + // Loading URL (especially the first time) can trigger alerts. + [SystemAlertHandler handleSystemAlertIfVisible]; } } @@ -1029,6 +1032,8 @@ [ChromeEarlGreyAppInterface waitForWindowIDInjectionIfNeededInWindowWithNumber:windowNumber], @"WindowID failed to inject"); + // Loading URL (especially the first time) can trigger alerts. + [SystemAlertHandler handleSystemAlertIfVisible]; } }
diff --git a/ios/chrome/test/xcuitest/BUILD.gn b/ios/chrome/test/xcuitest/BUILD.gn index 14e232ce..41a920cf 100644 --- a/ios/chrome/test/xcuitest/BUILD.gn +++ b/ios/chrome/test/xcuitest/BUILD.gn
@@ -30,6 +30,7 @@ deps = [ "//base/test:test_support", "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant", + "//ios/testing:system_alert_handler", ] frameworks = [ "UIKit.framework" ] }
diff --git a/ios/chrome/test/xcuitest/device_check_xctest.mm b/ios/chrome/test/xcuitest/device_check_xctest.mm index 4d1cdef..b0ece91 100644 --- a/ios/chrome/test/xcuitest/device_check_xctest.mm +++ b/ios/chrome/test/xcuitest/device_check_xctest.mm
@@ -6,6 +6,7 @@ #import "base/test/ios/wait_util.h" #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h" +#import "ios/testing/system_alert_handler.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -13,70 +14,6 @@ using base::test::ios::kWaitForPageLoadTimeout; using base::test::ios::kWaitForUIElementTimeout; -using base::test::ios::WaitUntilConditionOrTimeout; - -namespace { -// TODO(crbug.com/1112912): Share the logic and constants with -// ios/testing/earl_grey/base_earl_grey_test_case.mm. -// Alert labels (partial match) and corresponding buttons (exact match) to -// dismiss the alert. -NSArray<NSArray<NSString*>*>* alert_text_button_pairs = @[ - @[ @"Software Update", @"Later" ], - @[ @"Software Update", @"Remind Me Later" ], - @[ @"A new iOS update is now available.", @"Close" ], - @[ @"Carrier Settings Update", @"Not Now" ], - @[ - @"would like to find and connect to devices on your local network.", @"OK" - ], - @[ @"Unable to activate Touch ID on this iPhone.", @"OK" ], - @[ @"Like to Access the Microphone", @"OK" ], -]; - -BOOL ElementStaticTextContainsText(XCUIElement* element, NSString* text) { - NSPredicate* label_contains_text = - [NSPredicate predicateWithFormat:@"%K CONTAINS[c] %@", @"label", text]; - return - [element.staticTexts containingPredicate:label_contains_text].count > 0; -} - -BOOL HandleSingleAlert(XCUIElement* alert) { - for (NSArray<NSString*>* pair : alert_text_button_pairs) { - if (ElementStaticTextContainsText(alert, pair[0])) { - NSLog(@"Found alert containing text: %@", pair[0]); - if (!alert.buttons[pair[1]].exists) { - NSLog(@"Button %@ doesn't exist. Skip tapping.", pair[1]); - continue; - } - NSLog(@"Tapping alert button: %@", pair[1]); - [alert.buttons[pair[1]] tap]; - return YES; - } - } - return NO; -} - -BOOL HandleSystemAlertsIfVisible() { - XCUIApplication* springboard_app = [[XCUIApplication alloc] - initWithBundleIdentifier:@"com.apple.springboard"]; - XCUIElement* alert = - [springboard_app descendantsMatchingType:XCUIElementTypeAlert].firstMatch; - - // Limit attempt times. If attempt limit is exceeded it means something wrong - // at tapping the dismiss button. - int attempt = 0; - while ( - attempt < 5 && - [alert - waitForExistenceWithTimeout:kWaitForUIElementTimeout.InSecondsF()]) { - NSLog(@"Alert on screen: %@", alert.label); - if (!HandleSingleAlert(alert)) { - return NO; - } - attempt++; - } - return attempt < 5; -} -} // namespace // Test suite to verify Internet connectivity. @interface DeviceCheckTestCase : XCTestCase @@ -87,7 +24,7 @@ - (void)setUp { XCUIApplication* app = [[XCUIApplication alloc] init]; [app launch]; - XCTAssert(HandleSystemAlertsIfVisible(), @"Unhandled system alert."); + XCTAssert(HandleKnownSystemAlertsIfVisible(), @"Unhandled system alert."); } // Verifies Internet connectivity by navigating to google.com.
diff --git a/ios/public/provider/chrome/browser/BUILD.gn b/ios/public/provider/chrome/browser/BUILD.gn index 1b2ee62..9a29d3a 100644 --- a/ios/public/provider/chrome/browser/BUILD.gn +++ b/ios/public/provider/chrome/browser/BUILD.gn
@@ -34,6 +34,7 @@ "//ios/public/provider/chrome/browser/push_notification:push_notification_api", "//ios/public/provider/chrome/browser/risk_data:risk_data_api", "//ios/public/provider/chrome/browser/signin:signin_error_api", + "//ios/public/provider/chrome/browser/signin:signin_identity_api", "//ios/public/provider/chrome/browser/signin:signin_resources_api", "//ios/public/provider/chrome/browser/signin:signin_sso_api", "//ios/public/provider/chrome/browser/signin:trusted_vault_api",
diff --git a/ios/public/provider/chrome/browser/signin/BUILD.gn b/ios/public/provider/chrome/browser/signin/BUILD.gn index b412f01..4fc26e4 100644 --- a/ios/public/provider/chrome/browser/signin/BUILD.gn +++ b/ios/public/provider/chrome/browser/signin/BUILD.gn
@@ -11,6 +11,7 @@ "chrome_identity_service.mm", ] deps = [ + ":capabilities_types", "//base", "//components/signin/internal/identity_manager", "//components/sync/driver", @@ -26,6 +27,14 @@ frameworks = [ "Foundation.framework" ] } +source_set("signin_identity_api") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ "signin_identity_api.h" ] + deps = [ ":signin_sso_api" ] + public_deps = [ "//ios/chrome/browser/signin:system_identity_manager" ] + frameworks = [ "Foundation.framework" ] +} + source_set("signin_resources_api") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ "signin_resources_api.h" ] @@ -56,6 +65,7 @@ "fake_chrome_identity_service.mm", ] deps = [ + ":capabilities_types", ":constants", ":signin", "//base", @@ -73,6 +83,12 @@ public_deps = [ "//testing/gmock" ] } +source_set("capabilities_types") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ "capabilities_dict.h" ] + frameworks = [ "Foundation.framework" ] +} + source_set("constants") { configs += [ "//build/config/compiler:enable_arc" ] testonly = true @@ -90,6 +106,7 @@ testonly = true sources = [ "chrome_identity_service_unittest.mm" ] deps = [ + ":capabilities_types", ":signin", "//base", "//base/test:test_support",
diff --git a/ios/public/provider/chrome/browser/signin/DEPS b/ios/public/provider/chrome/browser/signin/DEPS index 9b1069a..98615e34 100644 --- a/ios/public/provider/chrome/browser/signin/DEPS +++ b/ios/public/provider/chrome/browser/signin/DEPS
@@ -3,6 +3,7 @@ "+components/signin/public/base/signin_metrics.h", "+components/sync/driver/trusted_vault_client.h", "+ios/chrome/browser/signin/system_identity.h", + "+ios/chrome/browser/signin/system_identity_manager.h", "+ios/chrome/browser/signin/trusted_vault_client_backend.h", "+ios/chrome/browser/signin/trusted_vault_configuration.h", ]
diff --git a/ios/public/provider/chrome/browser/signin/capabilities_dict.h b/ios/public/provider/chrome/browser/signin/capabilities_dict.h new file mode 100644 index 0000000..df23656 --- /dev/null +++ b/ios/public/provider/chrome/browser/signin/capabilities_dict.h
@@ -0,0 +1,18 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_PUBLIC_PROVIDER_CHROME_BROWSER_SIGNIN_CAPABILITIES_DICT_H_ +#define IOS_PUBLIC_PROVIDER_CHROME_BROWSER_SIGNIN_CAPABILITIES_DICT_H_ + +#import <Foundation/Foundation.h> + +namespace ios { + +// Dictionary from capability name, as in `account_capabilities.cc` to a +// `ChromeIdentityCapabilityResult` encoded as a NSNumber. +using CapabilitiesDict = NSDictionary<NSString*, NSNumber*>; + +} // namespace ios + +#endif // IOS_PUBLIC_PROVIDER_CHROME_BROWSER_SIGNIN_CAPABILITIES_DICT_H_
diff --git a/ios/public/provider/chrome/browser/signin/chrome_identity_service.h b/ios/public/provider/chrome/browser/signin/chrome_identity_service.h index aee158f..48b3da7d 100644 --- a/ios/public/provider/chrome/browser/signin/chrome_identity_service.h +++ b/ios/public/provider/chrome/browser/signin/chrome_identity_service.h
@@ -13,6 +13,7 @@ #include "base/callback.h" #include "base/observer_list.h" +#import "ios/public/provider/chrome/browser/signin/capabilities_dict.h" @class ChromeIdentityInteractionManager; @protocol SystemIdentity; @@ -67,7 +68,7 @@ // Callback for fetching the set of supported capabilities and their // corresponding states as defined in ChromeIdentityCapabilityResult. typedef void (^ChromeIdentityCapabilitiesFetchCompletionBlock)( - NSDictionary* capabilities, + CapabilitiesDict* capabilities, NSError* error); // Opaque type representing the MDM (Mobile Device Management) status of the
diff --git a/ios/public/provider/chrome/browser/signin/chrome_identity_service.mm b/ios/public/provider/chrome/browser/signin/chrome_identity_service.mm index 15908e23..64d40f5 100644 --- a/ios/public/provider/chrome/browser/signin/chrome_identity_service.mm +++ b/ios/public/provider/chrome/browser/signin/chrome_identity_service.mm
@@ -237,7 +237,7 @@ const base::TimeTicks fetch_start = base::TimeTicks::Now(); FetchCapabilities( identity, @[ capability_name ], - ^(NSDictionary<NSString*, NSNumber*>* capabilities, NSError* error) { + ^(CapabilitiesDict* capabilities, NSError* error) { base::UmaHistogramTimes( "Signin.AccountCapabilities.GetFromSystemLibraryDuration", base::TimeTicks::Now() - fetch_start);
diff --git a/ios/public/provider/chrome/browser/signin/chrome_identity_service_unittest.mm b/ios/public/provider/chrome/browser/signin/chrome_identity_service_unittest.mm index eecc4d43..60e518d5 100644 --- a/ios/public/provider/chrome/browser/signin/chrome_identity_service_unittest.mm +++ b/ios/public/provider/chrome/browser/signin/chrome_identity_service_unittest.mm
@@ -10,6 +10,7 @@ #import "components/signin/internal/identity_manager/account_capabilities_constants.h" #import "components/signin/public/base/signin_metrics.h" #import "ios/chrome/browser/signin/fake_system_identity.h" +#import "ios/public/provider/chrome/browser/signin/capabilities_dict.h" #import "testing/gmock/include/gmock/gmock.h" #import "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h" @@ -112,7 +113,7 @@ void RunFinishCapabilitiesCompletion(NSNumber* capability_value, NSError* error) { - NSDictionary* capabilities = + CapabilitiesDict* capabilities = capability_value ? @{capability_name_ : capability_value} : nil; EXPECT_TRUE(fetch_capabilities_request_.has_value()); EXPECT_TRUE(fetch_capabilities_request_.value().completion);
diff --git a/ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h b/ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h index 9f18772b..200efad9 100644 --- a/ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h +++ b/ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h
@@ -5,11 +5,12 @@ #ifndef IOS_PUBLIC_PROVIDER_CHROME_BROWSER_SIGNIN_FAKE_CHROME_IDENTITY_SERVICE_H_ #define IOS_PUBLIC_PROVIDER_CHROME_BROWSER_SIGNIN_FAKE_CHROME_IDENTITY_SERVICE_H_ -#include "ios/public/provider/chrome/browser/signin/chrome_identity_service.h" +#import "ios/public/provider/chrome/browser/signin/capabilities_dict.h" +#import "ios/public/provider/chrome/browser/signin/chrome_identity_service.h" #import <Foundation/Foundation.h> -#include "testing/gmock/include/gmock/gmock.h" +#import "testing/gmock/include/gmock/gmock.h" @class FakeChromeIdentityInteractionManager; @@ -79,7 +80,8 @@ // Adds a mapping from the `identity` to the capability name -> capability // result value used when calling FetchCapabilities. // Assumes the `identity` has been added to the available identities. - void SetCapabilities(id<SystemIdentity> identity, NSDictionary* capabilities); + void SetCapabilities(id<SystemIdentity> identity, + CapabilitiesDict* capabilities); // Waits until all asynchronous callbacks have been completed by the service. // Returns true on successful completion. @@ -96,7 +98,7 @@ private: NSMutableArray<id<SystemIdentity>>* identities_; - NSMutableDictionary<NSString*, NSDictionary*>* capabilitiesByIdentity_; + NSMutableDictionary<NSString*, CapabilitiesDict*>* capabilities_by_identity_; // If true, call to GetAccessToken() fakes a MDM error. bool _fakeMDMError;
diff --git a/ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.mm b/ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.mm index d0b881ca..669056e 100644 --- a/ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.mm +++ b/ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.mm
@@ -62,7 +62,7 @@ namespace ios { FakeChromeIdentityService::FakeChromeIdentityService() : identities_([[NSMutableArray alloc] init]), - capabilitiesByIdentity_([[NSMutableDictionary alloc] init]), + capabilities_by_identity_([[NSMutableDictionary alloc] init]), _fakeMDMError(false), _pendingCallback(0) { std::string value = @@ -122,7 +122,7 @@ id<SystemIdentity> identity, ForgetIdentityCallback callback) { [identities_ removeObject:identity]; - [capabilitiesByIdentity_ removeObjectForKey:identity.gaiaID]; + [capabilities_by_identity_ removeObjectForKey:identity.gaiaID]; FireIdentityListChanged(/*notify_user=*/false); if (callback) { // Forgetting an identity is normally an asynchronous operation (that @@ -222,7 +222,7 @@ void FakeChromeIdentityService::SimulateForgetIdentityFromOtherApp( id<SystemIdentity> identity) { [identities_ removeObject:identity]; - [capabilitiesByIdentity_ removeObjectForKey:identity.gaiaID]; + [capabilities_by_identity_ removeObjectForKey:identity.gaiaID]; FireChromeIdentityReload(); } @@ -258,10 +258,11 @@ FireIdentityListChanged(/*notify_user=*/false); } -void FakeChromeIdentityService::SetCapabilities(id<SystemIdentity> identity, - NSDictionary* capabilities) { +void FakeChromeIdentityService::SetCapabilities( + id<SystemIdentity> identity, + CapabilitiesDict* capabilities) { DCHECK([identities_ containsObject:identity]); - [capabilitiesByIdentity_ setObject:capabilities forKey:identity.gaiaID]; + [capabilities_by_identity_ setObject:capabilities forKey:identity.gaiaID]; } void FakeChromeIdentityService::SetFakeMDMError(bool fakeMDMError) { @@ -285,10 +286,10 @@ NSArray<NSString*>* capabilities, ChromeIdentityCapabilitiesFetchCompletionBlock completion) { NSMutableDictionary* result = [[NSMutableDictionary alloc] init]; - NSDictionary* capabilitiesForIdentity = - capabilitiesByIdentity_[identity.gaiaID]; + CapabilitiesDict* capabilitiesForIdentity = + capabilities_by_identity_[identity.gaiaID]; for (NSString* capability : capabilities) { - // Set capability result as unknown if not set in capabilitiesByIdentity_. + // Set capability result as unknown if not set in capabilities_by_identity_. NSNumber* capabilityResult = [NSNumber numberWithInt:static_cast<int>( ChromeIdentityCapabilityResult::kUnknown)];
diff --git a/ios/public/provider/chrome/browser/signin/signin_identity_api.h b/ios/public/provider/chrome/browser/signin/signin_identity_api.h new file mode 100644 index 0000000..df127b6 --- /dev/null +++ b/ios/public/provider/chrome/browser/signin/signin_identity_api.h
@@ -0,0 +1,29 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_PUBLIC_PROVIDER_CHROME_BROWSER_SIGNIN_SIGNIN_IDENTITY_API_H_ +#define IOS_PUBLIC_PROVIDER_CHROME_BROWSER_SIGNIN_SIGNIN_IDENTITY_API_H_ + +#include <memory> + +#include "ios/chrome/browser/signin/system_identity_manager.h" +#include "ios/public/provider/chrome/browser/signin/signin_sso_api.h" + +namespace ios { +namespace provider { + +// Returns whether signin is supported by the provider. If this returns +// false, then the manager returned by `CreateSystemIdentityManager()` +// will be a null object. +bool IsSigninSupported(); + +// Creates a new SystemIdentityManager instance. Returns null if signin +// is not supported by the application. +std::unique_ptr<SystemIdentityManager> CreateSystemIdentityManager( + id<SingleSignOnService> sso_service); + +} // namespace provider +} // namespace ios + +#endif // IOS_PUBLIC_PROVIDER_CHROME_BROWSER_SIGNIN_SIGNIN_IDENTITY_API_H_
diff --git a/ios/testing/BUILD.gn b/ios/testing/BUILD.gn index 3786c9b..af39b68f 100644 --- a/ios/testing/BUILD.gn +++ b/ios/testing/BUILD.gn
@@ -69,6 +69,19 @@ ] } +source_set("system_alert_handler") { + configs += [ + "//build/config/compiler:enable_arc", + "//build/config/ios:xctest_config", + ] + testonly = true + sources = [ + "system_alert_handler.h", + "system_alert_handler.mm", + ] + deps = [ "//base/test:test_support" ] +} + source_set("ocmock_support") { configs += [ "//build/config/compiler:enable_arc" ] testonly = true
diff --git a/ios/testing/earl_grey/BUILD.gn b/ios/testing/earl_grey/BUILD.gn index 3f16cc4b..e236113 100644 --- a/ios/testing/earl_grey/BUILD.gn +++ b/ios/testing/earl_grey/BUILD.gn
@@ -51,6 +51,8 @@ "earl_grey_test.h", "matchers.h", "matchers.mm", + "system_alert_handler.h", + "system_alert_handler.mm", ] deps = [ @@ -58,6 +60,7 @@ "//base/ios", "//base/test:test_support", "//components/variations", + "//ios/testing:system_alert_handler", "//ios/third_party/earl_grey2:test_lib", "//ios/third_party/edo", "//ios/web/common",
diff --git a/ios/testing/earl_grey/base_earl_grey_test_case.mm b/ios/testing/earl_grey/base_earl_grey_test_case.mm index 8901713..e2fead2 100644 --- a/ios/testing/earl_grey/base_earl_grey_test_case.mm +++ b/ios/testing/earl_grey/base_earl_grey_test_case.mm
@@ -15,6 +15,7 @@ #import "ios/testing/earl_grey/base_earl_grey_test_case_app_interface.h" #import "ios/testing/earl_grey/coverage_utils.h" #import "ios/testing/earl_grey/earl_grey_test.h" +#import "ios/testing/earl_grey/system_alert_handler.h" #if DCHECK_IS_ON() #import "ui/display/screen_base.h" @@ -61,7 +62,7 @@ [[AppLaunchManager sharedManager] ensureAppLaunchedWithConfiguration:[self appConfigurationForTestCase]]; - [self handleSystemAlertIfVisible]; + [SystemAlertHandler handleSystemAlertIfVisible]; NSString* logFormat = @"*********************************\nStarting test: %@"; [BaseEarlGreyTestCaseAppInterface @@ -98,103 +99,6 @@ [super tearDown]; } -// Handles system alerts if any are present, closing them to unblock the UI. -- (void)handleSystemAlertIfVisible { - NSError* systemAlertFoundError = nil; - [[EarlGrey selectElementWithMatcher:grey_systemAlertViewShown()] - assertWithMatcher:grey_nil() - error:&systemAlertFoundError]; - - if (systemAlertFoundError) { - NSError* alertGetTextError = nil; - NSString* alertText = - [self grey_systemAlertTextWithError:&alertGetTextError]; - GREYAssertNil(alertGetTextError, @"Error getting alert text.\n%@", - alertGetTextError); - - @try { - // TODO(crbug.com/1073542): Style guide does not allow throwing - // exceptions. This call throws an NSInternalInconsistencyException when - // the system alert is unknown in EG2 framework. The exception will be - // handled in @catch. Otherwise the system alert is of a known type, - // accept it. - [self grey_systemAlertType]; - - DLOG(WARNING) << "Accepting iOS system alert: " - << base::SysNSStringToUTF8(alertText); - - NSError* acceptAlertError = nil; - [self grey_acceptSystemDialogWithError:&acceptAlertError]; - GREYAssertNil(acceptAlertError, @"Error accepting system alert.\n%@", - acceptAlertError); - - } @catch (NSException* exception) { - GREYAssert( - (exception.name == NSInternalInconsistencyException && - [exception.reason rangeOfString:@"Invalid System Alert."].location != - NSNotFound), - @"Unknown error caught when handling unknown system alert: %@", - exception.reason); - // If the unsupported alert is iOS upgrade or carrier settings alert, - // handle it. Otherwise, fail the test. - if ([alertText isEqualToString:@"Software Update"]) { - DLOG(WARNING) << "Denying iOS system alert of Software Update!"; - // Software Update alert usually has two consecutive alerts, handle them - // one by one. - NSError* error = nil; - // Choose "Later" for the first alert. - [self tapAlertButtonWithText:@"Later" error:&error]; - // If an error with code |GREYSystemAlertCustomButtonNotFound| happens, - // probably the second alert is already there. Try to handle it in - // following steps. - GREYAssert( - error == nil || error.code == GREYSystemAlertCustomButtonNotFound, - @"Error denying first Software Update alert.\n%@", error); - // A second alert promoting to update tonight will appear. Wait for it. - [self grey_waitForAlertVisibility:YES - withTimeout:kSystemAlertVisibilityTimeout]; - error = nil; - // Choose "Remind Me Later" for the second alert. - [self tapAlertButtonWithText:@"Remind Me Later" error:&error]; - GREYAssertNil(error, @"Error denying second Software Update alert.\n%@", - error); - } else if ([alertText - containsString:@"A new iOS update is now available."]) { - DLOG(WARNING) - << "Denying iOS system alert of new iOS update is now available!"; - // This is another format of Software Update dialog. Need to choose - // "Close". - NSError* error = nil; - [self tapAlertButtonWithText:@"Close" error:&error]; - GREYAssertNil(error, @"Error closing Software Update alert.\n%@", - error); - } else if ([alertText isEqualToString:@"Carrier Settings Update"]) { - DLOG(WARNING) << "Denying iOS system alert of Carrier Settings Update!"; - NSError* error = nil; - [self tapAlertButtonWithText:@"Not Now" error:&error]; - GREYAssertNil( - error, @"Error closing Carrier Settings Update alert.\n%@", error); - } else if ([alertText containsString:@"would like to find and connect to " - @"devices on your local network."]) { - DLOG(WARNING) << "Denying iOS system alert of connecting to local " - "network devices!"; - NSError* error = nil; - [self tapAlertButtonWithText:@"OK" error:&error]; - GREYAssertNil(error, - @"Error closing connecting to local network devices.\n%@", - error); - } else { - XCTFail("An unsupported system alert is present on device. Failing " - "this test. Alert label: %@", - alertText); - } - } - } - // Ensures no visible alert after handling. - [self grey_waitForAlertVisibility:NO - withTimeout:kSystemAlertVisibilityTimeout]; -} - - (AppLaunchConfiguration)appConfigurationForTestCase { return AppLaunchConfiguration(); } @@ -216,29 +120,4 @@ } } -// Taps button with |text| in the system alert on screen. If an alert or the -// button doesn't exist, note it in |error| accordingly. In EG1, this method is -// no-op. -- (void)tapAlertButtonWithText:(NSString*)text error:(NSError**)error { - XCUIApplication* springboardApp = [[XCUIApplication alloc] - initWithBundleIdentifier:@"com.apple.springboard"]; - XCUIElement* alert = [[springboardApp - descendantsMatchingType:XCUIElementTypeAlert] firstMatch]; - if (![alert waitForExistenceWithTimeout:kSystemAlertVisibilityTimeout]) { - *error = [NSError errorWithDomain:kGREYSystemAlertDismissalErrorDomain - code:GREYSystemAlertNotPresent - userInfo:nil]; - return; - } - XCUIElement* button = alert.buttons[text]; - if (![alert.buttons[text] exists]) { - *error = [NSError errorWithDomain:kGREYSystemAlertDismissalErrorDomain - code:GREYSystemAlertCustomButtonNotFound - userInfo:nil]; - return; - } - - [button tap]; -} - @end
diff --git a/ios/testing/earl_grey/system_alert_handler.h b/ios/testing/earl_grey/system_alert_handler.h new file mode 100644 index 0000000..09f8aaa --- /dev/null +++ b/ios/testing/earl_grey/system_alert_handler.h
@@ -0,0 +1,20 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_TESTING_EARL_GREY_SYSTEM_ALERT_HANDLER_H_ +#define IOS_TESTING_EARL_GREY_SYSTEM_ALERT_HANDLER_H_ + +#import "ios/testing/earl_grey/base_eg_test_helper_impl.h" + +#define SystemAlertHandler \ + [SystemAlertHandlerImpl invokedFromFile:@"" __FILE__ lineNumber:__LINE__] + +@interface SystemAlertHandlerImpl : BaseEGTestHelperImpl + +// Handles system alerts if any are present, closing them to unblock the UI. +- (void)handleSystemAlertIfVisible; + +@end + +#endif // IOS_TESTING_EARL_GREY_SYSTEM_ALERT_HANDLER_H_
diff --git a/ios/testing/earl_grey/system_alert_handler.mm b/ios/testing/earl_grey/system_alert_handler.mm new file mode 100644 index 0000000..e5a3daf --- /dev/null +++ b/ios/testing/earl_grey/system_alert_handler.mm
@@ -0,0 +1,134 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/testing/earl_grey/system_alert_handler.h" + +#import "base/logging.h" +#import "base/strings/sys_string_conversions.h" +#import "ios/testing/earl_grey/earl_grey_test.h" +#import "ios/testing/system_alert_handler.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation SystemAlertHandlerImpl + +- (void)handleSystemAlertIfVisible { + NSError* systemAlertFoundError = nil; + [[EarlGrey selectElementWithMatcher:grey_systemAlertViewShown()] + assertWithMatcher:grey_nil() + error:&systemAlertFoundError]; + + if (systemAlertFoundError) { + NSError* alertGetTextError = nil; + NSString* alertText = + [EarlGrey SystemAlertTextWithError:&alertGetTextError]; + GREYAssertNil(alertGetTextError, @"Error getting alert text.\n%@", + alertGetTextError); + + @try { + // Calling this method has for side-effect to throw an + // NSInternalInconsistencyException if the system alert is unknown to the + // EG2 framework. + // If it does throw, handle the system alert in @catch. + // If it doesn’t throw, accept it here. + // TODO(crbug.com/1073542): Style guide does not allow throwing + // exceptions. + [EarlGrey SystemAlertType]; + + DLOG(WARNING) << "Accepting iOS system alert: " + << base::SysNSStringToUTF8(alertText); + + NSError* acceptAlertError = nil; + [EarlGrey AcceptSystemDialogWithError:&acceptAlertError]; + GREYAssertNil(acceptAlertError, @"Error accepting system alert.\n%@", + acceptAlertError); + + } @catch (NSException* exception) { + GREYAssert((exception.name == NSInternalInconsistencyException && + [exception.reason containsString:@"Invalid System Alert"]), + @"Unknown error caught when handling unknown system alert: %@", + exception.reason); + + // Manually handle EG2-unsupported alerts for some known cases, otherwise + // fail the test. + [self handleSystemAlertUnsupportedByEG2:alertText]; + } + } + // Ensures no visible alert after handling. + [EarlGrey WaitForAlertVisibility:NO + withTimeout:kSystemAlertVisibilityTimeout]; +} + +#pragma mark - Private + +// Tries to dismiss a system alert if it matches a list of known system alerts. +// alertText (NSString*) is the text of the system alert currently being shown. +// If the button cannot be tapped (system alert cannot be dismissed), or the +// text does not match a known text/button pair, the test will fail. +- (void)handleSystemAlertUnsupportedByEG2:(NSString*)alertText { + NSDictionary<NSString*, NSArray<NSString*>*>* textToButtons = + TextToButtonsOfKnownSystemAlerts(); + for (NSString* text in textToButtons) { + if ([alertText containsString:text]) { + DLOG(WARNING) << "Dismissing iOS system alert with label: " << text; + NSError* error; + + // Try every wanted button label possibility for that text before checking + // for an error. Some button labels share an alert text. + for (NSString* button in textToButtons[text]) { + error = nil; + [self tapAlertButtonWithText:button error:&error]; + + // Break out of button labels loop if the current button worked. + if (error == nil) { + break; + } + } + + GREYAssertNil(error, @"Error dismissing iOS alert with label: %@\n%@", + text, error); + + // For the case where a second alert will appear in succession, wait for + // it, and then handle it. + if ([alertText isEqualToString:@"Software Update"]) { + [EarlGrey WaitForAlertVisibility:YES + withTimeout:kSystemAlertVisibilityTimeout]; + [self handleSystemAlertUnsupportedByEG2:alertText]; + } + + return; + } + } + + XCTFail("An unsupported system alert is present on device. Failing the test. " + "Alert label: %@", + alertText); +} + +// Taps button with `text` in the system alert on screen. If an alert or the +// button doesn't exist, note it in `error` accordingly. +- (void)tapAlertButtonWithText:(NSString*)text error:(NSError**)error { + XCUIApplication* springboardApp = [[XCUIApplication alloc] + initWithBundleIdentifier:@"com.apple.springboard"]; + XCUIElement* alert = springboardApp.alerts.firstMatch; + if (![alert waitForExistenceWithTimeout:kSystemAlertVisibilityTimeout]) { + *error = [NSError errorWithDomain:kGREYSystemAlertDismissalErrorDomain + code:GREYSystemAlertNotPresent + userInfo:nil]; + return; + } + XCUIElement* button = alert.buttons[text]; + if (![alert.buttons[text] exists]) { + *error = [NSError errorWithDomain:kGREYSystemAlertDismissalErrorDomain + code:GREYSystemAlertCustomButtonNotFound + userInfo:nil]; + return; + } + + [button tap]; +} + +@end
diff --git a/ios/testing/system_alert_handler.h b/ios/testing/system_alert_handler.h new file mode 100644 index 0000000..23b0c63 --- /dev/null +++ b/ios/testing/system_alert_handler.h
@@ -0,0 +1,19 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_TESTING_SYSTEM_ALERT_HANDLER_H_ +#define IOS_TESTING_SYSTEM_ALERT_HANDLER_H_ + +#import <Foundation/Foundation.h> + +// A mapping between alert texts (partial match) and corresponding button titles +// (exact match) to dismiss the known system alerts. +NSDictionary<NSString*, NSArray<NSString*>*>* TextToButtonsOfKnownSystemAlerts( + void); + +// Closes system alerts from the `TextToButtonsOfKnownSystemAlerts` text/button +// mapping. +BOOL HandleKnownSystemAlertsIfVisible(void); + +#endif // IOS_TESTING_SYSTEM_ALERT_HANDLER_H_
diff --git a/ios/testing/system_alert_handler.mm b/ios/testing/system_alert_handler.mm new file mode 100644 index 0000000..bcf40fc --- /dev/null +++ b/ios/testing/system_alert_handler.mm
@@ -0,0 +1,91 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/testing/system_alert_handler.h" + +#import <XCTest/XCTest.h> + +#import "base/test/ios/wait_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using base::test::ios::kWaitForUIElementTimeout; + +namespace { + +// Returns true if any static text child of `element` (XCUIElement*) contains +// `text` (NSString*). +BOOL ElementStaticTextContainsText(XCUIElement* element, NSString* text) { + NSPredicate* label_contains_text = + [NSPredicate predicateWithFormat:@"%K CONTAINS[c] %@", @"label", text]; + return + [element.staticTexts containingPredicate:label_contains_text].count > 0; +} + +// Closes the `alert` (XCUIElement*) if it matches a known text/button pair and +// returns whether it succeeded or not in closing it. +BOOL HandleSingleAlert(XCUIElement* alert) { + NSDictionary<NSString*, NSArray<NSString*>*>* text_to_buttons = + TextToButtonsOfKnownSystemAlerts(); + for (NSString* text in text_to_buttons) { + if (ElementStaticTextContainsText(alert, text)) { + NSLog(@"Found alert containing text: %@", text); + + for (NSString* button in text_to_buttons[text]) { + if (!alert.buttons[button].exists) { + NSLog(@"Button %@ doesn't exist. Skip tapping.", button); + continue; + } + + NSLog(@"Tapping alert button: %@", button); + [alert.buttons[button] tap]; + return YES; + } + } + } + return NO; +} + +} // namespace + +NSDictionary<NSString*, NSArray<NSString*>*>* TextToButtonsOfKnownSystemAlerts( + void) { + static NSDictionary<NSString*, NSArray<NSString*>*>* text_to_buttons = nil; + static dispatch_once_t once_token; + dispatch_once(&once_token, ^{ + text_to_buttons = @{ + @"Software Update" : @[ @"Later", @"Remind Me Later" ], + @"A new iOS update is now available." : @[ @"Close" ], + @"Carrier Settings Update" : @[ @"Not Now" ], + @"would like to find and connect to devices on your local network" : + @[ @"OK", @"Allow" ], + @"Unable to activate Touch ID on this iPhone." : @[ @"OK" ], + @"Like to Access the Microphone" : @[ @"OK" ], + }; + }); + return text_to_buttons; +} + +BOOL HandleKnownSystemAlertsIfVisible(void) { + XCUIApplication* springboard_app = [[XCUIApplication alloc] + initWithBundleIdentifier:@"com.apple.springboard"]; + XCUIElement* alert = springboard_app.alerts.firstMatch; + + // Limit attempt times. If attempt limit is exceeded, it means something went + // wrong in tapping the buttons. + int attempt = 0; + while ( + attempt < 5 && + [alert + waitForExistenceWithTimeout:kWaitForUIElementTimeout.InSecondsF()]) { + NSLog(@"Alert on screen: %@", alert.label); + if (!HandleSingleAlert(alert)) { + return NO; + } + attempt++; + } + return attempt < 5; +}
diff --git a/ios/web_view/internal/passwords/web_view_password_feature_manager.h b/ios/web_view/internal/passwords/web_view_password_feature_manager.h index aa544f3..8886b7e3 100644 --- a/ios/web_view/internal/passwords/web_view_password_feature_manager.h +++ b/ios/web_view/internal/passwords/web_view_password_feature_manager.h
@@ -28,7 +28,6 @@ ~WebViewPasswordFeatureManager() override = default; bool IsGenerationEnabled() const override; - bool AreRequirementsForAutomatedPasswordChangeFulfilled() const override; bool IsOptedInForAccountStorage() const override; bool ShouldShowAccountStorageOptIn() const override; bool ShouldShowAccountStorageReSignin(
diff --git a/ios/web_view/internal/passwords/web_view_password_feature_manager.mm b/ios/web_view/internal/passwords/web_view_password_feature_manager.mm index 242c3ad..83696e8 100644 --- a/ios/web_view/internal/passwords/web_view_password_feature_manager.mm +++ b/ios/web_view/internal/passwords/web_view_password_feature_manager.mm
@@ -23,12 +23,6 @@ return true; } -bool WebViewPasswordFeatureManager:: - AreRequirementsForAutomatedPasswordChangeFulfilled() const { - // This is only a stub while APC is not implemented on iOS. - return false; -} - bool WebViewPasswordFeatureManager::IsOptedInForAccountStorage() const { // Although ios/web_view will only write to the account store, this should // still be controlled on a per user basis to ensure that the logged out user
diff --git a/ipc/ipc_message_macros.h b/ipc/ipc_message_macros.h index 7163348..94ef031 100644 --- a/ipc/ipc_message_macros.h +++ b/ipc/ipc_message_macros.h
@@ -370,7 +370,7 @@ case msg_class::ID: { \ IPC_TASK_ANNOTATOR_CONTEXT(msg_class) \ if (!msg_class::DispatchWithParamDelayReply(&ipc_message__, obj, \ - param__, \ & member_func)) \ + param__, &member_func)) \ ipc_message__.set_dispatch_error(); \ } break;
diff --git a/media/gpu/ipc/service/BUILD.gn b/media/gpu/ipc/service/BUILD.gn index 8542b35..fbd8a05 100644 --- a/media/gpu/ipc/service/BUILD.gn +++ b/media/gpu/ipc/service/BUILD.gn
@@ -16,18 +16,24 @@ ] sources = [ - "gpu_video_decode_accelerator.cc", - "gpu_video_decode_accelerator.h", "media_gpu_channel.cc", "media_gpu_channel.h", "media_gpu_channel_manager.cc", "media_gpu_channel_manager.h", - "picture_buffer_manager.cc", - "picture_buffer_manager.h", - "vda_video_decoder.cc", - "vda_video_decoder.h", ] + # The legacy VDA API is not supported on Android. + if (!is_android) { + sources += [ + "gpu_video_decode_accelerator.cc", + "gpu_video_decode_accelerator.h", + "picture_buffer_manager.cc", + "picture_buffer_manager.h", + "vda_video_decoder.cc", + "vda_video_decoder.h", + ] + } + include_dirs = [ "//third_party/mesa_headers" ] public_deps = [ @@ -57,10 +63,16 @@ source_set("unit_tests") { testonly = true - sources = [ - "picture_buffer_manager_unittest.cc", - "vda_video_decoder_unittest.cc", - ] + sources = [] + + # The legacy VDA API is not supported on Android. + if (!is_android) { + sources += [ + "picture_buffer_manager_unittest.cc", + "vda_video_decoder_unittest.cc", + ] + } + deps = [ ":service", "//base",
diff --git a/media/gpu/ipc/service/media_gpu_channel.cc b/media/gpu/ipc/service/media_gpu_channel.cc index 75b7296d..60d3a0e19 100644 --- a/media/gpu/ipc/service/media_gpu_channel.cc +++ b/media/gpu/ipc/service/media_gpu_channel.cc
@@ -11,6 +11,7 @@ #include "base/memory/raw_ptr.h" #include "base/task/single_thread_task_runner.h" #include "base/unguessable_token.h" +#include "build/build_config.h" #include "gpu/ipc/service/command_buffer_stub.h" #include "gpu/ipc/service/gpu_channel.h" #include "ipc/ipc_mojo_bootstrap.h" @@ -47,6 +48,12 @@ client, CreateAcceleratedVideoDecoderCallback callback) override { TRACE_EVENT0("gpu", "DecoderProviderImpl::CreateAcceleratedVideoDecoder"); +#if BUILDFLAG(IS_ANDROID) + NOTIMPLEMENTED() + << "The legacy VideoDecodeAccelerator API is not supported on Android"; + std::move(callback).Run(false); + return; +#else // Only allow stubs that have a ContextGroup, that is, the GLES2 ones. Later // code assumes the ContextGroup is valid. if (!stub_ || !stub_->decoder_context()->GetContextGroup()) { @@ -59,6 +66,7 @@ stub_, stub_->channel()->io_task_runner(), overlay_factory_cb_); std::move(callback).Run( decoder->Initialize(config, std::move(receiver), std::move(client))); +#endif } private:
diff --git a/net/BUILD.gn b/net/BUILD.gn index b18ca800b..c633dcd 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -2203,13 +2203,6 @@ "url_request/url_request_test_util.h", ] - if (is_mac) { - sources += [ - "test/keychain_test_util_mac.cc", - "test/keychain_test_util_mac.h", - ] - } - configs += [ "//build/config:precompiled_headers" ] public_deps = [
diff --git a/net/nqe/network_quality_estimator.cc b/net/nqe/network_quality_estimator.cc index b06d7ed2..9cf37139d 100644 --- a/net/nqe/network_quality_estimator.cc +++ b/net/nqe/network_quality_estimator.cc
@@ -903,7 +903,9 @@ base::BindOnce(&NetworkQualityEstimator:: NotifyEffectiveConnectionTypeObserverIfPresent, weak_ptr_factory_.GetWeakPtr(), - base::UnsafeDanglingUntriaged(observer))); + // This is safe as `handle` is checked against a map to + // verify it hasn't been removed before dereferencing. + base::UnsafeDangling(observer))); } void NetworkQualityEstimator::RemoveEffectiveConnectionTypeObserver( @@ -925,7 +927,9 @@ base::BindOnce(&NetworkQualityEstimator:: NotifyPeerToPeerConnectionsCountObserverIfPresent, weak_ptr_factory_.GetWeakPtr(), - base::UnsafeDanglingUntriaged(observer))); + // This is safe as `handle` is checked against a map to + // verify it hasn't been removed before dereferencing. + base::UnsafeDangling(observer))); } void NetworkQualityEstimator::RemovePeerToPeerConnectionsCountObserver(
diff --git a/net/ssl/client_cert_identity_mac.cc b/net/ssl/client_cert_identity_mac.cc index 6cdbec17..59c0baa1 100644 --- a/net/ssl/client_cert_identity_mac.cc +++ b/net/ssl/client_cert_identity_mac.cc
@@ -4,6 +4,9 @@ #include "net/ssl/client_cert_identity_mac.h" +#include <Security/SecIdentity.h> + +#include "base/mac/mac_logging.h" #include "net/ssl/ssl_platform_key_mac.h" #include "net/ssl/ssl_private_key.h" @@ -19,10 +22,19 @@ void ClientCertIdentityMac::AcquirePrivateKey( base::OnceCallback<void(scoped_refptr<SSLPrivateKey>)> private_key_callback) { - // This only adds a ref to and returns the private key from identity_ so it + // This only adds a ref to and returns the private key from `identity_`, so it // doesn't need to run on a worker thread. + base::ScopedCFTypeRef<SecKeyRef> key; + OSStatus status = + SecIdentityCopyPrivateKey(identity_.get(), key.InitializeInto()); + if (status != noErr) { + OSSTATUS_LOG(WARNING, status); + std::move(private_key_callback).Run(nullptr); + return; + } + std::move(private_key_callback) - .Run(CreateSSLPrivateKeyForSecIdentity(certificate(), identity_.get())); + .Run(CreateSSLPrivateKeyForSecKey(certificate(), key.get())); } } // namespace net
diff --git a/net/ssl/client_cert_store_mac_unittest.cc b/net/ssl/client_cert_store_mac_unittest.cc index 8cf3e31..27d9256 100644 --- a/net/ssl/client_cert_store_mac_unittest.cc +++ b/net/ssl/client_cert_store_mac_unittest.cc
@@ -22,11 +22,15 @@ std::vector<std::unique_ptr<ClientCertIdentityMac>> ClientCertIdentityMacListFromCertificateList(const CertificateList& certs) { - // This doesn't quite construct a real `ClientCertIdentityMac` the + // This doesn't quite construct a real `ClientCertIdentityMac` because the // `SecIdentityRef` is null. This means `SelectClientCertsForTesting` must // turn off the KeyChain query. If this becomes an issue, change - // client_cert_store_unittest-inl.h to pass in the key data and use - // `ScopedTestKeychain` with `ImportCertAndKeyToKeychain`. + // client_cert_store_unittest-inl.h to pass in the key data. + // + // Actually constructing a `SecIdentityRef` without persisting it is not + // currently possible with macOS's non-deprecated APIs, but it is possible + // with deprecated APIs using `SecKeychainCreate` and `SecItemImport`. See git + // history for net/test/keychain_test_util_mac.cc. std::vector<std::unique_ptr<ClientCertIdentityMac>> identities; identities.reserve(certs.size()); for (const auto& cert : certs) {
diff --git a/net/ssl/ssl_platform_key_mac.cc b/net/ssl/ssl_platform_key_mac.cc index ca6a6c5b..9aba51a 100644 --- a/net/ssl/ssl_platform_key_mac.cc +++ b/net/ssl/ssl_platform_key_mac.cc
@@ -181,32 +181,18 @@ base::ScopedCFTypeRef<SecKeyRef> key_; }; +} // namespace + scoped_refptr<SSLPrivateKey> CreateSSLPrivateKeyForSecKey( const X509Certificate* certificate, - SecKeyRef private_key) { + SecKeyRef key) { bssl::UniquePtr<EVP_PKEY> pubkey = GetClientCertPublicKey(certificate); if (!pubkey) return nullptr; return base::MakeRefCounted<ThreadedSSLPrivateKey>( - std::make_unique<SSLPlatformKeySecKey>(std::move(pubkey), private_key), + std::make_unique<SSLPlatformKeySecKey>(std::move(pubkey), key), GetSSLPlatformKeyTaskRunner()); } -} // namespace - -scoped_refptr<SSLPrivateKey> CreateSSLPrivateKeyForSecIdentity( - const X509Certificate* certificate, - SecIdentityRef identity) { - base::ScopedCFTypeRef<SecKeyRef> private_key; - OSStatus status = - SecIdentityCopyPrivateKey(identity, private_key.InitializeInto()); - if (status != noErr) { - OSSTATUS_LOG(WARNING, status); - return nullptr; - } - - return CreateSSLPrivateKeyForSecKey(certificate, private_key.get()); -} - } // namespace net
diff --git a/net/ssl/ssl_platform_key_mac.h b/net/ssl/ssl_platform_key_mac.h index 36928ce..35a57d63 100644 --- a/net/ssl/ssl_platform_key_mac.h +++ b/net/ssl/ssl_platform_key_mac.h
@@ -15,11 +15,11 @@ class SSLPrivateKey; class X509Certificate; -// Returns an SSLPrivateKey backed by the platform private key in |identity| -// which must correspond to |certificate|'s public key. -NET_EXPORT scoped_refptr<SSLPrivateKey> CreateSSLPrivateKeyForSecIdentity( +// Returns an `SSLPrivateKey` backed by the platform private key in `key`, which +// must correspond to `certificate`'s public key. +NET_EXPORT scoped_refptr<SSLPrivateKey> CreateSSLPrivateKeyForSecKey( const X509Certificate* certificate, - SecIdentityRef identity); + SecKeyRef key); } // namespace net
diff --git a/net/ssl/ssl_platform_key_mac_unittest.cc b/net/ssl/ssl_platform_key_mac_unittest.cc index cf1a21b..d9f358467 100644 --- a/net/ssl/ssl_platform_key_mac_unittest.cc +++ b/net/ssl/ssl_platform_key_mac_unittest.cc
@@ -5,6 +5,8 @@ #include "net/ssl/ssl_platform_key_mac.h" #include <CoreFoundation/CoreFoundation.h> +#include <Security/SecItem.h> +#include <Security/SecKey.h> #include <string> @@ -12,13 +14,18 @@ #include "base/files/file_util.h" #include "base/mac/scoped_cftyperef.h" #include "base/memory/ref_counted.h" +#include "base/numerics/checked_math.h" +#include "base/strings/string_piece.h" #include "base/test/task_environment.h" #include "net/ssl/ssl_private_key.h" #include "net/ssl/ssl_private_key_test_util.h" #include "net/test/cert_test_util.h" -#include "net/test/keychain_test_util_mac.h" #include "net/test/test_data_directory.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/boringssl/src/include/openssl/bytestring.h" +#include "third_party/boringssl/src/include/openssl/ec_key.h" +#include "third_party/boringssl/src/include/openssl/evp.h" +#include "third_party/boringssl/src/include/openssl/rsa.h" #include "third_party/boringssl/src/include/openssl/ssl.h" namespace net { @@ -43,6 +50,57 @@ return params.param.name; } +base::ScopedCFTypeRef<SecKeyRef> SecKeyFromPKCS8(base::StringPiece pkcs8) { + CBS cbs; + CBS_init(&cbs, reinterpret_cast<const uint8_t*>(pkcs8.data()), pkcs8.size()); + bssl::UniquePtr<EVP_PKEY> openssl_key(EVP_parse_private_key(&cbs)); + if (!openssl_key || CBS_len(&cbs) != 0) + return base::ScopedCFTypeRef<SecKeyRef>(); + + // `SecKeyCreateWithData` expects PKCS#1 for RSA keys, and a concatenated + // format for EC keys. See `SecKeyCopyExternalRepresentation` for details. + CFStringRef key_type; + bssl::ScopedCBB cbb; + if (!CBB_init(cbb.get(), 0)) { + return base::ScopedCFTypeRef<SecKeyRef>(); + } + if (EVP_PKEY_id(openssl_key.get()) == EVP_PKEY_RSA) { + key_type = kSecAttrKeyTypeRSA; + if (!RSA_marshal_private_key(cbb.get(), + EVP_PKEY_get0_RSA(openssl_key.get()))) { + return base::ScopedCFTypeRef<SecKeyRef>(); + } + } else if (EVP_PKEY_id(openssl_key.get()) == EVP_PKEY_EC) { + key_type = kSecAttrKeyTypeECSECPrimeRandom; + const EC_KEY* ec_key = EVP_PKEY_get0_EC_KEY(openssl_key.get()); + size_t priv_len = EC_KEY_priv2oct(ec_key, nullptr, 0); + uint8_t* out; + if (priv_len == 0 || + !EC_POINT_point2cbb(cbb.get(), EC_KEY_get0_group(ec_key), + EC_KEY_get0_public_key(ec_key), + POINT_CONVERSION_UNCOMPRESSED, nullptr) || + !CBB_add_space(cbb.get(), &out, priv_len) || + EC_KEY_priv2oct(ec_key, out, priv_len) != priv_len) { + return base::ScopedCFTypeRef<SecKeyRef>(); + } + } else { + return base::ScopedCFTypeRef<SecKeyRef>(); + } + + base::ScopedCFTypeRef<CFMutableDictionaryRef> attrs(CFDictionaryCreateMutable( + kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks)); + CFDictionarySetValue(attrs, kSecAttrKeyClass, kSecAttrKeyClassPrivate); + CFDictionarySetValue(attrs, kSecAttrKeyType, key_type); + + base::ScopedCFTypeRef<CFDataRef> data( + CFDataCreate(kCFAllocatorDefault, CBB_data(cbb.get()), + base::checked_cast<CFIndex>(CBB_len(cbb.get())))); + + return base::ScopedCFTypeRef<SecKeyRef>( + SecKeyCreateWithData(data, attrs, nullptr)); +} + } // namespace class SSLPlatformKeyMacTest : public testing::TestWithParam<TestKey> {}; @@ -61,20 +119,12 @@ base::FilePath pkcs8_path = GetTestCertsDirectory().AppendASCII(test_key.key_file); ASSERT_TRUE(base::ReadFileToString(pkcs8_path, &pkcs8)); + base::ScopedCFTypeRef<SecKeyRef> sec_key = SecKeyFromPKCS8(pkcs8); + ASSERT_TRUE(sec_key); - // Create a temporary keychain. - ScopedTestKeychain scoped_keychain; - ASSERT_TRUE(scoped_keychain.Initialize()); - SecKeychainRef keychain = scoped_keychain.keychain(); - - // Import cert and key to the keychain. - base::ScopedCFTypeRef<SecIdentityRef> sec_identity( - ImportCertAndKeyToKeychain(cert.get(), pkcs8, keychain)); - ASSERT_TRUE(sec_identity); - - // Finally, test the code to look up the key. + // Make an `SSLPrivateKey` backed by `sec_key`. scoped_refptr<SSLPrivateKey> key = - CreateSSLPrivateKeyForSecIdentity(cert.get(), sec_identity.get()); + CreateSSLPrivateKeyForSecKey(cert.get(), sec_key.get()); ASSERT_TRUE(key); // Mac keys from the default provider are expected to support all algorithms.
diff --git a/net/test/keychain_test_util_mac.cc b/net/test/keychain_test_util_mac.cc deleted file mode 100644 index 48b50db..0000000 --- a/net/test/keychain_test_util_mac.cc +++ /dev/null
@@ -1,116 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/test/keychain_test_util_mac.h" - -#include <Security/SecCertificate.h> -#include <Security/SecImportExport.h> - -#include "base/mac/mac_logging.h" -#include "net/cert/x509_util_apple.h" -#include "third_party/boringssl/src/include/openssl/bytestring.h" -#include "third_party/boringssl/src/include/openssl/ec_key.h" -#include "third_party/boringssl/src/include/openssl/evp.h" -#include "third_party/boringssl/src/include/openssl/mem.h" -#include "third_party/boringssl/src/include/openssl/rsa.h" - -namespace net { - -namespace { - -base::ScopedCFTypeRef<SecIdentityRef> GetSecIdentityRefForCertificate( - SecCertificateRef cert, - SecKeychainRef keychain) { - OSStatus status; - base::ScopedCFTypeRef<SecIdentityRef> identity; - status = SecIdentityCreateWithCertificate(keychain, cert, - identity.InitializeInto()); - if (status != noErr) { - OSSTATUS_LOG(WARNING, status); - return base::ScopedCFTypeRef<SecIdentityRef>(); - } - return identity; -} - -} // namespace - -ScopedTestKeychain::ScopedTestKeychain() = default; -ScopedTestKeychain::~ScopedTestKeychain() = default; - -// Much of the Keychain API was marked deprecated as of the macOS 13 SDK. -// Removal of its use is tracked in https://crbug.com/1348251 but deprecation -// warnings are disabled in the meanwhile. -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - -bool ScopedTestKeychain::Initialize() { - if (!keychain_dir_.CreateUniqueTempDir()) - return false; - base::FilePath keychain_path = - keychain_dir_.GetPath().AppendASCII("test_keychain.keychain"); - return SecKeychainCreate(keychain_path.value().c_str(), 0, "", FALSE, nullptr, - keychain_.InitializeInto()) == noErr; -} - -#pragma clang diagnostic pop - -base::ScopedCFTypeRef<SecIdentityRef> ImportCertAndKeyToKeychain( - const X509Certificate* cert, - const std::string pkcs8, - SecKeychainRef keychain) { - // Insert the certificate into the keychain. - base::ScopedCFTypeRef<SecCertificateRef> sec_cert( - x509_util::CreateSecCertificateFromX509Certificate(cert)); - if (!sec_cert) - return base::ScopedCFTypeRef<SecIdentityRef>(); - if (noErr != SecCertificateAddToKeychain(sec_cert, keychain)) - return base::ScopedCFTypeRef<SecIdentityRef>(); - - // Import the key into the keychain. Apple doesn't accept unencrypted PKCS#8, - // but it accepts the low-level RSAPrivateKey and ECPrivateKey types as - // "kSecFormatOpenSSL", so produce those. There doesn't appear to be a way to - // tell it which key type we have, so leave this unspecified and have it - // guess. - CBS cbs; - CBS_init(&cbs, reinterpret_cast<const uint8_t*>(pkcs8.data()), pkcs8.size()); - bssl::UniquePtr<EVP_PKEY> openssl_key(EVP_parse_private_key(&cbs)); - if (!openssl_key || CBS_len(&cbs) != 0) - return base::ScopedCFTypeRef<SecIdentityRef>(); - - bssl::ScopedCBB cbb; - if (!CBB_init(cbb.get(), 0)) - return base::ScopedCFTypeRef<SecIdentityRef>(); - if (EVP_PKEY_id(openssl_key.get()) == EVP_PKEY_RSA) { - if (!RSA_marshal_private_key(cbb.get(), - EVP_PKEY_get0_RSA(openssl_key.get()))) - return base::ScopedCFTypeRef<SecIdentityRef>(); - } else if (EVP_PKEY_id(openssl_key.get()) == EVP_PKEY_EC) { - if (!EC_KEY_marshal_private_key(cbb.get(), - EVP_PKEY_get0_EC_KEY(openssl_key.get()), 0)) - return base::ScopedCFTypeRef<SecIdentityRef>(); - } else { - return base::ScopedCFTypeRef<SecIdentityRef>(); - } - - uint8_t* encoded; - size_t encoded_len; - if (!CBB_finish(cbb.get(), &encoded, &encoded_len)) - return base::ScopedCFTypeRef<SecIdentityRef>(); - bssl::UniquePtr<uint8_t> scoped_encoded(encoded); - - base::ScopedCFTypeRef<CFDataRef> encoded_ref( - CFDataCreate(kCFAllocatorDefault, encoded, encoded_len)); - SecExternalFormat format = kSecFormatOpenSSL; - SecExternalItemType item_type = kSecItemTypePrivateKey; - if (noErr != SecItemImport(encoded_ref, nullptr, &format, &item_type, 0, - nullptr, keychain, nullptr)) { - return base::ScopedCFTypeRef<SecIdentityRef>(); - } - - base::ScopedCFTypeRef<SecIdentityRef> sec_identity = - GetSecIdentityRefForCertificate(sec_cert, keychain); - return sec_identity; -} - -} // namespace net
diff --git a/net/test/keychain_test_util_mac.h b/net/test/keychain_test_util_mac.h deleted file mode 100644 index 6e49947..0000000 --- a/net/test/keychain_test_util_mac.h +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef NET_TEST_KEYCHAIN_TEST_UTIL_MAC_H_ -#define NET_TEST_KEYCHAIN_TEST_UTIL_MAC_H_ - -#include <Security/SecKeychain.h> - -#include <string> - -#include "base/files/scoped_temp_dir.h" -#include "base/mac/scoped_cftyperef.h" - -namespace net { - -class X509Certificate; - -// Manages a temporary keychain. -class ScopedTestKeychain { - public: - ScopedTestKeychain(); - ~ScopedTestKeychain(); - - // Initializes the temp dir and keychain, returning true on success. - bool Initialize(); - - // Returns the SecKeychainRef. Initialize() must have been called first. - SecKeychainRef keychain() const { return keychain_.get(); } - - private: - base::ScopedTempDir keychain_dir_; - base::ScopedCFTypeRef<SecKeychainRef> keychain_; -}; - -// Import the |cert| and matching key in unencrypted |pkcs8| into |keychain| -// and return the SecIdentityRef for |cert| and its key. -base::ScopedCFTypeRef<SecIdentityRef> ImportCertAndKeyToKeychain( - const X509Certificate* cert, - const std::string pkcs8, - SecKeychainRef keychain); - -} // namespace net - -#endif // NET_TEST_KEYCHAIN_TEST_UTIL_MAC_H_
diff --git a/services/audio/public/cpp/audio_system_to_service_adapter.cc b/services/audio/public/cpp/audio_system_to_service_adapter.cc index 5217a051..5396a20 100644 --- a/services/audio/public/cpp/audio_system_to_service_adapter.cc +++ b/services/audio/public/cpp/audio_system_to_service_adapter.cc
@@ -8,7 +8,7 @@ #include "base/bind.h" #include "base/check_op.h" -#include "base/metrics/histogram_macros.h" +#include "base/metrics/histogram_functions.h" #include "base/notreached.h" #include "base/trace_event/trace_event.h" #include "media/audio/audio_device_description.h" @@ -180,6 +180,11 @@ name, start_time, std::move(on_input_device_info_callback)); } +void ReportGetDeviceDescriptionResult(bool success) { + base::UmaHistogramBoolean("Media.AudioSystem.GetDeviceDescription.Result", + success); +} + } // namespace AudioSystemToServiceAdapter::AudioSystemToServiceAdapter( @@ -240,16 +245,23 @@ void AudioSystemToServiceAdapter::GetDeviceDescriptions( bool for_input, OnDeviceDescriptionsCallback on_descriptions_callback) { + base::OnceCallback reporting_wrapped_callback = base::BindOnce( + [](OnDeviceDescriptionsCallback cb, bool success, + media::AudioDeviceDescriptions descriptions) { + ReportGetDeviceDescriptionResult(success); + WrapCallbackWithDeviceNameLocalization(std::move(cb)) + .Run(std::move(descriptions)); + }, + std::move(on_descriptions_callback)); auto reply_callback = mojo::WrapCallbackWithDefaultInvokeIfNotRun( - WrapCallbackWithDeviceNameLocalization( - std::move(on_descriptions_callback)), - media::AudioDeviceDescriptions()); + std::move(reporting_wrapped_callback), + /*success=*/false, media::AudioDeviceDescriptions()); if (for_input) - GetSystemInfo()->GetInputDeviceDescriptions( - WrapGetDeviceDescriptionsReply(kInput, std::move(reply_callback))); + GetSystemInfo()->GetInputDeviceDescriptions(WrapGetDeviceDescriptionsReply( + kInput, base::BindOnce(std::move(reply_callback), /*success=*/true))); else - GetSystemInfo()->GetOutputDeviceDescriptions( - WrapGetDeviceDescriptionsReply(kOutput, std::move(reply_callback))); + GetSystemInfo()->GetOutputDeviceDescriptions(WrapGetDeviceDescriptionsReply( + kOutput, base::BindOnce(std::move(reply_callback), /*success=*/true))); } void AudioSystemToServiceAdapter::GetAssociatedOutputDeviceID(
diff --git a/services/network/public/cpp/client_hints.cc b/services/network/public/cpp/client_hints.cc index b82d434..7481a8a 100644 --- a/services/network/public/cpp/client_hints.cc +++ b/services/network/public/cpp/client_hints.cc
@@ -8,11 +8,13 @@ #include <vector> #include "base/cxx17_backports.h" +#include "base/metrics/histogram_functions.h" #include "base/no_destructor.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/string_tokenizer.h" #include "base/strings/string_util.h" +#include "base/time/time.h" #include "net/http/structured_headers.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" @@ -202,4 +204,14 @@ } } +// static +void LogClientHintsPersistenceMetrics( + const base::TimeTicks& persistence_started, + std::size_t hints_stored) { + base::UmaHistogramTimes("ClientHints.StoreLatency", + base::TimeTicks::Now() - persistence_started); + base::UmaHistogramExactLinear("ClientHints.UpdateEventCount", 1, 2); + base::UmaHistogramCounts100("ClientHints.UpdateSize", hints_stored); +} + } // namespace network
diff --git a/services/network/public/cpp/client_hints.h b/services/network/public/cpp/client_hints.h index fac73b3..ec8f7c0 100644 --- a/services/network/public/cpp/client_hints.h +++ b/services/network/public/cpp/client_hints.h
@@ -90,6 +90,12 @@ ParseClientHintToDelegatedThirdPartiesHeader(const std::string& header, MetaCHType type); +// This is used by subclassed of ClientHintsControllerDelegate to track the +// amount of time that persisting client hints takes. +void COMPONENT_EXPORT(NETWORK_CPP) + LogClientHintsPersistenceMetrics(const base::TimeTicks& persistence_started, + std::size_t hints_stored); + } // namespace network #endif // SERVICES_NETWORK_PUBLIC_CPP_CLIENT_HINTS_H_
diff --git a/services/video_capture/public/mojom/multi_capture_service.mojom b/services/video_capture/public/mojom/multi_capture_service.mojom index 4b20192..38540a4 100644 --- a/services/video_capture/public/mojom/multi_capture_service.mojom +++ b/services/video_capture/public/mojom/multi_capture_service.mojom
@@ -10,7 +10,7 @@ // browser process and ash to inform about new / ending // multi capture events so that appropriate usage indicators can // be shown to the users. -[EnableIf=is_chromeos_ash] +[EnableIf=is_chromeos] interface MultiCaptureService { // Adds an observer for multi capture events. AddObserver(pending_remote<MultiCaptureServiceClient> observer); @@ -18,7 +18,7 @@ // The MultiCaptureServiceClient is used to receive new / ending multi // capture events in ash. -[EnableIf=is_chromeos_ash] +[EnableIf=is_chromeos] interface MultiCaptureServiceClient { // Called when a new multi capture is started. This event provides a unique // label and the origin that triggered the capture.
diff --git a/storage/browser/file_system/obfuscated_file_util.cc b/storage/browser/file_system/obfuscated_file_util.cc index fa2d72b..a8584d5 100644 --- a/storage/browser/file_system/obfuscated_file_util.cc +++ b/storage/browser/file_system/obfuscated_file_util.cc
@@ -921,9 +921,12 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // A default bucket in a first-party context uses // GetDirectoryForStorageKeyAndType() to determine its file path. - if (bucket.storage_key.IsFirstPartyContext() && bucket.is_default) { + // In tests, `sandbox_delegate_->quota_manager_proxy()` may be null. + if ((bucket.storage_key.IsFirstPartyContext() && bucket.is_default) || + !sandbox_delegate_->quota_manager_proxy()) { return GetDirectoryForStorageKeyAndType(bucket.storage_key, type, create); } + // All other contexts use the provided bucket information to construct the // file path. base::FilePath path =
diff --git a/styleguide/c++/c++.md b/styleguide/c++/c++.md index dd4ed29..4a0709ad 100644 --- a/styleguide/c++/c++.md +++ b/styleguide/c++/c++.md
@@ -304,8 +304,9 @@ following: ```c++ DCHECK(foo); - if (!foo) // Eliminate this code. + if (!foo) { // Eliminate this code. ... + } if (!bar) { // Replace this whole conditional with "DCHECK(bar);". NOTREACHED();
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 5686e3b..2e6d43e3 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -5774,9 +5774,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "isolate_profile_data": true, "merge": { "args": [], @@ -5788,8 +5788,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "dimension_sets": [ @@ -5945,9 +5945,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "isolate_profile_data": true, "merge": { "args": [], @@ -5959,8 +5959,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "dimension_sets": [ @@ -6097,9 +6097,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "isolate_profile_data": true, "merge": { "args": [], @@ -6111,8 +6111,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 14fff1be..e982f6c 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -85321,9 +85321,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "isolate_profile_data": true, "merge": { "args": [], @@ -85335,8 +85335,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -85462,9 +85462,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "isolate_profile_data": true, "merge": { "args": [], @@ -85476,8 +85476,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -85589,9 +85589,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "isolate_profile_data": true, "merge": { "args": [], @@ -85603,8 +85603,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -86937,9 +86937,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -86950,8 +86950,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "dimension_sets": [ @@ -87108,9 +87108,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -87121,8 +87121,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "dimension_sets": [ @@ -87260,9 +87260,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -87273,8 +87273,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "dimension_sets": [ @@ -88798,9 +88798,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -88811,8 +88811,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "dimension_sets": [ @@ -88969,9 +88969,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -88982,8 +88982,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "dimension_sets": [ @@ -89121,9 +89121,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -89134,8 +89134,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "dimension_sets": [ @@ -89907,9 +89907,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -89920,8 +89920,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.memory.fyi.json b/testing/buildbot/chromium.memory.fyi.json index e657def4..b09b892 100644 --- a/testing/buildbot/chromium.memory.fyi.json +++ b/testing/buildbot/chromium.memory.fyi.json
@@ -1582,669 +1582,6 @@ "test": "zlib_unittests", "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/" } - ], - "isolated_scripts": [ - { - "isolate_name": "blink_python_tests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "blink_python_tests", - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://:blink_python_tests/" - }, - { - "isolate_name": "blink_pytype", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "blink_pytype", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://third_party/blink/tools:blink_pytype/" - }, - { - "args": [ - "--num-retries=3", - "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", - "--git-revision=${got_revision}" - ], - "check_flakiness_for_new_tests": false, - "isolate_name": "blink_web_tests", - "isolate_profile_data": true, - "merge": { - "args": [ - "--verbose" - ], - "script": "//third_party/blink/tools/merge_web_test_results.py" - }, - "name": "blink_web_tests", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true - }, - "results_handler": "layout tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 5 - }, - "test_id_prefix": "ninja://:blink_web_tests/" - }, - { - "args": [ - "--num-retries=3", - "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", - "--git-revision=${got_revision}" - ], - "check_flakiness_for_new_tests": false, - "isolate_name": "blink_wpt_tests", - "isolate_profile_data": true, - "merge": { - "args": [ - "--verbose" - ], - "script": "//third_party/blink/tools/merge_web_test_results.py" - }, - "name": "blink_wpt_tests", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true - }, - "results_handler": "layout tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 7 - }, - "test_id_prefix": "ninja://:blink_wpt_tests/" - }, - { - "args": [ - "--test-type=integration" - ], - "check_flakiness_for_new_tests": false, - "isolate_name": "chromedriver_py_tests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "chromedriver_py_tests", - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_py_tests/" - }, - { - "isolate_name": "chromedriver_replay_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "chromedriver_replay_unittests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_replay_unittests/" - }, - { - "isolate_name": "content_shell_crash_test", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "content_shell_crash_test", - "resultdb": { - "enable": true, - "result_format": "single" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://content/shell:content_shell_crash_test/" - }, - { - "isolate_name": "flatbuffers_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "flatbuffers_unittests", - "resultdb": { - "enable": true, - "result_format": "single" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://third_party/flatbuffers:flatbuffers_unittests/" - }, - { - "isolate_name": "fuchsia_pytype", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "fuchsia_pytype", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://testing:fuchsia_pytype/" - }, - { - "isolate_name": "gold_common_pytype", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gold_common_pytype", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://build:gold_common_pytype/" - }, - { - "isolate_name": "gpu_pytype", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "gpu_pytype", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://content/test:gpu_pytype/" - }, - { - "isolate_name": "grit_python_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "grit_python_unittests", - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://tools/grit:grit_python_unittests/" - }, - { - "args": [ - "--flag-specific=highdpi", - "--skipped=always", - "--num-retries=3", - "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", - "--git-revision=${got_revision}" - ], - "check_flakiness_for_new_tests": false, - "isolate_name": "blink_web_tests", - "isolate_profile_data": true, - "merge": { - "args": [ - "--verbose" - ], - "script": "//third_party/blink/tools/merge_web_test_results.py" - }, - "name": "high_dpi_blink_web_tests", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true - }, - "results_handler": "layout tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://:blink_web_tests/" - }, - { - "args": [ - "--flag-specific=highdpi", - "--skipped=always", - "--num-retries=3", - "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", - "--git-revision=${got_revision}" - ], - "check_flakiness_for_new_tests": false, - "isolate_name": "blink_wpt_tests", - "isolate_profile_data": true, - "merge": { - "args": [ - "--verbose" - ], - "script": "//third_party/blink/tools/merge_web_test_results.py" - }, - "name": "high_dpi_blink_wpt_tests", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true - }, - "results_handler": "layout tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test_id_prefix": "ninja://:blink_wpt_tests/" - }, - { - "isolate_name": "mojo_python_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "mojo_python_unittests", - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://mojo/public/tools:mojo_python_unittests/" - }, - { - "args": [ - "--flag-specific=disable-site-isolation-trials", - "--num-retries=3", - "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", - "--git-revision=${got_revision}" - ], - "check_flakiness_for_new_tests": false, - "isolate_name": "blink_web_tests", - "isolate_profile_data": true, - "merge": { - "args": [ - "--verbose" - ], - "script": "//third_party/blink/tools/merge_web_test_results.py" - }, - "name": "not_site_per_process_blink_web_tests", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true - }, - "results_handler": "layout tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 8 - }, - "test_id_prefix": "ninja://:blink_web_tests/" - }, - { - "args": [ - "--flag-specific=disable-site-isolation-trials", - "--num-retries=3", - "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", - "--git-revision=${got_revision}" - ], - "check_flakiness_for_new_tests": false, - "isolate_name": "blink_wpt_tests", - "isolate_profile_data": true, - "merge": { - "args": [ - "--verbose" - ], - "script": "//third_party/blink/tools/merge_web_test_results.py" - }, - "name": "not_site_per_process_blink_wpt_tests", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true - }, - "results_handler": "layout tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 10 - }, - "test_id_prefix": "ninja://:blink_wpt_tests/" - }, - { - "isolate_name": "telemetry_gpu_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "telemetry_gpu_unittests", - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_unittests/" - }, - { - "args": [ - "--extra-browser-args=--enable-crashpad" - ], - "isolate_name": "telemetry_perf_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "telemetry_perf_unittests", - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 12 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests/" - }, - { - "args": [ - "--jobs=1", - "--extra-browser-args=--disable-gpu" - ], - "isolate_name": "telemetry_unittests", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "telemetry_unittests", - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 8 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_unittests/" - }, - { - "isolate_name": "testing_pytype", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "testing_pytype", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://testing:testing_pytype/" - }, - { - "args": [ - "--gtest-benchmark-name=views_perftests" - ], - "isolate_name": "views_perftests", - "isolate_profile_data": true, - "merge": { - "args": [ - "--smoke-test-mode" - ], - "script": "//tools/perf/process_perf_results.py" - }, - "name": "views_perftests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://ui/views:views_perftests/" - }, - { - "args": [ - "--num-retries=3", - "--skipped=always", - "--flag-specific=skia-vulkan-swiftshader", - "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", - "--git-revision=${got_revision}" - ], - "check_flakiness_for_new_tests": false, - "isolate_name": "blink_web_tests", - "isolate_profile_data": true, - "merge": { - "args": [ - "--verbose" - ], - "script": "//third_party/blink/tools/merge_web_test_results.py" - }, - "name": "vulkan_swiftshader_blink_web_tests", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true - }, - "results_handler": "layout tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://:blink_web_tests/" - }, - { - "isolate_name": "webdriver_wpt_tests", - "isolate_profile_data": true, - "merge": { - "args": [ - "--verbose" - ], - "script": "//third_party/blink/tools/merge_web_test_results.py" - }, - "name": "webdriver_tests_suite", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 4 - }, - "test_id_prefix": "ninja://:webdriver_wpt_tests/" - } ] } }
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index d7020fd5..97cd169 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -18656,12 +18656,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "isolate_profile_data": true, "merge": { "args": [], @@ -18673,8 +18673,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "dimension_sets": [ @@ -18847,12 +18847,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "isolate_profile_data": true, "merge": { "args": [], @@ -18864,8 +18864,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "dimension_sets": [ @@ -19014,12 +19014,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 110.0.5475.0", + "description": "Run with ash-chrome version 110.0.5476.0", "isolate_profile_data": true, "merge": { "args": [], @@ -19031,8 +19031,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v110.0.5475.0", - "revision": "version:110.0.5475.0" + "location": "lacros_version_skew_tests_v110.0.5476.0", + "revision": "version:110.0.5476.0" } ], "dimension_sets": [
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index 55d7ab1..487107be 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -22,16 +22,16 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5475.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v110.0.5476.0/test_ash_chrome', ], - 'description': 'Run with ash-chrome version 110.0.5475.0', + 'description': 'Run with ash-chrome version 110.0.5476.0', 'identifier': 'Lacros version skew testing ash canary', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v110.0.5475.0', - 'revision': 'version:110.0.5475.0', + 'location': 'lacros_version_skew_tests_v110.0.5476.0', + 'revision': 'version:110.0.5476.0', }, ], },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 5d343ee..22a220b 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -5236,7 +5236,6 @@ ], 'test_suites': { 'gtest_tests': 'chromium_linux_gtests', - 'isolated_scripts': 'chromium_linux_rel_isolated_scripts', }, }, },
diff --git a/testing/scripts/run_performance_tests.py b/testing/scripts/run_performance_tests.py index b7905ac8..2b09d2f 100755 --- a/testing/scripts/run_performance_tests.py +++ b/testing/scripts/run_performance_tests.py
@@ -345,7 +345,12 @@ traceback.print_exc() return_code = 1 if os.path.exists(output_paths.perf_results): - if command_generator.executable_name in GTEST_CONVERSION_WHITELIST: + executable_name = command_generator.executable_name + if executable_name.startswith('bin/run_'): + # The executable is a wrapper used by Fuchsia. Remove the prefix to get + # the actual executable name. + executable_name = executable_name[8:] + if executable_name in GTEST_CONVERSION_WHITELIST: with path_util.SysPath(path_util.GetTracingDir()): # pylint: disable=no-name-in-module,import-outside-toplevel from tracing.value import gtest_json_converter
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 3e1b6c5..35fbde7b 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -1493,6 +1493,32 @@ ] } ], + "AutofillUseParameterizedSectioning": [ + { + "platforms": [ + "android", + "chromeos", + "chromeos_lacros", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "NoParameters", + "params": { + "create_gaps": "false", + "expand_assigned_sections": "false", + "ignore_autocomplete": "false" + }, + "enable_features": [ + "AutofillUseParameterizedSectioning" + ] + } + ] + } + ], "AutomaticLazyFrameLoading": [ { "platforms": [ @@ -2090,21 +2116,6 @@ ] } ], - "CacheFeatureOverrideState": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "CacheFeatureOverrideState" - ] - } - ] - } - ], "CacheFontFamilyMatching": [ { "platforms": [ @@ -2957,39 +2968,6 @@ ] } ], - "CombinedPowerExperiment": [ - { - "platforms": [ - "android", - "android_weblayer", - "chromeos", - "chromeos_lacros", - "fuchsia", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled_20221128", - "params": { - "delay": "30s" - }, - "enable_features": [ - "AlwaysAbandonScheduledTask", - "CacheFeatureOverrideState", - "DelayFirstParkingOfStrings", - "EarlyExitOnNoopClassOrStyleChange", - "MessagePumpMacDelayedWorkOptimizations", - "NoWakeUpsForCanceledTasks", - "ReduceCpuUtilization", - "RemoveCanceledTasksInTaskQueue2", - "V8DelayMemoryReducer" - ] - } - ] - } - ], "CommerceHintAndroid": [ { "platforms": [ @@ -3189,7 +3167,7 @@ "action_chip_time_ms": "6000", "action_chip_with_different_color": "false", "enable_ui": "true", - "reader_mode_session_rate_limiting": "false" + "reader_mode_session_rate_limiting": "true" }, "enable_features": [ "ContextualPageActionPriceTracking", @@ -4366,21 +4344,6 @@ ] } ], - "EarlyExitOnNoopClassOrStyleChange": [ - { - "platforms": [ - "android_webview" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "EarlyExitOnNoopClassOrStyleChange" - ] - } - ] - } - ], "EcheSWA": [ { "platforms": [ @@ -7102,22 +7065,6 @@ ] } ], - "NoWakeUpsForCanceledTasks": [ - { - "platforms": [ - "android_webview", - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "NoWakeUpsForCanceledTasks" - ] - } - ] - } - ], "NoWorkerThreadReclaim": [ { "platforms": [ @@ -7197,6 +7144,25 @@ ] } ], + "NtpComprehensiveTheming": [ + { + "platforms": [ + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled_20221129", + "enable_features": [ + "NtpComprehensiveTheming" + ] + } + ] + } + ], "NtpRealboxRundedCorners": [ { "platforms": [ @@ -8964,6 +8930,21 @@ ] } ], + "PrivacyIndicators": [ + { + "platforms": [ + "chromeos" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "PrivacyIndicators" + ] + } + ] + } + ], "PrivacySandboxV3": [ { "platforms": [ @@ -9389,21 +9370,6 @@ ] } ], - "ReduceCpuUtilization": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "ReduceCpuUtilization" - ] - } - ] - } - ], "ReduceOpsTaskSplitting": [ { "platforms": [ @@ -9497,23 +9463,6 @@ ] } ], - "RemoveCanceledTasksInTaskQueue2": [ - { - "platforms": [ - "android_webview", - "ios" - ], - "experiments": [ - { - "name": "RemoveCanceledTasksInTaskQueue2", - "enable_features": [ - "AlwaysAbandonScheduledTask", - "RemoveCanceledTasksInTaskQueue2" - ] - } - ] - } - ], "RemoveIOSPowerEventNotifications": [ { "platforms": [ @@ -11769,24 +11718,6 @@ ] } ], - "V8DelayMemoryReducer": [ - { - "platforms": [ - "android_webview" - ], - "experiments": [ - { - "name": "Enabled", - "params": { - "delay": "30s" - }, - "enable_features": [ - "V8DelayMemoryReducer" - ] - } - ] - } - ], "V8FlushBaselineCode": [ { "platforms": [ @@ -12930,21 +12861,6 @@ ] } ], - "WebViewMeasureScreenCoverage": [ - { - "platforms": [ - "android_webview" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "WebViewMeasureScreenCoverage" - ] - } - ] - } - ], "WebViewRecordAppDataDirectorySize": [ { "platforms": [
diff --git a/third_party/blink/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.cc b/third_party/blink/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.cc index 1458ff0..dd51bfcf 100644 --- a/third_party/blink/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.cc +++ b/third_party/blink/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.cc
@@ -183,6 +183,71 @@ } // static +bool UnionTraits<blink::mojom::PotentiallyOpaqueSizeDataView, Prop<gfx::Size>>:: + Read(blink::mojom::PotentiallyOpaqueSizeDataView data, + Prop<gfx::Size>* out) { + switch (data.tag()) { + case blink::mojom::PotentiallyOpaqueSizeDataView::Tag::kTransparent: { + gfx::Size size; + if (!data.ReadTransparent(&size)) + return false; + out->potentially_opaque_value.emplace(std::move(size)); + return true; + } + case blink::mojom::PotentiallyOpaqueSizeDataView::Tag::kOpaque: { + blink::FencedFrame::Opaque opaque; + if (!data.ReadOpaque(&opaque)) + return false; + return true; + } + } + NOTREACHED(); + return false; +} + +// static +blink::mojom::PotentiallyOpaqueSizeDataView::Tag +UnionTraits<blink::mojom::PotentiallyOpaqueSizeDataView, + Prop<gfx::Size>>::GetTag(const Prop<gfx::Size>& property) { + if (property.potentially_opaque_value.has_value()) { + return blink::mojom::PotentiallyOpaqueSizeDataView::Tag::kTransparent; + } + + return blink::mojom::PotentiallyOpaqueSizeDataView::Tag::kOpaque; +} + +// static +bool UnionTraits<blink::mojom::PotentiallyOpaqueBoolDataView, Prop<bool>>::Read( + blink::mojom::PotentiallyOpaqueBoolDataView data, + Prop<bool>* out) { + switch (data.tag()) { + case blink::mojom::PotentiallyOpaqueBoolDataView::Tag::kTransparent: { + out->potentially_opaque_value.emplace(data.transparent()); + return true; + } + case blink::mojom::PotentiallyOpaqueBoolDataView::Tag::kOpaque: { + blink::FencedFrame::Opaque opaque; + if (!data.ReadOpaque(&opaque)) + return false; + return true; + } + } + NOTREACHED(); + return false; +} + +// static +blink::mojom::PotentiallyOpaqueBoolDataView::Tag +UnionTraits<blink::mojom::PotentiallyOpaqueBoolDataView, Prop<bool>>::GetTag( + const Prop<bool>& property) { + if (property.potentially_opaque_value.has_value()) { + return blink::mojom::PotentiallyOpaqueBoolDataView::Tag::kTransparent; + } + + return blink::mojom::PotentiallyOpaqueBoolDataView::Tag::kOpaque; +} + +// static bool UnionTraits<blink::mojom::PotentiallyOpaqueAdAuctionDataDataView, Prop<blink::FencedFrame::AdAuctionData>>:: Read(blink::mojom::PotentiallyOpaqueAdAuctionDataDataView data, @@ -352,6 +417,10 @@ Read(blink::mojom::FencedFrameConfigDataView data, blink::FencedFrame::RedactedFencedFrameConfig* out_config) { if (!data.ReadMappedUrl(&out_config->mapped_url_) || + !data.ReadContentSize(&out_config->content_size_) || + !data.ReadContainerSize(&out_config->container_size_) || + !data.ReadDeprecatedShouldFreezeInitialSize( + &out_config->deprecated_should_freeze_initial_size_) || !data.ReadAdAuctionData(&out_config->ad_auction_data_) || !data.ReadNestedConfigs(&out_config->nested_configs_) || !data.ReadSharedStorageBudgetMetadata( @@ -393,6 +462,10 @@ blink::FencedFrame::RedactedFencedFrameProperties* out_properties) { blink::mojom::PotentiallyOpaqueURNConfigVectorPtr nested_urn_config_pairs; if (!data.ReadMappedUrl(&out_properties->mapped_url_) || + !data.ReadContentSize(&out_properties->content_size_) || + !data.ReadContainerSize(&out_properties->container_size_) || + !data.ReadDeprecatedShouldFreezeInitialSize( + &out_properties->deprecated_should_freeze_initial_size_) || !data.ReadAdAuctionData(&out_properties->ad_auction_data_) || !data.ReadNestedUrnConfigPairs(&nested_urn_config_pairs) || !data.ReadSharedStorageBudgetMetadata(
diff --git a/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h b/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h index 976ee35f..e359409e 100644 --- a/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h +++ b/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h
@@ -15,6 +15,7 @@ #include "third_party/blink/public/common/common_export.h" #include "third_party/blink/public/mojom/fenced_frame/fenced_frame.mojom.h" #include "third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom-forward.h" +#include "ui/gfx/geometry/size.h" #include "url/gurl.h" #include "url/origin.h" @@ -99,6 +100,18 @@ const absl::optional<RedactedFencedFrameProperty<GURL>>& mapped_url() const { return mapped_url_; } + const absl::optional<RedactedFencedFrameProperty<gfx::Size>>& container_size() + const { + return container_size_; + } + const absl::optional<RedactedFencedFrameProperty<gfx::Size>>& content_size() + const { + return content_size_; + } + const absl::optional<RedactedFencedFrameProperty<bool>>& + deprecated_should_freeze_initial_size() const { + return deprecated_should_freeze_initial_size_; + } const absl::optional<RedactedFencedFrameProperty<AdAuctionData>>& ad_auction_data() const { return ad_auction_data_; @@ -129,6 +142,10 @@ absl::optional<GURL> urn_; absl::optional<RedactedFencedFrameProperty<GURL>> mapped_url_; + absl::optional<RedactedFencedFrameProperty<gfx::Size>> container_size_; + absl::optional<RedactedFencedFrameProperty<gfx::Size>> content_size_; + absl::optional<RedactedFencedFrameProperty<bool>> + deprecated_should_freeze_initial_size_; absl::optional<RedactedFencedFrameProperty<AdAuctionData>> ad_auction_data_; absl::optional< RedactedFencedFrameProperty<std::vector<RedactedFencedFrameConfig>>> @@ -153,6 +170,18 @@ const absl::optional<RedactedFencedFrameProperty<GURL>>& mapped_url() const { return mapped_url_; } + const absl::optional<RedactedFencedFrameProperty<gfx::Size>>& container_size() + const { + return container_size_; + } + const absl::optional<RedactedFencedFrameProperty<gfx::Size>>& content_size() + const { + return content_size_; + } + const absl::optional<RedactedFencedFrameProperty<bool>>& + deprecated_should_freeze_initial_size() const { + return deprecated_should_freeze_initial_size_; + } const absl::optional<RedactedFencedFrameProperty<AdAuctionData>>& ad_auction_data() const { return ad_auction_data_; @@ -183,6 +212,10 @@ absl::optional<GURL> urn_; absl::optional<RedactedFencedFrameProperty<GURL>> mapped_url_; + absl::optional<RedactedFencedFrameProperty<gfx::Size>> container_size_; + absl::optional<RedactedFencedFrameProperty<gfx::Size>> content_size_; + absl::optional<RedactedFencedFrameProperty<bool>> + deprecated_should_freeze_initial_size_; absl::optional<RedactedFencedFrameProperty<AdAuctionData>> ad_auction_data_; absl::optional<RedactedFencedFrameProperty< std::vector<std::pair<GURL, RedactedFencedFrameConfig>>>>
diff --git a/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h b/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h index 0469dbb2..48a6443 100644 --- a/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h +++ b/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h
@@ -74,9 +74,6 @@ template <> class BLINK_COMMON_EXPORT UnionTraits<blink::mojom::PotentiallyOpaqueURLDataView, Prop<GURL>> { - template <typename T> - using Prop = Prop<T>; - public: static const GURL& transparent(const Prop<GURL>& mapped_url) { return *mapped_url.potentially_opaque_value; @@ -94,6 +91,42 @@ template <> class BLINK_COMMON_EXPORT + UnionTraits<blink::mojom::PotentiallyOpaqueSizeDataView, Prop<gfx::Size>> { + public: + static const gfx::Size& transparent(const Prop<gfx::Size>& size) { + return *size.potentially_opaque_value; + } + static blink::FencedFrame::Opaque opaque(const Prop<gfx::Size>&) { + return blink::FencedFrame::Opaque::kOpaque; + } + + static bool Read(blink::mojom::PotentiallyOpaqueSizeDataView data, + Prop<gfx::Size>* out); + + static blink::mojom::PotentiallyOpaqueSizeDataView::Tag GetTag( + const Prop<gfx::Size>& size); +}; + +template <> +class BLINK_COMMON_EXPORT + UnionTraits<blink::mojom::PotentiallyOpaqueBoolDataView, Prop<bool>> { + public: + static const bool& transparent(const Prop<bool>& flag) { + return *flag.potentially_opaque_value; + } + static blink::FencedFrame::Opaque opaque(const Prop<bool>&) { + return blink::FencedFrame::Opaque::kOpaque; + } + + static bool Read(blink::mojom::PotentiallyOpaqueBoolDataView data, + Prop<bool>* out); + + static blink::mojom::PotentiallyOpaqueBoolDataView::Tag GetTag( + const Prop<bool>& flag); +}; + +template <> +class BLINK_COMMON_EXPORT UnionTraits<blink::mojom::PotentiallyOpaqueAdAuctionDataDataView, Prop<blink::FencedFrame::AdAuctionData>> { public: @@ -194,6 +227,19 @@ const blink::FencedFrame::RedactedFencedFrameConfig& config) { return config.mapped_url_; } + static const absl::optional<Prop<gfx::Size>>& container_size( + const blink::FencedFrame::RedactedFencedFrameConfig& config) { + return config.container_size_; + } + static const absl::optional<Prop<gfx::Size>>& content_size( + const blink::FencedFrame::RedactedFencedFrameConfig& config) { + return config.content_size_; + } + static const absl::optional<Prop<bool>>& + deprecated_should_freeze_initial_size( + const blink::FencedFrame::RedactedFencedFrameConfig& config) { + return config.deprecated_should_freeze_initial_size_; + } static const absl::optional<Prop<blink::FencedFrame::AdAuctionData>>& ad_auction_data(const blink::FencedFrame::RedactedFencedFrameConfig& config) { return config.ad_auction_data_; @@ -227,6 +273,19 @@ const blink::FencedFrame::RedactedFencedFrameProperties& properties) { return properties.mapped_url_; } + static const absl::optional<Prop<gfx::Size>>& container_size( + const blink::FencedFrame::RedactedFencedFrameProperties& properties) { + return properties.container_size_; + } + static const absl::optional<Prop<gfx::Size>>& content_size( + const blink::FencedFrame::RedactedFencedFrameProperties& properties) { + return properties.content_size_; + } + static const absl::optional<Prop<bool>>& + deprecated_should_freeze_initial_size( + const blink::FencedFrame::RedactedFencedFrameProperties& properties) { + return properties.deprecated_should_freeze_initial_size_; + } static const absl::optional<Prop<blink::FencedFrame::AdAuctionData>>& ad_auction_data( const blink::FencedFrame::RedactedFencedFrameProperties& properties) {
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index 7e5e4d4..5be6aba 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn
@@ -613,6 +613,14 @@ cpp = "::blink::FencedFrame::RedactedFencedFrameProperty<GURL>" }, { + mojom = "blink.mojom.PotentiallyOpaqueSize" + cpp = "::blink::FencedFrame::RedactedFencedFrameProperty<::gfx::Size>" + }, + { + mojom = "blink.mojom.PotentiallyOpaqueBool" + cpp = "::blink::FencedFrame::RedactedFencedFrameProperty<bool>" + }, + { mojom = "blink.mojom.PotentiallyOpaqueAdAuctionData" cpp = "::blink::FencedFrame::RedactedFencedFrameProperty<::blink::FencedFrame::AdAuctionData>" },
diff --git a/third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom b/third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom index 0ba82bc6..853374e 100644 --- a/third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom +++ b/third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom
@@ -7,6 +7,7 @@ module blink.mojom; +import "ui/gfx/geometry/mojom/geometry.mojom"; import "url/mojom/url.mojom"; import "url/mojom/origin.mojom"; @@ -40,6 +41,16 @@ Opaque opaque; }; +union PotentiallyOpaqueSize { + gfx.mojom.Size transparent; + Opaque opaque; +}; + +union PotentiallyOpaqueBool { + bool transparent; + Opaque opaque; +}; + struct AdAuctionData { url.mojom.Origin interest_group_owner; string interest_group_name; @@ -96,6 +107,12 @@ struct FencedFrameConfig { PotentiallyOpaqueURL? mapped_url; + PotentiallyOpaqueSize? container_size; + + PotentiallyOpaqueSize? content_size; + + PotentiallyOpaqueBool? deprecated_should_freeze_initial_size; + PotentiallyOpaqueAdAuctionData? ad_auction_data; PotentiallyOpaqueConfigVector? nested_configs; @@ -120,6 +137,12 @@ struct FencedFrameProperties { PotentiallyOpaqueURL? mapped_url; + PotentiallyOpaqueSize? container_size; + + PotentiallyOpaqueSize? content_size; + + PotentiallyOpaqueBool? deprecated_should_freeze_initial_size; + PotentiallyOpaqueAdAuctionData? ad_auction_data; // If this is a navigation to the result of an InterestGroup auction, this
diff --git a/third_party/blink/renderer/bindings/bindings.gni b/third_party/blink/renderer/bindings/bindings.gni index 8caa3b3..13717ca0 100644 --- a/third_party/blink/renderer/bindings/bindings.gni +++ b/third_party/blink/renderer/bindings/bindings.gni
@@ -154,8 +154,6 @@ "core/v8/v8_initializer.h", "core/v8/v8_intersection_observer_delegate.cc", "core/v8/v8_intersection_observer_delegate.h", - "core/v8/v8_iterator_result_value.cc", - "core/v8/v8_iterator_result_value.h", "core/v8/v8_metrics.cc", "core/v8/v8_metrics.h", "core/v8/v8_object_builder.cc",
diff --git a/third_party/blink/renderer/bindings/core/v8/iterable.cc b/third_party/blink/renderer/bindings/core/v8/iterable.cc index 4325c23..aecffd1 100644 --- a/third_party/blink/renderer/bindings/core/v8/iterable.cc +++ b/third_party/blink/renderer/bindings/core/v8/iterable.cc
@@ -40,4 +40,26 @@ } } // namespace bindings + +bool V8UnpackIterationResult(ScriptState* script_state, + v8::Local<v8::Object> sync_iteration_result, + v8::Local<v8::Value>* out_value, + bool* out_done) { + v8::Isolate* isolate = script_state->GetIsolate(); + v8::Local<v8::Context> context = script_state->GetContext(); + v8::TryCatch try_block(isolate); + + if (!sync_iteration_result->Get(context, V8AtomicString(isolate, "value")) + .ToLocal(out_value)) { + return false; + } + v8::Local<v8::Value> done_value; + if (!sync_iteration_result->Get(context, V8AtomicString(isolate, "done")) + .ToLocal(&done_value)) { + return false; + } + *out_done = done_value->BooleanValue(isolate); + return true; +} + } // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/iterable.h b/third_party/blink/renderer/bindings/core/v8/iterable.h index f4584411..624e5c4 100644 --- a/third_party/blink/renderer/bindings/core/v8/iterable.h +++ b/third_party/blink/renderer/bindings/core/v8/iterable.h
@@ -7,8 +7,6 @@ #include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h" #include "third_party/blink/renderer/bindings/core/v8/v8_for_each_iterator_callback.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" -#include "third_party/blink/renderer/core/dom/iterator.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/sync_iterator_base.h" @@ -358,199 +356,13 @@ ExceptionState& exception_state) = 0; }; -// Typically, you should use PairIterable<> (below) instead. -// Also, note that value iterators are set up automatically by the bindings -// code and the operations below come directly from V8. -// KeyType and ValueType define the key and value types correspondingly. -// IDLKey and IDLValue only define the types of -// ToV8Traits<IDLKey>::ToV8 and ToV8Traits<IDLValue>::ToV8 converters. -template <typename KeyType, - typename IDLKeyType, - typename ValueType, - typename IDLValueType> -class Iterable { - public: - Iterator* keysForBinding(ScriptState* script_state, - ExceptionState& exception_state) { - IterationSource* source = StartIteration(script_state, exception_state); - if (!source) - return nullptr; - return MakeGarbageCollected<IterableIterator<KeySelector>>(source); - } - - Iterator* valuesForBinding(ScriptState* script_state, - ExceptionState& exception_state) { - IterationSource* source = StartIteration(script_state, exception_state); - if (!source) - return nullptr; - return MakeGarbageCollected<IterableIterator<ValueSelector>>(source); - } - - Iterator* entriesForBinding(ScriptState* script_state, - ExceptionState& exception_state) { - IterationSource* source = StartIteration(script_state, exception_state); - if (!source) - return nullptr; - return MakeGarbageCollected<IterableIterator<EntrySelector>>(source); - } - - void forEachForBinding(ScriptState* script_state, - const ScriptValue& this_value, - V8ForEachIteratorCallback* callback, - const ScriptValue& this_arg, - ExceptionState& exception_state) { - IterationSource* source = StartIteration(script_state, exception_state); - - v8::TryCatch try_catch(script_state->GetIsolate()); - - v8::Local<v8::Value> v8_callback_this_value = this_arg.V8Value(); - v8::Local<v8::Value> v8_value; - v8::Local<v8::Value> v8_key; - - while (true) { - KeyType key; - ValueType value; - - if (!source->Next(script_state, key, value, exception_state)) - break; - - DCHECK(!exception_state.HadException()); - - v8_value = - ToV8Traits<IDLValueType>::ToV8(script_state, value).ToLocalChecked(); - v8_key = ToV8Traits<IDLKeyType>::ToV8(script_state, key).ToLocalChecked(); - if (try_catch.HasCaught()) { - exception_state.RethrowV8Exception(try_catch.Exception()); - return; - } - - if (callback - ->Invoke(v8_callback_this_value, - ScriptValue(script_state->GetIsolate(), v8_value), - ScriptValue(script_state->GetIsolate(), v8_key), - this_value) - .IsNothing()) { - exception_state.RethrowV8Exception(try_catch.Exception()); - return; - } - } - } - - class IterationSource : public GarbageCollected<IterationSource> { - public: - virtual ~IterationSource() = default; - - // If end of iteration has been reached or an exception thrown: return - // false. Otherwise: set |key| and |value| and return true. - virtual bool Next(ScriptState*, KeyType&, ValueType&, ExceptionState&) = 0; - - virtual void Trace(Visitor* visitor) const {} - }; - - private: - virtual IterationSource* StartIteration(ScriptState*, ExceptionState&) = 0; - - struct KeySelector { - STATIC_ONLY(KeySelector); - static const KeyType& Select(ScriptState*, - const KeyType& key, - const ValueType& value) { - return key; - } - }; - struct ValueSelector { - STATIC_ONLY(ValueSelector); - static const ValueType& Select(ScriptState*, - const KeyType& key, - const ValueType& value) { - return value; - } - }; - struct EntrySelector { - STATIC_ONLY(EntrySelector); - static HeapVector<ScriptValue, 2> Select(ScriptState* script_state, - const KeyType& key, - const ValueType& value) { - v8::Local<v8::Object> creation_context = - script_state->GetContext()->Global(); - v8::Isolate* isolate = script_state->GetIsolate(); - - HeapVector<ScriptValue, 2> entry; - entry.push_back( - ScriptValue(isolate, ToV8(key, creation_context, isolate))); - entry.push_back( - ScriptValue(isolate, ToV8(value, creation_context, isolate))); - return entry; - } - }; - - template <typename Selector> - class IterableIterator final : public Iterator { - public: - explicit IterableIterator(IterationSource* source) : source_(source) {} - - ScriptValue next(ScriptState* script_state, - ExceptionState& exception_state) override { - KeyType key; - ValueType value; - - if (!source_->Next(script_state, key, value, exception_state)) - return V8IteratorResultDone(script_state); - - return V8IteratorResult(script_state, - Selector::Select(script_state, key, value)); - } - - ScriptValue next(ScriptState* script_state, - ScriptValue, - ExceptionState& exception_state) override { - return next(script_state, exception_state); - } - - void Trace(Visitor* visitor) const override { - visitor->Trace(source_); - Iterator::Trace(visitor); - } - - private: - Member<IterationSource> source_; - }; -}; - -// Utility mixin base-class for classes implementing IDL interfaces with -// "iterable<Key, IDLKey, Value, IDLValue>" or -// "maplike<Key, IDLKey, Value, IDLValue>". -// IDLKey and IDLValue define the types of ToV8Traits<IDLKey>::ToV8 and -// ToV8Traits<IDLValue>::ToV8 converters. -template <typename KeyType, - typename IDLKeyType, - typename ValueType, - typename IDLValueType> -class PairIterable - : public Iterable<KeyType, IDLKeyType, ValueType, IDLValueType> { - public: - Iterator* GetIterator(ScriptState* script_state, - ExceptionState& exception_state) { - return this->entriesForBinding(script_state, exception_state); - } -}; - -// Utility mixin base-class for classes implementing IDL interfaces with -// "setlike<V>" (not "iterable<V>"). -// IDL interfaces with "iterable<V>" (value iterators) inherit @@iterator, -// values(), entries(), keys() and forEach() from the %ArrayPrototype% -// intrinsic object automatically. -// IDLKey and IDLValue define the types of ToV8Traits<IDLKey>::ToV8 and -// ToV8Traits<IDLValue>::ToV8 converters. -template <typename ValueType, typename IDLValueType> -class SetlikeIterable - : public Iterable<ValueType, IDLValueType, ValueType, IDLValueType> { - public: - Iterator* GetIterator(ScriptState* script_state, - ExceptionState& exception_state) { - return this->valuesForBinding(script_state, exception_state); - } -}; +// Unpacks `sync_iteration_result`, stores 'value' and 'done' properties in +// `out_value` and 'out_done` respectively, and returns true on success. +[[nodiscard]] CORE_EXPORT bool V8UnpackIterationResult( + ScriptState* script_state, + v8::Local<v8::Object> sync_iteration_result, + v8::Local<v8::Value>* out_value, + bool* out_done); } // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/maplike.h b/third_party/blink/renderer/bindings/core/v8/maplike.h index 70b8a61..769f2a26 100644 --- a/third_party/blink/renderer/bindings/core/v8/maplike.h +++ b/third_party/blink/renderer/bindings/core/v8/maplike.h
@@ -6,8 +6,6 @@ #define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_MAPLIKE_H_ #include "third_party/blink/renderer/bindings/core/v8/iterable.h" -#include "third_party/blink/renderer/bindings/core/v8/script_value.h" -#include "third_party/blink/renderer/bindings/core/v8/to_v8_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h" namespace blink { @@ -59,48 +57,6 @@ typename PairSyncIterable<IDLInterface>::KeyType, typename PairSyncIterable<IDLInterface>::ValueType> {}; -// KeyType and ValueType define the key and value types correspondingly. -// IDLKey and IDLValue only define the types of -// ToV8Traits<[IDLKey,IDLValue]>::ToV8 converters. -template <typename KeyType, - typename IDLKeyType, - typename ValueType, - typename IDLValueType> -class Maplike - : public PairIterable<KeyType, IDLKeyType, ValueType, IDLValueType> { - public: - bool hasForBinding(ScriptState* script_state, - const KeyType& key, - ExceptionState& exception_state) { - ValueType value; - return GetMapEntry(script_state, key, value, exception_state); - } - - ScriptValue getForBinding(ScriptState* script_state, - const KeyType& key, - ExceptionState& exception_state) { - ValueType value; - if (GetMapEntry(script_state, key, value, exception_state)) - return ScriptValue(script_state->GetIsolate(), - ToV8(value, script_state->GetContext()->Global(), - script_state->GetIsolate())); - return ScriptValue(script_state->GetIsolate(), - v8::Undefined(script_state->GetIsolate())); - } - - private: - virtual bool GetMapEntry(ScriptState*, - const KeyType&, - ValueType&, - ExceptionState&) = 0; -}; - -// KeyType and ValueType define the key and value types correspondingly. -// IDLKey and IDLValue only define the types of -// ToV8Traits<[IDLKey,IDLValue]>::ToV8 converters. -template <typename KeyType, typename IDLKeyType> -class Setlike : public Maplike<KeyType, IDLKeyType, KeyType, IDLKeyType> {}; - } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_MAPLIKE_H_
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.cc b/third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.cc deleted file mode 100644 index 50cc0dd..0000000 --- a/third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.cc +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" - -#include "third_party/blink/renderer/bindings/core/v8/v8_object_builder.h" - -namespace blink { - -v8::Local<v8::Object> V8IteratorResultValue(ScriptState* script_state, - bool done, - v8::Local<v8::Value> value) { - if (value.IsEmpty()) - value = v8::Undefined(script_state->GetIsolate()); - return V8ObjectBuilder(script_state) - .Add("done", done) - .Add("value", value) - .V8Value(); -} - -v8::MaybeLocal<v8::Value> V8UnpackIteratorResult(ScriptState* script_state, - v8::Local<v8::Object> result, - bool* done) { - v8::MaybeLocal<v8::Value> maybe_value = - result->Get(script_state->GetContext(), - V8AtomicString(script_state->GetIsolate(), "value")); - if (maybe_value.IsEmpty()) - return maybe_value; - v8::Local<v8::Value> done_value; - if (!result - ->Get(script_state->GetContext(), - V8AtomicString(script_state->GetIsolate(), "done")) - .ToLocal(&done_value)) { - return v8::MaybeLocal<v8::Value>(); - } - *done = done_value->BooleanValue(script_state->GetIsolate()); - return maybe_value; -} - -} // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h b/third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h deleted file mode 100644 index 34c43d25f..0000000 --- a/third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ITERATOR_RESULT_VALUE_H_ -#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ITERATOR_RESULT_VALUE_H_ - -#include "third_party/blink/renderer/bindings/core/v8/script_value.h" -#include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h" -#include "third_party/blink/renderer/core/core_export.h" -#include "v8/include/v8.h" - -namespace blink { - -// "Iterator result" in this file is an object returned from iterator.next() -// having two members "done" and "value". - -CORE_EXPORT v8::Local<v8::Object> V8IteratorResultValue(ScriptState*, - bool done, - v8::Local<v8::Value>); - -// Unpacks |result|, stores the value of "done" member to |done| and returns -// the value of "value" member. Returns an empty handle when errored. -CORE_EXPORT v8::MaybeLocal<v8::Value> -V8UnpackIteratorResult(ScriptState*, v8::Local<v8::Object> result, bool* done); - -template <typename T> -inline ScriptValue V8IteratorResult(ScriptState* script_state, const T& value) { - return ScriptValue( - script_state->GetIsolate(), - V8IteratorResultValue(script_state, false, - ToV8(value, script_state->GetContext()->Global(), - script_state->GetIsolate()))); -} - -inline ScriptValue V8IteratorResultDone(ScriptState* script_state) { - return ScriptValue( - script_state->GetIsolate(), - V8IteratorResultValue(script_state, true, - v8::Undefined(script_state->GetIsolate()))); -} - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_V8_ITERATOR_RESULT_VALUE_H_
diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni index ee0afa9..35f003a 100644 --- a/third_party/blink/renderer/bindings/generated_in_core.gni +++ b/third_party/blink/renderer/bindings/generated_in_core.gni
@@ -1069,8 +1069,6 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_intervention_report_body.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_intrinsic_sizes.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_intrinsic_sizes.h", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_iterator.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_iterator.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_keyboard_event.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_keyboard_event.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_keyframe_effect.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni index cb9f1eda..a3ac4ba 100644 --- a/third_party/blink/renderer/bindings/idl_in_core.gni +++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -164,7 +164,6 @@ "//third_party/blink/renderer/core/dom/idle_deadline.idl", "//third_party/blink/renderer/core/dom/idle_request_callback.idl", "//third_party/blink/renderer/core/dom/idle_request_options.idl", - "//third_party/blink/renderer/core/dom/iterator.idl", "//third_party/blink/renderer/core/dom/mutation_observer.idl", "//third_party/blink/renderer/core/dom/mutation_observer_init.idl", "//third_party/blink/renderer/core/dom/mutation_record.idl",
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py b/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py index c738b92..e01c798 100644 --- a/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py +++ b/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py
@@ -279,7 +279,8 @@ # of [TargetOfExposed] exposure. If this is actually a global, # add it to GLOBAL_NAME_TO_EXECUTION_CONTEXT_CHECK. return _Expr( - "(::logging::CheckError::NotReached(__FILE__, __LINE__) << " + "(::logging::NotReachedError::NotReached" + "(__FILE__, __LINE__) << " "\"{} exposure test is not supported at runtime\", false)". format(entry.global_name))
diff --git a/third_party/blink/renderer/core/dom/build.gni b/third_party/blink/renderer/core/dom/build.gni index 902bda2..c9fff951 100644 --- a/third_party/blink/renderer/core/dom/build.gni +++ b/third_party/blink/renderer/core/dom/build.gni
@@ -174,7 +174,6 @@ "ignore_opens_during_unload_count_incrementer.h", "increment_load_event_delay_count.cc", "increment_load_event_delay_count.h", - "iterator.h", "layout_tree_builder.cc", "layout_tree_builder.h", "layout_tree_builder_traversal.cc",
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 1a839a3..90717f2 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -3994,7 +3994,8 @@ const base::TimeTicks pagehide_event_end = base::TimeTicks::Now(); DEFINE_STATIC_LOCAL( CustomCountHistogram, pagehide_histogram, - ("DocumentEventTiming.PageHideDuration", 0, 10000000, 50)); + ("DocumentEventTiming.PageHideDuration", kTimeBasedHistogramMinSample, + kTimeBasedHistogramMaxSample, kTimeBasedHistogramBucketCount)); pagehide_histogram.CountMicroseconds(pagehide_event_end - pagehide_event_start); } @@ -4015,7 +4016,9 @@ base::TimeTicks::Now(); DEFINE_STATIC_LOCAL( CustomCountHistogram, pagevisibility_histogram, - ("DocumentEventTiming.PageVibilityHiddenDuration", 0, 10000000, 50)); + ("DocumentEventTiming.PageVibilityHiddenDuration", + kTimeBasedHistogramMinSample, kTimeBasedHistogramMaxSample, + kTimeBasedHistogramBucketCount)); pagevisibility_histogram.CountMicroseconds( pagevisibility_hidden_event_end - pagevisibility_hidden_event_start); DispatchEvent( @@ -4036,7 +4039,8 @@ // Record unload event timing when navigating cross-document. DEFINE_STATIC_LOCAL( CustomCountHistogram, unload_histogram, - ("DocumentEventTiming.UnloadDuration", 0, 10000000, 50)); + ("DocumentEventTiming.UnloadDuration", kTimeBasedHistogramMinSample, + kTimeBasedHistogramMaxSample, kTimeBasedHistogramBucketCount)); unload_histogram.CountMicroseconds(unload_event_end - unload_event_start); auto& timing = unload_timing_info->unload_timing.emplace(); @@ -4054,8 +4058,10 @@ DispatchEvent(*Event::Create(event_type_names::kFreeze)); SetFreezingInProgress(false); const base::TimeTicks freeze_event_end = base::TimeTicks::Now(); - DEFINE_STATIC_LOCAL(CustomCountHistogram, freeze_histogram, - ("DocumentEventTiming.FreezeDuration", 0, 10000000, 50)); + DEFINE_STATIC_LOCAL( + CustomCountHistogram, freeze_histogram, + ("DocumentEventTiming.FreezeDuration", kTimeBasedHistogramMinSample, + kTimeBasedHistogramMaxSample, kTimeBasedHistogramBucketCount)); freeze_histogram.CountMicroseconds(freeze_event_end - freeze_event_start); UseCounter::Count(*this, WebFeature::kPageLifeCycleFreeze); }
diff --git a/third_party/blink/renderer/core/dom/document_lifecycle.cc b/third_party/blink/renderer/core/dom/document_lifecycle.cc index 0f60005f..90dbcf8 100644 --- a/third_party/blink/renderer/core/dom/document_lifecycle.cc +++ b/third_party/blink/renderer/core/dom/document_lifecycle.cc
@@ -153,7 +153,7 @@ return true; if (next_state == kInStyleRecalc) return true; - if (next_state == kCompositingInputsClean) + if (next_state == kInCompositingInputsUpdate) return true; if (next_state == kInPrePaint) return true;
diff --git a/third_party/blink/renderer/core/dom/iterator.h b/third_party/blink/renderer/core/dom/iterator.h deleted file mode 100644 index 39c5cb7..0000000 --- a/third_party/blink/renderer/core/dom/iterator.h +++ /dev/null
@@ -1,32 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_DOM_ITERATOR_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_DOM_ITERATOR_H_ - -#include "third_party/blink/renderer/bindings/core/v8/script_value.h" -#include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" - -namespace blink { - -class ExceptionState; - -class CORE_EXPORT Iterator : public ScriptWrappable { - DEFINE_WRAPPERTYPEINFO(); - - public: - Iterator() = default; - ~Iterator() override = default; - - virtual ScriptValue next(ScriptState*, ExceptionState&) = 0; - virtual ScriptValue next(ScriptState*, - ScriptValue /* value */, - ExceptionState&) = 0; - Iterator* GetIterator(ScriptState*, ExceptionState&) { return this; } -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_DOM_ITERATOR_H_
diff --git a/third_party/blink/renderer/core/dom/iterator.idl b/third_party/blink/renderer/core/dom/iterator.idl deleted file mode 100644 index 2b49cd1a0..0000000 --- a/third_party/blink/renderer/core/dom/iterator.idl +++ /dev/null
@@ -1,11 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// http://people.mozilla.org/~jorendorff/es6-draft.html#sec-iterator-interface - -[ - LegacyNoInterfaceObject -] interface Iterator { - [CallWith=ScriptState, RaisesException] any next(optional any value); -};
diff --git a/third_party/blink/renderer/core/fetch/headers.cc b/third_party/blink/renderer/core/fetch/headers.cc index 8b45168c..22e7c47 100644 --- a/third_party/blink/renderer/core/fetch/headers.cc +++ b/third_party/blink/renderer/core/fetch/headers.cc
@@ -4,9 +4,7 @@ #include "third_party/blink/renderer/core/fetch/headers.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_union_bytestringbytestringrecord_bytestringsequencesequence.h" -#include "third_party/blink/renderer/core/dom/iterator.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h"
diff --git a/third_party/blink/renderer/core/fetch/readable_stream_bytes_consumer.cc b/third_party/blink/renderer/core/fetch/readable_stream_bytes_consumer.cc index a15f8452..a46cbcce 100644 --- a/third_party/blink/renderer/core/fetch/readable_stream_bytes_consumer.cc +++ b/third_party/blink/renderer/core/fetch/readable_stream_bytes_consumer.cc
@@ -8,10 +8,10 @@ #include <algorithm> +#include "third_party/blink/renderer/bindings/core/v8/iterable.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h" #include "third_party/blink/renderer/bindings/core/v8/script_function.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/scoped_persistent.h" #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h" @@ -29,15 +29,15 @@ : consumer_(consumer) {} ScriptValue Call(ScriptState* script_state, ScriptValue v) override { - bool done; v8::Local<v8::Value> item = v.V8Value(); if (!item->IsObject()) { consumer_->OnRejected(); return ScriptValue(); } v8::Local<v8::Value> value; - if (!V8UnpackIteratorResult(script_state, item.As<v8::Object>(), &done) - .ToLocal(&value)) { + bool done; + if (!V8UnpackIterationResult(script_state, item.As<v8::Object>(), &value, + &done)) { consumer_->OnRejected(); return ScriptValue(); }
diff --git a/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.cc b/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.cc index fa2a8dd..1ce85834 100644 --- a/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.cc +++ b/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.cc
@@ -142,12 +142,16 @@ // Define the UMA for the primary metric. primary_metric_.pre_fcp_uma_counter = std::make_unique<CustomCountHistogram>( - "Blink.MainFrame.UpdateTime.PreFCP", 1, 10000000, 50); + "Blink.MainFrame.UpdateTime.PreFCP", kTimeBasedHistogramMinSample, + kTimeBasedHistogramMaxSample, kTimeBasedHistogramBucketCount); primary_metric_.post_fcp_uma_counter = std::make_unique<CustomCountHistogram>( - "Blink.MainFrame.UpdateTime.PostFCP", 1, 10000000, 50); + "Blink.MainFrame.UpdateTime.PostFCP", kTimeBasedHistogramMinSample, + kTimeBasedHistogramMaxSample, kTimeBasedHistogramBucketCount); primary_metric_.uma_aggregate_counter = std::make_unique<CustomCountHistogram>( - "Blink.MainFrame.UpdateTime.AggregatedPreFCP", 1, 10000000, 50); + "Blink.MainFrame.UpdateTime.AggregatedPreFCP", + kTimeBasedHistogramMinSample, kTimeBasedHistogramMaxSample, + kTimeBasedHistogramBucketCount); // Set up the substrings to create the UMA names const char* const uma_prefcp_postscript = ".PreFCP";
diff --git a/third_party/blink/renderer/core/speculation_rules/speculation_rules_origin_trial_test.cc b/third_party/blink/renderer/core/speculation_rules/speculation_rules_origin_trial_test.cc index ec28b208..b66f760 100644 --- a/third_party/blink/renderer/core/speculation_rules/speculation_rules_origin_trial_test.cc +++ b/third_party/blink/renderer/core/speculation_rules/speculation_rules_origin_trial_test.cc
@@ -123,11 +123,11 @@ // These tests only work on platforms where the feature is not already enabled // by default -- at which point an origin trial token is not required. -#if !BUILDFLAG(IS_ANDROID) +// TODO(crbug.com/1173646): Remove these soon. // Without the corresponding base::Feature, this trial token should not be // accepted. -TEST(SpeculationRulesOriginTrialTest, RequiresBaseFeature) { +TEST(SpeculationRulesOriginTrialTest, DISABLED_RequiresBaseFeature) { base::test::ScopedFeatureList scoped_features; scoped_features.InitAndDisableFeature( features::kSpeculationRulesPrefetchProxy); @@ -138,7 +138,7 @@ } // Without a valid origin trial token, this feature should not be exposed. -TEST(SpeculationRulesOriginTrialTest, RequiresValidToken) { +TEST(SpeculationRulesOriginTrialTest, DISABLED_RequiresValidToken) { base::test::ScopedFeatureList scoped_features; scoped_features.InitAndEnableFeature( features::kSpeculationRulesPrefetchProxy); @@ -149,7 +149,8 @@ } // With the feature and a matching token, speculation rules should be turned on. -TEST(SpeculationRulesOriginTrialTest, BaseFeatureAndValidTokenSuffice) { +TEST(SpeculationRulesOriginTrialTest, + DISABLED_BaseFeatureAndValidTokenSuffice) { base::test::ScopedFeatureList scoped_features; scoped_features.InitAndEnableFeature( features::kSpeculationRulesPrefetchProxy); @@ -159,8 +160,6 @@ kSimplePrefetchProxyRuleSet)); } -#endif // !BUILDFLAG(IS_ANDROID) - class ScopedRegisterMockedURLLoads { public: ScopedRegisterMockedURLLoads() {
diff --git a/third_party/blink/renderer/core/streams/readable_stream.cc b/third_party/blink/renderer/core/streams/readable_stream.cc index ed70429..c64abaf 100644 --- a/third_party/blink/renderer/core/streams/readable_stream.cc +++ b/third_party/blink/renderer/core/streams/readable_stream.cc
@@ -4,11 +4,11 @@ #include "third_party/blink/renderer/core/streams/readable_stream.h" +#include "third_party/blink/renderer/bindings/core/v8/iterable.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h" #include "third_party/blink/renderer/bindings/core/v8/script_function.h" #include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h" #include "third_party/blink/renderer/bindings/core/v8/v8_abort_signal.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_readable_stream.h" #include "third_party/blink/renderer/bindings/core/v8/v8_readable_stream_get_reader_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_readable_writable_pair.h" @@ -479,9 +479,8 @@ auto* isolate = script_state_->GetIsolate(); v8::Local<v8::Value> value; bool done = false; - bool unpack_succeeded = - V8UnpackIteratorResult(script_state_, result.As<v8::Object>(), &done) - .ToLocal(&value); + bool unpack_succeeded = V8UnpackIterationResult( + script_state_, result.As<v8::Object>(), &value, &done); DCHECK(unpack_succeeded); if (done) { ReadableClosed(); @@ -930,9 +929,8 @@ // "Get" operations cannot have side-effects. v8::Local<v8::Value> value; bool done = false; - bool unpack_succeeded = - V8UnpackIteratorResult(script_state, result.As<v8::Object>(), &done) - .ToLocal(&value); + bool unpack_succeeded = V8UnpackIterationResult( + script_state, result.As<v8::Object>(), &value, &done); CHECK(unpack_succeeded); // vi. Assert: Type(done) is Boolean.
diff --git a/third_party/blink/renderer/core/streams/readable_stream_test.cc b/third_party/blink/renderer/core/streams/readable_stream_test.cc index 919ddfb2..d4f54de 100644 --- a/third_party/blink/renderer/core/streams/readable_stream_test.cc +++ b/third_party/blink/renderer/core/streams/readable_stream_test.cc
@@ -15,7 +15,6 @@ #include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_readable_stream.h" #include "third_party/blink/renderer/bindings/core/v8/v8_readable_stream_get_reader_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_union_readablestreambyobreader_readablestreamdefaultreader.h"
diff --git a/third_party/blink/renderer/core/streams/transferable_streams.cc b/third_party/blink/renderer/core/streams/transferable_streams.cc index c3be8715..36c899d93 100644 --- a/third_party/blink/renderer/core/streams/transferable_streams.cc +++ b/third_party/blink/renderer/core/streams/transferable_streams.cc
@@ -7,10 +7,10 @@ #include "third_party/blink/renderer/core/streams/transferable_streams.h" +#include "third_party/blink/renderer/bindings/core/v8/iterable.h" #include "third_party/blink/renderer/bindings/core/v8/script_function.h" #include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h" #include "third_party/blink/renderer/bindings/core/v8/v8_dom_exception.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_post_message_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_readable_stream_default_controller.h" #include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h" @@ -810,11 +810,10 @@ ScriptValue Call(ScriptState* script_state, ScriptValue read_result) override { DCHECK(read_result.IsObject()); + v8::Local<v8::Value> value; bool done = false; - v8::Local<v8::Value> value = - V8UnpackIteratorResult(script_state, - read_result.V8Value().As<v8::Object>(), &done) - .ToLocalChecked(); + CHECK(V8UnpackIterationResult( + script_state, read_result.V8Value().As<v8::Object>(), &value, &done)); if (done) { // We've finished reading `source1_`. Let's start reading `source2_`. source_->has_finished_reading_stream1_ = true;
diff --git a/third_party/blink/renderer/core/streams/transferable_streams_test.cc b/third_party/blink/renderer/core/streams/transferable_streams_test.cc index f7411b3..97bf9b1 100644 --- a/third_party/blink/renderer/core/streams/transferable_streams_test.cc +++ b/third_party/blink/renderer/core/streams/transferable_streams_test.cc
@@ -6,12 +6,12 @@ #include "base/types/strong_alias.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/bindings/core/v8/iterable.h" #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/script_promise_resolver.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_readable_stream_default_reader.h" #include "third_party/blink/renderer/bindings/core/v8/v8_writable_stream_default_writer.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" @@ -125,8 +125,8 @@ } v8::Local<v8::Value> value; bool done = false; - if (!V8UnpackIteratorResult(script_state, result.As<v8::Object>(), &done) - .ToLocal(&value)) { + if (!V8UnpackIterationResult(script_state, result.As<v8::Object>(), &value, + &done)) { ADD_FAILURE() << "Failed to unpack the iterator result."; return; } @@ -144,8 +144,8 @@ SCOPED_TRACE(testing::Message() << "__LINE__ = " << line); v8::Local<v8::Value> value; bool done = false; - if (!V8UnpackIteratorResult(script_state, result.As<v8::Object>(), &done) - .ToLocal(&value)) { + if (!V8UnpackIterationResult(script_state, result.As<v8::Object>(), &value, + &done)) { ADD_FAILURE() << "Failed to unpack the iterator result."; return; } @@ -187,19 +187,17 @@ ADD_FAILURE() << "iterator must be an object"; return ScriptValue(); } - bool done = false; - auto chunk_maybe = - V8UnpackIteratorResult(script_state, - value.V8Value() - ->ToObject(script_state->GetContext()) - .ToLocalChecked(), - &done); - EXPECT_FALSE(done); v8::Local<v8::Value> chunk; - if (!chunk_maybe.ToLocal(&chunk)) { - ADD_FAILURE() << "V8UnpackIteratorResult failed"; + bool done = false; + if (!V8UnpackIterationResult(script_state, + value.V8Value() + ->ToObject(script_state->GetContext()) + .ToLocalChecked(), + &chunk, &done)) { + ADD_FAILURE() << "V8UnpackIterationResult failed"; return ScriptValue(); } + EXPECT_FALSE(done); EXPECT_TRUE(chunk->IsNull()); return ScriptValue(); }
diff --git a/third_party/blink/renderer/core/streams/transform_stream_test.cc b/third_party/blink/renderer/core/streams/transform_stream_test.cc index f5d9f31..e4428a6 100644 --- a/third_party/blink/renderer/core/streams/transform_stream_test.cc +++ b/third_party/blink/renderer/core/streams/transform_stream_test.cc
@@ -6,6 +6,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/bindings/core/v8/iterable.h" #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/script_promise_resolver.h" @@ -15,7 +16,6 @@ #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" #include "third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/core/streams/readable_stream.h" #include "third_party/blink/renderer/core/streams/test_utils.h" #include "third_party/blink/renderer/core/streams/transform_stream_default_controller.h" @@ -219,15 +219,18 @@ if (!value.IsObject()) { return false; } + v8::Local<v8::Value> chunk; bool done = false; - auto chunk = V8UnpackIteratorResult( - script_state, - value.V8Value()->ToObject(script_state->GetContext()).ToLocalChecked(), - &done); - if (done || chunk.IsEmpty()) + if (!V8UnpackIterationResult(script_state, + value.V8Value() + ->ToObject(script_state->GetContext()) + .ToLocalChecked(), + &chunk, &done)) { return false; - return ToCoreStringWithUndefinedOrNullCheck(chunk.ToLocalChecked()) == - expected; + } + if (done) + return false; + return ToCoreStringWithUndefinedOrNullCheck(chunk) == expected; } bool IsTypeError(ScriptState* script_state,
diff --git a/third_party/blink/renderer/core/testing/internals.cc b/third_party/blink/renderer/core/testing/internals.cc index ba0e0fda4f..dfb96c2 100644 --- a/third_party/blink/renderer/core/testing/internals.cc +++ b/third_party/blink/renderer/core/testing/internals.cc
@@ -48,7 +48,6 @@ #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_binding_for_core.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/core/animation/document_timeline.h" #include "third_party/blink/renderer/core/css/css_property_names.h" #include "third_party/blink/renderer/core/css/properties/css_unresolved_property.h" @@ -58,7 +57,6 @@ #include "third_party/blink/renderer/core/dom/dom_string_list.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/flat_tree_traversal.h" -#include "third_party/blink/renderer/core/dom/iterator.h" #include "third_party/blink/renderer/core/dom/node_computed_style.h" #include "third_party/blink/renderer/core/dom/pseudo_element.h" #include "third_party/blink/renderer/core/dom/range.h"
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker.cc b/third_party/blink/renderer/core/workers/dedicated_worker.cc index 2ac9b918..fe2d16c 100644 --- a/third_party/blink/renderer/core/workers/dedicated_worker.cc +++ b/third_party/blink/renderer/core/workers/dedicated_worker.cc
@@ -460,9 +460,7 @@ if (auto* window = DynamicTo<LocalDOMWindow>(execution_context)) { // When the main thread creates a new DedicatedWorker. auto* frame = window->GetFrame(); - if (frame) { - parent_devtools_token = frame->GetDevToolsFrameToken(); - } + parent_devtools_token = frame->GetDevToolsFrameToken(); settings = std::make_unique<WorkerSettings>(frame->GetSettings()); agent_group_scheduler_compositor_task_runner = execution_context->GetScheduler()
diff --git a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc index a3199a4..7805af3 100644 --- a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc +++ b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc
@@ -223,6 +223,19 @@ blink_interest_group, /*expected_error_field_name=*/"sellerCapabilities", /*expected_error_field_value=*/"null", /*expected_error=*/"sellerCapabilities origins must all be HTTPS."); + + blink_interest_group->seller_capabilities->clear(); + blink_interest_group->seller_capabilities->insert( + SecurityOrigin::CreateFromString(String::FromUTF8("https://origin.test")), + mojom::blink::SellerCapabilities::New()); + blink_interest_group->seller_capabilities->insert( + SecurityOrigin::CreateFromString(String::FromUTF8("https://invalid^&")), + mojom::blink::SellerCapabilities::New()); + // Data URLs have opaque origins, which are mapped to the string "null". + ExpectInterestGroupIsNotValid( + blink_interest_group, /*expected_error_field_name=*/"sellerCapabilities", + /*expected_error_field_value=*/"null", + /*expected_error=*/"sellerCapabilities origins must all be HTTPS."); } // Check that `bidding_url`, `bidding_wasm_helper_url`, `daily_update_url`, and
diff --git a/third_party/blink/renderer/modules/breakout_box/stream_test_utils.h b/third_party/blink/renderer/modules/breakout_box/stream_test_utils.h index cb4ffd8e..15300d7b 100644 --- a/third_party/blink/renderer/modules/breakout_box/stream_test_utils.h +++ b/third_party/blink/renderer/modules/breakout_box/stream_test_utils.h
@@ -5,10 +5,10 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_BREAKOUT_BOX_STREAM_TEST_UTILS_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_BREAKOUT_BOX_STREAM_TEST_UTILS_H_ +#include "third_party/blink/renderer/bindings/core/v8/iterable.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.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/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/core/streams/readable_stream_default_reader.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" @@ -31,9 +31,8 @@ EXPECT_TRUE(result->IsObject()); v8::Local<v8::Value> v8_signal; bool done = false; - EXPECT_TRUE( - V8UnpackIteratorResult(script_state, result.As<v8::Object>(), &done) - .ToLocal(&v8_signal)); + EXPECT_TRUE(V8UnpackIterationResult(script_state, result.As<v8::Object>(), + &v8_signal, &done)); EXPECT_FALSE(done); return NativeValueTraits<T>::NativeValue(v8_scope.GetIsolate(), v8_signal, ASSERT_NO_EXCEPTION);
diff --git a/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.cc b/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.cc index 7117ccc..ce21ed42 100644 --- a/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.cc +++ b/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper.cc
@@ -10,7 +10,6 @@ #include "mojo/public/cpp/system/simple_watcher.h" #include "net/base/ip_endpoint.h" #include "net/base/net_errors.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/streams/readable_stream.h"
diff --git a/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper_unittest.cc b/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper_unittest.cc index 9650329..a8f1e2e0 100644 --- a/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper_unittest.cc +++ b/third_party/blink/renderer/modules/direct_sockets/tcp_readable_stream_wrapper_unittest.cc
@@ -7,10 +7,10 @@ #include "base/callback_helpers.h" #include "base/test/mock_callback.h" #include "net/base/net_errors.h" +#include "third_party/blink/renderer/bindings/core/v8/iterable.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.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/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/core/streams/readable_stream.h" #include "third_party/blink/renderer/modules/direct_sockets/stream_wrapper.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" @@ -105,11 +105,11 @@ CHECK(result->IsObject()); Iterator ret; v8::Local<v8::Value> v8value; - if (!V8UnpackIteratorResult(scope.GetScriptState(), result.As<v8::Object>(), - &ret.done) - .ToLocal(&v8value)) { + if (!V8UnpackIterationResult(scope.GetScriptState(), + result.As<v8::Object>(), &v8value, + &ret.done)) { ADD_FAILURE() << "Couldn't unpack iterator"; - return ret; + return {}; } if (ret.done) { EXPECT_TRUE(v8value->IsUndefined());
diff --git a/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper_unittest.cc b/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper_unittest.cc index 01ff5a71..d2742c7 100644 --- a/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper_unittest.cc +++ b/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper_unittest.cc
@@ -10,11 +10,11 @@ #include "mojo/public/cpp/bindings/receiver.h" #include "net/base/net_errors.h" #include "third_party/blink/public/mojom/direct_sockets/direct_sockets.mojom-blink.h" +#include "third_party/blink/renderer/bindings/core/v8/iterable.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.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/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_udp_message.h" #include "third_party/blink/renderer/core/streams/readable_stream.h" @@ -98,9 +98,9 @@ EXPECT_TRUE(result->IsObject()); v8::Local<v8::Value> udp_message_packed; bool done = false; - EXPECT_TRUE(V8UnpackIteratorResult(scope.GetScriptState(), - result.As<v8::Object>(), &done) - .ToLocal(&udp_message_packed)); + EXPECT_TRUE(V8UnpackIterationResult(scope.GetScriptState(), + result.As<v8::Object>(), + &udp_message_packed, &done)); if (done) { return {nullptr, true}; }
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.cc b/third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.cc index ec6b270..c193e05 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.cc
@@ -5,8 +5,8 @@ #include "third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.h" #include "third_party/blink/public/platform/task_type.h" +#include "third_party/blink/renderer/bindings/core/v8/iterable.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/fileapi/file_error.h" #include "third_party/blink/renderer/modules/file_system_access/file_system_access_error.h" @@ -29,6 +29,12 @@ } ScriptPromise FileSystemDirectoryIterator::next(ScriptState* script_state) { + // TODO(crbug.com/1087157): The bindings layer should implement async + // iterable. Until it gets implemented, this class (and especially this + // member function) implements the behavior of async iterable in its own way. + // Use of bindings internal code (use of bindings:: internal namespace) should + // be gone once https://crbug.com/1087157 gets resolved. + if (error_) { auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); auto result = resolver->Promise(); @@ -38,23 +44,27 @@ if (!entries_.empty()) { FileSystemHandle* handle = entries_.TakeFirst(); - ScriptValue result; + v8::Local<v8::Value> result; switch (mode_) { case Mode::kKey: - result = V8IteratorResult(script_state, handle->name()); + result = bindings::ESCreateIterResultObject( + script_state, false, + ToV8Traits<IDLString>::ToV8(script_state, handle->name()) + .ToLocalChecked()); break; case Mode::kValue: - result = V8IteratorResult(script_state, handle); + result = bindings::ESCreateIterResultObject( + script_state, false, + ToV8Traits<FileSystemHandle>::ToV8(script_state, handle) + .ToLocalChecked()); break; case Mode::kKeyValue: - HeapVector<ScriptValue, 2> keyvalue; - keyvalue.push_back(ScriptValue( - script_state->GetIsolate(), - ToV8Traits<IDLString>::ToV8(script_state, handle->name()))); - keyvalue.push_back(ScriptValue( - script_state->GetIsolate(), - ToV8Traits<FileSystemHandle>::ToV8(script_state, handle))); - result = V8IteratorResult(script_state, keyvalue); + result = bindings::ESCreateIterResultObject( + script_state, false, + ToV8Traits<IDLString>::ToV8(script_state, handle->name()) + .ToLocalChecked(), + ToV8Traits<FileSystemHandle>::ToV8(script_state, handle) + .ToLocalChecked()); break; } return ScriptPromise::Cast(script_state, result); @@ -66,7 +76,10 @@ return pending_next_->Promise(); } - return ScriptPromise::Cast(script_state, V8IteratorResultDone(script_state)); + return ScriptPromise::Cast( + script_state, + bindings::ESCreateIterResultObject( + script_state, true, v8::Undefined(script_state->GetIsolate()))); } bool FileSystemDirectoryIterator::HasPendingActivity() const {
diff --git a/third_party/blink/renderer/modules/webtransport/bidirectional_stream_test.cc b/third_party/blink/renderer/modules/webtransport/bidirectional_stream_test.cc index 4ffe0d3..bff3c19 100644 --- a/third_party/blink/renderer/modules/webtransport/bidirectional_stream_test.cc +++ b/third_party/blink/renderer/modules/webtransport/bidirectional_stream_test.cc
@@ -19,11 +19,11 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/webtransport/web_transport_connector.mojom-blink.h" +#include "third_party/blink/renderer/bindings/core/v8/iterable.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_tester.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_web_transport_bidirectional_stream.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_web_transport_options.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" @@ -362,9 +362,8 @@ DCHECK(result->IsObject()); v8::Local<v8::Value> v8value; bool done = false; - EXPECT_TRUE( - V8UnpackIteratorResult(script_state, result.As<v8::Object>(), &done) - .ToLocal(&v8value)); + EXPECT_TRUE(V8UnpackIterationResult(script_state, result.As<v8::Object>(), + &v8value, &done)); EXPECT_TRUE(done); }
diff --git a/third_party/blink/renderer/modules/webtransport/incoming_stream.cc b/third_party/blink/renderer/modules/webtransport/incoming_stream.cc index 6748baec..ca360af 100644 --- a/third_party/blink/renderer/modules/webtransport/incoming_stream.cc +++ b/third_party/blink/renderer/modules/webtransport/incoming_stream.cc
@@ -9,7 +9,6 @@ #include <utility> #include "third_party/blink/renderer/bindings/core/v8/script_function.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_web_transport_error.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h"
diff --git a/third_party/blink/renderer/modules/webtransport/incoming_stream_test.cc b/third_party/blink/renderer/modules/webtransport/incoming_stream_test.cc index 55816ea..18e5ad60 100644 --- a/third_party/blink/renderer/modules/webtransport/incoming_stream_test.cc +++ b/third_party/blink/renderer/modules/webtransport/incoming_stream_test.cc
@@ -9,13 +9,13 @@ #include "base/test/mock_callback.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/bindings/core/v8/iterable.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_tester.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" #include "third_party/blink/renderer/bindings/core/v8/v8_dom_exception.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/streams/readable_stream.h" #include "third_party/blink/renderer/core/streams/readable_stream_default_reader.h" @@ -122,11 +122,11 @@ CHECK(result->IsObject()); Iterator ret; v8::Local<v8::Value> v8value; - if (!V8UnpackIteratorResult(scope.GetScriptState(), result.As<v8::Object>(), - &ret.done) - .ToLocal(&v8value)) { + if (!V8UnpackIterationResult(scope.GetScriptState(), + result.As<v8::Object>(), &v8value, + &ret.done)) { ADD_FAILURE() << "Couldn't unpack iterator"; - return ret; + return {}; } if (ret.done) { EXPECT_TRUE(v8value->IsUndefined());
diff --git a/third_party/blink/renderer/modules/webtransport/test_utils.cc b/third_party/blink/renderer/modules/webtransport/test_utils.cc index a81e376..ad5d7d8 100644 --- a/third_party/blink/renderer/modules/webtransport/test_utils.cc +++ b/third_party/blink/renderer/modules/webtransport/test_utils.cc
@@ -7,10 +7,10 @@ #include "base/check.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" +#include "third_party/blink/renderer/bindings/core/v8/iterable.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.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/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_web_transport_options.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/streams/readable_stream.h" @@ -55,9 +55,8 @@ DCHECK(result->IsObject()); v8::Local<v8::Value> v8value; bool done = false; - EXPECT_TRUE( - V8UnpackIteratorResult(script_state, result.As<v8::Object>(), &done) - .ToLocal(&v8value)); + EXPECT_TRUE(V8UnpackIterationResult(script_state, result.As<v8::Object>(), + &v8value, &done)); EXPECT_FALSE(done); return v8value; }
diff --git a/third_party/blink/renderer/modules/webtransport/web_transport_test.cc b/third_party/blink/renderer/modules/webtransport/web_transport_test.cc index 13e36310..4ddfb98 100644 --- a/third_party/blink/renderer/modules/webtransport/web_transport_test.cc +++ b/third_party/blink/renderer/modules/webtransport/web_transport_test.cc
@@ -18,6 +18,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/webtransport/web_transport_connector.mojom-blink.h" +#include "third_party/blink/renderer/bindings/core/v8/iterable.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_tester.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" @@ -25,7 +26,6 @@ #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" #include "third_party/blink/renderer/bindings/core/v8/v8_dom_exception.h" #include "third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_readable_stream.h" #include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h" #include "third_party/blink/renderer/bindings/core/v8/v8_writable_stream.h" @@ -926,9 +926,9 @@ ScriptValue iterator_result) { bool done = false; v8::Local<v8::Value> value; - if (!V8UnpackIteratorResult(script_state, - iterator_result.V8Value().As<v8::Object>(), &done) - .ToLocal(&value)) { + if (!V8UnpackIterationResult(script_state, + iterator_result.V8Value().As<v8::Object>(), + &value, &done)) { ADD_FAILURE() << "unable to unpack iterator_result"; return {}; } @@ -1764,9 +1764,8 @@ ASSERT_TRUE(read_result->IsObject()); v8::Local<v8::Value> value; bool done = false; - ASSERT_TRUE( - V8UnpackIteratorResult(script_state, read_result.As<v8::Object>(), &done) - .ToLocal(&value)); + ASSERT_TRUE(V8UnpackIterationResult( + script_state, read_result.As<v8::Object>(), &value, &done)); NotShared<DOMUint8Array> u8array = NativeValueTraits<NotShared<DOMUint8Array>>::NativeValue( scope.GetIsolate(), value, ASSERT_NO_EXCEPTION);
diff --git a/third_party/blink/renderer/platform/audio/hrtf_elevation.h b/third_party/blink/renderer/platform/audio/hrtf_elevation.h index fc09bbe..92349a7 100644 --- a/third_party/blink/renderer/platform/audio/hrtf_elevation.h +++ b/third_party/blink/renderer/platform/audio/hrtf_elevation.h
@@ -33,7 +33,6 @@ #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/platform/audio/hrtf_kernel.h" -#include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -42,7 +41,7 @@ // HRTFElevation contains all of the HRTFKernels (one left ear and one right ear // per azimuth angle) for a particular elevation. -class PLATFORM_EXPORT HRTFElevation { +class HRTFElevation { USING_FAST_MALLOC(HRTFElevation); public:
diff --git a/third_party/blink/renderer/platform/audio/hrtf_kernel.h b/third_party/blink/renderer/platform/audio/hrtf_kernel.h index ac6c5c4f..216f3a1 100644 --- a/third_party/blink/renderer/platform/audio/hrtf_kernel.h +++ b/third_party/blink/renderer/platform/audio/hrtf_kernel.h
@@ -33,7 +33,6 @@ #include <utility> #include "base/memory/ptr_util.h" #include "third_party/blink/renderer/platform/audio/fft_frame.h" -#include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/vector.h" @@ -50,7 +49,7 @@ // m_fftFrame is the frequency-domain representation of the impulse // response with the delay removed // m_frameDelay is the leading delay of the original impulse response. -class PLATFORM_EXPORT HRTFKernel { +class HRTFKernel { USING_FAST_MALLOC(HRTFKernel); public:
diff --git a/third_party/blink/renderer/platform/audio/hrtf_panner.h b/third_party/blink/renderer/platform/audio/hrtf_panner.h index 36f5b5ed..7890e1f1 100644 --- a/third_party/blink/renderer/platform/audio/hrtf_panner.h +++ b/third_party/blink/renderer/platform/audio/hrtf_panner.h
@@ -29,13 +29,12 @@ #include "third_party/blink/renderer/platform/audio/audio_delay_dsp_kernel.h" #include "third_party/blink/renderer/platform/audio/fft_convolver.h" #include "third_party/blink/renderer/platform/audio/panner.h" -#include "third_party/blink/renderer/platform/platform_export.h" namespace blink { class HRTFDatabaseLoader; -class PLATFORM_EXPORT HRTFPanner final : public Panner { +class HRTFPanner final : public Panner { public: HRTFPanner(float sample_rate, unsigned render_quantum_frames,
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc index 23cd9eb..2bc1646 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc
@@ -603,11 +603,11 @@ // Populate the output mailbox and callback. { + bool is_overlay_candidate = !!color_buffer_for_mailbox->gpu_memory_buffer; *out_resource = viz::TransferableResource::MakeGpu( color_buffer_for_mailbox->mailbox, GL_LINEAR, texture_target_, color_buffer_for_mailbox->produce_sync_token, size_, - color_buffer_for_mailbox->format, - color_buffer_for_mailbox->is_overlay_candidate); + color_buffer_for_mailbox->format, is_overlay_candidate); out_resource->color_space = color_buffer_for_mailbox->color_space; // This holds a ref on the DrawingBuffer that will keep it alive until the // mailbox is released (and while the release callback is running). @@ -835,7 +835,6 @@ const gfx::ColorSpace& color_space, viz::ResourceFormat format, GLuint texture_id, - bool is_overlay_candidate, std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer, gpu::Mailbox mailbox) : owning_thread_ref(base::PlatformThread::CurrentRef()), @@ -844,7 +843,6 @@ color_space(color_space), format(format), texture_id(texture_id), - is_overlay_candidate(is_overlay_candidate), gpu_memory_buffer(std::move(gpu_memory_buffer)), mailbox(mailbox) {} @@ -1830,11 +1828,14 @@ state_restorer_->SetTextureBindingDirty(); gpu::SharedImageInterface* sii = ContextProvider()->SharedImageInterface(); - bool is_overlay_candidate = false; + gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = + Platform::Current()->GetGpuMemoryBufferManager(); + gpu::Mailbox back_buffer_mailbox; // Set only when using swap chains. gpu::Mailbox front_buffer_mailbox; GLuint texture_id = 0; + std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer; uint32_t usage = gpu::SHARED_IMAGE_USAGE_GLES2 | gpu::SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT | gpu::SHARED_IMAGE_USAGE_DISPLAY_READ; @@ -1844,10 +1845,13 @@ ? kTopLeft_GrSurfaceOrigin : kBottomLeft_GrSurfaceOrigin; - viz::ResourceFormat format = - use_half_float_storage_ - ? viz::RGBA_F16 - : (have_alpha_channel_ ? viz::RGBA_8888 : viz::RGBX_8888); + viz::ResourceFormat format; + if (have_alpha_channel_) { + format = use_half_float_storage_ ? viz::RGBA_F16 : viz::RGBA_8888; + } else { + DCHECK(!use_half_float_storage_); + format = viz::RGBX_8888; + } if (UsingSwapChain()) { gpu::SharedImageInterface::SwapChainMailboxes mailboxes = sii->CreateSwapChain(format, size, color_space_, origin, @@ -1855,26 +1859,8 @@ usage | gpu::SHARED_IMAGE_USAGE_SCANOUT); back_buffer_mailbox = mailboxes.back_buffer; front_buffer_mailbox = mailboxes.front_buffer; - } - - // Allocate a GpuMemoryBuffer-backed SharedImage. - std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer; - if (ShouldUseChromiumImage() && back_buffer_mailbox.IsZero()) { - gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = - Platform::Current()->GetGpuMemoryBufferManager(); - - // TODO(crbug.com/911176): We should not allocate a GpuMemoryBuffer here. - // Multiple attempts to remove this path have been reverted, so this path - // is to be removed by incrementally expanding the situations where - // `use_gpu_memory_buffers` is false until the whole block can be removed. - bool use_gpu_memory_buffers = true; -#if !BUILDFLAG(IS_CHROMEOS) - use_gpu_memory_buffers = false; -#endif - if (use_half_float_storage_) - use_gpu_memory_buffers = false; - - if (use_gpu_memory_buffers) { + } else { + if (ShouldUseChromiumImage()) { gfx::BufferFormat buffer_format; if (have_alpha_channel_) { buffer_format = use_half_float_storage_ ? gfx::BufferFormat::RGBA_F16 @@ -1888,6 +1874,10 @@ buffer_format = gfx::BufferFormat::BGRX_8888; } } + // TODO(crbug.com/911176): When RGB emulation is not needed, we should use + // the non-GMB CreateSharedImage with gpu::SHARED_IMAGE_USAGE_SCANOUT in + // order to allocate the GMB service-side and avoid a synchronous + // round-trip to the browser process here. gfx::BufferUsage buffer_usage = gfx::BufferUsage::SCANOUT; uint32_t additional_usage_flags = gpu::SHARED_IMAGE_USAGE_SCANOUT; if (low_latency_enabled()) { @@ -1908,43 +1898,22 @@ } } } - } - if (back_buffer_mailbox.IsZero()) { - if (ShouldUseChromiumImage()) { - // Only allocate using SCANOUT if GpuMemoryBuffers of the equivalent - // gfx::BufferFormat are supported. -#if BUILDFLAG(IS_MAC) - const viz::ResourceFormat scanout_format = - use_half_float_storage_ - ? viz::RGBA_F16 - : (have_alpha_channel_ ? viz::BGRA_8888 : viz::BGRX_8888); -#else - const viz::ResourceFormat scanout_format = format; -#endif - if (gpu::IsImageFromGpuMemoryBufferFormatSupported( - viz::BufferFormat(scanout_format), - ContextProvider()->GetCapabilities())) { - format = scanout_format; - is_overlay_candidate = true; - usage |= gpu::SHARED_IMAGE_USAGE_SCANOUT; - if (low_latency_enabled()) { - usage |= gpu::SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE; - } - } + // Create a normal SharedImage if GpuMemoryBuffer is not needed or the + // allocation above failed. + if (!gpu_memory_buffer) { + // We want to set the correct SkAlphaType on the new shared image but in + // the case of ShouldUseChromiumImage() we instead keep this buffer + // premultiplied, draw to |premultiplied_alpha_false_mailbox_|, and + // convert during copy. + SkAlphaType alpha_type = kPremul_SkAlphaType; + if (!ShouldUseChromiumImage() && !premultiplied_alpha_) + alpha_type = kUnpremul_SkAlphaType; + + back_buffer_mailbox = + sii->CreateSharedImage(format, size, color_space_, origin, alpha_type, + usage, gpu::kNullSurfaceHandle); } - - // We want to set the correct SkAlphaType on the new shared image but in - // the case of ShouldUseChromiumImage() we instead keep this buffer - // premultiplied, draw to |premultiplied_alpha_false_mailbox_|, and - // convert during copy. - SkAlphaType alpha_type = kPremul_SkAlphaType; - if (!ShouldUseChromiumImage() && !premultiplied_alpha_) - alpha_type = kUnpremul_SkAlphaType; - - back_buffer_mailbox = - sii->CreateSharedImage(format, size, color_space_, origin, alpha_type, - usage, gpu::kNullSurfaceHandle); } gpu::SyncToken sync_token = sii->GenUnverifiedSyncToken(); @@ -1956,7 +1925,7 @@ front_buffer_mailbox.name); front_color_buffer_ = base::MakeRefCounted<ColorBuffer>( weak_factory_.GetWeakPtr(), size, color_space_, format, texture_id, - /*is_overlay_candidate=*/false, nullptr, front_buffer_mailbox); + nullptr, front_buffer_mailbox); } // Import the backbuffer of swap chain or allocated SharedImage into GL. texture_id = @@ -1985,7 +1954,7 @@ return base::MakeRefCounted<ColorBuffer>( weak_factory_.GetWeakPtr(), size, color_space_, format, texture_id, - is_overlay_candidate, std::move(gpu_memory_buffer), back_buffer_mailbox); + std::move(gpu_memory_buffer), back_buffer_mailbox); } void DrawingBuffer::AttachColorBufferToReadFramebuffer() {
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h index 88c7d91..5dc76db 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h
@@ -418,7 +418,6 @@ const gfx::ColorSpace& color_space, viz::ResourceFormat, GLuint texture_id, - bool is_overlay_candidate, std::unique_ptr<gfx::GpuMemoryBuffer>, gpu::Mailbox mailbox); ColorBuffer(const ColorBuffer&) = delete; @@ -437,7 +436,6 @@ const gfx::ColorSpace color_space; const viz::ResourceFormat format; const GLuint texture_id = 0; - const bool is_overlay_candidate; std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer; // If we're emulating an RGB back buffer using an RGBA Chromium
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test.cc b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test.cc index 385af30..040c8a5 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test.cc
@@ -345,6 +345,236 @@ testing::Mock::VerifyAndClearExpectations(gl_); } +class DrawingBufferImageChromiumTest : public DrawingBufferTest, + private ScopedWebGLImageChromiumForTest { + public: + DrawingBufferImageChromiumTest() : ScopedWebGLImageChromiumForTest(true) {} + + protected: + void SetUp() override { + platform_ = std::make_unique< + ScopedTestingPlatformSupport<GpuMemoryBufferTestPlatform>>(); + + gfx::Size initial_size(kInitialWidth, kInitialHeight); + auto gl = std::make_unique<GLES2InterfaceForTests>(); + auto provider = + std::make_unique<WebGraphicsContext3DProviderForTests>(std::move(gl)); + GLES2InterfaceForTests* gl_ = + static_cast<GLES2InterfaceForTests*>(provider->ContextGL()); + EXPECT_CALL(*gl_, CreateAndTexStorage2DSharedImageCHROMIUMMock(_)).Times(1); + Platform::GraphicsInfo graphics_info; + graphics_info.using_gpu_compositing = true; + drawing_buffer_ = DrawingBufferForTests::Create( + std::move(provider), graphics_info, gl_, initial_size, + DrawingBuffer::kPreserve, kDisableMultisampling); + CHECK(drawing_buffer_); + SetAndSaveRestoreState(true); + testing::Mock::VerifyAndClearExpectations(gl_); + } + + void TearDown() override { + platform_.reset(); + } + + GLuint image_id0_; + std::unique_ptr<ScopedTestingPlatformSupport<GpuMemoryBufferTestPlatform>> + platform_; +}; + +TEST_F(DrawingBufferImageChromiumTest, VerifyResizingReallocatesImages) { + GLES2InterfaceForTests* gl_ = drawing_buffer_->ContextGLForTests(); + viz::TestSharedImageInterface* sii = + drawing_buffer_->SharedImageInterfaceForTests(); + + viz::TransferableResource resource; + viz::ReleaseCallback release_callback; + + gfx::Size initial_size(kInitialWidth, kInitialHeight); + gfx::Size alternate_size(kInitialWidth, kAlternateHeight); + + // There should be currently one back buffer and therefore one SharedImage. + gpu::Mailbox mailbox1; + mailbox1.SetName(gl_->last_imported_shared_image()->name); + EXPECT_EQ(1u, sii->shared_image_count()); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox1)); + + // Produce one resource at size 100x100. This should create another buffer and + // therefore another SharedImage. + EXPECT_CALL(*gl_, CreateAndTexStorage2DSharedImageCHROMIUMMock(_)).Times(1); + EXPECT_FALSE(drawing_buffer_->MarkContentsChanged()); + EXPECT_TRUE(drawing_buffer_->PrepareTransferableResource(nullptr, &resource, + &release_callback)); + EXPECT_EQ(initial_size, sii->MostRecentSize()); + EXPECT_TRUE(resource.is_overlay_candidate); + EXPECT_EQ(initial_size, resource.size); + testing::Mock::VerifyAndClearExpectations(gl_); + VerifyStateWasRestored(); + gpu::Mailbox mailbox2; + mailbox2.SetName(gl_->last_imported_shared_image()->name); + EXPECT_EQ(2u, sii->shared_image_count()); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox1)); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox2)); + EXPECT_EQ(mailbox2, resource.mailbox_holder.mailbox); + + // Resize to 100x50. The current backbuffer must be destroyed. The exported + // resource should stay alive. A new backbuffer must be created. + EXPECT_CALL(*gl_, CreateAndTexStorage2DSharedImageCHROMIUMMock(_)).Times(1); + drawing_buffer_->Resize(alternate_size); + VerifyStateWasRestored(); + gpu::Mailbox mailbox3; + mailbox3.SetName(gl_->last_imported_shared_image()->name); + EXPECT_EQ(2u, sii->shared_image_count()); + EXPECT_FALSE(sii->CheckSharedImageExists(mailbox1)); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox2)); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox3)); + testing::Mock::VerifyAndClearExpectations(gl_); + + // Return the exported resource. Now it should get destroyed too. + std::move(release_callback).Run(gpu::SyncToken(), false /* lostResource */); + VerifyStateWasRestored(); + EXPECT_EQ(1u, sii->shared_image_count()); + EXPECT_FALSE(sii->CheckSharedImageExists(mailbox1)); + EXPECT_FALSE(sii->CheckSharedImageExists(mailbox2)); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox3)); + + // Produce a resource at the new size. + EXPECT_CALL(*gl_, CreateAndTexStorage2DSharedImageCHROMIUMMock(_)).Times(1); + EXPECT_TRUE(drawing_buffer_->MarkContentsChanged()); + EXPECT_TRUE(drawing_buffer_->PrepareTransferableResource(nullptr, &resource, + &release_callback)); + EXPECT_EQ(alternate_size, sii->MostRecentSize()); + EXPECT_TRUE(resource.is_overlay_candidate); + EXPECT_EQ(alternate_size, resource.size); + gpu::Mailbox mailbox4; + mailbox4.SetName(gl_->last_imported_shared_image()->name); + EXPECT_EQ(2u, sii->shared_image_count()); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox3)); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox4)); + EXPECT_EQ(mailbox4, resource.mailbox_holder.mailbox); + testing::Mock::VerifyAndClearExpectations(gl_); + + // Reset to initial size. The exported resource has to stay alive, but the + // current back buffer must be destroyed and a new one with the right size + // must be created. + EXPECT_CALL(*gl_, CreateAndTexStorage2DSharedImageCHROMIUMMock(_)).Times(1); + drawing_buffer_->Resize(initial_size); + VerifyStateWasRestored(); + gpu::Mailbox mailbox5; + mailbox5.SetName(gl_->last_imported_shared_image()->name); + EXPECT_EQ(2u, sii->shared_image_count()); + EXPECT_FALSE(sii->CheckSharedImageExists(mailbox3)); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox4)); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox5)); + testing::Mock::VerifyAndClearExpectations(gl_); + + // Return the exported resource. Now it will be destroyed too. + std::move(release_callback).Run(gpu::SyncToken(), false /* lostResource */); + VerifyStateWasRestored(); + EXPECT_EQ(1u, sii->shared_image_count()); + EXPECT_FALSE(sii->CheckSharedImageExists(mailbox3)); + EXPECT_FALSE(sii->CheckSharedImageExists(mailbox4)); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox5)); + + // Prepare another resource and verify that it's the correct size. + EXPECT_CALL(*gl_, CreateAndTexStorage2DSharedImageCHROMIUMMock(_)).Times(1); + EXPECT_TRUE(drawing_buffer_->MarkContentsChanged()); + EXPECT_TRUE(drawing_buffer_->PrepareTransferableResource(nullptr, &resource, + &release_callback)); + EXPECT_EQ(initial_size, sii->MostRecentSize()); + EXPECT_TRUE(resource.is_overlay_candidate); + EXPECT_EQ(initial_size, resource.size); + testing::Mock::VerifyAndClearExpectations(gl_); + gpu::Mailbox mailbox6; + mailbox6.SetName(gl_->last_imported_shared_image()->name); + EXPECT_EQ(2u, sii->shared_image_count()); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox5)); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox6)); + + // Prepare one final resource and verify that it's the correct size. We should + // recycle the previously exported resource and avoid allocating a new + // SharedImage. + std::move(release_callback).Run(gpu::SyncToken(), false /* lostResource */); + EXPECT_TRUE(drawing_buffer_->MarkContentsChanged()); + EXPECT_TRUE(drawing_buffer_->PrepareTransferableResource(nullptr, &resource, + &release_callback)); + EXPECT_EQ(initial_size, sii->MostRecentSize()); + EXPECT_TRUE(resource.is_overlay_candidate); + EXPECT_EQ(initial_size, resource.size); + std::move(release_callback).Run(gpu::SyncToken(), false /* lostResource */); + EXPECT_EQ(2u, sii->shared_image_count()); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox5)); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox6)); + + drawing_buffer_->BeginDestruction(); + testing::Mock::VerifyAndClearExpectations(sii); + EXPECT_EQ(0u, sii->shared_image_count()); +} + +TEST_F(DrawingBufferImageChromiumTest, AllocationFailure) { + GLES2InterfaceForTests* gl_ = drawing_buffer_->ContextGLForTests(); + viz::TestGpuMemoryBufferManager* gmb_manager = + static_cast<viz::TestGpuMemoryBufferManager*>( + Platform::Current()->GetGpuMemoryBufferManager()); + viz::TestSharedImageInterface* sii = + drawing_buffer_->SharedImageInterfaceForTests(); + + viz::TransferableResource resource1; + viz::ReleaseCallback release_callback1; + viz::TransferableResource resource2; + viz::ReleaseCallback release_callback2; + viz::TransferableResource resource3; + viz::ReleaseCallback release_callback3; + + // Request a resource. A SharedImage should already be created. Everything + // works as expected. + EXPECT_CALL(*gl_, CreateAndTexStorage2DSharedImageCHROMIUMMock(_)).Times(1); + EXPECT_FALSE(drawing_buffer_->MarkContentsChanged()); + EXPECT_TRUE(drawing_buffer_->PrepareTransferableResource(nullptr, &resource1, + &release_callback1)); + EXPECT_TRUE(resource1.is_overlay_candidate); + gpu::Mailbox mailbox1; + mailbox1.SetName(gl_->last_imported_shared_image()->name); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox1)); + testing::Mock::VerifyAndClearExpectations(gl_); + VerifyStateWasRestored(); + + // Force GpuMemoryBuffer creation failure. Request another resource. It should + // still be provided, but this time with allowOverlay = false. + EXPECT_CALL(*gl_, CreateAndTexStorage2DSharedImageCHROMIUMMock(_)).Times(1); + gmb_manager->SetFailOnCreate(true); + EXPECT_TRUE(drawing_buffer_->MarkContentsChanged()); + EXPECT_TRUE(drawing_buffer_->PrepareTransferableResource(nullptr, &resource2, + &release_callback2)); + EXPECT_FALSE(resource2.is_overlay_candidate); + gpu::Mailbox mailbox2; + mailbox2.SetName(gl_->last_imported_shared_image()->name); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox2)); + VerifyStateWasRestored(); + + // Check that if GpuMemoryBuffer allocation starts working again, resources + // are correctly created with allowOverlay = true. + EXPECT_CALL(*gl_, CreateAndTexStorage2DSharedImageCHROMIUMMock(_)).Times(1); + gmb_manager->SetFailOnCreate(false); + EXPECT_TRUE(drawing_buffer_->MarkContentsChanged()); + EXPECT_TRUE(drawing_buffer_->PrepareTransferableResource(nullptr, &resource3, + &release_callback3)); + EXPECT_TRUE(resource3.is_overlay_candidate); + gpu::Mailbox mailbox3; + mailbox3.SetName(gl_->last_imported_shared_image()->name); + EXPECT_TRUE(sii->CheckSharedImageExists(mailbox3)); + testing::Mock::VerifyAndClearExpectations(gl_); + VerifyStateWasRestored(); + + std::move(release_callback1).Run(gpu::SyncToken(), false /* lostResource */); + std::move(release_callback2).Run(gpu::SyncToken(), false /* lostResource */); + std::move(release_callback3).Run(gpu::SyncToken(), false /* lostResource */); + + drawing_buffer_->BeginDestruction(); + EXPECT_FALSE(sii->CheckSharedImageExists(mailbox1)); + EXPECT_FALSE(sii->CheckSharedImageExists(mailbox2)); + EXPECT_FALSE(sii->CheckSharedImageExists(mailbox3)); +} + class DepthStencilTrackingGLES2Interface : public gpu::gles2::GLES2InterfaceStub { public:
diff --git a/third_party/blink/renderer/platform/instrumentation/histogram.h b/third_party/blink/renderer/platform/instrumentation/histogram.h index 75440d4..7d43f81 100644 --- a/third_party/blink/renderer/platform/instrumentation/histogram.h +++ b/third_party/blink/renderer/platform/instrumentation/histogram.h
@@ -77,9 +77,17 @@ static bool ShouldRecord() { return base::TimeTicks::IsHighResolution(); } }; +static constexpr base::HistogramBase::Sample kTimeBasedHistogramMinSample = 1; +static constexpr base::HistogramBase::Sample kTimeBasedHistogramMaxSample = + static_cast<base::Histogram::Sample>(base::Seconds(10).InMicroseconds()); +static constexpr int32_t kTimeBasedHistogramBucketCount = 50; + #define SCOPED_BLINK_UMA_HISTOGRAM_TIMER_IMPL(name, allow_cross_thread) \ - DEFINE_STATIC_LOCAL_IMPL(CustomCountHistogram, scoped_us_counter, \ - (name, 0, 10000000, 50), allow_cross_thread); \ + DEFINE_STATIC_LOCAL_IMPL( \ + CustomCountHistogram, scoped_us_counter, \ + (name, kTimeBasedHistogramMinSample, kTimeBasedHistogramMaxSample, \ + kTimeBasedHistogramBucketCount), \ + allow_cross_thread); \ ScopedUsHistogramTimer timer(scoped_us_counter); #define SCOPED_BLINK_UMA_HISTOGRAM_TIMER_HIGHRES_IMPL(name, \
diff --git a/third_party/blink/renderer/platform/instrumentation/histogram_test.cc b/third_party/blink/renderer/platform/instrumentation/histogram_test.cc index c4d5c4b0..b5a4c4b 100644 --- a/third_party/blink/renderer/platform/instrumentation/histogram_test.cc +++ b/third_party/blink/renderer/platform/instrumentation/histogram_test.cc
@@ -32,8 +32,9 @@ }; TEST_F(ScopedUsHistogramTimerTest, Basic) { - TestCustomCountHistogram scoped_us_counter("ScopedUsHistogramTimerTest.Basic", - 0, 10000000, 50); + TestCustomCountHistogram scoped_us_counter( + "ScopedUsHistogramTimerTest.Basic", kTimeBasedHistogramMinSample, + kTimeBasedHistogramMaxSample, kTimeBasedHistogramBucketCount); { ScopedUsHistogramTimer timer(scoped_us_counter, test_task_runner_->GetMockTickClock()); @@ -45,7 +46,8 @@ TEST_F(ScopedUsHistogramTimerTest, BasicHighRes) { TestCustomCountHistogram scoped_us_counter( - "ScopedHighResUsHistogramTimerTest.Basic", 0, 10000000, 50); + "ScopedHighResUsHistogramTimerTest.Basic", kTimeBasedHistogramMinSample, + kTimeBasedHistogramMaxSample, kTimeBasedHistogramBucketCount); { ScopedHighResUsHistogramTimer timer(scoped_us_counter, test_task_runner_->GetMockTickClock());
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index e9bb07d..377b2b82 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2576,6 +2576,7 @@ // was enabled. { name: "SpeculationRules", + status: "stable", implied_by: ["SpeculationRulesPrefetchProxy", "SpeculationRulesPrefetchWithSubresources", "Prerender2", "SpeculationRulesDocumentRules", "SpeculationRulesRelativeToDocument"], origin_trial_feature_name: "SpeculationRules__DONOTUSE", }, @@ -2609,12 +2610,10 @@ origin_trial_feature_name: "SpeculationRulesPrefetchFuture", origin_trial_allows_third_party: true, }, - // Origin trial to enable Speculation Rules for access to the prefetch proxy. - // https://crbug.com/1190167 { name: "SpeculationRulesPrefetchProxy", origin_trial_feature_name: "SpeculationRulesPrefetch", - status: {"Android": "stable"}, + status: "stable", base_feature: "SpeculationRulesPrefetchProxy", copied_from_base_feature_if: "overridden", implied_by: ["SpeculationRulesPrefetchFuture"],
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.cc index cc2602d..ec74a9d 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.cc
@@ -9,6 +9,7 @@ #include "base/metrics/histogram_macros.h" #include "base/numerics/safe_conversions.h" #include "third_party/blink/public/platform/scheduler/web_renderer_process_type.h" +#include "third_party/blink/renderer/platform/instrumentation/histogram.h" #include "third_party/blink/renderer/platform/instrumentation/resource_coordinator/renderer_resource_coordinator.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h" @@ -22,8 +23,11 @@ MAIN_THREAD_LOAD_METRIC_NAME ".Extension" #define DURATION_PER_TASK_TYPE_METRIC_NAME \ "RendererScheduler.TaskDurationPerTaskType2" -#define QUEUEING_TIME_PER_QUEUE_TYPE_METRIC_NAME \ - "RendererScheduler.QueueingDurationPerQueueType" + +#define QUEUEING_DELAY_HISTOGRAM_INIT(name) \ + "RendererScheduler.QueueingDuration." name "Priority", \ + kTimeBasedHistogramMinSample, kTimeBasedHistogramMaxSample, \ + kTimeBasedHistogramBucketCount enum class MainThreadTaskLoadState { kLow, kHigh, kUnknown }; @@ -64,21 +68,19 @@ &MainThreadMetricsHelper::RecordForegroundMainThreadTaskLoad, base::Unretained(this)), kThreadLoadTrackerReportingInterval), - per_task_type_duration_reporter_(DURATION_PER_TASK_TYPE_METRIC_NAME), no_use_case_per_task_type_duration_reporter_( DURATION_PER_TASK_TYPE_METRIC_NAME ".UseCaseNone"), loading_per_task_type_duration_reporter_( DURATION_PER_TASK_TYPE_METRIC_NAME ".UseCaseLoading"), input_handling_per_task_type_duration_reporter_( DURATION_PER_TASK_TYPE_METRIC_NAME ".UseCaseInputHandling"), - foreground_per_task_type_duration_reporter_( - DURATION_PER_TASK_TYPE_METRIC_NAME ".Foreground"), - background_per_task_type_duration_reporter_( - DURATION_PER_TASK_TYPE_METRIC_NAME ".Background"), - background_after_fifth_minute_per_task_type_duration_reporter_( - DURATION_PER_TASK_TYPE_METRIC_NAME ".Background.AfterFifthMinute"), - background_after_tenth_minute_per_task_type_duration_reporter_( - DURATION_PER_TASK_TYPE_METRIC_NAME ".Background.AfterTenthMinute"), + queueing_delay_histograms_{{QUEUEING_DELAY_HISTOGRAM_INIT("Control")}, + {QUEUEING_DELAY_HISTOGRAM_INIT("Highest")}, + {QUEUEING_DELAY_HISTOGRAM_INIT("VeryHigh")}, + {QUEUEING_DELAY_HISTOGRAM_INIT("High")}, + {QUEUEING_DELAY_HISTOGRAM_INIT("Normal")}, + {QUEUEING_DELAY_HISTOGRAM_INIT("Low")}, + {QUEUEING_DELAY_HISTOGRAM_INIT("BestEffort")}}, total_task_time_reporter_( "Scheduler.Experimental.Renderer.TotalTime.Wall.MainThread.Positive", "Scheduler.Experimental.Renderer.TotalTime.Wall.MainThread.Negative"), @@ -172,10 +174,18 @@ total_task_time_reporter_.RecordAdditionalDuration( task_timing.wall_duration()); + if (queue && base::TimeTicks::IsHighResolution()) { + base::TimeDelta elapsed = + task_timing.start_time() - task.GetDesiredExecutionTime(); + queueing_delay_histograms_[queue->GetQueuePriority()].CountMicroseconds( + elapsed); + } + // WARNING: All code below must be compatible with down-sampling. - constexpr double kSamplingProbabily = .01; - if (!metrics_subsampler_.ShouldSample(kSamplingProbabily)) + constexpr double kSamplingProbability = .01; + if (!metrics_subsampler_.ShouldSample(kSamplingProbability)) { return; + } base::TimeDelta duration = task_timing.wall_duration(); UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime2",
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.h index 4b62c79..d09344a 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.h
@@ -11,6 +11,7 @@ #include "components/scheduling_metrics/total_duration_metric_reporter.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/platform/task_type.h" +#include "third_party/blink/renderer/platform/instrumentation/histogram.h" #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/scheduler/common/metrics_helper.h" #include "third_party/blink/renderer/platform/scheduler/common/thread_load_tracker.h" @@ -85,8 +86,6 @@ using TaskDurationPerTaskTypeMetricReporter = scheduling_metrics::TaskDurationMetricReporter<TaskType>; - TaskDurationPerTaskTypeMetricReporter per_task_type_duration_reporter_; - // The next three reporters are used to report the duration per task type // split by renderer scheduler use case (check use_case.h for reference): // None, Loading, and User Input (aggregation of multiple input-handling @@ -98,14 +97,9 @@ TaskDurationPerTaskTypeMetricReporter input_handling_per_task_type_duration_reporter_; - TaskDurationPerTaskTypeMetricReporter - foreground_per_task_type_duration_reporter_; - TaskDurationPerTaskTypeMetricReporter - background_per_task_type_duration_reporter_; - TaskDurationPerTaskTypeMetricReporter - background_after_fifth_minute_per_task_type_duration_reporter_; - TaskDurationPerTaskTypeMetricReporter - background_after_tenth_minute_per_task_type_duration_reporter_; + static_assert(TaskQueue::kQueuePriorityCount == 7); + CustomCountHistogram + queueing_delay_histograms_[TaskQueue::kQueuePriorityCount]; scheduling_metrics::TotalDurationMetricReporter total_task_time_reporter_;
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper_unittest.cc index 391d4ad..7d6b50b4 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper_unittest.cc
@@ -72,46 +72,24 @@ } void RunTask(MainThreadTaskQueue::QueueType queue_type, - base::TimeTicks start, - base::TimeDelta duration) { - DCHECK_LE(Now(), start); - FastForwardTo(start + duration); - scoped_refptr<MainThreadTaskQueueForTest> queue; + base::TimeTicks queue_time, + base::TimeDelta queue_duration, + base::TimeDelta task_duration) { + base::TimeTicks start_time = queue_time + queue_duration; + base::TimeTicks end_time = start_time + task_duration; + FastForwardTo(end_time); + scoped_refptr<MainThreadTaskQueue> queue; if (queue_type != MainThreadTaskQueue::QueueType::kDetached) { - queue = scoped_refptr<MainThreadTaskQueueForTest>( - new MainThreadTaskQueueForTest(queue_type)); + queue = scheduler_->GetHelper().NewTaskQueue( + MainThreadTaskQueue::QueueCreationParams(queue_type)); } - metrics_helper_->RecordTaskMetrics(queue.get(), FakeTask(), - FakeTaskTiming(start, start + duration)); + FakeTask task; + task.queue_time = queue_time; + metrics_helper_->RecordTaskMetrics(queue.get(), task, + FakeTaskTiming(start_time, end_time)); } - void RunTask(FrameSchedulerImpl* scheduler, - base::TimeTicks start, - base::TimeDelta duration) { - DCHECK_LE(Now(), start); - FastForwardTo(start + duration); - scoped_refptr<MainThreadTaskQueueForTest> queue( - new MainThreadTaskQueueForTest(QueueType::kDefault)); - queue->SetFrameSchedulerForTest(scheduler); - metrics_helper_->RecordTaskMetrics(queue.get(), FakeTask(), - FakeTaskTiming(start, start + duration)); - } - - void RunTask(UseCase use_case, - base::TimeTicks start, - base::TimeDelta duration) { - DCHECK_LE(Now(), start); - FastForwardTo(start + duration); - scoped_refptr<MainThreadTaskQueueForTest> queue( - new MainThreadTaskQueueForTest(QueueType::kDefault)); - scheduler_->SetCurrentUseCaseForTest(use_case); - metrics_helper_->RecordTaskMetrics(queue.get(), FakeTask(), - FakeTaskTiming(start, start + duration)); - } - - void ForceUpdatePolicy() { scheduler_->ForceUpdatePolicy(); } - std::unique_ptr<FakeFrameScheduler> CreateFakeFrameSchedulerWithType( FrameStatus frame_status) { FakeFrameScheduler::Builder builder; @@ -250,5 +228,16 @@ } } +TEST_F(MainThreadMetricsHelperTest, TaskQueueingDelay) { + base::TimeTicks queue_time = Now(); + base::TimeDelta queue_duration = base::Microseconds(11); + base::TimeDelta task_duration = base::Microseconds(97); + RunTask(MainThreadTaskQueue::QueueType::kDefault, queue_time, queue_duration, + task_duration); + histogram_tester_->ExpectUniqueSample( + "RendererScheduler.QueueingDuration.NormalPriority", + queue_duration.InMicroseconds(), 1); +} + } // namespace scheduler } // namespace blink
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_results_processor.py b/third_party/blink/tools/blinkpy/w3c/wpt_results_processor.py index 7209a5c..99d084b 100644 --- a/third_party/blink/tools/blinkpy/w3c/wpt_results_processor.py +++ b/third_party/blink/tools/blinkpy/w3c/wpt_results_processor.py
@@ -20,6 +20,7 @@ from blinkpy.web_tests.models.typ_types import ( Artifacts, Result, + ResultType, ResultSinkReporter, ) @@ -455,6 +456,13 @@ for iteration, (actual, duration) in enumerate(zip(actual_statuses, durations)): + if (self.run_info.get('sanitizer_enabled') + and actual == ResultType.Failure): + # `--enable-sanitizer` is equivalent to running every test as a + # crashtest. It suffices for a crashtest to not suffer a timeout + # or low-level crash to pass: + # https://web-platform-tests.org/writing-tests/crashtest.html + actual = ResultType.Pass result = Result( name=test_name, actual=actual,
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_results_processor_unittest.py b/third_party/blink/tools/blinkpy/w3c/wpt_results_processor_unittest.py index f240cc8..0a2536836 100644 --- a/third_party/blink/tools/blinkpy/w3c/wpt_results_processor_unittest.py +++ b/third_party/blink/tools/blinkpy/w3c/wpt_results_processor_unittest.py
@@ -319,6 +319,25 @@ }, }]) + def test_result_sink_with_sanitizer(self): + self._create_json_output({ + 'tests': { + 'fail': { + 'test.html': { + 'expected': 'PASS', + 'actual': 'FAIL', + }, + }, + }, + 'path_delimiter': '/', + }) + self.processor.run_info['sanitizer_enabled'] = True + self.processor.process_wpt_results(OUTPUT_JSON_FILENAME) + (request, ) = self.processor.sink.sink_requests + self.assertEqual(request['result']['actual'], 'PASS') + self.assertEqual(request['result']['expected'], {'PASS'}) + self.assertEqual(request['result']['unexpected'], False) + def test_result_sink_for_multiple_runs(self): json_dict = { 'tests': {
diff --git a/third_party/blink/tools/run_wpt_tests.py b/third_party/blink/tools/run_wpt_tests.py index 196a7f9f..295a5d9 100755 --- a/third_party/blink/tools/run_wpt_tests.py +++ b/third_party/blink/tools/run_wpt_tests.py
@@ -252,6 +252,7 @@ # suite. 'flag_specific': self.options.flag_specific or '', 'used_upstream': self.options.use_upstream_wpt, + 'sanitizer_enabled': self.options.enable_sanitizer, } if self.options.use_upstream_wpt: # `run_wpt_tests` does not run in the upstream checkout's git @@ -324,11 +325,6 @@ 'the upstream github wpt to a temporary ' 'directory and will use the binary and ' 'tests from upstream')) - parser.add_argument('--no-wpt-internal', - action='store_false', - dest='run_wpt_internal', - default=True, - help=('Do not run internal WPTs.')) parser.add_argument('--flag-specific', choices=sorted(self.port.flag_specific_configs()), metavar='FLAG_SPECIFIC', @@ -339,12 +335,13 @@ default=True, help=('Use this tag to not run wptrunner in' 'headless mode')) - # TODO(crbug.com/1377834) show results in browser in future. - # currently this flag is no-op parser.add_argument('--show-results-in-browser', action='store_true', - help='adding this tag will show results in' - 'the browser') + help='Open the results viewer in a browser.') + parser.add_argument( + '--enable-sanitizer', + action='store_true', + help='Only report sanitizer-related errors and crashes.') def add_binary_arguments(self, parser): group = parser.add_argument_group( @@ -385,6 +382,11 @@ '--gtest_filter', metavar='TESTS_OR_DIRS', help='Colon-separated list of test names (URL prefixes).') + parser.add_argument('--no-wpt-internal', + action='store_false', + dest='run_wpt_internal', + default=True, + help='Do not run internal WPTs.') return group def add_mode_arguments(self, parser):
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng index 4ec9205..e7df0ff 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng +++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -11,7 +11,6 @@ # Tests that fail in legacy but pass in NG # ====== New tests from wpt-importer added here ====== -crbug.com/626703 external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed.tentative.html [ Failure ] crbug.com/626703 external/wpt/fullscreen/api/document-exit-fullscreen-nested-in-iframe.html [ Timeout ] crbug.com/626703 external/wpt/css/css-sizing/aspect-ratio/replaced-element-039.html [ Failure ] crbug.com/626703 external/wpt/css/css-sizing/aspect-ratio/replaced-element-040.html [ Failure ] @@ -2176,6 +2175,9 @@ external/wpt/html/semantics/popovers/popover-anchor-scroll-display.tentative.html [ Skip ] external/wpt/html/semantics/popovers/popover-anchor-nested-display.tentative.html [ Skip ] +# HTML <selectmenu> depends on CSS Anchor Positioning +external/wpt/html/semantics/forms/the-selectmenu-element/* [ Skip ] + crbug.com/1303102 external/wpt/css/css-images/object-view-box* [ Skip ] crbug.com/1303102 virtual/view-transition/external/wpt/css/css-view-transitions/new-content-with-overflow-zoomed.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 95156ba2..1b803a95 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -209,12 +209,6 @@ crbug.com/1383735 http/tests/devtools/elements/styles-1/add-new-rule-inline-style-csp.js [ Failure Pass ] crbug.com/1383735 http/tests/devtools/modify-cross-domain-rule.js [ Failure Pass ] -# ====== Popover and Anchor Positioning failures from here ====== - -crbug.com/1307772 external/wpt/html/semantics/popovers/popover-attribute-basic.tentative.html [ Failure Pass ] - -# ====== Popover and Anchor Positioning failures to here ====== - # Sheriff on 2020-09-03 crbug.com/1124352 media/picture-in-picture/clear-after-request.html [ Crash Pass ] crbug.com/1124352 media/picture-in-picture/controls/picture-in-picture-button.html [ Crash Pass ] @@ -3417,6 +3411,9 @@ crbug.com/876994 external/wpt/pointerevents/pointerevent_attributes_hoverable_rightbutton.html?mouse [ Failure ] crbug.com/876994 external/wpt/pointerevents/pointerevent_attributes_hoverable_rightbutton.html?pen [ Failure ] crbug.com/876994 external/wpt/uievents/mouse/attributes.html [ Failure ] +crbug.com/1136584 external/wpt/pointerevents/capturing_boundary_event_handler_at_ua_shadowdom.html?mouse [ Failure ] +crbug.com/1136584 external/wpt/pointerevents/capturing_boundary_event_handler_at_ua_shadowdom.html?pen [ Failure ] +crbug.com/1136584 external/wpt/pointerevents/capturing_boundary_event_handler_at_ua_shadowdom.html?touch [ Failure ] crbug.com/626703 external/wpt/payment-method-basic-card/apply_the_modifiers.html [ Timeout ] crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-tracks.https.html [ Skip Timeout ] crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-remote-track-mute.https.html [ Skip Timeout ] @@ -3617,8 +3614,6 @@ crbug.com/809935 external/wpt/css/css-fonts/variations/font-style-interpolation.html [ Skip Timeout ] crbug.com/626703 external/wpt/css/css-ui/text-overflow-011.html [ Crash Failure Pass ] -crbug.com/1088280 [ Mac ] external/wpt/dom/events/scrolling/scrollend-event-for-user-scroll.html [ Failure Timeout ] -crbug.com/1088280 [ Win ] external/wpt/dom/events/scrolling/scrollend-event-for-user-scroll.html [ Failure Timeout ] crbug.com/1088280 external/wpt/dom/events/scrolling/scrollend-event-handler-content-attributes.html [ Timeout ] crbug.com/1395298 external/wpt/dom/events/scrolling/scrollend-event-fired-to-element-with-overscroll-behavior.html [ Timeout ]
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/scrolling/scroll_support.js b/third_party/blink/web_tests/external/wpt/dom/events/scrolling/scroll_support.js index d3be274..169393e 100644 --- a/third_party/blink/web_tests/external/wpt/dom/events/scrolling/scroll_support.js +++ b/third_party/blink/web_tests/external/wpt/dom/events/scrolling/scroll_support.js
@@ -1,8 +1,22 @@ +async function waitForScrollendEvent(test, target, timeoutMs = 500) { + return new Promise((resolve, reject) => { + const timeoutCallback = test.step_timeout(() => { + reject(`No Scrollend event received for target ${target}`); + }, timeoutMs); + target.addEventListener('scrollend', (evt) => { + clearTimeout(timeoutCallback); + resolve(evt); + }, { once: true }); + }); +} + const MAX_FRAME = 700; const MAX_UNCHANGED_FRAMES = 20; // Returns a promise that resolves when the given condition is met or rejects // after MAX_FRAME animation frames. +// TODO(crbug.com/1400399): deprecate. We should not use frame based waits in +// WPT as frame rates may vary greatly in different testing environments. function waitFor(condition, error_message = 'Reaches the maximum frames.') { return new Promise((resolve, reject) => { function tick(frames) { @@ -19,6 +33,9 @@ }); } +// TODO(crbug.com/1400446): Test driver should defer sending events until the +// browser is ready. Also the term compositor-commit is misleading as not all +// user-agents use a compositor process. function waitForCompositorCommit() { return new Promise((resolve) => { // rAF twice. @@ -28,6 +45,8 @@ }); } +// TODO(crbug.com/1400399): Deprecate as frame rates may vary greatly in +// different test environments. function waitForAnimationEnd(getValue) { var last_changed_frame = 0; var last_position = getValue(); @@ -124,6 +143,8 @@ // Returns a promise that resolves when the given condition holds for 10 // animation frames or rejects if the condition changes to false within 10 // animation frames. +// TODO(crbug.com/1400399): Deprecate as frame rates may very greatly in +// different test environments. function conditionHolds(condition, error_message = 'Condition is not true anymore.') { const MAX_FRAME = 10; return new Promise((resolve, reject) => {
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/scrolling/scrollend-event-for-user-scroll.html b/third_party/blink/web_tests/external/wpt/dom/events/scrolling/scrollend-event-for-user-scroll.html index e203482d..5146c5f 100644 --- a/third_party/blink/web_tests/external/wpt/dom/events/scrolling/scrollend-event-for-user-scroll.html +++ b/third_party/blink/web_tests/external/wpt/dom/events/scrolling/scrollend-event-for-user-scroll.html
@@ -30,110 +30,170 @@ <script> var target_div = document.getElementById('targetDiv'); -var scrollend_arrived = false; -function onScrollEnd(event) { - assert_false(event.cancelable); - assert_false(event.bubbles); - scrollend_arrived = true; -} - -function resetTargetScrollState() { +async function resetTargetScrollState(test) { + if (target_div.scrollTop != 0 || target_div.scrollLeft != 0) { target_div.scrollTop = 0; target_div.scrollLeft = 0; + return waitForScrollendEvent(test, target_div); + } } -function checkFinalPosition(target, position, pause_time_in_ms) { - return new Promise((resolve, reject) => { - step_timeout(() => { - resolve(); - assert_equals(position.x, target.scrollLeft); - assert_equals(position.y, target.scrollTop); - }, pause_time_in_ms); - }); +async function verifyScrollStopped(test) { + const unscaled_pause_time_in_ms = 100; + const x = target_div.scrollLeft; + const y = target_div.scrollTop; + return new Promise(resolve => { + test.step_timeout(() => { + assert_equals(x, target_div.scrollLeft); + assert_equals(y, target_div.scrollTop); + resolve(); + }, unscaled_pause_time_in_ms); + }); } -target_div.addEventListener("scrollend", onScrollEnd); +async function verifyNoScrollendOnDocument(test) { + const callback = + test.unreached_func("window got unexpected scrollend event."); + window.addEventListener('scrollend', callback); +} + +async function createScrollendPromise(test) { + return waitForScrollendEvent(test, target_div).then(evt => { + assert_false(evt.cancelable, 'Event is not cancelable'); + assert_false(evt.bubbles, 'Event targeting element does not bubble'); + }); +} function runTest() { - promise_test(async (t) => { - // Make sure that no scrollend event is sent to window. - window.addEventListener("scrollend", - t.unreached_func("window got unexpected scrollend event.")); - await waitForCompositorCommit(); - scrollend_arrived = false; + promise_test(async (t) => { + // Skip the test on a Mac as they do not support touch screens. + const isMac = navigator.platform.toUpperCase().indexOf('MAC')>=0; + if (isMac) + return; - // Perform drag action on target div and wait for target_div to get scrollend event. - var origin = { x: target_div.offsetWidth / 2, y: target_div.offsetHeight - 50 }; - var delta = { x: 0, y: 40 }; - await mouseActionsInTarget(target_div, origin, delta, 300); - await waitFor(() => { return scrollend_arrived; }, - 'target_div did not receive scrollend event after dragging scroll on target.'); - assert_true(target_div.scrollTop > 0); - await checkFinalPosition(target_div, {x: target_div.scrollLeft, y: target_div.scrollTop}, 300); - }, 'Tests that the target_div gets scrollend event when dragging scroll on target.'); + await resetTargetScrollState(t); + await waitForCompositorCommit(); - promise_test(async (t) => { - resetTargetScrollState(); - // Make sure that no scrollend event is sent to window. - window.addEventListener("scrollend", - t.unreached_func("window got unexpected scrollend event.")); - await waitForCompositorCommit(); - scrollend_arrived = false; + const targetScrollendPromise = createScrollendPromise(t); + verifyNoScrollendOnDocument(t); - // Hit the scrollbar of target div and wait for target_div to get scrollend event. - var scrollbar_width = target_div.offsetWidth - target_div.clientWidth; - assert_true(scrollbar_width > 0, "This test requires scrollbar."); - var origin = {x: target_div.offsetWidth - scrollbar_width / 2, y: target_div.offsetHeight - 50}; - var delta = {x: 0, y: 0}; - await mouseActionsInTarget(target_div, origin, delta, 100); - await waitFor(() => { return scrollend_arrived; }, - 'target_div did not receive scrollend event after clicking scrollbar on target.'); - assert_true(target_div.scrollTop > 0); - await checkFinalPosition(target_div, { x: target_div.scrollLeft, y: target_div.scrollTop }, 300); - }, 'Tests that the target_div gets scrollend event when click scrollbar on target.'); + // Perform a touch drag on target div and wait for target_div to get + // a scrollend event. + await new test_driver.Actions() + .addPointer('TestPointer', 'touch') + .pointerMove(0, 0, {origin: target_div}) // 0, 0 is center of element. + .pointerDown() + .addTick() + .pointerMove(0, -40, {origin: target_div}) // Drag up to move down. + .addTick() + .pause(200) // Prevent inertial scroll. + .pointerUp() + .send(); - promise_test(async (t) => { - resetTargetScrollState(); - // Make sure that no scrollend event is sent to window. - window.addEventListener("scrollend", - t.unreached_func("window got unexpected scrollend event.")); - await waitForCompositorCommit(); - scrollend_arrived = false; + await targetScrollendPromise; + assert_true(target_div.scrollTop > 0); + await verifyScrollStopped(t); + }, 'Tests that the target_div gets scrollend event when touch dragging.'); - // Drag the thumb of target div. - var scrollbar_width = target_div.offsetWidth - target_div.clientWidth; - assert_true(scrollbar_width > 0, "This test requires scrollbar."); - var origin = { x: target_div.offsetWidth - scrollbar_width / 2, y: 50 }; - var delta = { x: 0, y: 20 }; - await mouseActionsInTarget(target_div, origin, delta, 100); - await waitFor(() => { return scrollend_arrived; }, - 'target_div did not receive scrollend event after dragging the thumb of target.'); - assert_true(target_div.scrollTop > 0); - await checkFinalPosition(target_div, { x: target_div.scrollLeft, y: target_div.scrollTop }, 300); - }, 'Tests that the target_div gets scrollend event when drag the thumb of target.'); + promise_test(async (t) => { + // Skip test on platforms that do not have a visible scrollbar (e.g. + // overlay scrollbar). + const scrollbar_width = target_div.offsetWidth - target_div.clientWidth; + if (scrollbar_width == 0) + return; - promise_test(async (t) => { - resetTargetScrollState(); - // Make sure that no scrollend event is sent to window. - window.addEventListener("scrollend", - t.unreached_func("window got unexpected scrollend event.")); - await waitForCompositorCommit(); - scrollend_arrived = false; + await resetTargetScrollState(t); + await waitForCompositorCommit(); - // Hit and active the target div. - var origin = { x: target_div.offsetWidth / 2, y: target_div.offsetHeight / 2}; - var delta = { x: 0, y: 0 }; - await mouseActionsInTarget(target_div, origin, delta, 100); - // Send DOWN key to the target div. - window.test_driver.send_keys(target_div, '\ue015'); + const targetScrollendPromise = createScrollendPromise(t); + verifyNoScrollendOnDocument(t); - await waitFor(() => { return scrollend_arrived; }, - 'target_div did not receive scrollend event after sending DOWN key to target.'); - assert_true(target_div.scrollTop > 0); - await checkFinalPosition(target_div, { x: target_div.scrollLeft, y: target_div.scrollTop }, 300); - }, 'Tests that the target_div gets scrollend event when send DOWN key to target.'); + const bounds = target_div.getBoundingClientRect(); + const x = bounds.right - scrollbar_width / 2; + const y = bounds.bottom - 20; + await new test_driver.Actions() + .addPointer('TestPointer', 'mouse') + .pointerMove(x, y, {origin: 'viewport'}) + .pointerDown() + .addTick() + .pointerUp() + .send(); + + await targetScrollendPromise; + assert_true(target_div.scrollTop > 0); + await verifyScrollStopped(t); + }, 'Tests that the target_div gets scrollend event when clicking ' + + 'scrollbar.'); + + // Same issue as previous test. + promise_test(async (t) => { + // Skip test on platforms that do not have a visible scrollbar (e.g. + // overlay scrollbar). + const scrollbar_width = target_div.offsetWidth - target_div.clientWidth; + if (scrollbar_width == 0) + return; + + resetTargetScrollState(t); + const targetScrollendPromise = createScrollendPromise(t); + verifyNoScrollendOnDocument(t); + + const bounds = target_div.getBoundingClientRect(); + const x = bounds.right - scrollbar_width / 2; + const y = bounds.top + 30; + const dy = 30; + await new test_driver.Actions() + .addPointer('TestPointer', 'mouse') + .pointerMove(x, y, { origin: 'viewport' }) + .pointerDown() + .pointerMove(x, y + dy, { origin: 'viewport' }) + .addTick() + .pointerUp() + .send(); + + await targetScrollendPromise; + assert_true(target_div.scrollTop > 0); + await verifyScrollStopped(t); + }, 'Tests that the target_div gets scrollend event when dragging the ' + + 'scrollbar thumb.'); + + promise_test(async (t) => { + resetTargetScrollState(t); + const targetScrollendPromise = createScrollendPromise(t); + verifyNoScrollendOnDocument(t); + + const x = 0; + const y = 0; + const dx = 0; + const dy = 40; + const duration_ms = 10; + await new test_driver.Actions() + .scroll(x, y, dx, dy, { origin: target_div }, duration_ms) + .send(); + + await targetScrollendPromise; + assert_true(target_div.scrollTop > 0); + await verifyScrollStopped(t); + }, 'Tests that the target_div gets scrollend event when mouse wheel ' + + 'scrolling.'); + + promise_test(async (t) => { + await resetTargetScrollState(t); + await waitForCompositorCommit(); + + verifyNoScrollendOnDocument(t); + const targetScrollendPromise = createScrollendPromise(t); + + target_div.focus(); + window.test_driver.send_keys(target_div, '\ue015'); + + await targetScrollendPromise; + assert_true(target_div.scrollTop > 0); + await verifyScrollStopped(t); + }, 'Tests that the target_div gets scrollend event when sending DOWN key ' + + 'to the target.'); } + </script> </html>
diff --git a/third_party/blink/web_tests/external/wpt/dom/xslt/sort-ref.html b/third_party/blink/web_tests/external/wpt/dom/xslt/sort-ref.html new file mode 100644 index 0000000..163002d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/dom/xslt/sort-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://bugs.chromium.org/p/chromium/issues/detail?id=1399858"> + +<div> + <div>1</div> + <div>2</div> + <div>3</div> + <div>7</div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/dom/xslt/sort.html b/third_party/blink/web_tests/external/wpt/dom/xslt/sort.html new file mode 100644 index 0000000..631c3ed --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/dom/xslt/sort.html
@@ -0,0 +1,48 @@ +<!DOCTYPE html> +<link rel=match href="sort-ref.html"> + +<body> + <div id="container"></div> +</body> + +<script type="text/xml" id="sampleXml"> + <root> + <node id="1" /> + <node id="7" /> + <node id="3" /> + <node id="2" /> + </root> +</script> + +<script type="text/xml" id="sampleXsl"> + <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> + + <xsl:template match="/"> + <xsl:apply-templates select="//node"> + <xsl:sort select="@id" data-type="number" /> + </xsl:apply-templates> + </xsl:template> + + <xsl:template match="node"> + <div> + <xsl:value-of select="@id"/> + </div> + </xsl:template> + + </xsl:stylesheet> +</script> + +<script> + let parser = new DOMParser(); + const xslStyleSheet = parser.parseFromString(document.getElementById('sampleXsl').textContent, 'text/xml'); + + const xsltProcessor = new XSLTProcessor(); + xsltProcessor.importStylesheet(xslStyleSheet); + + parser = new DOMParser(); + const xmlDoc = parser.parseFromString(document.getElementById('sampleXml').textContent, 'text/xml'); + + const fragment = xsltProcessor.transformToFragment(xmlDoc, document); + + document.getElementById('container').appendChild(fragment); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-attribute-basic.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-attribute-basic.tentative.html index 2250d6fa..1bc32db 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-attribute-basic.tentative.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-attribute-basic.tentative.html
@@ -2,6 +2,7 @@ <meta charset="utf-8"> <link rel="author" href="mailto:masonf@chromium.org"> <link rel=help href="https://open-ui.org/components/popup.research.explainer"> +<meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> @@ -283,8 +284,9 @@ other_popover.showPopover(); const popover = createPopover(t); popover.setAttribute('popover','auto'); - other_popover.addEventListener('toggle', (e) => { - if (e.state !== "closing") return; + other_popover.addEventListener('beforetoggle', (e) => { + if (e.newState !== "closed") + return; popover.setAttribute('popover','manual'); },{once: true}); assert_true(other_popover.matches(':open')); @@ -292,7 +294,7 @@ popover.showPopover(); assert_false(other_popover.matches(':open'),'unrelated popover is hidden'); assert_false(popover.matches(':open'),'popover is not shown if its type changed during show'); - },`Changing the popover type in a "toggle" event handler should not cause problems (during showPopover())`); + },`Changing the popover type in a "beforetoggle" event handler should not cause problems (during showPopover())`); test((t) => { const popover = createPopover(t); @@ -303,13 +305,15 @@ popover.showPopover(); other_popover.showPopover(); let nested_popover_hidden=false; - other_popover.addEventListener('toggle', (e) => { - if (e.state !== "closing") return; + other_popover.addEventListener('beforetoggle', (e) => { + if (e.newState !== "closed") + return; nested_popover_hidden = true; popover.setAttribute('popover','manual'); },{once: true}); - popover.addEventListener('toggle', (e) => { - if (e.state !== "closing") return; + popover.addEventListener('beforetoggle', (e) => { + if (e.newState !== "closed") + return; assert_true(nested_popover_hidden,'The nested popover should be hidden first'); },{once: true}); assert_true(popover.matches(':open')); @@ -318,7 +322,7 @@ assert_false(other_popover.matches(':open'),'unrelated popover is hidden'); assert_false(popover.matches(':open'),'popover is still hidden if its type changed during hide event'); assert_throws_dom("InvalidStateError",() => other_popover.hidePopover(),'Nested popover should already be hidden'); - },`Changing the popover type in a "toggle" event handler should not cause problems (during hidePopover())`); + },`Changing the popover type in a "beforetoggle" event handler should not cause problems (during hidePopover())`); function interpretedType(typeString,method) { if (validTypes.includes(typeString)) @@ -355,8 +359,9 @@ popover.showPopover(); assert_true(popover.matches(':open')); let gotEvent = false; - popover.addEventListener('toggle', (e) => { - if (e.state !== "closing") return; + popover.addEventListener('beforetoggle', (e) => { + if (e.newState !== "closed") + return; gotEvent = true; setPopoverValue(popover,inEventType,method); },{once:true}); @@ -392,7 +397,7 @@ } } } - },`Changing a popover from ${type} to ${newType} (via ${method}), and then ${inEventType} during 'toggle' works`); + },`Changing a popover from ${type} to ${newType} (via ${method}), and then ${inEventType} during 'beforetoggle' works`); }); }); });
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/capturing_boundary_event_handler_at_ua_shadowdom.html b/third_party/blink/web_tests/external/wpt/pointerevents/capturing_boundary_event_handler_at_ua_shadowdom.html new file mode 100644 index 0000000..7500277f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/pointerevents/capturing_boundary_event_handler_at_ua_shadowdom.html
@@ -0,0 +1,80 @@ +<!DOCTYPE HTML> +<title>Capturing boundary event handler at UA Shadow DOM</title> +<meta name="variant" content="?mouse"> +<meta name="variant" content="?touch"> +<meta name="variant" content="?pen"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="pointerevent_support.js"></script> + +<style> + .target { + width: 100px; + height: 50px; + border: 1px solid red; + } +</style> +<!-- This div has no shadow dom, serves only as a "control" group. --> +<div class="target"></div> +<video class="target"></video> +<input class="target"></input> +<div id="done">done</div> + +<script> + "use strict"; + const pointer_type = location.search.substring(1); + + const targets = document.getElementsByClassName("target"); + const done = document.getElementById("done"); + + let event_log = []; + function logEventAndPhase(e) { + event_log.push(`${e.type}-${e.eventPhase}`); + } + + const logged_events = [ + "pointerenter", "pointerleave", "pointerover", "pointerout" + ]; + const expected_events_and_phases = [ + "pointerover-2", "pointerenter-2", "pointerout-2", "pointerleave-2" + ]; + + function addPromiseTest(target) { + const test_name = `Capturing boundary event handler at ${target.tagName}`; + promise_test(async () => { + event_log = []; + + logged_events.forEach(ename => { + target.addEventListener(ename, logEventAndPhase, {capture:true}); + }); + + let done_click_promise = getEvent("click", done); + + let actions = new test_driver.Actions() + .addPointer("TestPointer", pointer_type) + .pointerMove(0, 0, {origin: target}) + .pointerDown() + .pointerUp() + .pointerMove(0, 0, {origin: done}) + .pointerDown() + .pointerUp(); + + await actions.send(); + await done_click_promise; + + logged_events.forEach(ename => { + target.removeEventListener(ename, logEventAndPhase, {capture:true}); + }); + + assert_equals(event_log.toString(), + expected_events_and_phases.toString(), + "received events with phases"); + }, test_name); + } + + for (let i = 0; i < targets.length; i++) + addPromiseTest(targets.item(i)); +</script>
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/resources/use-counter-third-party-controlled-iframe.html b/third_party/blink/web_tests/http/tests/serviceworker/resources/use-counter-third-party-controlled-iframe.html index ff866c8..3ad21346 100644 --- a/third_party/blink/web_tests/http/tests/serviceworker/resources/use-counter-third-party-controlled-iframe.html +++ b/third_party/blink/web_tests/http/tests/serviceworker/resources/use-counter-third-party-controlled-iframe.html
@@ -10,6 +10,7 @@ window.top.postMessage('FAIL: unexpected message', '*'); return; } + const registration = await navigator.serviceWorker.register('../resources/empty-worker.js'); await window.internals.observeUseCounter(document, kFeature); if (window.internals.isUseCounted(document, kFeature)) { @@ -18,5 +19,7 @@ } window.top.postMessage('FAIL: !isUseCounted', '*'); + + registration.unregister(); }); </script>
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/use-counter-third-party-page-controlled.html b/third_party/blink/web_tests/http/tests/serviceworker/use-counter-third-party-page-controlled.html index 16fb529..6839f0f 100644 --- a/third_party/blink/web_tests/http/tests/serviceworker/use-counter-third-party-page-controlled.html +++ b/third_party/blink/web_tests/http/tests/serviceworker/use-counter-third-party-page-controlled.html
@@ -32,18 +32,22 @@ }); } -// This test registers a service worker and opens a cross-origin popup. The -// popup creates an iframe same-origin with the opener page. The iframe -// communicates whether it has observed UseCounter kThirdPartyServiceWorker. +// This test opens a cross-origin popup and then the popup creates an iframe +// that's same-origin with the opener page. In the iframe we create a service +// worker and then the iframe communicates whether it has observed UseCounter +// kThirdPartyServiceWorker. When storage partitioning is disabled, the +// service worker will be shared between the top-level context and the iframe +// (we could have created the service worker here, for instance). When storage +// partitioning is enabled, though, service workers won't be shared between the +// top-level site and the iframe. Therefore, we need to create the service +// worker in the iframe so that a corresponding service worker is present and +// will cause the kThirdPartyServiceWorker UseCounter to be hit. promise_test(async t => { const popup_url = get_host_info().HTTPS_REMOTE_ORIGIN + '/serviceworker/resources/use-counter-third-party-parent.html'; const popup = window.open(popup_url); await popup_page_loaded(); - const registration = await navigator.serviceWorker.register('resources/empty-worker.js'); - t.add_cleanup(() => registration.unregister()); - await wait_for_state(t, registration.installing, 'activated'); return assert_subframe_has_use_counter(popup, 'frame in the popup should have observed the use counter kThirdPartyServiceWorker'); }, 'Test UseCounter for service worker controlled page in third party context.');
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/dom/events/scrolling/scrollend-event-for-user-scroll-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/dom/events/scrolling/scrollend-event-for-user-scroll-expected.txt deleted file mode 100644 index a9b7884..0000000 --- a/third_party/blink/web_tests/platform/linux/external/wpt/dom/events/scrolling/scrollend-event-for-user-scroll-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -FAIL Tests that the target_div gets scrollend event when dragging scroll on target. promise_test: Unhandled rejection with value: "target_div did not receive scrollend event after dragging scroll on target." -FAIL Tests that the target_div gets scrollend event when click scrollbar on target. promise_test: Unhandled rejection with value: "target_div did not receive scrollend event after clicking scrollbar on target." -FAIL Tests that the target_div gets scrollend event when drag the thumb of target. promise_test: Unhandled rejection with value: "target_div did not receive scrollend event after dragging the thumb of target." -PASS Tests that the target_div gets scrollend event when send DOWN key to target. -Harness: the test ran to completion. -
diff --git a/third_party/leveldatabase/README.chromium b/third_party/leveldatabase/README.chromium index 229552a..9069527 100644 --- a/third_party/leveldatabase/README.chromium +++ b/third_party/leveldatabase/README.chromium
@@ -7,8 +7,10 @@ Security Critical: yes Description: -Alternative to SQLite used as the backend for IndexedDB and internally by the -FileSystem API implementation and others. +Alternative to SQLite. + +Prefer using SQLite when feasible. For googlers, please refer to +go/use-sqlite-in-chrome for more details. Currently using (not yet released) manifest reuse feature for all platforms except Chrome OS.
diff --git a/third_party/libxslt/README.chromium b/third_party/libxslt/README.chromium index 32dda510..59a99002 100644 --- a/third_party/libxslt/README.chromium +++ b/third_party/libxslt/README.chromium
@@ -1,6 +1,6 @@ Name: libxslt URL: http://xmlsoft.org/XSLT -Version: ef14b02cb0ee8cf7a037100c555aa19e8fce1e29 +Version: 99dfc53198b374719661de6a77ef9531f2805485 CPEPrefix: cpe:/a:xmlsoft:libxslt:1.1.37 Security Critical: yes License: MIT
diff --git a/third_party/libxslt/src/libxslt/xsltutils.c b/third_party/libxslt/src/libxslt/xsltutils.c index fc9bec6..9f0feb5 100644 --- a/third_party/libxslt/src/libxslt/xsltutils.c +++ b/third_party/libxslt/src/libxslt/xsltutils.c
@@ -947,11 +947,10 @@ } /** - * xsltComputeSortResultInternal: + * xsltComputeSortResultiInternal: * @ctxt: a XSLT process context - * @sort: xsl:sort node - * @number: data-type is number - * @locale: transform strings according to locale + * @sort: node list + * @xfrm: Transform strings according to locale * * reorder the current node list accordingly to the set of sorting * requirement provided by the array of nodes. @@ -960,11 +959,11 @@ */ static xmlXPathObjectPtr * xsltComputeSortResultInternal(xsltTransformContextPtr ctxt, xmlNodePtr sort, - int number, xsltLocale locale) { + int xfrm) { #ifdef XSLT_REFACTORED xsltStyleItemSortPtr comp; #else - const xsltStylePreComp *comp; + xsltStylePreCompPtr comp; #endif xmlXPathObjectPtr *results = NULL; xmlNodeSetPtr list = NULL; @@ -1032,10 +1031,10 @@ if (res != NULL) { if (res->type != XPATH_STRING) res = xmlXPathConvertString(res); - if (number) + if (comp->number) res = xmlXPathConvertNumber(res); res->index = i; /* Save original pos for dupl resolv */ - if (number) { + if (comp->number) { if (res->type == XPATH_NUMBER) { results[i] = res; } else { @@ -1047,9 +1046,9 @@ } } else { if (res->type == XPATH_STRING) { - if (locale != (xsltLocale)0) { + if ((xfrm) && (comp->locale != (xsltLocale)0)) { xmlChar *str = res->stringval; - res->stringval = (xmlChar *) xsltStrxfrm(locale, str); + res->stringval = (xmlChar *) xsltStrxfrm(comp->locale, str); xmlFree(str); } @@ -1089,8 +1088,7 @@ */ xmlXPathObjectPtr * xsltComputeSortResult(xsltTransformContextPtr ctxt, xmlNodePtr sort) { - return xsltComputeSortResultInternal(ctxt, sort, /* number */ 0, - /* locale */ 0); + return xsltComputeSortResultInternal(ctxt, sort, /* xfrm */ 0); } /** @@ -1108,19 +1106,20 @@ #ifdef XSLT_REFACTORED xsltStyleItemSortPtr comp; #else - const xsltStylePreComp *comp; + xsltStylePreCompPtr comp; #endif xmlXPathObjectPtr *resultsTab[XSLT_MAX_SORT]; xmlXPathObjectPtr *results = NULL, *res; xmlNodeSetPtr list = NULL; + int descending, number, desc, numb; int len = 0; int i, j, incr; int tst; int depth; xmlNodePtr node; xmlXPathObjectPtr tmp; - int number[XSLT_MAX_SORT], desc[XSLT_MAX_SORT]; - xsltLocale locale[XSLT_MAX_SORT]; + int tempstype[XSLT_MAX_SORT], temporder[XSLT_MAX_SORT], + templang[XSLT_MAX_SORT]; if ((ctxt == NULL) || (sorts == NULL) || (nbsorts <= 0) || (nbsorts >= XSLT_MAX_SORT)) @@ -1137,70 +1136,71 @@ for (j = 0; j < nbsorts; j++) { comp = sorts[j]->psvi; + tempstype[j] = 0; if ((comp->stype == NULL) && (comp->has_stype != 0)) { - xmlChar *stype = + comp->stype = xsltEvalAttrValueTemplate(ctxt, sorts[j], - BAD_CAST "data-type", NULL); - number[j] = 0; - if (stype != NULL) { - if (xmlStrEqual(stype, (const xmlChar *) "text")) - ; - else if (xmlStrEqual(stype, (const xmlChar *) "number")) - number[j] = 1; + (const xmlChar *) "data-type", + NULL); + if (comp->stype != NULL) { + tempstype[j] = 1; + if (xmlStrEqual(comp->stype, (const xmlChar *) "text")) + comp->number = 0; + else if (xmlStrEqual(comp->stype, (const xmlChar *) "number")) + comp->number = 1; else { xsltTransformError(ctxt, NULL, sorts[j], "xsltDoSortFunction: no support for data-type = %s\n", - stype); + comp->stype); + comp->number = 0; /* use default */ } - xmlFree(stype); } - } else { - number[j] = comp->number; - } + } + temporder[j] = 0; if ((comp->order == NULL) && (comp->has_order != 0)) { - xmlChar *order = xsltEvalAttrValueTemplate(ctxt, sorts[j], - BAD_CAST "order", NULL); - desc[j] = 0; - if (order != NULL) { - if (xmlStrEqual(order, (const xmlChar *) "ascending")) - ; - else if (xmlStrEqual(order, (const xmlChar *) "descending")) - desc[j] = 1; + comp->order = xsltEvalAttrValueTemplate(ctxt, sorts[j], + (const xmlChar *) "order", + NULL); + if (comp->order != NULL) { + temporder[j] = 1; + if (xmlStrEqual(comp->order, (const xmlChar *) "ascending")) + comp->descending = 0; + else if (xmlStrEqual(comp->order, + (const xmlChar *) "descending")) + comp->descending = 1; else { xsltTransformError(ctxt, NULL, sorts[j], "xsltDoSortFunction: invalid value %s for order\n", - order); + comp->order); + comp->descending = 0; /* use default */ } - xmlFree(order); } - } else { - desc[j] = comp->descending; } + templang[j] = 0; if ((comp->lang == NULL) && (comp->has_lang != 0)) { xmlChar *lang = xsltEvalAttrValueTemplate(ctxt, sorts[j], (xmlChar *) "lang", NULL); if (lang != NULL) { - locale[j] = xsltNewLocale(lang); + templang[j] = 1; + comp->locale = xsltNewLocale(lang); xmlFree(lang); - } else { - locale[j] = 0; } - } else { - locale[j] = comp->locale; - } + } } len = list->nodeNr; - resultsTab[0] = xsltComputeSortResultInternal(ctxt, sorts[0], number[0], - locale[0]); + resultsTab[0] = xsltComputeSortResultInternal(ctxt, sorts[0], + /* xfrm */ 1); for (i = 1;i < XSLT_MAX_SORT;i++) resultsTab[i] = NULL; results = resultsTab[0]; comp = sorts[0]->psvi; + descending = comp->descending; + number = comp->number; if (results == NULL) goto cleanup; @@ -1215,7 +1215,7 @@ if (results[j] == NULL) tst = 1; else { - if (number[0]) { + if (number) { /* We make NaN smaller than number in accordance with XSLT spec */ if (xmlXPathIsNaN(results[j]->floatval)) { @@ -1232,16 +1232,16 @@ results[j + incr]->floatval) tst = 1; else tst = -1; - } else if(locale[0] != (xsltLocale)0) { + } else if(comp->locale != (xsltLocale)0) { tst = xsltLocaleStrcmp( - locale[0], + comp->locale, (xsltLocaleChar *) results[j]->stringval, (xsltLocaleChar *) results[j + incr]->stringval); } else { tst = xmlStrcmp(results[j]->stringval, results[j + incr]->stringval); } - if (desc[0]) + if (descending) tst = -tst; } if (tst == 0) { @@ -1255,6 +1255,8 @@ comp = sorts[depth]->psvi; if (comp == NULL) break; + desc = comp->descending; + numb = comp->number; /* * Compute the result of the next level for the @@ -1264,8 +1266,7 @@ resultsTab[depth] = xsltComputeSortResultInternal(ctxt, sorts[depth], - number[depth], - locale[depth]); + /* xfrm */ 1); res = resultsTab[depth]; if (res == NULL) break; @@ -1275,7 +1276,7 @@ } else if (res[j+incr] == NULL) { tst = -1; } else { - if (number[depth]) { + if (numb) { /* We make NaN smaller than number in accordance with XSLT spec */ if (xmlXPathIsNaN(res[j]->floatval)) { @@ -1294,16 +1295,16 @@ res[j + incr]->floatval) tst = 1; else tst = -1; - } else if(locale[depth] != (xsltLocale)0) { + } else if(comp->locale != (xsltLocale)0) { tst = xsltLocaleStrcmp( - locale[depth], + comp->locale, (xsltLocaleChar *) res[j]->stringval, (xsltLocaleChar *) res[j + incr]->stringval); } else { tst = xmlStrcmp(res[j]->stringval, res[j + incr]->stringval); } - if (desc[depth]) + if (desc) tst = -tst; } @@ -1348,11 +1349,20 @@ cleanup: for (j = 0; j < nbsorts; j++) { comp = sorts[j]->psvi; - if ((comp->lang == NULL) && (comp->has_lang != 0)) { - if (locale[j] != (xsltLocale)0) { - xsltFreeLocale(locale[j]); - } - } + if (tempstype[j] == 1) { + /* The data-type needs to be recomputed each time */ + xmlFree((void *)(comp->stype)); + comp->stype = NULL; + } + if (temporder[j] == 1) { + /* The order needs to be recomputed each time */ + xmlFree((void *)(comp->order)); + comp->order = NULL; + } + if (templang[j] == 1) { + xsltFreeLocale(comp->locale); + comp->locale = (xsltLocale)0; + } if (resultsTab[j] != NULL) { for (i = 0;i < len;i++) xmlXPathFreeObject(resultsTab[j][i]);
diff --git a/third_party/metrics_proto/ukm/source.proto b/third_party/metrics_proto/ukm/source.proto index 90dcbe49..1e38423c 100644 --- a/third_party/metrics_proto/ukm/source.proto +++ b/third_party/metrics_proto/ukm/source.proto
@@ -33,6 +33,7 @@ TRUSTED_WEB_ACTIVITY = 2; WEB_APP = 3; WEB_APK = 4; + PRE_FIRST_TAB = 5; } // This signifies if the reported source is a navigation to the same origin as
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium index e2e5610a..e0a68d0 100644 --- a/third_party/nearby/README.chromium +++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@ Name: Nearby Connections Library Short Name: Nearby URL: https://github.com/google/nearby -Version: f73b23e720a9c587e1d4663b77775edb30aed4ae +Version: 228e52e9796e640068b4c64af9fef8870499bed0 License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/tools/android/dependency_analysis/generate_json_dependency_graph.py b/tools/android/dependency_analysis/generate_json_dependency_graph.py index e91d4db1..2faa583 100755 --- a/tools/android/dependency_analysis/generate_json_dependency_graph.py +++ b/tools/android/dependency_analysis/generate_json_dependency_graph.py
@@ -20,7 +20,7 @@ import serialization import target_dependency -_SRC_PATH = pathlib.Path(__file__).parents[3].resolve() +_SRC_PATH = pathlib.Path(__file__).resolve().parents[3] sys.path.append(str(_SRC_PATH / 'build/android')) from pylib import constants @@ -41,6 +41,20 @@ return pathlib.Path(path).relative_to(src_path) +def _is_relative_to(path: pathlib.Path, other_path: pathlib.Path): + """This replicates pathlib.Path.is_relative_to. + + Since bots still run python3.8, they do not have access to is_relative_to, + which was introduced in python3.9. + """ + try: + path.relative_to(other_path) + return True + except ValueError: + # This error is expected when path is not a subpath of other_path. + return False + + def class_is_interesting(name: str, prefixes: Tuple[str]): """Checks if a jdeps class is a class we are actually interested in.""" if not prefixes or name.startswith(prefixes): @@ -127,7 +141,7 @@ Returns: /cr/src/out/Debug/jdeps_cache/b/c/file.jdeps_cache """ filepath = filepath.resolve(strict=True) - if filepath.is_relative_to(build_output_dir): + if _is_relative_to(filepath, build_output_dir): return filepath.with_suffix('.jdeps_cache') assert src_path in filepath.parents, f'Jar file not under src: {filepath}' jdeps_cache_dir = build_output_dir / 'jdeps_cache'
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec index 0c7a6f2..cc28e95 100644 --- a/tools/gritsettings/resource_ids.spec +++ b/tools/gritsettings/resource_ids.spec
@@ -341,12 +341,16 @@ "META": {"sizes": {"includes": [50]}}, "includes": [2150], }, + "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/omnibox_popup/resources.grd": { + "META": {"sizes": {"includes": [10]}}, + "includes": [2160], + }, # END chrome/browser section. # START chrome/ WebUI resources section "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/browsing_topics/resources.grd": { "META": {"sizes": {"includes": [10]}}, - "includes": [2160], + "includes": [2170], }, "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/bluetooth_internals/resources.grd": { "META": {"sizes": {"includes": [50],}},
diff --git a/tools/mac/power/benchmark.py b/tools/mac/power/benchmark.py index be682cfa..636acc81 100755 --- a/tools/mac/power/benchmark.py +++ b/tools/mac/power/benchmark.py
@@ -130,6 +130,8 @@ kasa_plug_controller = None if args.kasa_switch_ip: kasa_plug_controller = plug.get_plug_controller(args.kasa_switch_ip) + # Turn off power to pass environment checks below. + kasa_plug_controller.turn_off() logging.info(f'Outputing results in {os.path.abspath(output_dir)}') with DriverContext(output_dir, args.power_sampler) as driver: @@ -153,7 +155,7 @@ scenario.tag = args.tag if kasa_plug_controller: - kasa_plug_controller.charge_to(80) + kasa_plug_controller.charge_or_discharge_to(80) if args.tracing_mode: logging.info(f'Tracing scenario {scenario.name} ...')
diff --git a/tools/mac/power/plug.py b/tools/mac/power/plug.py index 1fa44aa..c018220d 100755 --- a/tools/mac/power/plug.py +++ b/tools/mac/power/plug.py
@@ -14,27 +14,31 @@ from kasa import SmartStrip -# This script allows the user to control a Kasa Smart Plug Power Strip (KP303) -# to start and stop the charging of devices connected to it. -# The smart switch has three plugs and it needs to be configured to have plug -# names that are the identical to the host names of the machines that are -# connected to it. For example for $HOST=macbook-air use the Kasa app to name -# a plug macbook-air and plug a charger in said plug and the laptop. Hardcoding -# things in this way minimizes the chances of turning on/off a unrelated -# machine which invalidates the whole benchmark/profile run. - - class KasaPlugController(): - """Class that manages communication with the Kasa smart plug + """Provides control of a device's charger. + + The device's charger must be plugged into one of the 3 outlets of a Kasa Smart + Plug Power Strip (KP303). The outlet name must match the device's host name + (this is intended to prevent inadvertently controlling the wrong device's + charger). """ - def __init__(self, kasa_switch_ip: str): + def __init__(self, kasa_power_strip_ip: str): + """Constructs a KasaPlugController to control the current device's charger. + + Args: + kasa_power_strip_ip: IP of the Kasak Smart Plug Power Strip in which + this device's charger is connected. + """ + # The outlet name must match the device's host name. + self.kasa_outlet_name = os.uname()[1].split('.')[0] + # Create the event loop self.loop = asyncio.new_event_loop() asyncio.set_event_loop(self.loop) # Create the strip controller - self.strip = SmartStrip(kasa_switch_ip) + self.strip = SmartStrip(kasa_power_strip_ip) self.loop.run_until_complete(self.strip.update()) self.closed = False @@ -42,30 +46,46 @@ def __del__(self): self.close() - def turn_on(self, device: str): - """Turns the plug for |device| to the on position + def turn_on(self): + """Turns on this device's charger. """ - + logging.info("Turning on the charger") for plug in self.strip.children: - if plug.alias == device: + if plug.alias == self.kasa_outlet_name: self.loop.run_until_complete(plug.turn_on()) return - print("Cannot find device!") + logging.error("Cannot find device to turn on") - def turn_off(self, device: str): - """Turns the plug for |device| to the off position + def turn_off(self): + """Turns off this device's charger. """ + logging.info("Turning off the charger") for plug in self.strip.children: - if plug.alias == device: + if plug.alias == self.kasa_outlet_name: self.loop.run_until_complete(plug.turn_off()) - return - print("Cannot find device!") - def discharge_to(self, level: int, battery): + battery = psutil.sensors_battery() + while battery.power_plugged: + logging.info("Waiting for device to no longer be plugged in") + time.sleep(1) + battery = psutil.sensors_battery() + return + logging.error("Cannot find device to turn off") + + def discharge_to(self, level: int): + """Discharges the battery until it reaches a target level. + + Args: + level: The target battery level. + """ + + self.turn_off() + + battery = psutil.sensors_battery() + while battery.percent > level: - print(f"Waiting to discharge to {level}%." - f" Currently at {battery.percent}%") - battery = psutil.sensors_battery() + logging.info(f"Waiting to discharge to {level}%." + f" Currently at {battery.percent}%") # Perform arbitrary operations as fast as possible to burn # CPU and discharge faster. @@ -75,45 +95,48 @@ f_value = f_value * 1.7272882 f_value = f_value / 1.7272882 - print("Discharge complete") + battery = psutil.sensors_battery() + + logging.info(f"Discharge to {level}% complete") def charge_to(self, level: int): - """Ensures the current device reaches the charge level |level|. + """Charges the battery until it reaches a target level. + + Args: + level: The target battery level. """ + + self.turn_on() + battery = psutil.sensors_battery() - # Get the host name of the device - device = os.uname()[1].split('.')[0] - - if battery.percent > level: - self.turn_off(device) - self.discharge_to(level, battery) - return - - print(f"Plugging in {device}...") - self.turn_on(device) - - while not battery.power_plugged: - battery = psutil.sensors_battery() - time.sleep(0.100) - print(f"Waiting for {device} to start charging.") while battery.percent < level: - print(f"Waiting for {device} to be charged to {level}%." - f" Currently at {battery.percent}%") - battery = psutil.sensors_battery() + logging.info(f"Waiting to charge to {level}%." + f" Currently at {battery.percent}%") time.sleep(10) - - print(f"Unplugging {device}...") - self.turn_off(device) - battery = psutil.sensors_battery() - while battery.power_plugged: battery = psutil.sensors_battery() - time.sleep(0.100) - print(f"Waiting for {device} to stop charging.") + + logging.info(f"Charge to {level}% complete") + + def charge_or_discharge_to(self, level: int): + """Charges or discharges the battery until it reaches a target level. + + Leaves the charger in an unplugged state. + + Args: + level: The target battery level. + """ + battery = psutil.sensors_battery() + if battery.percent < level: + self.charge_to(level) + elif battery.percent > level: + self.discharge_to(level) + else: + logging.info(f"Battery is already at the target level {level}%") + self.turn_off() def close(self): - """Closes the message loop. - """ + """Closes the message loop.""" if self.closed: return self.closed = True @@ -127,7 +150,7 @@ if __name__ == "__main__": parser = argparse.ArgumentParser( description='Controls kasa power switch connected to this device.') - parser.add_argument("--kasa_switch_ip", + parser.add_argument("--kasa_power_strip_ip", required=True, help="IP address of the kasa power switch.") parser.add_argument("--charge_level", @@ -136,6 +159,6 @@ help="Desired charge level.") args = parser.parse_args() - kasa_plug_controller = KasaPlugController(args.kasa_switch_ip) + kasa_plug_controller = KasaPlugController(args.kasa_power_strip_ip) kasa_plug_controller.charge_to(args.charge_level) kasa_plug_controller.close()
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index d9eb0b1..3184ccb5 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -21350,6 +21350,23 @@ </description> </action> +<action name="MobileTranslateSettingsBack"> + <owner>fedegermi@google.com</owner> + <owner>sdefresne@chromium.org</owner> + <description> + Reported when user goes back from Translate Settings UI to root Settings + screen. iOS only. + </description> +</action> + +<action name="MobileTranslateSettingsClose"> + <owner>fedegermi@google.com</owner> + <owner>sdefresne@chromium.org</owner> + <description> + Reported when Translate Settings UI was dismissed. iOS only. + </description> +</action> + <action name="MobileUsingMenuByHwButtonDragging"> <obsolete> Deprecated as of 06/2014. We removed this feature http://crbug.com/366154 .
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 32d86d6b..5068564 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -18579,6 +18579,7 @@ <int value="90" label="Private network chooser data"/> <int value="91" label="Federated identity identity-provider-sign-in-status API"/> + <int value="92" label="Unused site permissions"/> </enum> <enum name="ContentTypeParseableResult"> @@ -36640,6 +36641,18 @@ <int value="1" label="System UI Pairing"/> </enum> +<enum name="FastPairProtocolPairingSteps"> + <int value="0" label="Pairing started"/> + <int value="1" label="Exhausted retries"/> + <int value="2" label="Device already paired"/> + <int value="3" label="Bond successful"/> + <int value="4" label="Passkey negotiated"/> + <int value="5" label="Recieved passkey response"/> + <int value="6" label="Passkey validated"/> + <int value="7" label="Passkey confirmed"/> + <int value="8" label="Pairing complete"/> +</enum> + <enum name="FastPairRetroactiveEngagementFlowEvent"> <int value="1" label="Associate Account UI Shown"/> <int value="11" label="Associate Account Dismissed By User"/> @@ -62583,6 +62596,7 @@ label="OmniboxMostVisitedTilesAddRecycledViewPool:enabled"/> <int value="1149417604" label="StreamlinedUsbPrinterSetup:disabled"/> <int value="1149731024" label="MultiDisplayOverviewAndSplitView:enabled"/> + <int value="1149741132" label="RecordPermissionExpirationTimestamps:enabled"/> <int value="1149823105" label="enable-input-ime-api"/> <int value="1150622273" label="enable-apps-file-associations"/> <int value="1152491093" label="MediaSessionService:disabled"/> @@ -62944,6 +62958,8 @@ <int value="1355923367" label="CrOSContainer:disabled"/> <int value="1356161410" label="VizHitTestSurfaceLayer:enabled"/> <int value="1359972809" label="enable-gesture-deletion"/> + <int value="1360774969" + label="RecordPermissionExpirationTimestamps:disabled"/> <int value="1360969228" label="RevampedContextMenu:enabled"/> <int value="1361047396" label="disable-click-delay"/> <int value="1361073386" label="ContentSuggestionsNotifications:enabled"/> @@ -84157,21 +84173,17 @@ <enum name="ProfileImageDownloadResult"> <int value="0" label="DownloadSuccessChanged"> - <summary> - Reported when image download succeeds and the image is newer than what we - already have so we update it. - </summary> + Reported when image download succeeds and the image is newer than what we + already have so we update it. </int> <int value="1" label="DownloadSuccess"> - <summary>Reported anytime we download profile image successfully.</summary> + Reported anytime we download profile image successfully. </int> <int value="2" label="DownloadFailure"> - <summary>Download failed because of network errors.</summary> + Download failed because of network errors. </int> <int value="3" label="DownloadDefault"> - <summary> - We didn't download the image because it's the default one. - </summary> + We didn't download the image because it's the default one. </int> </enum> @@ -110136,6 +110148,7 @@ <int value="1" label="USB4 peripheral - wrong cable"/> <int value="2" label="DisplayPort peripheral - wrong cable"/> <int value="3" label="Cable Limiting Speed"/> + <int value="4" label="None"/> </enum> <enum name="XFrameOptions">
diff --git a/tools/metrics/histograms/metadata/apps/histograms.xml b/tools/metrics/histograms/metadata/apps/histograms.xml index 946a620..efea449 100644 --- a/tools/metrics/histograms/metadata/apps/histograms.xml +++ b/tools/metrics/histograms/metadata/apps/histograms.xml
@@ -2528,18 +2528,12 @@ </token> </histogram> -<histogram name="Apps.PaginationTransition.AnimationSmoothness" units="%" - expires_after="2023-04-16"> -<!-- Name completed by histogram_suffixes name="TabletOrClamshellMode" --> - +<histogram name="Apps.PaginationTransition.AnimationSmoothness.TabletMode" + units="%" expires_after="2023-04-16"> <owner>tbarzic@chromium.org</owner> <owner>newcomer@chromium.org</owner> <owner>wutao@chromium.org</owner> <summary> - Base name is deprecated as of 3/2019 in favor of - Apps.PaginationTransition.AnimationSmoothness.ClamshellMode and - Apps.PaginationTransition.AnimationSmoothness.TabletMode - Relative smoothness of animations of launcher pagination transitions. 100% represents ideally smooth 60 frames per second. 50% represents only 30 frames per second is achieved during the animations. 0% should not happen. @@ -2783,30 +2777,18 @@ </summary> </histogram> -<histogram name="Apps.StateTransition.AnimationSmoothness{AppListTargetState}" - units="%" expires_after="2022-12-30"> +<histogram name="Apps.StateTransition.AnimationSmoothness" units="%" + expires_after="2022-12-30"> <owner>tbarzic@chromium.org</owner> <owner>newcomer@chromium.org</owner> <owner>src/ash/app_list/OWNERS</owner> <summary> - Relative smoothness of animations of peeking launcher state transitions. + Relative smoothness of animations of tablet mode launcher state transitions. 100% represents ideally smooth 60 frames per second. 50% represents only 30 frames per second is achieved during the animations. 0% should not happen. This metric is recorded exactly once when the user switches states of the - launcher. {AppListTargetState} + launcher. </summary> - <token key="AppListTargetState"> - <variant name=""/> - <variant name=".Close.ClamshellMode" summary="Closing the app list"/> - <variant name=".FullscreenAllApps.ClamshellMode" - summary="Fullscreen and showing all apps"/> - <variant name=".FullscreenSearch.ClamshellMode" - summary="Fullscreen with search results"/> - <variant name=".Half.ClamshellMode" - summary="Half-visible state of the app list"/> - <variant name=".Peeking.ClamshellMode" - summary="Peek state of the app list"/> - </token> </histogram> <histogram name="Apps.TimeBetweenAppInstallAndLaunch{TabletOrClamshell}"
diff --git a/tools/metrics/histograms/metadata/families/DIR_METADATA b/tools/metrics/histograms/metadata/families/DIR_METADATA new file mode 100644 index 0000000..7c567602 --- /dev/null +++ b/tools/metrics/histograms/metadata/families/DIR_METADATA
@@ -0,0 +1,4 @@ +# Chrome Browser +mixins: "//chrome/browser/supervised_user/android/COMMON_METADATA" +# ChromeOS specific +mixins: "//chrome/browser/supervised_user/chromeos/COMMON_METADATA"
diff --git a/tools/metrics/histograms/metadata/families/histograms.xml b/tools/metrics/histograms/metadata/families/histograms.xml index abe6f11..a9ca816 100644 --- a/tools/metrics/histograms/metadata/families/histograms.xml +++ b/tools/metrics/histograms/metadata/families/histograms.xml
@@ -30,10 +30,9 @@ <histograms> <histogram name="AddSupervisionDialog.Enrollment" - enum="AddSupervisionEnrollment" expires_after="2023-01-20"> - <owner>tobyhuang@chromium.org</owner> - <owner>michaelpg@chromium.org</owner> + enum="AddSupervisionEnrollment" expires_after="2023-12-12"> <owner>danan@chromium.org</owner> + <owner>michaelpg@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> Records the number of users who go through the Add Supervision process to @@ -49,10 +48,9 @@ </histogram> <histogram name="AddSupervisionDialog.EnrollmentCompletedUserTime" units="ms" - expires_after="2023-01-20"> - <owner>tobyhuang@chromium.org</owner> - <owner>michaelpg@chromium.org</owner> + expires_after="2023-12-12"> <owner>danan@chromium.org</owner> + <owner>michaelpg@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> Measures the amount of time in milliseconds for users to successfully enroll @@ -62,10 +60,9 @@ </histogram> <histogram name="AddSupervisionDialog.EnrollmentNotCompletedUserTime" - units="ms" expires_after="2023-01-20"> - <owner>tobyhuang@chromium.org</owner> - <owner>michaelpg@chromium.org</owner> + units="ms" expires_after="2023-12-12"> <owner>danan@chromium.org</owner> + <owner>michaelpg@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> Measures the amount of time in milliseconds for users to exit the Add @@ -76,10 +73,9 @@ </histogram> <histogram name="AddSupervisionDialog.SignoutCompletedUserTime" units="ms" - expires_after="2023-01-20"> - <owner>tobyhuang@chromium.org</owner> - <owner>michaelpg@chromium.org</owner> + expires_after="2023-12-12"> <owner>danan@chromium.org</owner> + <owner>michaelpg@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> Measures the amount of time in milliseconds for users to sign out after @@ -89,7 +85,7 @@ </histogram> <histogram name="ChildAccountReconcilor.ForcedUserExitOnReconcileError" - enum="BooleanHit" expires_after="2023-01-20"> + enum="BooleanHit" expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -99,8 +95,8 @@ </histogram> <histogram name="ChromeOS.FamilyLink.ChildStatusReportRequest.Size" units="KB" - expires_after="2023-01-20"> - <owner>tobyhuang@chromium.org</owner> + expires_after="2023-12-12"> + <owner>courtneywong@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> Reports the size of the uploaded ChildStatusReportRequest proto in @@ -111,8 +107,8 @@ <histogram name="ChromeOS.FamilyLink.ChildStatusReportRequest.TimeSinceLastReport" - units="minutes" expires_after="2023-01-20"> - <owner>tobyhuang@chromium.org</owner> + units="minutes" expires_after="2023-12-12"> + <owner>courtneywong@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> Reports the time in between ChildStatusReportRequest uploads in minutes. The @@ -123,7 +119,7 @@ </histogram> <histogram name="ChromeOS.FamilyLinkUser.FaviconAvailability" - enum="SupervisedUserFaviconAvailability" expires_after="2023-01-20"> + enum="SupervisedUserFaviconAvailability" expires_after="2023-12-12"> <owner>courtneywong@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -138,7 +134,8 @@ enum="FamilyLinkUserLogSegment" expires_after="never"> <!-- expires-never: used internally for filtering --> - <owner>tobyhuang@chromium.org</owner> + <owner>courtneywong@chromium.org</owner> + <owner>agawronska@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <owner>chrome-metrics-team@google.com</owner> <summary> @@ -151,7 +148,7 @@ </histogram> <histogram name="ChromeOS.FamilyLinkUser.ParentAccess.FlowResult.{FlowType}" - enum="ParentAccessFlowResult" expires_after="2023-11-15"> + enum="ParentAccessFlowResult" expires_after="2023-12-12"> <owner>courtneywong@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -166,7 +163,7 @@ </histogram> <histogram name="ChromeOS.FamilyUser.ChildUserTypeMismatchError" - enum="ChildUserTypeMismatchError" expires_after="2023-01-20"> + enum="ChildUserTypeMismatchError" expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> <owner>galenemco@chromium.org</owner> <owner>cros-families-eng@google.com</owner> @@ -184,7 +181,8 @@ expires_after="never"> <!-- expires-never: used internally for filtering --> - <owner>tobyhuang@chromium.org</owner> + <owner>courtneywong@chromium.org</owner> + <owner>agawronska@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <owner>chrome-metrics-team@google.com</owner> <summary> @@ -201,8 +199,8 @@ </histogram> <histogram name="ChromeOS.FamilyUser.NumSecondaryAccounts" units="accounts" - expires_after="2023-05-07"> - <owner>tobyhuang@chromium.org</owner> + expires_after="2023-12-12"> + <owner>courtneywong@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <owner>chrome-metrics-team@google.com</owner> <summary> @@ -213,8 +211,8 @@ </histogram> <histogram name="ChromeOS.LegacySupervisedUsers.HiddenFromLoginScreen" - enum="LegacySupervisedUserStatus" expires_after="2023-01-20"> - <owner>tobyhuang@chromium.org</owner> + enum="LegacySupervisedUserStatus" expires_after="2023-12-12"> + <owner>courtneywong@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> Reports "hidden" when the login screen hides a legacy supervised @@ -225,7 +223,7 @@ </histogram> <histogram name="FamilyLinkUser.LocalWebApprovalCompleteRequestTotalDuration" - units="ms" expires_after="2023-03-26"> + units="ms" expires_after="2023-12-12"> <owner>anthie@google.com</owner> <owner>ljjlee@google.com</owner> <owner>chrome-kids-eng@google.com</owner> @@ -239,7 +237,7 @@ </histogram> <histogram name="FamilyLinkUser.LocalWebApprovalOutcome" - enum="FamilyLinkUserLocalWebApprovalOutcome" expires_after="2023-06-04"> + enum="FamilyLinkUserLocalWebApprovalOutcome" expires_after="2023-12-12"> <owner>anthie@google.com</owner> <owner>ljjlee@google.com</owner> <owner>chrome-kids-eng@google.com</owner> @@ -251,7 +249,7 @@ </histogram> <histogram name="FamilyLinkUser.LocalWebApprovalResult" - enum="FamilyLinkUserLocalWebApprovalResult" expires_after="2023-03-26"> + enum="FamilyLinkUserLocalWebApprovalResult" expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <owner>chrome-kids-eng@google.com</owner> @@ -280,9 +278,8 @@ </histogram> <histogram name="FamilyUser.ChromeBrowserEngagement.Duration2" units="ms" - expires_after="2023-03-26"> + expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> - <owner>tobyhuang@chromium.org</owner> <owner>xiqiruan@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -297,7 +294,7 @@ </histogram> <histogram name="FamilyUser.DenylistSource" enum="FamilyUserDenylistSource" - expires_after="2023-03-26"> + expires_after="2023-12-12"> <owner>courtneywong@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -310,9 +307,8 @@ </histogram> <histogram name="FamilyUser.DeviceOwner" enum="Boolean" - expires_after="2023-06-04"> + expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> - <owner>tobyhuang@chromium.org</owner> <owner>xiqiruan@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -322,9 +318,8 @@ </histogram> <histogram name="FamilyUser.FamilyLinkUsersCount" units="Number of Users" - expires_after="2023-03-26"> + expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> - <owner>tobyhuang@chromium.org</owner> <owner>xiqiruan@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -334,9 +329,8 @@ </histogram> <histogram name="FamilyUser.GaiaUsersCount" units="Number of Users" - expires_after="2023-06-04"> + expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> - <owner>tobyhuang@chromium.org</owner> <owner>xiqiruan@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -347,9 +341,8 @@ </histogram> <histogram name="FamilyUser.ManagedSiteList" enum="FamilyLinkManagedSiteList" - expires_after="2023-06-04"> + expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> - <owner>tobyhuang@chromium.org</owner> <owner>xiqiruan@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -362,7 +355,7 @@ </histogram> <histogram name="FamilyUser.ManagedSiteList.Conflict" enum="BooleanHasConflict" - expires_after="2023-06-04"> + expires_after="2023-12-12"> <owner>msalama@chromium.org</owner> <owner>chrome-kids-eng@google.com</owner> <owner>cros-families-eng@google.com</owner> @@ -374,9 +367,8 @@ </histogram> <histogram name="FamilyUser.ManagedSiteListCount.Approved" - units="Number of approved sites" expires_after="2023-06-04"> + units="Number of approved sites" expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> - <owner>tobyhuang@chromium.org</owner> <owner>xiqiruan@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -388,9 +380,8 @@ </histogram> <histogram name="FamilyUser.ManagedSiteListCount.Blocked" - units="Number of blocked sites" expires_after="2023-06-04"> + units="Number of blocked sites" expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> - <owner>tobyhuang@chromium.org</owner> <owner>xiqiruan@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -402,9 +393,8 @@ </histogram> <histogram name="FamilyUser.NewUserAdded" enum="NewUserAdded" - expires_after="2023-06-04"> + expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> - <owner>tobyhuang@chromium.org</owner> <owner>xiqiruan@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -415,9 +405,8 @@ </histogram> <histogram name="FamilyUser.SessionEngagement.Duration" units="ms" - expires_after="2023-01-20"> + expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> - <owner>tobyhuang@chromium.org</owner> <owner>xiqiruan@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -428,9 +417,8 @@ </histogram> <histogram name="FamilyUser.SessionEngagement.Total" units="Hour of day" - expires_after="2023-01-20"> + expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> - <owner>tobyhuang@chromium.org</owner> <owner>xiqiruan@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -442,9 +430,8 @@ </histogram> <histogram name="FamilyUser.SessionEngagement.Weekday" units="Hour of day" - expires_after="2023-06-04"> + expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> - <owner>tobyhuang@chromium.org</owner> <owner>xiqiruan@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -455,9 +442,8 @@ </histogram> <histogram name="FamilyUser.SessionEngagement.Weekend" units="Hour of day" - expires_after="2023-06-04"> + expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> - <owner>tobyhuang@chromium.org</owner> <owner>xiqiruan@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -468,9 +454,8 @@ </histogram> <histogram name="FamilyUser.TimeLimitPolicyTypes" enum="TimeLimitPolicyType" - expires_after="2023-03-26"> + expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> - <owner>tobyhuang@chromium.org</owner> <owner>xiqiruan@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -484,9 +469,8 @@ </histogram> <histogram name="FamilyUser.WebFilterType" enum="FamilyLinkWebFilterType" - expires_after="2023-06-04"> + expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> - <owner>tobyhuang@chromium.org</owner> <owner>xiqiruan@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -498,8 +482,8 @@ </histogram> <histogram name="FamilyUser.{AppType}AppsCount2" units="Number of Apps" - expires_after="2023-01-20"> - <owner>tobyhuang@chromium.org</owner> + expires_after="2023-12-12"> + <owner>courtneywong@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> Around once per day, records the number of recently used {AppType} apps in @@ -522,8 +506,8 @@ </histogram> <histogram name="FamilyUser.{ExtensionStatus}ExtensionsCount2" - units="Number of Extensions" expires_after="2023-01-20"> - <owner>tobyhuang@chromium.org</owner> + units="Number of Extensions" expires_after="2023-12-12"> + <owner>courtneywong@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> Records the number of non-component {ExtensionStatus} regular browser @@ -537,14 +521,14 @@ </histogram> <histogram name="ManagedMode.BlockingInterstitialCommand" - enum="ManagedModeBlockingCommand" expires_after="2023-06-04"> + enum="ManagedModeBlockingCommand" expires_after="2023-12-12"> <owner>agawronska@google.com</owner> <owner>cros-families-eng@google.com</owner> <summary>Which command was selected from the blocking interstitial.</summary> </histogram> <histogram name="ManagedUsers.BlockedIframeCount" units="iframes" - expires_after="2023-06-04"> + expires_after="2023-12-12"> <owner>yilkal@chromium.org</owner> <owner>michaelpg@chromium.org</owner> <owner>cros-families-eng@google.com</owner> @@ -555,7 +539,7 @@ </histogram> <histogram name="ManagedUsers.FilteringResult" - enum="SupervisedUserSafetyFilterResult" expires_after="2023-06-04"> + enum="SupervisedUserSafetyFilterResult" expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -567,7 +551,7 @@ </histogram> <histogram name="ManagedUsers.KidsManagementClassifyUrlFailureDelay" units="ms" - expires_after="2023-01-20"> + expires_after="2023-12-12"> <owner>escordeiro@chromium.org</owner> <owner>unichrome-eng@google.com</owner> <owner>cros-families-eng@google.com</owner> @@ -580,7 +564,7 @@ </histogram> <histogram name="ManagedUsers.KidsManagementClassifyUrlSuccessDelay" units="ms" - expires_after="2023-01-20"> + expires_after="2023-12-12"> <owner>escordeiro@chromium.org</owner> <owner>unichrome-eng@google.com</owner> <owner>cros-families-eng@google.com</owner> @@ -593,7 +577,7 @@ </histogram> <histogram name="ManagedUsers.KidsManagementUrlCheckerResponseStatus" - enum="KidsManagementURLCheckerResponseStatus" expires_after="2023-01-20"> + enum="KidsManagementURLCheckerResponseStatus" expires_after="2023-12-12"> <owner>escordeiro@chromium.org</owner> <owner>unichrome-eng@google.com</owner> <owner>cros-families-eng@google.com</owner> @@ -605,7 +589,7 @@ </histogram> <histogram name="ManagedUsers.RequestPermissionSource" - enum="ManagedUserURLRequestPermissionSource" expires_after="2023-06-04"> + enum="ManagedUserURLRequestPermissionSource" expires_after="2023-12-12"> <owner>michaelpg@chromium.org</owner> <owner>yilkal@chromium.org</owner> <owner>cros-families-eng@google.com</owner> @@ -615,7 +599,7 @@ </histogram> <histogram name="ManagedUsers.SafeSitesDelay" units="ms" - expires_after="2023-06-04"> + expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -625,7 +609,7 @@ </histogram> <histogram name="ManagedUsers.SafetyFilter" - enum="SupervisedUserSafetyFilterResult" expires_after="2023-06-04"> + enum="SupervisedUserSafetyFilterResult" expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -638,10 +622,9 @@ </histogram> <histogram name="SupervisedUsers.ExtensionEnablement" - enum="SupervisedUserExtensionEnablement" expires_after="2023-01-20"> - <owner>tobyhuang@chromium.org</owner> - <owner>agawronska@chromium.org</owner> + enum="SupervisedUserExtensionEnablement" expires_after="2023-12-12"> <owner>danan@chromium.org</owner> + <owner>agawronska@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> Records supervised users trying to enable or disable extensions. Enabled @@ -655,10 +638,9 @@ </histogram> <histogram name="SupervisedUsers.ExtensionInstallDialog" - enum="SupervisedUserExtensionInstallDialog" expires_after="2023-05-27"> - <owner>tobyhuang@chromium.org</owner> - <owner>agawronska@chromium.org</owner> + enum="SupervisedUserExtensionInstallDialog" expires_after="2023-12-12"> <owner>danan@chromium.org</owner> + <owner>agawronska@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> Records the actions of supervised users on the Extension Install Dialog. @@ -671,10 +653,9 @@ </histogram> <histogram name="SupervisedUsers.Extensions2" enum="SupervisedUserExtension2" - expires_after="2023-01-20"> - <owner>tobyhuang@chromium.org</owner> - <owner>agawronska@chromium.org</owner> + expires_after="2023-12-12"> <owner>danan@chromium.org</owner> + <owner>agawronska@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> Records the progress of supervised users as they try to install Chrome @@ -687,8 +668,8 @@ </histogram> <histogram name="SupervisedUsers.ExtensionsMayRequestPermissions" - enum="BooleanEnabled" expires_after="2023-05-27"> - <owner>tobyhuang@chromium.org</owner> + enum="BooleanEnabled" expires_after="2023-12-12"> + <owner>courtneywong@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> Records the state of the "Permissions for sites, apps and @@ -708,10 +689,9 @@ </histogram> <histogram name="SupervisedUsers.ParentPermissionDialog" - enum="SupervisedUserParentPermissionDialog" expires_after="2023-01-20"> - <owner>tobyhuang@chromium.org</owner> - <owner>agawronska@chromium.org</owner> + enum="SupervisedUserParentPermissionDialog" expires_after="2023-12-12"> <owner>danan@chromium.org</owner> + <owner>agawronska@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> Records the actions of parents on the Parent Permission Dialog. Opened count @@ -727,7 +707,7 @@ </histogram> <histogram name="SupervisedUsers.PerAppTimeLimits.AppsWithTimeLimit" - units="Apps" expires_after="2023-01-20"> + units="Apps" expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> <owner>yilkal@chromium.org</owner> <owner>cros-families-eng@google.com</owner> @@ -738,7 +718,7 @@ </histogram> <histogram name="SupervisedUsers.PerAppTimeLimits.BlockedAppsCount" - units="Apps" expires_after="2023-01-20"> + units="Apps" expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> <owner>yilkal@chromium.org</owner> <owner>cros-families-eng@google.com</owner> @@ -749,7 +729,7 @@ </histogram> <histogram name="SupervisedUsers.PerAppTimeLimits.Engagement" units="Apps" - expires_after="2023-01-20"> + expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> <owner>yilkal@chromium.org</owner> <owner>cros-families-eng@google.com</owner> @@ -761,7 +741,7 @@ </histogram> <histogram name="SupervisedUsers.PerAppTimeLimits.PolicyChangeCount" - units="Changes" expires_after="2023-01-20"> + units="Changes" expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> <owner>yilkal@chromium.org</owner> <owner>cros-families-eng@google.com</owner> @@ -772,7 +752,7 @@ </histogram> <histogram name="Supervision.ParentAccessCode.Action" - enum="ParentAccessCodeAction" expires_after="2023-05-27"> + enum="ParentAccessCodeAction" expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -782,7 +762,7 @@ </histogram> <histogram name="Supervision.ParentAccessCode.Usage" - enum="ParentAccessCodeUsage" expires_after="2023-01-20"> + enum="ParentAccessCodeUsage" expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -792,7 +772,7 @@ </histogram> <histogram name="Supervision.ParentAccessCode.ValidationResult.{Action}" - enum="ParentAccessCodeValidationResult" expires_after="2023-01-20"> + enum="ParentAccessCodeValidationResult" expires_after="2023-12-12"> <owner>agawronska@chromium.org</owner> <owner>cros-families-eng@google.com</owner> <summary> @@ -810,7 +790,7 @@ </histogram> <histogram name="Supervision.StatusReport.Event" - enum="SupervisionStatusReportEvent" expires_after="2023-01-20"> + enum="SupervisionStatusReportEvent" expires_after="2023-12-12"> <owner>escordeiro@google.com</owner> <owner>brunoad@google.com</owner> <owner>ldaguilar@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/fastpair/histograms.xml b/tools/metrics/histograms/metadata/fastpair/histograms.xml index 10f6c8e..0f1a75d6 100644 --- a/tools/metrics/histograms/metadata/fastpair/histograms.xml +++ b/tools/metrics/histograms/metadata/fastpair/histograms.xml
@@ -59,6 +59,24 @@ </summary> </histogram> +<histogram name="FastPair.{FastPairPairingProtocol}.Pairing" + enum="FastPairProtocolPairingSteps" expires_after="2023-02-26"> + <owner>jackshira@google.com</owner> + <owner>chromeos-cross-device-eng@google.com</owner> + <summary> + Records each sucessful step in the Protocol-based Pairing flow. These steps + are: on pairing start, when retries have been exhausted, when device is + already paired, on successful bond, on passkey negotiated, on passkey + characteristic found, on notifications enabled for passkey characteristic, + on passkey response, on passkey validation, on passkey confirmation, and on + pairing complete. + </summary> + <token key="FastPairPairingProtocol"> + <variant name="InitialPairing" summary="Initial pairing protocol"/> + <variant name="SubsequentPairing" summary="Subsequent pairing protocol"/> + </token> +</histogram> + </histograms> </histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml index e1251e3..6bdee9f 100644 --- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml +++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -6296,12 +6296,10 @@ <affected-histogram name="Apps.AppListSuggestedChipOpenType"/> <affected-histogram name="Apps.ContextMenuExecuteCommand.FromApp"/> <affected-histogram name="Apps.ContextMenuExecuteCommand.NotFromApp"/> - <affected-histogram name="Apps.PaginationTransition.AnimationSmoothness"/> <affected-histogram name="Apps.PaginationTransition.DragScroll.PresentationTime"/> <affected-histogram name="Apps.PaginationTransition.DragScroll.PresentationTime.MaxLatency"/> - <affected-histogram name="Apps.StateTransition.AnimationSmoothness"/> <affected-histogram name="Ash.LoginAnimation.Duration"/> <affected-histogram name="Ash.LoginAnimation.Jank"/> <affected-histogram name="Ash.LoginAnimation.Smoothness"/>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml index eaab327b..8305e95 100644 --- a/tools/metrics/histograms/metadata/ios/histograms.xml +++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -1839,6 +1839,16 @@ </summary> </histogram> +<histogram name="IOS.TabGrid.CloseTabs" units="Tabs" expires_after="2023-11-01"> + <owner>ewannpv@chromium.org</owner> + <owner>gambard@chromium.org</owner> + <owner>bling-team@google.com</owner> + <summary> + The number of Tab Grid items closed with a bulk or a 'Close All' operation. + A Tab can be recoreded twice if it is restored and closed again. + </summary> +</histogram> + <histogram name="IOS.TabGrid.Selection.AddToBookmarks" units="Tabs" expires_after="2023-11-01"> <owner>mrefaat@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml index cf02c59..cc6ee6a 100644 --- a/tools/metrics/histograms/metadata/media/histograms.xml +++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -1481,6 +1481,17 @@ </summary> </histogram> +<histogram name="Media.AudioSystem.GetDeviceDescription.Result" + enum="BooleanSuccess" expires_after="2023-05-13"> + <owner>toprice@chromium.org</owner> + <owner>olka@chromium.org</owner> + <summary> + Records whether AudioSystemToServiceAdapter::GetDeviceDescriptions calls to + the audio service returned successfully, or failed and retured an default + empty list due to an audio service crash. + </summary> +</histogram> + <histogram name="Media.AudioThreadStatus" enum="AudioThreadStatus" expires_after="never"> <!-- expires-never: Audio pipeline health metric. -->
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml index 6c4e6413..66f4411 100644 --- a/tools/metrics/histograms/metadata/net/histograms.xml +++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -4897,7 +4897,7 @@ </histogram> <histogram name="Net.SSLKeyLogFileUse" enum="SSLKeyLogFileAction" - expires_after="M110"> + expires_after="M116"> <owner>cthomp@chromium.org</owner> <owner>trusty-transport@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index 52f7a97..a6839f35 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -10440,7 +10440,7 @@ </histogram> <histogram name="Process.Sandbox.StartSandboxedWin.{Event}Duration" - units="microseconds" expires_after="2023-01-21"> + units="microseconds" expires_after="2023-05-21"> <owner>ajgo@chromium.org</owner> <owner>src/sandbox/policy/win/OWNERS</owner> <summary> @@ -10815,7 +10815,7 @@ </histogram> <histogram name="ReadingList.Read.AgeOnFirstRead" units="hours" - expires_after="2022-12-18"> + expires_after="2023-12-13"> <owner>thegreenfrog@chromium.org</owner> <owner>olivierrobin@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml index 5a3eca93..253d6752 100644 --- a/tools/metrics/histograms/metadata/page/histograms.xml +++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -897,7 +897,7 @@ <histogram name="PageLoad.Clients.GoogleSearch.ParseTiming.NavigationToParseStart" - units="ms" expires_after="2022-12-23"> + units="ms" expires_after="2023-04-30"> <owner>spelchat@chromium.org</owner> <owner>chrome-brapp-loading@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml index 54000a4..0e47c49 100644 --- a/tools/metrics/histograms/metadata/password/histograms.xml +++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -1192,6 +1192,34 @@ </histogram> <histogram + name="PasswordManager.CredentialManager.{ProfileType}.GetIntent.APIError" + enum="PasswordStoreAndroidBackendAPIError" expires_after="M114"> + <owner>ioanap@chromium.org</owner> + <owner>maxan@google.com</owner> + <summary> + Records the API error code encountered while attempting to fetch the + Credential Manager launch intent from Google Play Services for the + {ProfileType}. This is recorded after the asynchronous call comes back with + an error. + </summary> + <token key="ProfileType" variants="ProfileType"/> +</histogram> + +<histogram + name="PasswordManager.CredentialManager.{ProfileType}.GetIntent.APIError.ConnectionResultCode" + enum="PasswordStoreAndroidBackendConnectionResultCode" expires_after="M114"> + <owner>ioanap@chromium.org</owner> + <owner>maxan@google.com</owner> + <summary> + Records the API error code encountered while attempting to fetch the + Credential Manager launch intent from Google Play Services for the + {ProfileType}. This is recorded after the asynchronous call comes back with + an error only if ConnectionResult was set on the returned error. + </summary> + <token key="ProfileType" variants="ProfileType"/> +</histogram> + +<histogram name="PasswordManager.CredentialManager.{ProfileType}.GetIntent.Error" enum="CredentialManagerError" expires_after="M114"> <owner>ioanap@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/renderer/histograms.xml b/tools/metrics/histograms/metadata/renderer/histograms.xml index e9cb2403..d509206 100644 --- a/tools/metrics/histograms/metadata/renderer/histograms.xml +++ b/tools/metrics/histograms/metadata/renderer/histograms.xml
@@ -477,6 +477,31 @@ </summary> </histogram> +<histogram base="true" + name="RendererScheduler.QueueingDuration.{Priority}Priority" + units="microseconds" expires_after="2023-10-31"> + <owner>szager@chromium.org</owner> + <owner>paint-dev@chromium.org</owner> + <summary> + Time between when a new task is added to a TaskQueue with priority + k{Priority}Priority, and when the task begins execution. For delayed (i.e. + timer-based) tasks, the initial timestamp is based on the ideal starting + time, rather than the time when the event loop notices that the timer has + expired. + + Note: Not recorded on ~5% of Windows machines with low-resolution clocks. + </summary> + <token key="Priority"> + <variant name="BestEffort"/> + <variant name="Control"/> + <variant name="High"/> + <variant name="Highest"/> + <variant name="Low"/> + <variant name="Normal"/> + <variant name="VeryHigh"/> + </token> +</histogram> + <histogram name="RendererScheduler.RendererMainThreadLoad5" units="%" expires_after="2023-04-30"> <owner>altimin@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/web_apk/histograms.xml b/tools/metrics/histograms/metadata/web_apk/histograms.xml index 808000e..f16215a9 100644 --- a/tools/metrics/histograms/metadata/web_apk/histograms.xml +++ b/tools/metrics/histograms/metadata/web_apk/histograms.xml
@@ -224,19 +224,6 @@ </summary> </histogram> -<histogram name="WebApk.Session.TotalDuration2{WebApkDistributorType}" - units="ms" expires_after="2022-12-16"> - <owner>hartmanng@chromium.org</owner> - <owner> - src/chrome/android/java/src/org/chromium/chrome/browser/webapps/OWNERS - </owner> - <summary> - The length of a WebAPK session (launch/foregrounding to backgrounding) in - milliseconds. {WebApkDistributorType} - </summary> - <token key="WebApkDistributorType" variants="WebApkDistributorType"/> -</histogram> - <histogram name="WebApk.ShellApkVersion2{WebApkDistributorType}" units="units" expires_after="2023-06-01"> <owner>hartmanng@chromium.org</owner>
diff --git a/tools/metrics/histograms/update_histogram_enum.py b/tools/metrics/histograms/update_histogram_enum.py index 673c748..b55e773 100644 --- a/tools/metrics/histograms/update_histogram_enum.py +++ b/tools/metrics/histograms/update_histogram_enum.py
@@ -172,10 +172,11 @@ new_comments = [] # Add a "Generated from (...)" comment. - new_comments.append(document.createComment( - ' Generated from {0}.'.format(source_enum_path) + ( - '\nCalled by {0}.'.format(caller_script_name) if caller_script_name - else ''))) + new_comments.append( + document.createComment( + ' Generated from {0}.'.format(source_enum_path).replace('\\', '/') + + ('\nCalled by {0}.'.format(caller_script_name + ) if caller_script_name else ''))) # Create item nodes for each of the enum values. for value, label in source_enum_values.items(): @@ -301,7 +302,7 @@ Log('Cancelled.') return - with io.open(ENUMS_PATH, 'w', encoding='utf-8') as f: + with io.open(ENUMS_PATH, 'w', encoding='utf-8', newline='') as f: f.write(new_xml) Log('Done.')
diff --git a/tools/perf/process_perf_results.pydeps b/tools/perf/process_perf_results.pydeps index 900973c..2c901fdc 100644 --- a/tools/perf/process_perf_results.pydeps +++ b/tools/perf/process_perf_results.pydeps
@@ -262,6 +262,7 @@ ../../third_party/catapult/telemetry/telemetry/internal/platform/fuchsia_platform_backend.py ../../third_party/catapult/telemetry/telemetry/internal/platform/gpu_device.py ../../third_party/catapult/telemetry/telemetry/internal/platform/gpu_info.py +../../third_party/catapult/telemetry/telemetry/internal/platform/linux_based_device.py ../../third_party/catapult/telemetry/telemetry/internal/platform/linux_based_platform_backend.py ../../third_party/catapult/telemetry/telemetry/internal/platform/network_controller_backend.py ../../third_party/catapult/telemetry/telemetry/internal/platform/platform_backend.py
diff --git a/tools/rust/build_rust.py b/tools/rust/build_rust.py index 156b642..f702c68 100755 --- a/tools/rust/build_rust.py +++ b/tools/rust/build_rust.py
@@ -121,9 +121,12 @@ with open(RUST_CONFIG_TEMPLATE_PATH, 'r') as input: template = string.Template(input.read()) + def quote_string(s: str): + return s.replace('\\', '\\\\').replace('"', '\\"') + subs = {} - subs['INSTALL_DIR'] = RUST_TOOLCHAIN_OUT_DIR - subs['LLVM_ROOT'] = llvm_libs_root + subs['INSTALL_DIR'] = quote_string(str(RUST_TOOLCHAIN_OUT_DIR)) + subs['LLVM_ROOT'] = quote_string(str(llvm_libs_root)) subs['PACKAGE_VERSION'] = GetPackageVersionForBuild() # ...and apply substitutions, writing to config.toml in Rust tree.
diff --git a/ui/accessibility/BUILD.gn b/ui/accessibility/BUILD.gn index 1d0a8f2..f1909f3 100644 --- a/ui/accessibility/BUILD.gn +++ b/ui/accessibility/BUILD.gn
@@ -366,6 +366,7 @@ "platform/ax_platform_node_textrangeprovider_win_unittest.cc", "platform/ax_platform_node_win_unittest.cc", "platform/ax_platform_node_win_unittest.h", + "platform/iaccessible2/scoped_co_mem_array_unittest.cc", ] deps += [
diff --git a/ui/accessibility/platform/BUILD.gn b/ui/accessibility/platform/BUILD.gn index 19a94b01..9f1549e1 100644 --- a/ui/accessibility/platform/BUILD.gn +++ b/ui/accessibility/platform/BUILD.gn
@@ -180,6 +180,7 @@ "ax_platform_relation_win.h", "ax_system_caret_win.cc", "ax_system_caret_win.h", + "iaccessible2/scoped_co_mem_array.h", "inspect/ax_call_statement_invoker_win.cc", "inspect/ax_call_statement_invoker_win.h", "inspect/ax_event_recorder_win.cc",
diff --git a/ui/accessibility/platform/iaccessible2/scoped_co_mem_array.h b/ui/accessibility/platform/iaccessible2/scoped_co_mem_array.h new file mode 100644 index 0000000..93a6702 --- /dev/null +++ b/ui/accessibility/platform/iaccessible2/scoped_co_mem_array.h
@@ -0,0 +1,103 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_ACCESSIBILITY_PLATFORM_IACCESSIBLE2_SCOPED_CO_MEM_ARRAY_H_ +#define UI_ACCESSIBILITY_PLATFORM_IACCESSIBLE2_SCOPED_CO_MEM_ARRAY_H_ + +#include <cstddef> +#include <utility> + +#include <objbase.h> + +#include "base/check_op.h" +#include "base/memory/raw_ptr.h" +#include "base/win/windows_types.h" + +namespace ui { + +// RAII type for COM arrays. +// Example: +// base::win::ScopedCoMemArray<LONG> columns; +// get_selectedColumns(columns.Receive(), columns.ReceiveSize()) +// ... +// return; <-- memory released +template <typename T> +class ScopedCoMemArray { + public: + ScopedCoMemArray() = default; + + ScopedCoMemArray(const ScopedCoMemArray&) = delete; + ScopedCoMemArray& operator=(const ScopedCoMemArray&) = delete; + + ScopedCoMemArray(ScopedCoMemArray&& o) + : mem_ptr_(std::exchange(o.mem_ptr_, nullptr)), + size_(std::exchange(o.size_, 0)) {} + + ScopedCoMemArray& operator=(ScopedCoMemArray&& o) { + if (&o != this) + Reset(std::exchange(o.mem_ptr_, nullptr), std::exchange(o.size_, 0)); + return *this; + } + + ~ScopedCoMemArray() { Reset(nullptr, 0); } + + LONG size() const { return size_; } + + const T& operator[](std::size_t pos) const { + CHECK_LT(static_cast<LONG>(pos), size_); + return this->mem_ptr_[pos]; + } + + class Iterator final { + public: + Iterator(const ScopedCoMemArray* array, LONG index) + : array_(array), index_(index) {} + ~Iterator() {} + + Iterator& operator++() { + ++index_; + return *this; + } + Iterator operator++(int) { + Iterator tmp(*this); + operator++(); + return tmp; + } + + const T& operator*() const { return (*array_)[index_]; } + + friend constexpr bool operator==(const Iterator& lhs, const Iterator& rhs) { + return lhs.array_ == rhs.array_ && lhs.index_ == rhs.index_; + } + friend constexpr bool operator!=(const Iterator& lhs, const Iterator& rhs) { + return !(lhs == rhs); + } + + private: + raw_ptr<const ScopedCoMemArray> array_ = nullptr; + LONG index_ = 0; + }; + + Iterator begin() const { return {this, 0}; } + Iterator end() const { return {this, size_}; } + + T** Receive() { + DCHECK_EQ(mem_ptr_, nullptr); // To catch memory leaks. + return &mem_ptr_; + } + LONG* ReceiveSize() { return &size_; } + + private: + void Reset(T* ptr, LONG size) { + ::CoTaskMemFree(std::exchange(mem_ptr_, ptr)); + size_ = size; + } + + T* mem_ptr_ = nullptr; + LONG size_ = 0; +}; + +} // namespace ui + +#endif // UI_ACCESSIBILITY_PLATFORM_IACCESSIBLE2_SCOPED_CO_MEM_ARRAY_H_
diff --git a/ui/accessibility/platform/iaccessible2/scoped_co_mem_array_unittest.cc b/ui/accessibility/platform/iaccessible2/scoped_co_mem_array_unittest.cc new file mode 100644 index 0000000..ecc17b9 --- /dev/null +++ b/ui/accessibility/platform/iaccessible2/scoped_co_mem_array_unittest.cc
@@ -0,0 +1,34 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/accessibility/platform/iaccessible2/scoped_co_mem_array.h" + +#include <vector> + +#include <objbase.h> + +#include "base/win/windows_types.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ui { + +void AllocateComArray(std::vector<LONG>& vector, + LONG** out_ptr, + LONG* out_size) { + *out_size = static_cast<LONG>(vector.size()); + *out_ptr = static_cast<LONG*>(CoTaskMemAlloc(sizeof(LONG) * vector.size())); + for (std::size_t i = 0; i < vector.size(); i++) + (*out_ptr)[i] = vector[i]; +} + +TEST(ScopedCoMemArray, Receive) { + std::vector<LONG> vector{10, 20}; + ScopedCoMemArray<LONG> array; + AllocateComArray(vector, array.Receive(), array.ReceiveSize()); + EXPECT_EQ(array.size(), 2); + EXPECT_EQ(array[0], 10); + EXPECT_EQ(array[1], 20); +} + +} // namespace ui
diff --git a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java index 03ddfc7..c89c7af0 100644 --- a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java +++ b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
@@ -6,7 +6,6 @@ import android.content.ClipData; import android.graphics.Bitmap; -import android.os.Build; import android.os.Bundle; import android.view.MotionEvent; import android.view.PointerIcon; @@ -24,7 +23,6 @@ import org.chromium.base.ObserverList; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.base.compat.ApiHelperForN; import org.chromium.ui.dragdrop.DragAndDropDelegate; import org.chromium.ui.dragdrop.DragAndDropDelegateImpl; import org.chromium.ui.dragdrop.DragStateTracker; @@ -261,18 +259,13 @@ @VisibleForTesting @CalledByNative public void onCursorChangedToCustom(Bitmap customCursorBitmap, int hotspotX, int hotspotY) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - PointerIcon icon = - ApiHelperForN.createPointerIcon(customCursorBitmap, hotspotX, hotspotY); - ApiHelperForN.setPointerIcon(getContainerViewGroup(), icon); - } + PointerIcon icon = PointerIcon.create(customCursorBitmap, hotspotX, hotspotY); + getContainerViewGroup().setPointerIcon(icon); } @VisibleForTesting @CalledByNative public void onCursorChanged(int cursorType) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return; - // Allow stylus writing handler to override the cursor. if (mHoverActionStylusWritable && mStylusWritingCursorHandler != null && mStylusWritingCursorHandler.didHandleCursorUpdate(getContainerViewGroup())) { @@ -402,7 +395,7 @@ } ViewGroup containerView = getContainerViewGroup(); PointerIcon icon = PointerIcon.getSystemIcon(containerView.getContext(), pointerIconType); - ApiHelperForN.setPointerIcon(containerView, icon); + containerView.setPointerIcon(icon); } @CalledByNative
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn index aa6bb75b..56ee545 100644 --- a/ui/gl/BUILD.gn +++ b/ui/gl/BUILD.gn
@@ -139,6 +139,8 @@ if (is_android) { sources += [ + "android/scoped_a_native_window.cc", + "android/scoped_a_native_window.h", "android/scoped_java_surface.cc", "android/scoped_java_surface.h", "android/scoped_java_surface_control.cc",
diff --git a/ui/gl/android/scoped_a_native_window.cc b/ui/gl/android/scoped_a_native_window.cc new file mode 100644 index 0000000..8e93462 --- /dev/null +++ b/ui/gl/android/scoped_a_native_window.cc
@@ -0,0 +1,65 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/gl/android/scoped_a_native_window.h" + +#include <android/native_window_jni.h> + +#include "base/android/jni_android.h" +#include "ui/gl/android/scoped_java_surface.h" + +namespace gl { + +// static +ScopedANativeWindow ScopedANativeWindow::Wrap(ANativeWindow* a_native_window) { + return ScopedANativeWindow(a_native_window); +} + +ScopedANativeWindow::ScopedANativeWindow(const ScopedJavaSurface& surface) { + if (!surface.j_surface()) { + return; + } + + JNIEnv* env = base::android::AttachCurrentThread(); + // Note: This ensures that any local references used by + // ANativeWindow_fromSurface are released immediately. This is needed as a + // workaround for https://code.google.com/p/android/issues/detail?id=68174 + base::android::ScopedJavaLocalFrame scoped_local_reference_frame(env); + a_native_window_ = ANativeWindow_fromSurface(env, surface.j_surface().obj()); +} + +ScopedANativeWindow::ScopedANativeWindow(ANativeWindow* a_native_window) + : a_native_window_(a_native_window) { + if (a_native_window_) { + ANativeWindow_acquire(a_native_window_); + } +} + +ScopedANativeWindow::~ScopedANativeWindow() { + DestroyIfNeeded(); +} + +ScopedANativeWindow::ScopedANativeWindow(ScopedANativeWindow&& other) + : a_native_window_(other.a_native_window_) { + other.a_native_window_ = nullptr; +} + +ScopedANativeWindow& ScopedANativeWindow::operator=( + ScopedANativeWindow&& other) { + if (this != &other) { + DestroyIfNeeded(); + a_native_window_ = other.a_native_window_; + other.a_native_window_ = nullptr; + } + return *this; +} + +void ScopedANativeWindow::DestroyIfNeeded() { + if (a_native_window_) { + ANativeWindow_release(a_native_window_); + } + a_native_window_ = nullptr; +} + +} // namespace gl
diff --git a/ui/gl/android/scoped_a_native_window.h b/ui/gl/android/scoped_a_native_window.h new file mode 100644 index 0000000..339f384 --- /dev/null +++ b/ui/gl/android/scoped_a_native_window.h
@@ -0,0 +1,43 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_GL_ANDROID_SCOPED_A_NATIVE_WINDOW_H_ +#define UI_GL_ANDROID_SCOPED_A_NATIVE_WINDOW_H_ + +#include "ui/gl/gl_export.h" + +struct ANativeWindow; + +namespace gl { + +class ScopedJavaSurface; + +class GL_EXPORT ScopedANativeWindow { + public: + static ScopedANativeWindow Wrap(ANativeWindow* a_native_window); + explicit ScopedANativeWindow(const ScopedJavaSurface& surface); + ~ScopedANativeWindow(); + + ScopedANativeWindow(ScopedANativeWindow&& other); + ScopedANativeWindow& operator=(ScopedANativeWindow&& other); + + // Move only type. + ScopedANativeWindow(const ScopedANativeWindow&) = delete; + ScopedANativeWindow& operator=(const ScopedANativeWindow&) = delete; + + explicit operator bool() const { return !!a_native_window_; } + + ANativeWindow* a_native_window() const { return a_native_window_; } + + private: + explicit ScopedANativeWindow(ANativeWindow* a_native_window); + + void DestroyIfNeeded(); + + ANativeWindow* a_native_window_ = nullptr; +}; + +} // namespace gl + +#endif // UI_GL_ANDROID_SCOPED_A_NATIVE_WINDOW_H_
diff --git a/ui/gl/android/scoped_java_surface_control.cc b/ui/gl/android/scoped_java_surface_control.cc index 167ee479..7e61d695 100644 --- a/ui/gl/android/scoped_java_surface_control.cc +++ b/ui/gl/android/scoped_java_surface_control.cc
@@ -20,10 +20,7 @@ release_on_destroy_(release_on_destroy) {} ScopedJavaSurfaceControl::~ScopedJavaSurfaceControl() { - if (release_on_destroy_ && j_surface_control_) { - Java_ScopedJavaSurfaceControl_releaseSurfaceControl( - base::android::AttachCurrentThread(), j_surface_control_); - } + DestroyIfNeeded(); } ScopedJavaSurfaceControl::ScopedJavaSurfaceControl( @@ -35,9 +32,12 @@ ScopedJavaSurfaceControl& ScopedJavaSurfaceControl::operator=( ScopedJavaSurfaceControl&& other) { - j_surface_control_ = std::move(other.j_surface_control_); - release_on_destroy_ = other.release_on_destroy_; - other.release_on_destroy_ = false; + if (this != &other) { + DestroyIfNeeded(); + j_surface_control_ = std::move(other.j_surface_control_); + release_on_destroy_ = other.release_on_destroy_; + other.release_on_destroy_ = false; + } return *this; } @@ -61,4 +61,13 @@ j_surface_control_); } +void ScopedJavaSurfaceControl::DestroyIfNeeded() { + if (release_on_destroy_ && j_surface_control_) { + Java_ScopedJavaSurfaceControl_releaseSurfaceControl( + base::android::AttachCurrentThread(), j_surface_control_); + } + j_surface_control_.Reset(); + release_on_destroy_ = false; +} + } // namespace gl
diff --git a/ui/gl/android/scoped_java_surface_control.h b/ui/gl/android/scoped_java_surface_control.h index 01dfb11..deac84b 100644 --- a/ui/gl/android/scoped_java_surface_control.h +++ b/ui/gl/android/scoped_java_surface_control.h
@@ -47,6 +47,8 @@ scoped_refptr<gfx::SurfaceControl::Surface> MakeSurface(); private: + void DestroyIfNeeded(); + base::android::ScopedJavaGlobalRef<jobject> j_surface_control_; bool release_on_destroy_ = false; };
diff --git a/ui/gl/generate_bindings.py b/ui/gl/generate_bindings.py index ddad77b..2c1ad670 100755 --- a/ui/gl/generate_bindings.py +++ b/ui/gl/generate_bindings.py
@@ -389,13 +389,6 @@ 'GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, ' 'GLboolean unpackUnmultiplyAlpha', }, { 'return_type': 'void', - 'names': ['glCoverageModulationNV'], - 'versions': [{ 'name': 'glCoverageModulationNV', - 'extensions': ['GL_NV_framebuffer_mixed_samples'] }, - { 'name': 'glCoverageModulationCHROMIUM', - 'extensions': ['GL_CHROMIUM_framebuffer_mixed_samples'] }], - 'arguments': 'GLenum components'}, -{ 'return_type': 'void', 'names': ['glCoverFillPathInstancedNV'], 'versions': [{ 'name': 'glCoverFillPathInstancedNV', 'extensions': ['GL_NV_path_rendering'] },
diff --git a/ui/gl/gl_bindings.h b/ui/gl/gl_bindings.h index ff0374bb..cfde91b 100644 --- a/ui/gl/gl_bindings.h +++ b/ui/gl/gl_bindings.h
@@ -320,11 +320,6 @@ #define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F #endif /* GL_EXT_multisample_compatibility */ -#ifndef GL_CHROMIUM_framebuffer_mixed_samples -#define GL_CHROMIUM_framebuffer_mixed_samples 1 -#define GL_COVERAGE_MODULATION_CHROMIUM 0x9332 -#endif /* GL_CHROMIUM_framebuffer_mixed_samples */ - #ifndef GL_KHR_blend_equation_advanced #define GL_KHR_blend_equation_advanced 1 #define GL_COLORBURN_KHR 0x929A
diff --git a/ui/gl/gl_bindings_api_autogen_gl.h b/ui/gl/gl_bindings_api_autogen_gl.h index 803df7f..6de50d2 100644 --- a/ui/gl/gl_bindings_api_autogen_gl.h +++ b/ui/gl/gl_bindings_api_autogen_gl.h
@@ -287,7 +287,6 @@ GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha) override; -void glCoverageModulationNVFn(GLenum components) override; void glCoverFillPathInstancedNVFn(GLsizei numPaths, GLenum pathNameType, const void* paths,
diff --git a/ui/gl/gl_bindings_autogen_gl.cc b/ui/gl/gl_bindings_autogen_gl.cc index a6d7d46..38cd41fb 100644 --- a/ui/gl/gl_bindings_autogen_gl.cc +++ b/ui/gl/gl_bindings_autogen_gl.cc
@@ -369,8 +369,6 @@ gfx::HasExtension(extensions, "GL_CHROMIUM_bind_uniform_location"); ext.b_GL_CHROMIUM_copy_texture = gfx::HasExtension(extensions, "GL_CHROMIUM_copy_texture"); - ext.b_GL_CHROMIUM_framebuffer_mixed_samples = - gfx::HasExtension(extensions, "GL_CHROMIUM_framebuffer_mixed_samples"); ext.b_GL_CHROMIUM_gles_depth_binding_hack = gfx::HasExtension(extensions, "GL_CHROMIUM_gles_depth_binding_hack"); ext.b_GL_CHROMIUM_glgetstringi_hack = @@ -456,8 +454,6 @@ ext.b_GL_NV_fence = gfx::HasExtension(extensions, "GL_NV_fence"); ext.b_GL_NV_framebuffer_blit = gfx::HasExtension(extensions, "GL_NV_framebuffer_blit"); - ext.b_GL_NV_framebuffer_mixed_samples = - gfx::HasExtension(extensions, "GL_NV_framebuffer_mixed_samples"); ext.b_GL_NV_internalformat_sample_query = gfx::HasExtension(extensions, "GL_NV_internalformat_sample_query"); ext.b_GL_NV_path_rendering = @@ -802,14 +798,6 @@ GetGLProcAddress("glCopyTextureCHROMIUM")); } - if (ext.b_GL_NV_framebuffer_mixed_samples) { - fn.glCoverageModulationNVFn = reinterpret_cast<glCoverageModulationNVProc>( - GetGLProcAddress("glCoverageModulationNV")); - } else if (ext.b_GL_CHROMIUM_framebuffer_mixed_samples) { - fn.glCoverageModulationNVFn = reinterpret_cast<glCoverageModulationNVProc>( - GetGLProcAddress("glCoverageModulationCHROMIUM")); - } - if (ext.b_GL_NV_path_rendering) { fn.glCoverFillPathInstancedNVFn = reinterpret_cast<glCoverFillPathInstancedNVProc>( @@ -3570,10 +3558,6 @@ destType, unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha); } -void GLApiBase::glCoverageModulationNVFn(GLenum components) { - driver_->fn.glCoverageModulationNVFn(components); -} - void GLApiBase::glCoverFillPathInstancedNVFn(GLsizei numPaths, GLenum pathNameType, const void* paths, @@ -7024,11 +7008,6 @@ destType, unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha); } -void TraceGLApi::glCoverageModulationNVFn(GLenum components) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "TraceGLAPI::glCoverageModulationNV"); - gl_api_->glCoverageModulationNVFn(components); -} - void TraceGLApi::glCoverFillPathInstancedNVFn(GLsizei numPaths, GLenum pathNameType, const void* paths, @@ -11179,12 +11158,6 @@ destType, unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha); } -void LogGLApi::glCoverageModulationNVFn(GLenum components) { - GL_SERVICE_LOG("glCoverageModulationNV" - << "(" << GLEnums::GetStringEnum(components) << ")"); - gl_api_->glCoverageModulationNVFn(components); -} - void LogGLApi::glCoverFillPathInstancedNVFn(GLsizei numPaths, GLenum pathNameType, const void* paths, @@ -16121,10 +16094,6 @@ NoContextHelper("glCopyTextureCHROMIUM"); } -void NoContextGLApi::glCoverageModulationNVFn(GLenum components) { - NoContextHelper("glCoverageModulationNV"); -} - void NoContextGLApi::glCoverFillPathInstancedNVFn( GLsizei numPaths, GLenum pathNameType,
diff --git a/ui/gl/gl_bindings_autogen_gl.h b/ui/gl/gl_bindings_autogen_gl.h index acdaace..8b8e615 100644 --- a/ui/gl/gl_bindings_autogen_gl.h +++ b/ui/gl/gl_bindings_autogen_gl.h
@@ -314,7 +314,6 @@ GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha); -typedef void(GL_BINDING_CALL* glCoverageModulationNVProc)(GLenum components); typedef void(GL_BINDING_CALL* glCoverFillPathInstancedNVProc)( GLsizei numPaths, GLenum pathNameType, @@ -2008,7 +2007,6 @@ bool b_GL_ARB_vertex_array_object; bool b_GL_CHROMIUM_bind_uniform_location; bool b_GL_CHROMIUM_copy_texture; - bool b_GL_CHROMIUM_framebuffer_mixed_samples; bool b_GL_CHROMIUM_gles_depth_binding_hack; bool b_GL_CHROMIUM_glgetstringi_hack; bool b_GL_CHROMIUM_path_rendering; @@ -2054,7 +2052,6 @@ bool b_GL_NV_blend_equation_advanced; bool b_GL_NV_fence; bool b_GL_NV_framebuffer_blit; - bool b_GL_NV_framebuffer_mixed_samples; bool b_GL_NV_internalformat_sample_query; bool b_GL_NV_path_rendering; bool b_GL_OES_EGL_image; @@ -2139,7 +2136,6 @@ glCopyTexSubImage2DProc glCopyTexSubImage2DFn; glCopyTexSubImage3DProc glCopyTexSubImage3DFn; glCopyTextureCHROMIUMProc glCopyTextureCHROMIUMFn; - glCoverageModulationNVProc glCoverageModulationNVFn; glCoverFillPathInstancedNVProc glCoverFillPathInstancedNVFn; glCoverFillPathNVProc glCoverFillPathNVFn; glCoverStrokePathInstancedNVProc glCoverStrokePathInstancedNVFn; @@ -2882,7 +2878,6 @@ GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha) = 0; - virtual void glCoverageModulationNVFn(GLenum components) = 0; virtual void glCoverFillPathInstancedNVFn(GLsizei numPaths, GLenum pathNameType, const void* paths, @@ -4436,8 +4431,6 @@ #define glCopyTexSubImage3D ::gl::g_current_gl_context->glCopyTexSubImage3DFn #define glCopyTextureCHROMIUM \ ::gl::g_current_gl_context->glCopyTextureCHROMIUMFn -#define glCoverageModulationNV \ - ::gl::g_current_gl_context->glCoverageModulationNVFn #define glCoverFillPathInstancedNV \ ::gl::g_current_gl_context->glCoverFillPathInstancedNVFn #define glCoverFillPathNV ::gl::g_current_gl_context->glCoverFillPathNVFn
diff --git a/ui/gl/gl_bindings_autogen_mock.cc b/ui/gl/gl_bindings_autogen_mock.cc index 8922f36..0fdd279 100644 --- a/ui/gl/gl_bindings_autogen_mock.cc +++ b/ui/gl/gl_bindings_autogen_mock.cc
@@ -933,18 +933,6 @@ } void GL_BINDING_CALL -MockGLInterface::Mock_glCoverageModulationCHROMIUM(GLenum components) { - MakeGlMockFunctionUnique("glCoverageModulationCHROMIUM"); - interface_->CoverageModulationNV(components); -} - -void GL_BINDING_CALL -MockGLInterface::Mock_glCoverageModulationNV(GLenum components) { - MakeGlMockFunctionUnique("glCoverageModulationNV"); - interface_->CoverageModulationNV(components); -} - -void GL_BINDING_CALL MockGLInterface::Mock_glCreateMemoryObjectsEXT(GLsizei n, GLuint* memoryObjects) { MakeGlMockFunctionUnique("glCreateMemoryObjectsEXT"); @@ -5641,11 +5629,6 @@ Mock_glCoverStrokePathInstancedNV); if (strcmp(name, "glCoverStrokePathNV") == 0) return reinterpret_cast<GLFunctionPointerType>(Mock_glCoverStrokePathNV); - if (strcmp(name, "glCoverageModulationCHROMIUM") == 0) - return reinterpret_cast<GLFunctionPointerType>( - Mock_glCoverageModulationCHROMIUM); - if (strcmp(name, "glCoverageModulationNV") == 0) - return reinterpret_cast<GLFunctionPointerType>(Mock_glCoverageModulationNV); if (strcmp(name, "glCreateMemoryObjectsEXT") == 0) return reinterpret_cast<GLFunctionPointerType>( Mock_glCreateMemoryObjectsEXT);
diff --git a/ui/gl/gl_bindings_autogen_mock.h b/ui/gl/gl_bindings_autogen_mock.h index 3b43ae5..4e8d39cd 100644 --- a/ui/gl/gl_bindings_autogen_mock.h +++ b/ui/gl/gl_bindings_autogen_mock.h
@@ -444,9 +444,6 @@ static void GL_BINDING_CALL Mock_glCoverStrokePathNV(GLuint name, GLenum coverMode); static void GL_BINDING_CALL -Mock_glCoverageModulationCHROMIUM(GLenum components); -static void GL_BINDING_CALL Mock_glCoverageModulationNV(GLenum components); -static void GL_BINDING_CALL Mock_glCreateMemoryObjectsEXT(GLsizei n, GLuint* memoryObjects); static GLuint GL_BINDING_CALL Mock_glCreateProgram(void); static GLuint GL_BINDING_CALL Mock_glCreateShader(GLenum type);
diff --git a/ui/gl/gl_mock_autogen_gl.h b/ui/gl/gl_mock_autogen_gl.h index b7daccc6..3a6b370 100644 --- a/ui/gl/gl_mock_autogen_gl.h +++ b/ui/gl/gl_mock_autogen_gl.h
@@ -244,7 +244,6 @@ GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha)); -MOCK_METHOD1(CoverageModulationNV, void(GLenum components)); MOCK_METHOD7(CoverFillPathInstancedNV, void(GLsizei numPaths, GLenum pathNameType,
diff --git a/ui/gl/gl_stub_autogen_gl.h b/ui/gl/gl_stub_autogen_gl.h index c01806b..94a3bd87 100644 --- a/ui/gl/gl_stub_autogen_gl.h +++ b/ui/gl/gl_stub_autogen_gl.h
@@ -286,7 +286,6 @@ GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha) override {} -void glCoverageModulationNVFn(GLenum components) override {} void glCoverFillPathInstancedNVFn(GLsizei numPaths, GLenum pathNameType, const void* paths,
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc index 1e73a56..e900059 100644 --- a/ui/gl/gl_surface_egl.cc +++ b/ui/gl/gl_surface_egl.cc
@@ -10,6 +10,7 @@ #include <map> #include <memory> #include <sstream> +#include <utility> #include <vector> #include "base/lazy_instance.h" @@ -38,11 +39,6 @@ #include "ui/ozone/buildflags.h" #endif // BUILDFLAG(IS_OZONE) -#if BUILDFLAG(IS_ANDROID) -#include <android/native_window_jni.h> -#include "base/android/build_info.h" -#endif - #if !defined(EGL_FIXED_SIZE_ANGLE) #define EGL_FIXED_SIZE_ANGLE 0x3201 #endif @@ -364,6 +360,16 @@ GLSurfaceEGL::~GLSurfaceEGL() = default; +#if BUILDFLAG(IS_ANDROID) +NativeViewGLSurfaceEGL::NativeViewGLSurfaceEGL( + GLDisplayEGL* display, + ScopedANativeWindow scoped_window, + std::unique_ptr<gfx::VSyncProvider> vsync_provider) + : GLSurfaceEGL(display), + scoped_window_(std::move(scoped_window)), + window_(scoped_window_.a_native_window()), + vsync_provider_external_(std::move(vsync_provider)) {} +#else NativeViewGLSurfaceEGL::NativeViewGLSurfaceEGL( GLDisplayEGL* display, EGLNativeWindowType window, @@ -371,17 +377,13 @@ : GLSurfaceEGL(display), window_(window), vsync_provider_external_(std::move(vsync_provider)) { -#if BUILDFLAG(IS_ANDROID) - if (window) - ANativeWindow_acquire(window); -#endif - #if BUILDFLAG(IS_WIN) RECT windowRect; if (GetClientRect(window_, &windowRect)) size_ = gfx::Rect(windowRect).size(); #endif } +#endif // BUILDFLAG(IS_ANDROID) bool NativeViewGLSurfaceEGL::Initialize(GLSurfaceFormat format) { DCHECK(!surface_); @@ -1050,10 +1052,6 @@ NativeViewGLSurfaceEGL::~NativeViewGLSurfaceEGL() { Destroy(); -#if BUILDFLAG(IS_ANDROID) - if (window_) - ANativeWindow_release(window_); -#endif } PbufferGLSurfaceEGL::PbufferGLSurfaceEGL(GLDisplayEGL* display,
diff --git a/ui/gl/gl_surface_egl.h b/ui/gl/gl_surface_egl.h index 2886986be..c3381bd 100644 --- a/ui/gl/gl_surface_egl.h +++ b/ui/gl/gl_surface_egl.h
@@ -29,6 +29,10 @@ #include "ui/gl/gl_surface.h" #include "ui/gl/gl_surface_overlay.h" +#if BUILDFLAG(IS_ANDROID) +#include "ui/gl/android/scoped_a_native_window.h" +#endif + namespace gl { class GLSurfacePresentationHelper; @@ -62,9 +66,15 @@ class GL_EXPORT NativeViewGLSurfaceEGL : public GLSurfaceEGL, public EGLTimestampClient { public: +#if BUILDFLAG(IS_ANDROID) + NativeViewGLSurfaceEGL(GLDisplayEGL* display, + ScopedANativeWindow scoped_window, + std::unique_ptr<gfx::VSyncProvider> vsync_provider); +#else NativeViewGLSurfaceEGL(GLDisplayEGL* display, EGLNativeWindowType window, std::unique_ptr<gfx::VSyncProvider> vsync_provider); +#endif NativeViewGLSurfaceEGL(const NativeViewGLSurfaceEGL&) = delete; NativeViewGLSurfaceEGL& operator=(const NativeViewGLSurfaceEGL&) = delete; @@ -119,6 +129,9 @@ protected: ~NativeViewGLSurfaceEGL() override; +#if BUILDFLAG(IS_ANDROID) + ScopedANativeWindow scoped_window_; +#endif EGLNativeWindowType window_ = 0; gfx::Size size_ = gfx::Size(1, 1); bool enable_fixed_size_angle_ = true;
diff --git a/ui/gl/gl_surface_egl_surface_control.cc b/ui/gl/gl_surface_egl_surface_control.cc index d90fa2f..7db58f0 100644 --- a/ui/gl/gl_surface_egl_surface_control.cc +++ b/ui/gl/gl_surface_egl_surface_control.cc
@@ -17,6 +17,7 @@ #include "cc/base/math_util.h" #include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/overlay_transform_utils.h" +#include "ui/gl/android/scoped_a_native_window.h" #include "ui/gl/android/scoped_java_surface_control.h" #include "ui/gl/egl_util.h" #include "ui/gl/gl_context.h" @@ -58,12 +59,12 @@ GLSurfaceEGLSurfaceControl::GLSurfaceEGLSurfaceControl( GLDisplayEGL* display, - ANativeWindow* window, + gl::ScopedANativeWindow window, scoped_refptr<base::SingleThreadTaskRunner> task_runner) : GLSurfaceEGLSurfaceControl( display, base::MakeRefCounted<gfx::SurfaceControl::Surface>( - window, + window.a_native_window(), BuildSurfaceName(kRootSurfaceName).c_str()), std::move(task_runner)) {}
diff --git a/ui/gl/gl_surface_egl_surface_control.h b/ui/gl/gl_surface_egl_surface_control.h index 7966d70..a6b72d97 100644 --- a/ui/gl/gl_surface_egl_surface_control.h +++ b/ui/gl/gl_surface_egl_surface_control.h
@@ -29,13 +29,14 @@ namespace gl { +class ScopedANativeWindow; class ScopedJavaSurfaceControl; class GL_EXPORT GLSurfaceEGLSurfaceControl : public GLSurfaceEGL { public: GLSurfaceEGLSurfaceControl( GLDisplayEGL* display, - ANativeWindow* window, + gl::ScopedANativeWindow window, scoped_refptr<base::SingleThreadTaskRunner> task_runner); GLSurfaceEGLSurfaceControl( GLDisplayEGL* display,
diff --git a/ui/gl/init/create_gr_gl_interface.cc b/ui/gl/init/create_gr_gl_interface.cc index c7bb26b..17d85fe 100644 --- a/ui/gl/init/create_gr_gl_interface.cc +++ b/ui/gl/init/create_gr_gl_interface.cc
@@ -226,6 +226,7 @@ "GL_ARB_multi_draw_indirect", "GL_ARB_sample_shading", "GL_ARB_texture_barrier", + "GL_CHROMIUM_framebuffer_mixed_samples", "GL_EXT_direct_state_access", "GL_EXT_multi_draw_indirect", "GL_EXT_raster_multisample", @@ -541,8 +542,6 @@ RenderbufferStorageMultisampleEXT, NeedFlushOnMac); BIND(BlitFramebuffer, NeedFlushOnMac); - BIND_EXTENSION(CoverageModulation, CoverageModulationNV); - BIND_EXTENSION(InsertEventMarker, InsertEventMarkerEXT); BIND_EXTENSION(PushGroupMarker, PushGroupMarkerEXT); BIND_EXTENSION(PopGroupMarker, PopGroupMarkerEXT);
diff --git a/ui/gl/init/gl_factory_android.cc b/ui/gl/init/gl_factory_android.cc index e0b05f0..58ab5f5 100644 --- a/ui/gl/init/gl_factory_android.cc +++ b/ui/gl/init/gl_factory_android.cc
@@ -7,6 +7,7 @@ #include "base/check_op.h" #include "base/notreached.h" #include "base/trace_event/trace_event.h" +#include "ui/gl/android/scoped_a_native_window.h" #include "ui/gl/gl_bindings.h" #include "ui/gl/gl_context.h" #include "ui/gl/gl_context_egl.h" @@ -125,7 +126,8 @@ case kGLImplementationEGLANGLE: if (window != gfx::kNullAcceleratedWidget) { return InitializeGLSurface(new NativeViewGLSurfaceEGL( - display->GetAs<gl::GLDisplayEGL>(), window, nullptr)); + display->GetAs<gl::GLDisplayEGL>(), + ScopedANativeWindow::Wrap(window), nullptr)); } else { return InitializeGLSurface(new GLSurfaceStub()); }
diff --git a/ui/message_center/public/cpp/notification.h b/ui/message_center/public/cpp/notification.h index 0926c4e6..80719f0 100644 --- a/ui/message_center/public/cpp/notification.h +++ b/ui/message_center/public/cpp/notification.h
@@ -163,11 +163,11 @@ // depending on visual assistance systems. bool should_make_spoken_feedback_for_popup_updates = true; -#if BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS) // Flag if the notification is pinned. If true, the notification is pinned // and the user can't remove it. bool pinned = false; -#endif // BUILDFLAG(IS_CHROMEOS_ASH) +#endif // BUILDFLAG(IS_CHROMEOS) // Vibration pattern to play when displaying the notification. There must be // an odd number of entries in this pattern when it's set: numbers of @@ -442,15 +442,15 @@ } bool pinned() const { -#if BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS) return optional_fields_.pinned; #else return false; -#endif // BUILDFLAG(IS_CHROMEOS_ASH) +#endif // BUILDFLAG(IS_CHROMEOS) } -#if BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS) void set_pinned(bool pinned) { optional_fields_.pinned = pinned; } -#endif // BUILDFLAG(IS_CHROMEOS_ASH) +#endif // BUILDFLAG(IS_CHROMEOS) // Gets a text for spoken feedback. const std::u16string& accessible_name() const {
diff --git a/ui/ozone/platform/wayland/emulate/wayland_input_emulate.cc b/ui/ozone/platform/wayland/emulate/wayland_input_emulate.cc index 36cf80e7..a98a31ba 100644 --- a/ui/ozone/platform/wayland/emulate/wayland_input_emulate.cc +++ b/ui/ozone/platform/wayland/emulate/wayland_input_emulate.cc
@@ -359,7 +359,7 @@ struct weston_test* weston_test, wl_fixed_t x, wl_fixed_t y) { - WaylandInputEmulate* emulate = static_cast<WaylandInputEmulate*>(data); + auto* emulate = static_cast<WaylandInputEmulate*>(data); gfx::Point mouse_position_on_screen_px(wl_fixed_to_int(x), wl_fixed_to_int(y)); for (WaylandInputEmulate::Observer& observer : emulate->observers_) @@ -371,7 +371,7 @@ struct weston_test* weston_test, int32_t button, uint32_t state) { - WaylandInputEmulate* emulate = static_cast<WaylandInputEmulate*>(data); + auto* emulate = static_cast<WaylandInputEmulate*>(data); for (WaylandInputEmulate::Observer& observer : emulate->observers_) { observer.OnPointerButtonGlobal(button, state == WL_POINTER_BUTTON_STATE_PRESSED); @@ -383,7 +383,7 @@ struct weston_test* weston_test, uint32_t key, uint32_t state) { - WaylandInputEmulate* emulate = static_cast<WaylandInputEmulate*>(data); + auto* emulate = static_cast<WaylandInputEmulate*>(data); for (WaylandInputEmulate::Observer& observer : emulate->observers_) observer.OnKeyboardKey(key, state == WL_KEYBOARD_KEY_STATE_PRESSED); } @@ -393,7 +393,7 @@ struct weston_test* weston_test, wl_fixed_t x, wl_fixed_t y) { - WaylandInputEmulate* emulate = static_cast<WaylandInputEmulate*>(data); + auto* emulate = static_cast<WaylandInputEmulate*>(data); auto touch_position_on_screen_px = gfx::Point(wl_fixed_to_int(x), wl_fixed_to_int(y)); for (WaylandInputEmulate::Observer& observer : emulate->observers_) @@ -408,7 +408,7 @@ uint32_t version) { auto* emulate = static_cast<WaylandInputEmulate*>(data); if (strcmp(interface, "weston_test") == 0) { - const struct wl_interface* wayland_interface = + const auto* wayland_interface = static_cast<const struct wl_interface*>(&weston_test_interface); emulate->weston_test_ = static_cast<struct weston_test*>( wl_registry_bind(registry, name, wayland_interface, version)); @@ -419,7 +419,7 @@ void WaylandInputEmulate::FrameCallbackHandler(void* data, struct wl_callback* callback, uint32_t time) { - WaylandInputEmulate* emulate = static_cast<WaylandInputEmulate*>(data); + auto* emulate = static_cast<WaylandInputEmulate*>(data); CHECK(emulate) << "WaylandInputEmulate was destroyed before a frame callback arrived";
diff --git a/ui/ozone/platform/wayland/host/shell_toplevel_wrapper.h b/ui/ozone/platform/wayland/host/shell_toplevel_wrapper.h index 18adac8..ebd64bd 100644 --- a/ui/ozone/platform/wayland/host/shell_toplevel_wrapper.h +++ b/ui/ozone/platform/wayland/host/shell_toplevel_wrapper.h
@@ -155,6 +155,12 @@ // Sets the scale factor for the next commit. Scale factor persists until a // new one is set. virtual void SetScaleFactor(float scale_factor) = 0; + + // Snaps the window in the direction of `snap_direction`. `snap_ratio` + // indicates the width of the work area to snap to in landscape mode, or + // height in portrait mode. + virtual void CommitSnap(WaylandWindowSnapDirection snap_direction, + float snap_ratio) = 0; }; // Look for |value| in |wl_array| in C++ style.
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc b/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc index 4802f7d..8e30730 100644 --- a/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc +++ b/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc
@@ -56,7 +56,7 @@ // static void WaylandBufferHandle::BufferRelease(void* data, struct wl_buffer* wl_buffer) { - WaylandBufferHandle* self = static_cast<WaylandBufferHandle*>(data); + auto* self = static_cast<WaylandBufferHandle*>(data); DCHECK(self); self->OnWlBufferRelease(wl_buffer); }
diff --git a/ui/ozone/platform/wayland/host/wayland_connection.cc b/ui/ozone/platform/wayland/host/wayland_connection.cc index ccf1ba8..ecd62ff 100644 --- a/ui/ozone/platform/wayland/host/wayland_connection.cc +++ b/ui/ozone/platform/wayland/host/wayland_connection.cc
@@ -597,7 +597,7 @@ void WaylandConnection::GlobalRemove(void* data, wl_registry* registry, uint32_t name) { - WaylandConnection* connection = static_cast<WaylandConnection*>(data); + auto* connection = static_cast<WaylandConnection*>(data); // The Wayland protocol distinguishes global objects by unique numeric names, // which the WaylandOutputManager uses as unique output ids. But, it is only // possible to figure out, what global object is going to be removed on the @@ -610,7 +610,7 @@ // static void WaylandConnection::Ping(void* data, xdg_wm_base* shell, uint32_t serial) { - WaylandConnection* connection = static_cast<WaylandConnection*>(data); + auto* connection = static_cast<WaylandConnection*>(data); xdg_wm_base_pong(shell, serial); connection->Flush(); } @@ -621,7 +621,7 @@ uint32_t clk_id) { DCHECK_EQ(base::TimeTicks::GetClock(), base::TimeTicks::Clock::LINUX_CLOCK_MONOTONIC); - WaylandConnection* connection = static_cast<WaylandConnection*>(data); + auto* connection = static_cast<WaylandConnection*>(data); connection->presentation_clk_id_ = clk_id; }
diff --git a/ui/ozone/platform/wayland/host/wayland_frame_manager.cc b/ui/ozone/platform/wayland/host/wayland_frame_manager.cc index 1b8cbe4..b458559b 100644 --- a/ui/ozone/platform/wayland/host/wayland_frame_manager.cc +++ b/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
@@ -430,7 +430,7 @@ void WaylandFrameManager::FrameCallbackDone(void* data, struct wl_callback* callback, uint32_t time) { - WaylandFrameManager* self = static_cast<WaylandFrameManager*>(data); + auto* self = static_cast<WaylandFrameManager*>(data); DCHECK(self); self->OnFrameCallback(callback); } @@ -458,7 +458,7 @@ uint32_t seq_hi, uint32_t seq_lo, uint32_t flags) { - WaylandFrameManager* self = static_cast<WaylandFrameManager*>(data); + auto* self = static_cast<WaylandFrameManager*>(data); DCHECK(self); self->OnPresentation( wp_presentation_feedback, @@ -472,7 +472,7 @@ void WaylandFrameManager::FeedbackDiscarded( void* data, struct wp_presentation_feedback* wp_presentation_feedback) { - WaylandFrameManager* self = static_cast<WaylandFrameManager*>(data); + auto* self = static_cast<WaylandFrameManager*>(data); DCHECK(self); self->OnPresentation(wp_presentation_feedback, gfx::PresentationFeedback::Failure(),
diff --git a/ui/ozone/platform/wayland/host/wayland_keyboard.cc b/ui/ozone/platform/wayland/host/wayland_keyboard.cc index 7d98bb5..3cbe29d3 100644 --- a/ui/ozone/platform/wayland/host/wayland_keyboard.cc +++ b/ui/ozone/platform/wayland/host/wayland_keyboard.cc
@@ -139,7 +139,7 @@ uint32_t format, int32_t fd, uint32_t size) { - WaylandKeyboard* keyboard = static_cast<WaylandKeyboard*>(data); + auto* keyboard = static_cast<WaylandKeyboard*>(data); DCHECK(keyboard); if (!data || format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) @@ -193,7 +193,7 @@ uint32_t time, uint32_t key, uint32_t state) { - WaylandKeyboard* keyboard = static_cast<WaylandKeyboard*>(data); + auto* keyboard = static_cast<WaylandKeyboard*>(data); DCHECK(keyboard); keyboard->OnKey(serial, time, key, state, KeyEventKind::kKey); } @@ -206,7 +206,7 @@ uint32_t locked, uint32_t group) { #if BUILDFLAG(USE_XKBCOMMON) - WaylandKeyboard* keyboard = static_cast<WaylandKeyboard*>(data); + auto* keyboard = static_cast<WaylandKeyboard*>(data); DCHECK(keyboard); int modifiers = keyboard->layout_engine_->UpdateModifiers(depressed, latched, @@ -329,7 +329,7 @@ void WaylandKeyboard::SyncCallback(void* data, struct wl_callback* cb, uint32_t time) { - WaylandKeyboard* keyboard = static_cast<WaylandKeyboard*>(data); + auto* keyboard = static_cast<WaylandKeyboard*>(data); DCHECK(keyboard); DCHECK(keyboard->auto_repeat_closure_); std::move(keyboard->auto_repeat_closure_).Run();
diff --git a/ui/ozone/platform/wayland/host/wayland_output.cc b/ui/ozone/platform/wayland/host/wayland_output.cc index e00a40ab..8654657 100644 --- a/ui/ozone/platform/wayland/host/wayland_output.cc +++ b/ui/ozone/platform/wayland/host/wayland_output.cc
@@ -214,7 +214,7 @@ // static void WaylandOutput::OutputHandleGeometry(void* data, - wl_output* output, + wl_output* obj, int32_t x, int32_t y, int32_t physical_width, @@ -223,8 +223,7 @@ const char* make, const char* model, int32_t output_transform) { - WaylandOutput* wayland_output = static_cast<WaylandOutput*>(data); - if (wayland_output) { + if (auto* output = static_cast<WaylandOutput*>(data)) { // It looks like there is a bug in libffi - only the 8th arg is affected. // Possibly it is not following the calling convention of the ABI? Eg. the // lib has some off-by-1-error where it's supposed to pass 8 args in regs @@ -232,8 +231,8 @@ // out of our control. Given the output_transform is always correct, // unpoison the value to make MSAN happy. MSAN_UNPOISON(&output_transform, sizeof(int32_t)); - wayland_output->origin_ = gfx::Point(x, y); - wayland_output->panel_transform_ = output_transform; + output->origin_ = gfx::Point(x, y); + output->panel_transform_ = output_transform; } } @@ -244,9 +243,9 @@ int32_t width, int32_t height, int32_t refresh) { - WaylandOutput* wayland_output = static_cast<WaylandOutput*>(data); - if (wayland_output && (flags & WL_OUTPUT_MODE_CURRENT)) - wayland_output->physical_size_ = gfx::Size(width, height); + auto* output = static_cast<WaylandOutput*>(data); + if (output && (flags & WL_OUTPUT_MODE_CURRENT)) + output->physical_size_ = gfx::Size(width, height); } // static @@ -259,25 +258,24 @@ void WaylandOutput::OutputHandleScale(void* data, struct wl_output* wl_output, int32_t factor) { - WaylandOutput* wayland_output = static_cast<WaylandOutput*>(data); - if (wayland_output) - wayland_output->scale_factor_ = factor; + if (auto* output = static_cast<WaylandOutput*>(data)) + output->scale_factor_ = factor; } // static void WaylandOutput::OutputHandleName(void* data, struct wl_output* wl_output, const char* name) { - if (WaylandOutput* wayland_output = static_cast<WaylandOutput*>(data)) - wayland_output->name_ = name ? std::string(name) : std::string{}; + if (auto* output = static_cast<WaylandOutput*>(data)) + output->name_ = name ? std::string(name) : std::string{}; } // static void WaylandOutput::OutputHandleDescription(void* data, struct wl_output* wl_output, const char* description) { - if (WaylandOutput* wayland_output = static_cast<WaylandOutput*>(data)) { - wayland_output->description_ = + if (auto* output = static_cast<WaylandOutput*>(data)) { + output->description_ = description ? std::string(description) : std::string{}; } }
diff --git a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc index de9fd1e..93b7c67 100644 --- a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
@@ -172,8 +172,8 @@ WaylandWindow::Hide(); // Request the compositor to cease any possible ongoing snapping - // preview/commit. - CommitSnap(WaylandWindowSnapDirection::kNone); + // preview/commit. Use any value for `snap_ratio` since it will not be used. + CommitSnap(WaylandWindowSnapDirection::kNone, /*snap_ratio=*/1.f); if (IsSupportedOnAuraSurface(ZAURA_SURFACE_RELEASE_SINCE_VERSION)) SetAuraSurface(nullptr); @@ -639,13 +639,13 @@ uint32_t occlusion_reason) {} void WaylandToplevelWindow::LockFrame(void* data, zaura_surface* surface) { - WaylandToplevelWindow* self = static_cast<WaylandToplevelWindow*>(data); + auto* self = static_cast<WaylandToplevelWindow*>(data); DCHECK(self); self->OnFrameLockingChanged(true); } void WaylandToplevelWindow::UnlockFrame(void* data, zaura_surface* surface) { - WaylandToplevelWindow* self = static_cast<WaylandToplevelWindow*>(data); + auto* self = static_cast<WaylandToplevelWindow*>(data); DCHECK(self); self->OnFrameLockingChanged(false); } @@ -653,7 +653,7 @@ void WaylandToplevelWindow::OcclusionStateChanged(void* data, zaura_surface* surface, uint32_t mode) { - WaylandToplevelWindow* self = static_cast<WaylandToplevelWindow*>(data); + auto* self = static_cast<WaylandToplevelWindow*>(data); DCHECK(self); auto state = PlatformWindowOcclusionState::kUnknown; switch (mode) { @@ -676,18 +676,18 @@ void WaylandToplevelWindow::DeskChanged(void* data, zaura_surface* surface, int state) { - WaylandToplevelWindow* self = static_cast<WaylandToplevelWindow*>(data); + auto* self = static_cast<WaylandToplevelWindow*>(data); DCHECK(self); self->OnDeskChanged(state); } void WaylandToplevelWindow::StartThrottle(void* data, zaura_surface* surface) { - WaylandToplevelWindow* self = static_cast<WaylandToplevelWindow*>(data); + auto* self = static_cast<WaylandToplevelWindow*>(data); self->delegate()->SetFrameRateThrottleEnabled(true); } void WaylandToplevelWindow::EndThrottle(void* data, zaura_surface* surface) { - WaylandToplevelWindow* self = static_cast<WaylandToplevelWindow*>(data); + auto* self = static_cast<WaylandToplevelWindow*>(data); self->delegate()->SetFrameRateThrottleEnabled(false); } @@ -758,7 +758,21 @@ } void WaylandToplevelWindow::CommitSnap( - WaylandWindowSnapDirection snap_direction) { + WaylandWindowSnapDirection snap_direction, + float snap_ratio) { + if (IsSupportedOnAuraSurface(ZAURA_TOPLEVEL_SET_SNAP_PRIMARY_SINCE_VERSION)) { + switch (snap_direction) { + case WaylandWindowSnapDirection::kNone: + // TODO(sophiewen): Move unset_snap to aura toplevel. + zaura_surface_unset_snap(aura_surface()); + return; + case WaylandWindowSnapDirection::kPrimary: + case WaylandWindowSnapDirection::kSecondary: + shell_toplevel_->CommitSnap(snap_direction, snap_ratio); + return; + } + } + if (IsSupportedOnAuraSurface(ZAURA_SURFACE_UNSET_SNAP_SINCE_VERSION)) { switch (snap_direction) { case WaylandWindowSnapDirection::kPrimary:
diff --git a/ui/ozone/platform/wayland/host/wayland_toplevel_window.h b/ui/ozone/platform/wayland/host/wayland_toplevel_window.h index f3e317e..4500363 100644 --- a/ui/ozone/platform/wayland/host/wayland_toplevel_window.h +++ b/ui/ozone/platform/wayland/host/wayland_toplevel_window.h
@@ -135,7 +135,7 @@ #endif void ShowSnapPreview(WaylandWindowSnapDirection snap, bool allow_haptic_feedback) override; - void CommitSnap(WaylandWindowSnapDirection snap) override; + void CommitSnap(WaylandWindowSnapDirection snap, float snap_ratio) override; void SetCanGoBack(bool value) override; void SetPip() override; bool SupportsPointerLock() override;
diff --git a/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc b/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc index c118e306..9fe6376 100644 --- a/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc +++ b/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc
@@ -20,7 +20,7 @@ namespace { constexpr uint32_t kMinVersion = 1; -constexpr uint32_t kMaxVersion = 46; +constexpr uint32_t kMaxVersion = 48; } // static
diff --git a/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc b/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc index 3db8cb5..db9fbcf5 100644 --- a/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc +++ b/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc
@@ -160,8 +160,7 @@ uint32_t format, uint32_t modifier_hi, uint32_t modifier_lo) { - WaylandZwpLinuxDmabuf* self = static_cast<WaylandZwpLinuxDmabuf*>(data); - if (self) { + if (auto* self = static_cast<WaylandZwpLinuxDmabuf*>(data)) { uint64_t modifier = static_cast<uint64_t>(modifier_hi) << 32 | modifier_lo; self->AddSupportedFourCCFormatAndModifier(format, {modifier}); } @@ -171,8 +170,7 @@ void WaylandZwpLinuxDmabuf::Format(void* data, struct zwp_linux_dmabuf_v1* zwp_linux_dmabuf, uint32_t format) { - WaylandZwpLinuxDmabuf* self = static_cast<WaylandZwpLinuxDmabuf*>(data); - if (self) + if (auto* self = static_cast<WaylandZwpLinuxDmabuf*>(data)) self->AddSupportedFourCCFormatAndModifier(format, absl::nullopt); } @@ -181,8 +179,7 @@ void* data, struct zwp_linux_buffer_params_v1* params, struct wl_buffer* new_buffer) { - WaylandZwpLinuxDmabuf* self = static_cast<WaylandZwpLinuxDmabuf*>(data); - if (self) + if (auto* self = static_cast<WaylandZwpLinuxDmabuf*>(data)) self->NotifyRequestCreateBufferDone(params, new_buffer); } @@ -190,8 +187,7 @@ void WaylandZwpLinuxDmabuf::CreateFailed( void* data, struct zwp_linux_buffer_params_v1* params) { - WaylandZwpLinuxDmabuf* self = static_cast<WaylandZwpLinuxDmabuf*>(data); - if (self) + if (auto* self = static_cast<WaylandZwpLinuxDmabuf*>(data)) self->NotifyRequestCreateBufferDone(params, nullptr); }
diff --git a/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc b/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc index aed3f976..0705ffb 100644 --- a/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc +++ b/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc
@@ -8,6 +8,7 @@ #include <xdg-decoration-unstable-v1-client-protocol.h> #include "base/logging.h" +#include "base/notreached.h" #include "base/strings/utf_string_conversions.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/base/hit_test.h" @@ -565,4 +566,24 @@ } } +void XDGToplevelWrapperImpl::CommitSnap( + WaylandWindowSnapDirection snap_direction, + float snap_ratio) { + if (aura_toplevel_ && zaura_toplevel_get_version(aura_toplevel_.get()) >= + ZAURA_TOPLEVEL_SET_SNAP_PRIMARY_SINCE_VERSION) { + uint32_t value = *reinterpret_cast<uint32_t*>(&snap_ratio); + switch (snap_direction) { + case WaylandWindowSnapDirection::kPrimary: + zaura_toplevel_set_snap_primary(aura_toplevel_.get(), value); + return; + case WaylandWindowSnapDirection::kSecondary: + zaura_toplevel_set_snap_secondary(aura_toplevel_.get(), value); + return; + case WaylandWindowSnapDirection::kNone: + NOTREACHED() << "Toplevel does not support UnsetSnap yet"; + return; + } + } +} + } // namespace ui
diff --git a/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.h b/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.h index df09c188..d4a7c6f 100644 --- a/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.h +++ b/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.h
@@ -63,6 +63,8 @@ void Activate() override; void Deactivate() override; void SetScaleFactor(float scale_factor) override; + void CommitSnap(WaylandWindowSnapDirection snap_direction, + float snap_ratio) override; XDGSurfaceWrapperImpl* xdg_surface_wrapper() const;
diff --git a/ui/platform_window/extensions/wayland_extension.h b/ui/platform_window/extensions/wayland_extension.h index b9147b9..a9a5fc6 100644 --- a/ui/platform_window/extensions/wayland_extension.h +++ b/ui/platform_window/extensions/wayland_extension.h
@@ -55,8 +55,10 @@ // Requests the underneath platform to snap the window in the given direction, // if not WaylandWindowSnapDirection::kNone, otherwise cancels the window - // snapping. - virtual void CommitSnap(WaylandWindowSnapDirection snap) = 0; + // snapping. `snap_ratio` indicates the width of the work area to snap to in + // landscape mode, or height in portrait mode. + virtual void CommitSnap(WaylandWindowSnapDirection snap, + float snap_ratio) = 0; // Signals the underneath platform whether the current tab of the browser // window can go back. The underneath platform might react, for example,
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn index e4200f6..c9ca6c4 100644 --- a/ui/views/BUILD.gn +++ b/ui/views/BUILD.gn
@@ -1357,6 +1357,7 @@ "view_unittest_mac.mm", "widget/ax_native_widget_mac_unittest.mm", "widget/native_widget_mac_unittest.mm", + "widget/sublevel_manager_mac_unittest.mm", ] # views_unittests not yet compiling on Mac. http://crbug.com/378134
diff --git a/ui/views/controls/button/label_button.cc b/ui/views/controls/button/label_button.cc index 7c4b47ed..5f48fe8 100644 --- a/ui/views/controls/button/label_button.cc +++ b/ui/views/controls/button/label_button.cc
@@ -15,6 +15,7 @@ #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node_data.h" #include "ui/base/metadata/metadata_impl_macros.h" +#include "ui/base/ui_base_features.h" #include "ui/color/color_id.h" #include "ui/color/color_provider.h" #include "ui/compositor/layer.h" @@ -27,6 +28,7 @@ #include "ui/views/animation/ink_drop.h" #include "ui/views/background.h" #include "ui/views/controls/button/label_button_border.h" +#include "ui/views/controls/highlight_path_generator.h" #include "ui/views/painter.h" #include "ui/views/style/platform_style.h" #include "ui/views/view_class_properties.h" @@ -118,6 +120,21 @@ explicitly_set_colors_[for_state] = true; } +float LabelButton::GetFocusRingCornerRadius() const { + return focus_ring_corner_radius_; +} + +void LabelButton::SetFocusRingCornerRadius(float radius) { + if (focus_ring_corner_radius_ == radius) + return; + focus_ring_corner_radius_ = radius; + InkDrop::Get(this)->SetSmallCornerRadius(focus_ring_corner_radius_); + InkDrop::Get(this)->SetLargeCornerRadius(focus_ring_corner_radius_); + views::InstallRoundRectHighlightPathGenerator(this, gfx::Insets(), + focus_ring_corner_radius_); + OnPropertyChanged(&focus_ring_corner_radius_, kPropertyEffectsPaint); +} + void LabelButton::SetEnabledTextColors(absl::optional<SkColor> color) { ButtonState states[] = {STATE_NORMAL, STATE_HOVERED, STATE_PRESSED}; if (color.has_value()) { @@ -243,6 +260,11 @@ void LabelButton::OnBoundsChanged(const gfx::Rect& previous_bounds) { ClearTextIfShrunkDown(); Button::OnBoundsChanged(previous_bounds); + + if (features::IsChromeRefresh2023()) { + SetFocusRingCornerRadius(LayoutProvider::Get()->GetCornerRadiusMetric( + Emphasis::kMaximum, size())); + } } gfx::Size LabelButton::CalculatePreferredSize() const { @@ -638,6 +660,7 @@ ADD_PROPERTY_METADATA(bool, IsDefault) ADD_PROPERTY_METADATA(int, ImageLabelSpacing) ADD_PROPERTY_METADATA(bool, ImageCentered) +ADD_PROPERTY_METADATA(float, FocusRingCornerRadius) END_METADATA } // namespace views
diff --git a/ui/views/controls/button/label_button.h b/ui/views/controls/button/label_button.h index ef134f3..7ee1bc5 100644 --- a/ui/views/controls/button/label_button.h +++ b/ui/views/controls/button/label_button.h
@@ -111,6 +111,10 @@ bool GetImageCentered() const; void SetImageCentered(bool image_centered); + // Sets the corner radius of the focus ring around the button. + float GetFocusRingCornerRadius() const; + void SetFocusRingCornerRadius(float radius); + // Creates the default border for this button. This can be overridden by // subclasses. virtual std::unique_ptr<LabelButtonBorder> CreateDefaultBorder() const; @@ -267,6 +271,9 @@ // UI direction). gfx::HorizontalAlignment horizontal_alignment_ = gfx::ALIGN_LEFT; + // Corner radius of the focus ring. + float focus_ring_corner_radius_ = FocusableBorder::kCornerRadiusDp; + base::CallbackListSubscription paint_as_active_subscription_; base::CallbackListSubscription flip_canvas_on_paint_subscription_ =
diff --git a/ui/views/controls/button/md_text_button.cc b/ui/views/controls/button/md_text_button.cc index 21ab6b7..3cc7267 100644 --- a/ui/views/controls/button/md_text_button.cc +++ b/ui/views/controls/button/md_text_button.cc
@@ -106,13 +106,10 @@ if (corner_radius_ == radius) return; corner_radius_ = radius; - InkDrop::Get(this)->SetSmallCornerRadius(corner_radius_); - InkDrop::Get(this)->SetLargeCornerRadius(corner_radius_); - views::InstallRoundRectHighlightPathGenerator(this, gfx::Insets(), - corner_radius_); + LabelButton::SetFocusRingCornerRadius(corner_radius_); // UpdateColors also updates the background border radius. UpdateColors(); - OnPropertyChanged(&corner_radius_, kPropertyEffectsPaint); + OnPropertyChanged(&corner_radius_, kPropertyEffectsNone); } float MdTextButton::GetCornerRadius() const {
diff --git a/ui/views/widget/sublevel_manager.cc b/ui/views/widget/sublevel_manager.cc index 5f3dfc3..2e6ee09 100644 --- a/ui/views/widget/sublevel_manager.cc +++ b/ui/views/widget/sublevel_manager.cc
@@ -45,7 +45,7 @@ // where showing an activatable widget brings its ancestors to the front. Widget* parent = owner_->parent(); Widget* child = owner_; - while (parent) { + while (parent && parent->GetSublevelManager()->IsTrackingChildWidget(child)) { parent->GetSublevelManager()->OrderChildWidget(child); child = parent; parent = parent->parent(); @@ -96,6 +96,10 @@ owner->parent()->GetSublevelManager()->UntrackChildWidget(owner); } +bool SublevelManager::IsTrackingChildWidget(Widget* child) { + return base::ranges::find(children_, child) != children_.end(); +} + SublevelManager::ChildIterator SublevelManager::FindInsertPosition( Widget* child) const { ui::ZOrderLevel child_level = child->GetZOrderLevel();
diff --git a/ui/views/widget/sublevel_manager.h b/ui/views/widget/sublevel_manager.h index 019ba4aa..5503c80 100644 --- a/ui/views/widget/sublevel_manager.h +++ b/ui/views/widget/sublevel_manager.h
@@ -9,6 +9,7 @@ #include "base/memory/raw_ptr.h" #include "base/scoped_observation.h" +#include "ui/views/views_export.h" #include "ui/views/widget/widget.h" #include "ui/views/widget/widget_observer.h" @@ -17,7 +18,7 @@ // The SublevelManager ensures a widget is shown at the correct sublevel. // It tracks the sublevel of the owner widget and the stacking state of // the owner's children widgets. -class SublevelManager : public WidgetObserver { +class VIEWS_EXPORT SublevelManager : public WidgetObserver { public: SublevelManager(Widget* owner, int sublevel); @@ -27,6 +28,9 @@ void TrackChildWidget(Widget* child); // Untracks a child widget. + // This is intended for internal use and to work around platform-specific + // compatibility issues. + // You should not use this. void UntrackChildWidget(Widget* child); // Sets the sublevel of `owner_` and triggers `EnsureOwnerSublevel()`. @@ -47,6 +51,9 @@ // to ensure that its sublevel is respected. void OrderChildWidget(Widget* child); + // Check if a child widget is being tracked. + bool IsTrackingChildWidget(Widget* child); + // Returns the position in `children_` before which `child` should be inserted // to maintain the sublevel ordering. This methods assumes that `child` is not // in `children_`.
diff --git a/ui/views/widget/sublevel_manager_mac_unittest.mm b/ui/views/widget/sublevel_manager_mac_unittest.mm new file mode 100644 index 0000000..2e34c2f --- /dev/null +++ b/ui/views/widget/sublevel_manager_mac_unittest.mm
@@ -0,0 +1,134 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/views/widget/sublevel_manager.h" + +#include <AppKit/AppKit.h> + +#include <algorithm> +#include <memory> +#include <string> +#include <tuple> +#include <utility> + +#include "base/mac/mac_util.h" +#include "base/test/scoped_feature_list.h" +#include "build/buildflag.h" +#include "ui/views/test/views_test_base.h" +#include "ui/views/test/widget_test.h" +#include "ui/views/views_features.h" + +namespace views { + +enum WidgetShowType { kShowActive, kShowInactive }; + +class SublevelManagerMacTest + : public ViewsTestBase, + public testing::WithParamInterface< + std::tuple<WidgetShowType, Widget::InitParams::Activatable>> { + public: + SublevelManagerMacTest() { + scoped_feature_list_.InitAndEnableFeature(features::kWidgetLayering); + } + + std::unique_ptr<Widget> CreateChildWidget( + Widget* parent, + ui::ZOrderLevel level, + int sublevel, + Widget::InitParams::Activatable activatable) { + Widget::InitParams params = CreateParamsForTestWidget(); + params.z_order = level; + params.sublevel = sublevel; + params.activatable = activatable; + params.parent = parent->GetNativeView(); + return CreateTestWidget(std::move(params)); + } + + // Call Show() or ShowInactive() depending on WidgetShowType. + void ShowWidget(const std::unique_ptr<Widget>& widget) { + WidgetShowType show_type = std::get<WidgetShowType>(GetParam()); + if (show_type == WidgetShowType::kShowActive) + widget->Show(); + else + widget->ShowInactive(); + test::WidgetVisibleWaiter(widget.get()).Wait(); + } + + static std::string PrintTestName( + const ::testing::TestParamInfo<SublevelManagerMacTest::ParamType>& info) { + std::string test_name; + switch (std::get<WidgetShowType>(info.param)) { + case WidgetShowType::kShowActive: + test_name += "ShowActive"; + break; + case WidgetShowType::kShowInactive: + test_name += "ShowInactive"; + break; + } + test_name += "_"; + switch (std::get<Widget::InitParams::Activatable>(info.param)) { + case Widget::InitParams::Activatable::kNo: + test_name += "NotActivatable"; + break; + case Widget::InitParams::Activatable::kYes: + test_name += "Activatable"; + break; + default: + NOTREACHED(); + } + return test_name; + } + + protected: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +// Disabled widgets are ignored when its siblings are re-ordered. +TEST_P(SublevelManagerMacTest, ExplicitUntrack) { + std::unique_ptr<Widget> root = CreateTestWidget(); + std::unique_ptr<Widget> root2 = CreateTestWidget(); + std::unique_ptr<Widget> children[3]; + + ShowWidget(root); + ShowWidget(root2); + for (int i = 0; i < 3; i++) { + children[i] = CreateChildWidget( + root.get(), ui::ZOrderLevel::kNormal, i, + std::get<Widget::InitParams::Activatable>(GetParam())); + ShowWidget(children[i]); + + // Disable the second widget. + if (i == 1) { + children[i]->parent()->GetSublevelManager()->UntrackChildWidget( + children[i].get()); + } + } + + NSWindow* root_nswindow = root->GetNativeWindow().GetNativeNSWindow(); + NSWindow* root2_nswindow = root2->GetNativeWindow().GetNativeNSWindow(); + NSWindow* child2_nswindow = + children[1]->GetNativeWindow().GetNativeNSWindow(); + + // Reparent `child2` to root2 at the NSWindow level but not at the Widget + // level. + [root_nswindow removeChildWindow:child2_nswindow]; + [root2_nswindow addChildWindow:child2_nswindow ordered:NSWindowAbove]; + + children[1]->GetSublevelManager()->EnsureOwnerSublevel(); + + // The parent of child2 does not change. + EXPECT_EQ([child2_nswindow parentWindow], root2_nswindow); +} + +INSTANTIATE_TEST_SUITE_P( + , + SublevelManagerMacTest, + ::testing::Combine( + ::testing::Values(WidgetShowType::kShowActive, + WidgetShowType::kShowInactive), + ::testing::Values(Widget::InitParams::Activatable::kNo, + Widget::InitParams::Activatable::kYes)), + SublevelManagerMacTest::PrintTestName); + +} // namespace views
diff --git a/ui/views/widget/sublevel_manager_unittest.cc b/ui/views/widget/sublevel_manager_unittest.cc index 23e5c89e..41e1c5d 100644 --- a/ui/views/widget/sublevel_manager_unittest.cc +++ b/ui/views/widget/sublevel_manager_unittest.cc
@@ -91,7 +91,7 @@ test_name += "_"; switch (std::get<Widget::InitParams::Activatable>(info.param)) { case Widget::InitParams::Activatable::kNo: - test_name += "Inactivatable"; + test_name += "NotActivatable"; break; case Widget::InitParams::Activatable::kYes: test_name += "Activatable";