diff --git a/.eslintrc.js b/.eslintrc.js index 711aca8..3b5554f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js
@@ -24,13 +24,6 @@ 'no-restricted-properties': [ 'error', { - 'object': 'document', - 'property': 'getElementById', - 'message': 'Use $(\'id\') or getSVGElement(\'id\') ' + - 'from chrome://resources/js/util.js instead of ' + - 'document.getElementById(\'id\')', - }, - { 'property': '__lookupGetter__', 'message': 'Use Object.getOwnPropertyDescriptor', },
diff --git a/.gitignore b/.gitignore index cc0150c..b58c0d6 100644 --- a/.gitignore +++ b/.gitignore
@@ -53,6 +53,11 @@ *.class compile_commands.json cscope.* +child_pool-0.profraw +child_pool-1.profraw +child_pool-2.profraw +child_pool-3.profraw +default.profraw GPATH GRTAGS GSYMS
diff --git a/.gn b/.gn index d9be91c..7d538f8 100644 --- a/.gn +++ b/.gn
@@ -33,8 +33,6 @@ # also needs to be defined to src/ios/BUILD.gn (respectively removed from both # location when it is removed). - v8_extra_library_files = [] - v8_experimental_extra_library_files = [] v8_enable_gdbjit = false v8_imminent_deprecation_warnings = false
diff --git a/DEPS b/DEPS index 82aebdb..ff8de46 100644 --- a/DEPS +++ b/DEPS
@@ -269,15 +269,15 @@ # 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': '1fb7b3d7012eced7ee859d5bbe3964f8ca7870be', + 'skia_revision': 'f7daa168cb3fcacaeba3d12d3f5f2176d4a114e7', # 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': '8dbcd272b9220a710db891d64274ed30d50bebab', + 'v8_revision': '0cad92eaf1d6f95f42e6d4a92fddc44473c9656b', # 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': 'd734686731fcc325e664866b46648bd3c8271eda', + 'angle_revision': '2fae9482c87e1782bccd9e1712ee6dda796b66c0', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -296,7 +296,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:8.20220504.2.1', + 'fuchsia_version': 'version:8.20220505.2.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. @@ -340,7 +340,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': '81c0ef0a068c73d64462bd0f926daff1fb865bfa', + 'catapult_revision': '7979ffe0227feed94a5825d73851811d3501963f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -348,7 +348,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '07dca225ab48fadbaf3e7a0dce46c4c49e2c554b', + 'devtools_frontend_revision': 'e805dda363f2f56d0ef37ad23148bc465e8cb8e0', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -384,7 +384,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': 'f20a867d2f6fd5d52835379c2acd74c9bfa02a20', + 'dawn_revision': '7cbd8202e6715ee5d51314bd1e745a5243da82c1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -914,7 +914,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'nWvCs11JIQtG7q6R1Vb1ySaYovfUvDCJnkXNXEsu9-0C', + 'version': 'zp3RnPK3_VmfYGulKhpKF2BDqASl8O2ytuTOj5AaRWIC', }, ], 'condition': 'checkout_android', @@ -1527,7 +1527,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '2308bab3aebd39f00010c846cdcab351046158cc', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '4df14f2d7ef32e7a35d428b5abfc728609b1579d', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1757,7 +1757,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'a912567d309f6bde49e7e0c3b0671a2e138ab96c', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '8615bf0582c736fd8e5168ace669ae1f88299483', + Var('webrtc_git') + '/src.git' + '@' + '6d0d844d1f2ef4c6d1b64c72faa1c4c12ce067e9', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1830,7 +1830,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@5ba5fcb1e6366ac64856691f29b20c8dd4c9bf58', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@4f4aa573a520cbd4ae5ecae5bd7afa660427c8b9', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/browser/gfx/aw_gl_surface.cc b/android_webview/browser/gfx/aw_gl_surface.cc index e7f8ce8..f42c3b0 100644 --- a/android_webview/browser/gfx/aw_gl_surface.cc +++ b/android_webview/browser/gfx/aw_gl_surface.cc
@@ -13,10 +13,14 @@ namespace android_webview { -AwGLSurface::AwGLSurface(bool is_angle) : is_angle_(is_angle) {} +AwGLSurface::AwGLSurface(gl::GLDisplayEGL* display, bool is_angle) + : gl::GLSurfaceEGL(display), is_angle_(is_angle) {} -AwGLSurface::AwGLSurface(scoped_refptr<gl::GLSurface> surface) - : is_angle_(false), wrapped_surface_(std::move(surface)) {} +AwGLSurface::AwGLSurface(gl::GLDisplayEGL* display, + scoped_refptr<gl::GLSurface> surface) + : gl::GLSurfaceEGL(display), + is_angle_(false), + wrapped_surface_(std::move(surface)) {} AwGLSurface::~AwGLSurface() { Destroy();
diff --git a/android_webview/browser/gfx/aw_gl_surface.h b/android_webview/browser/gfx/aw_gl_surface.h index 7bac1a9..48b9e091 100644 --- a/android_webview/browser/gfx/aw_gl_surface.h +++ b/android_webview/browser/gfx/aw_gl_surface.h
@@ -17,8 +17,8 @@ // GLSurface. class AwGLSurface : public gl::GLSurfaceEGL { public: - explicit AwGLSurface(bool is_angle); - explicit AwGLSurface(scoped_refptr<gl::GLSurface> surface); + AwGLSurface(gl::GLDisplayEGL* display, bool is_angle); + AwGLSurface(gl::GLDisplayEGL* display, scoped_refptr<gl::GLSurface> surface); AwGLSurface(const AwGLSurface&) = delete; AwGLSurface& operator=(const AwGLSurface&) = delete;
diff --git a/android_webview/browser/gfx/aw_gl_surface_external_stencil.cc b/android_webview/browser/gfx/aw_gl_surface_external_stencil.cc index 47e4abc..cda9512 100644 --- a/android_webview/browser/gfx/aw_gl_surface_external_stencil.cc +++ b/android_webview/browser/gfx/aw_gl_surface_external_stencil.cc
@@ -155,8 +155,10 @@ gfx::Size size_; }; -AwGLSurfaceExternalStencil::AwGLSurfaceExternalStencil(bool is_angle) - : AwGLSurface(is_angle) {} +AwGLSurfaceExternalStencil::AwGLSurfaceExternalStencil( + gl::GLDisplayEGL* display, + bool is_angle) + : AwGLSurface(display, is_angle) {} AwGLSurfaceExternalStencil::~AwGLSurfaceExternalStencil() = default;
diff --git a/android_webview/browser/gfx/aw_gl_surface_external_stencil.h b/android_webview/browser/gfx/aw_gl_surface_external_stencil.h index 0cceedf5..ccf09d1 100644 --- a/android_webview/browser/gfx/aw_gl_surface_external_stencil.h +++ b/android_webview/browser/gfx/aw_gl_surface_external_stencil.h
@@ -10,7 +10,7 @@ namespace android_webview { class AwGLSurfaceExternalStencil : public AwGLSurface { public: - explicit AwGLSurfaceExternalStencil(bool is_angle); + AwGLSurfaceExternalStencil(gl::GLDisplayEGL* display, bool is_angle); AwGLSurfaceExternalStencil(const AwGLSurfaceExternalStencil&) = delete; AwGLSurfaceExternalStencil& operator=(const AwGLSurfaceExternalStencil&) =
diff --git a/android_webview/browser/gfx/output_surface_provider_webview.cc b/android_webview/browser/gfx/output_surface_provider_webview.cc index f8bd108..22c42ad 100644 --- a/android_webview/browser/gfx/output_surface_provider_webview.cc +++ b/android_webview/browser/gfx/output_surface_provider_webview.cc
@@ -116,21 +116,22 @@ void OutputSurfaceProviderWebView::InitializeContext() { DCHECK(!gl_surface_) << "InitializeContext() called twice"; + gl::GLDisplayEGL* display = gl::GLSurfaceEGL::GetGLDisplayEGL(); // If EGL supports EGL_ANGLE_external_context_and_surface, then we will create // an ANGLE context for the current native GL context. const bool is_angle = - !enable_vulkan_ && gl::GLSurfaceEGL::GetGLDisplayEGL() - ->IsANGLEExternalContextAndSurfaceSupported(); + !enable_vulkan_ && display->IsANGLEExternalContextAndSurfaceSupported(); GLSurfaceContextPair real_context; if (enable_vulkan_) { DCHECK(!is_angle); real_context = GetRealContextForVulkan(); - gl_surface_ = - base::MakeRefCounted<AwGLSurface>(std::move(real_context.first)); + gl_surface_ = base::MakeRefCounted<AwGLSurface>( + display, std::move(real_context.first)); } else { // We need to draw to FBO for External Stencil support with SkiaRenderer - gl_surface_ = base::MakeRefCounted<AwGLSurfaceExternalStencil>(is_angle); + gl_surface_ = + base::MakeRefCounted<AwGLSurfaceExternalStencil>(display, is_angle); } bool result = gl_surface_->Initialize(gl::GLSurfaceFormat());
diff --git a/android_webview/browser/gfx/vulkan_gl_interop.cc b/android_webview/browser/gfx/vulkan_gl_interop.cc index 480757c..a027c2c 100644 --- a/android_webview/browser/gfx/vulkan_gl_interop.cc +++ b/android_webview/browser/gfx/vulkan_gl_interop.cc
@@ -54,8 +54,9 @@ public: GLNonOwnedCompatibilityContext() : gl::GLContextEGL(nullptr), - surface_( - base::MakeRefCounted<gl::PbufferGLSurfaceEGL>(gfx::Size(1, 1))) { + surface_(base::MakeRefCounted<gl::PbufferGLSurfaceEGL>( + gl::GLSurfaceEGL::GetGLDisplayEGL(), + gfx::Size(1, 1))) { gl::GLContextAttribs attribs; Initialize(surface_.get(), attribs);
diff --git a/ash/app_list/app_list_bubble_presenter.cc b/ash/app_list/app_list_bubble_presenter.cc index 247d66d..6ecaa5a 100644 --- a/ash/app_list/app_list_bubble_presenter.cc +++ b/ash/app_list/app_list_bubble_presenter.cc
@@ -340,7 +340,13 @@ bool AppListBubblePresenter::IsShowingEmbeddedAssistantUI() const { if (!is_target_visibility_show_) return false; - DCHECK(bubble_widget_); + + // Bubble view is null while the bubble widget is being initialized for show. + // In this case, return true iff the app list will show the assistant page + // when initialized. + if (!bubble_view_) + return target_page_ == AppListBubblePage::kAssistant; + return bubble_view_->IsShowingEmbeddedAssistantUI(); }
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc index efae0d6..7cc225c4 100644 --- a/ash/app_list/app_list_controller_impl.cc +++ b/ash/app_list/app_list_controller_impl.cc
@@ -2062,6 +2062,11 @@ DCHECK(!is_shutdown_); is_shutdown_ = true; + // Cancel any pending assistant UI close requests to avoid attempts to update + // assistant UI state mid shutdown (possibly after assistant has started + // shutting down). + IgnoreResult(close_assistant_ui_runner_.Release()); + // Always shutdown the bubble presenter, even if ProductivityLauncher is // disabled, because tests might have temporarily enabled the feature and // the widget needs to be closed.
diff --git a/ash/app_list/app_list_presenter_unittest.cc b/ash/app_list/app_list_presenter_unittest.cc index ce62e59..c6e98bd6 100644 --- a/ash/app_list/app_list_presenter_unittest.cc +++ b/ash/app_list/app_list_presenter_unittest.cc
@@ -167,8 +167,7 @@ suggestion_result->set_display_type(SearchResultDisplayType::kList); SearchResultActions actions; actions.push_back(SearchResultAction(SearchResultActionType::kRemove, - gfx::ImageSkia(), u"Remove", - true /*visible_on_hover*/)); + u"Remove", true /*visible_on_hover*/)); suggestion_result->SetActions(actions); return suggestion_result;
diff --git a/ash/app_list/views/continue_task_view.cc b/ash/app_list/views/continue_task_view.cc index 301c0e2..53a2e7a2 100644 --- a/ash/app_list/views/continue_task_view.cc +++ b/ash/app_list/views/continue_task_view.cc
@@ -312,11 +312,10 @@ ui::kColorAshSystemUIMenuIcon)); if (features::IsLauncherHideContinueSectionEnabled()) { context_menu_model_->AddSeparator(ui::NORMAL_SEPARATOR); - // TODO(crbug.com/1317428): Custom icon. context_menu_model_->AddItemWithIcon( ContinueTaskCommandId::kHideContinueSection, l10n_util::GetStringUTF16(IDS_ASH_LAUNCHER_HIDE_CONTINUE_SECTION), - ui::ImageModel::FromVectorIcon(kLockScreenPasswordInvisibleIcon, + ui::ImageModel::FromVectorIcon(kLauncherHideContinueSectionIcon, ui::kColorAshSystemUIMenuIcon)); } return context_menu_model_.get();
diff --git a/ash/app_list/views/result_selection_controller_unittest.cc b/ash/app_list/views/result_selection_controller_unittest.cc index 9c9ea2f4..6f58d8e3 100644 --- a/ash/app_list/views/result_selection_controller_unittest.cc +++ b/ash/app_list/views/result_selection_controller_unittest.cc
@@ -110,8 +110,7 @@ std::vector<SearchResult::Action>( params.actions_per_result.value(), SearchResult::Action(SearchResultActionType::kRemove, - gfx::ImageSkia(), std::u16string(), - false))); + std::u16string(), false))); search_result_views_.emplace_back(std::move(result_view)); } else { auto result_view = std::make_unique<TestResultView>(); @@ -1288,7 +1287,7 @@ selected_view->AsResultViewWithActions()->GetActionsView()->SetActions( std::vector<SearchResult::Action>( 1, SearchResult::Action(ash::SearchResultActionType::kRemove, - gfx::ImageSkia(), std::u16string(), false))); + std::u16string(), false))); ASSERT_EQ(create_test_location(0, 1), GetCurrentLocation()); EXPECT_TRUE(CurrentResultActionNotSelected());
diff --git a/ash/app_list/views/search_result_actions_view.cc b/ash/app_list/views/search_result_actions_view.cc index dbf3f41..d071839 100644 --- a/ash/app_list/views/search_result_actions_view.cc +++ b/ash/app_list/views/search_result_actions_view.cc
@@ -15,6 +15,8 @@ #include "ash/constants/ash_features.h" #include "ash/public/cpp/app_list/app_list_color_provider.h" #include "ash/public/cpp/app_list/app_list_config.h" +#include "ash/public/cpp/app_list/vector_icons/vector_icons.h" +#include "ash/style/icon_button.h" #include "base/bind.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/canvas.h" @@ -33,31 +35,26 @@ namespace { -// Image buttons. -constexpr int kImageButtonSizeDip = 40; -constexpr int kProductivityLauncherImageButtonSizeDip = 32; constexpr int kActionButtonBetweenSpacing = 8; -int GetButtonSize() { - if (features::IsProductivityLauncherEnabled()) - return kProductivityLauncherImageButtonSizeDip; - return kImageButtonSizeDip; -} - } // namespace -// SearchResultImageButton renders the button defined by SearchResult::Action. -class SearchResultImageButton : public views::ImageButton { +// SearchResultActionButton renders the button defined by SearchResult::Action. +class SearchResultActionButton : public IconButton { public: - SearchResultImageButton(SearchResultActionsView* parent, - const SearchResult::Action& action); + SearchResultActionButton(SearchResultActionsView* parent, + const SearchResult::Action& action, + PressedCallback callback, + Type type, + const gfx::VectorIcon* icon, + const std::u16string& accessible_name); - SearchResultImageButton(const SearchResultImageButton&) = delete; - SearchResultImageButton& operator=(const SearchResultImageButton&) = delete; + SearchResultActionButton(const SearchResultActionButton&) = delete; + SearchResultActionButton& operator=(const SearchResultActionButton&) = delete; - ~SearchResultImageButton() override {} + ~SearchResultActionButton() override {} - // views::ImageButton: + // IconButton: void OnGestureEvent(ui::GestureEvent* event) override; // Updates the button visibility upon state change of the button or the @@ -68,8 +65,6 @@ // views::ImageButton: void OnPaintBackground(gfx::Canvas* canvas) override; - void SetButtonImage(const gfx::ImageSkia& source); - int GetButtonRadius() const; const char* GetClassName() const override; @@ -78,70 +73,26 @@ bool to_be_activate_by_long_press_ = false; }; -SearchResultImageButton::SearchResultImageButton( +SearchResultActionButton::SearchResultActionButton( SearchResultActionsView* parent, - const SearchResult::Action& action) - : parent_(parent), visible_on_hover_(action.visible_on_hover) { + const SearchResult::Action& action, + PressedCallback callback, + Type type, + const gfx::VectorIcon* icon, + const std::u16string& accessible_name) + : IconButton(callback, + type, + icon, + action.tooltip_text, + /*is_togglable=*/false, + /*has_border=*/false), + parent_(parent), + visible_on_hover_(action.visible_on_hover) { SetFocusBehavior(FocusBehavior::ALWAYS); - // Avoid drawing default dashed focus and draw customized focus in - // OnPaintBackground(); - SetFocusPainter(nullptr); - views::InkDrop::Get(this)->SetMode(views::InkDropHost::InkDropMode::ON); - views::InkDrop::Get(this)->SetCreateHighlightCallback(base::BindRepeating( - [](SearchResultImageButton* host) { - const AppListColorProvider* const color_provider = - AppListColorProvider::Get(); - const SkColor bg_color = color_provider->GetSearchBoxBackgroundColor(); - auto highlight = std::make_unique<views::InkDropHighlight>( - gfx::SizeF(host->size()), - features::IsProductivityLauncherEnabled() - ? SK_ColorTRANSPARENT - /*productivity launcher does not use inkdrop highlights*/ - : color_provider->GetInkDropBaseColor(bg_color)); - highlight->set_visible_opacity( - features::IsProductivityLauncherEnabled() - ? 0 /*productivity launcher does not use inkdrop highlights*/ - : color_provider->GetInkDropOpacity(bg_color)); - return highlight; - }, - this)); - views::InkDrop::Get(this)->SetCreateRippleCallback(base::BindRepeating( - [](SearchResultImageButton* host) - -> std::unique_ptr<views::InkDropRipple> { - const gfx::Point center = host->GetLocalBounds().CenterPoint(); - const int ripple_radius = host->GetButtonRadius(); - gfx::Rect bounds(center.x() - ripple_radius, center.y() - ripple_radius, - 2 * ripple_radius, 2 * ripple_radius); - const AppListColorProvider* const color_provider = - AppListColorProvider::Get(); - const SkColor bg_color = color_provider->GetSearchBoxBackgroundColor(); - return std::make_unique<views::FloodFillInkDropRipple>( - host->size(), host->GetLocalBounds().InsetsFrom(bounds), - views::InkDrop::Get(host)->GetInkDropCenterBasedOnLastEvent(), - features::IsProductivityLauncherEnabled() - ? color_provider->GetInvertedInkDropBaseColor(bg_color) - : color_provider->GetInkDropBaseColor(bg_color), - features::IsProductivityLauncherEnabled() - ? color_provider->GetInvertedInkDropOpacity(bg_color) - : color_provider->GetInkDropOpacity(bg_color)); - }, - this)); - - SetPreferredSize(gfx::Size(GetButtonSize(), GetButtonSize())); - SetImageHorizontalAlignment(views::ImageButton::ALIGN_CENTER); - SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE); - - SetButtonImage(action.image); - - SetAccessibleName(action.tooltip_text); - - SetTooltipText(action.tooltip_text); - SetVisible(!visible_on_hover_); - views::InstallCircleHighlightPathGenerator(this); } -void SearchResultImageButton::OnGestureEvent(ui::GestureEvent* event) { +void SearchResultActionButton::OnGestureEvent(ui::GestureEvent* event) { switch (event->type()) { case ui::ET_GESTURE_LONG_PRESS: to_be_activate_by_long_press_ = true; @@ -162,29 +113,25 @@ Button::OnGestureEvent(event); } -void SearchResultImageButton::UpdateOnStateChanged() { +void SearchResultActionButton::UpdateOnStateChanged() { // Show button if the associated result row is hovered or selected, or one // of the action buttons is selected. if (visible_on_hover_) SetVisible(parent_->IsSearchResultHoveredOrSelected()); } -void SearchResultImageButton::OnPaintBackground(gfx::Canvas* canvas) { +void SearchResultActionButton::OnPaintBackground(gfx::Canvas* canvas) { if (HasFocus() || parent_->GetSelectedAction() == tag()) { PaintFocusRing(canvas, GetLocalBounds().CenterPoint(), GetButtonRadius()); } } -void SearchResultImageButton::SetButtonImage(const gfx::ImageSkia& source) { - SetImage(views::ImageButton::STATE_NORMAL, source); -} - -int SearchResultImageButton::GetButtonRadius() const { +int SearchResultActionButton::GetButtonRadius() const { return width() / 2; } -const char* SearchResultImageButton::GetClassName() const { - return "SearchResultImageButton"; +const char* SearchResultActionButton::GetClassName() const { + return "SearchResultActionButton"; } SearchResultActionsView::SearchResultActionsView( @@ -219,7 +166,7 @@ void SearchResultActionsView::UpdateButtonsOnStateChanged() { for (views::View* child : children()) - static_cast<SearchResultImageButton*>(child)->UpdateOnStateChanged(); + static_cast<SearchResultActionButton*>(child)->UpdateOnStateChanged(); } const char* SearchResultActionsView::GetClassName() const { @@ -292,11 +239,29 @@ void SearchResultActionsView::CreateImageButton( const SearchResult::Action& action, int action_index) { - auto* const button = - AddChildView(std::make_unique<SearchResultImageButton>(this, action)); - button->SetCallback(base::BindRepeating( - &SearchResultActionsViewDelegate::OnSearchResultActionActivated, - base::Unretained(delegate_), action_index)); + const gfx::VectorIcon* icon = nullptr; + switch (action.type) { + case SearchResultActionType::kRemove: + icon = &ash::kSearchResultRemoveIcon; + break; + case ash::SearchResultActionType::kAppend: + icon = &ash::kSearchResultAppendIcon; + break; + case ash::SearchResultActionType::kSearchResultActionTypeMax: + NOTREACHED(); + } + + DCHECK(icon); + + auto* const button = AddChildView(std::make_unique<SearchResultActionButton>( + this, action, + base::BindRepeating( + &SearchResultActionsViewDelegate::OnSearchResultActionActivated, + base::Unretained(delegate_), action_index), + features::IsProductivityLauncherEnabled() + ? IconButton::Type::kSmallFloating + : IconButton::Type::kMediumFloating, + icon, action.tooltip_text)); button->set_tag(action_index); subscriptions_.push_back(button->AddStateChangedCallback( base::BindRepeating(&SearchResultActionsView::UpdateButtonsOnStateChanged,
diff --git a/ash/capture_mode/capture_mode_camera_controller.cc b/ash/capture_mode/capture_mode_camera_controller.cc index be607ac..c93025cd 100644 --- a/ash/capture_mode/capture_mode_camera_controller.cc +++ b/ash/capture_mode/capture_mode_camera_controller.cc
@@ -328,7 +328,8 @@ camera_preview_window_->GetBoundsInScreen(); const gfx::Point camera_preview_center_point = camera_preview_bounds.CenterPoint(); - const int camera_preview_radius = camera_preview_bounds.width() / 2; + const int camera_preview_radius = camera_preview_bounds.width() / 2 - + capture_mode::kCameraPreviewBorderSize; // Check if events are outside of the camera preview circle by comparing // if the distance between screen location and center of camera preview is
diff --git a/ash/capture_mode/capture_mode_camera_preview_view.cc b/ash/capture_mode/capture_mode_camera_preview_view.cc index d990d67a..8b2266f6 100644 --- a/ash/capture_mode/capture_mode_camera_preview_view.cc +++ b/ash/capture_mode/capture_mode_camera_preview_view.cc
@@ -107,6 +107,11 @@ camera_controller_->is_camera_preview_collapsed())))), scoped_a11y_overrider_( std::make_unique<ScopedA11yOverrideWindowSetter>()) { + // Add an empty border to the camera preview. This is done to keep some gap + // between the focus ring and the contents of the camera preview, as focus + // ring will extend a little beyond the border. + SetBorder(views::CreateEmptyBorder(capture_mode::kCameraPreviewBorderSize)); + resize_button_->SetPaintToLayer(); resize_button_->layer()->SetFillsBoundsOpaquely(false); resize_button_->SetBackground(views::CreateRoundedRectBackground( @@ -300,7 +305,8 @@ const gfx::Rect bounds( (width() - resize_button_size.width()) / 2.f, height() - resize_button_size.height() - - capture_mode::kSpaceBetweenResizeButtonAndCameraPreview, + capture_mode::kSpaceBetweenResizeButtonAndCameraPreview - + capture_mode::kCameraPreviewBorderSize, resize_button_size.width(), resize_button_size.height()); resize_button_->SetBoundsRect(bounds);
diff --git a/ash/capture_mode/capture_mode_constants.h b/ash/capture_mode/capture_mode_constants.h index 33235ec..d31f1d7 100644 --- a/ash/capture_mode/capture_mode_constants.h +++ b/ash/capture_mode/capture_mode_constants.h
@@ -55,6 +55,9 @@ // diameter. constexpr int kCollapsedPreviewDivider = 2; +// Size of the camera preview border. +constexpr int kCameraPreviewBorderSize = 4; + // The space between the camera preview and edges of the bounds that will be // recorded. constexpr int kSpaceBetweenCameraPreviewAndEdges = 16;
diff --git a/ash/capture_mode/capture_mode_session_focus_cycler.cc b/ash/capture_mode/capture_mode_session_focus_cycler.cc index 2064fdc..b25c53d 100644 --- a/ash/capture_mode/capture_mode_session_focus_cycler.cc +++ b/ash/capture_mode/capture_mode_session_focus_cycler.cc
@@ -383,7 +383,15 @@ // focused. if (current_focus_group_ == FocusGroup::kPendingSettings || current_focus_group_ == FocusGroup::kSettingsMenu) { - ClearFocus(); + // When the settings menu is closed while focus is in or about to be in it, + // we manually put the focus back on the settings button. + current_focus_group_ = FocusGroup::kSettingsClose; + focus_index_ = 0u; + const auto highlightable_views = GetGroupItems(current_focus_group_); + DCHECK_EQ(highlightable_views.size(), 2u); + scoped_a11y_overrider_->MaybeUpdateA11yOverrideWindow( + GetA11yOverrideWindow()); + highlightable_views[focus_index_]->PseudoFocus(); } UpdateA11yAnnotation(); }
diff --git a/ash/capture_mode/capture_mode_unittests.cc b/ash/capture_mode/capture_mode_unittests.cc index 355c81b..2a196841 100644 --- a/ash/capture_mode/capture_mode_unittests.cc +++ b/ash/capture_mode/capture_mode_unittests.cc
@@ -2271,6 +2271,50 @@ EXPECT_EQ(FocusGroup::kSettingsClose, test_api.GetCurrentFocusGroup()); } +// Tests that the focus should be on the `Settings` button after closing the +// settings menu. +TEST_F(CaptureModeTest, ReturnFocusToSettingsButtonAfterSettingsMenuIsClosed) { + auto* controller = StartCaptureSession(CaptureModeSource::kFullscreen, + CaptureModeType::kImage); + CaptureModeSession* capture_mode_session = controller->capture_mode_session(); + CaptureModeSessionTestApi test_api(capture_mode_session); + + using FocusGroup = CaptureModeSessionFocusCycler::FocusGroup; + auto* event_generator = GetEventGenerator(); + + // Check the initial focus of the focus ring. + EXPECT_EQ(FocusGroup::kNone, test_api.GetCurrentFocusGroup()); + + // Tab six times, `Settings` button should be focused. + SendKey(ui::VKEY_TAB, event_generator, ui::EF_NONE, /*count=*/6); + EXPECT_EQ(FocusGroup::kSettingsClose, test_api.GetCurrentFocusGroup()); + EXPECT_TRUE(test_api.GetCaptureModeBarView()->settings_button()->has_focus()); + + // Tab the space key and the settings menu will be opened. + SendKey(ui::VKEY_SPACE, event_generator, ui::EF_NONE); + EXPECT_TRUE(test_api.GetCaptureModeSettingsView()); + EXPECT_EQ(FocusGroup::kPendingSettings, test_api.GetCurrentFocusGroup()); + + // Close the settings menu, the focus ring should be on the `Settings` button. + SendKey(ui::VKEY_ESCAPE, event_generator, ui::EF_NONE); + EXPECT_FALSE(test_api.GetCaptureModeSettingsView()); + EXPECT_EQ(FocusGroup::kSettingsClose, test_api.GetCurrentFocusGroup()); + EXPECT_TRUE(test_api.GetCaptureModeBarView()->settings_button()->has_focus()); + + // Tab the space key to open the settings menu again and tab to focus on the + // settings menu item. + SendKey(ui::VKEY_SPACE, event_generator, ui::EF_NONE); + EXPECT_TRUE(test_api.GetCaptureModeSettingsView()); + SendKey(ui::VKEY_TAB, event_generator, ui::EF_NONE, /*count=*/3); + EXPECT_EQ(FocusGroup::kSettingsMenu, test_api.GetCurrentFocusGroup()); + + // Close the settings menu, the focus ring should be on the `Settings` button. + SendKey(ui::VKEY_ESCAPE, event_generator, ui::EF_NONE); + EXPECT_FALSE(test_api.GetCaptureModeSettingsView()); + EXPECT_EQ(FocusGroup::kSettingsClose, test_api.GetCurrentFocusGroup()); + EXPECT_TRUE(test_api.GetCaptureModeBarView()->settings_button()->has_focus()); +} + class CaptureModeSaveFileTest : public CaptureModeTest, public testing::WithParamInterface<CaptureModeType> {
diff --git a/ash/public/cpp/app_list/app_list_types.cc b/ash/public/cpp/app_list/app_list_types.cc index 482b873..c56e73e 100644 --- a/ash/public/cpp/app_list/app_list_types.cc +++ b/ash/public/cpp/app_list/app_list_types.cc
@@ -234,11 +234,9 @@ SearchResultAction::SearchResultAction() = default; SearchResultAction::SearchResultAction(SearchResultActionType type, - const gfx::ImageSkia& image, const std::u16string& tooltip_text, bool visible_on_hover) : type(type), - image(image), tooltip_text(tooltip_text), visible_on_hover(visible_on_hover) {}
diff --git a/ash/public/cpp/app_list/app_list_types.h b/ash/public/cpp/app_list/app_list_types.h index 7aba40e..6fe4657 100644 --- a/ash/public/cpp/app_list/app_list_types.h +++ b/ash/public/cpp/app_list/app_list_types.h
@@ -512,14 +512,12 @@ struct ASH_PUBLIC_EXPORT SearchResultAction { SearchResultAction(); SearchResultAction(SearchResultActionType type, - const gfx::ImageSkia& image, const std::u16string& tooltip_text, bool visible_on_hover); SearchResultAction(const SearchResultAction& other); ~SearchResultAction(); SearchResultActionType type; - gfx::ImageSkia image; std::u16string tooltip_text; // Visible when button or its parent row in hover state. bool visible_on_hover;
diff --git a/ash/resources/vector_icons/BUILD.gn b/ash/resources/vector_icons/BUILD.gn index f6d9407b..92f7499 100644 --- a/ash/resources/vector_icons/BUILD.gn +++ b/ash/resources/vector_icons/BUILD.gn
@@ -125,6 +125,7 @@ "ksv_volume_down.icon", "ksv_volume_up.icon", "launch.icon", + "launcher_hide_continue_section.icon", "lock_screen_alert.icon", "lock_screen_arrow.icon", "lock_screen_arrow_back.icon",
diff --git a/ash/resources/vector_icons/launcher_hide_continue_section.icon b/ash/resources/vector_icons/launcher_hide_continue_section.icon new file mode 100644 index 0000000..d5ad850 --- /dev/null +++ b/ash/resources/vector_icons/launcher_hide_continue_section.icon
@@ -0,0 +1,41 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 17.39f, 18.02f, +LINE_TO, 16, 19.41f, +LINE_TO, 12.36f, 15.78f, +CUBIC_TO, 11.62f, 15.93f, 10.84f, 16, 10, 16, +CUBIC_TO, 5.67f, 16, 2.67f, 14, 1, 10, +CUBIC_TO, 1.66f, 8.69f, 2.42f, 7.59f, 3.29f, 6.71f, +LINE_TO, 0.59f, 4, +LINE_TO, 2, 2.59f, +LINE_TO, 2.01f, 2.6f, +LINE_TO, 1.99f, 2.62f, +LINE_TO, 17.39f, 18.02f, +CLOSE, +MOVE_TO, 16.18f, 13.99f, +LINE_TO, 14.76f, 12.57f, +CUBIC_TO, 15.56f, 11.95f, 16.22f, 11.12f, 16.76f, 10.07f, +CUBIC_TO, 15.13f, 7.29f, 12.94f, 6, 10, 6, +CUBIC_TO, 9.42f, 6, 8.87f, 6.05f, 8.35f, 6.15f, +LINE_TO, 6.72f, 4.52f, +CUBIC_TO, 7.72f, 4.17f, 8.82f, 4, 10, 4, +CUBIC_TO, 14, 4, 17, 6, 19, 10, +CUBIC_TO, 18.3f, 11.69f, 17.36f, 13.02f, 16.18f, 13.99f, +CLOSE, +MOVE_TO, 9.28f, 7.09f, +CUBIC_TO, 9.51f, 7.03f, 9.75f, 7, 10, 7, +CUBIC_TO, 11.66f, 7, 13, 8.34f, 13, 10, +CUBIC_TO, 13, 10.25f, 12.97f, 10.49f, 12.91f, 10.72f, +LINE_TO, 9.28f, 7.09f, +CLOSE, +MOVE_TO, 10.57f, 13.99f, +LINE_TO, 9.55f, 12.97f, +CUBIC_TO, 8.25f, 12.77f, 7.23f, 11.75f, 7.03f, 10.45f, +LINE_TO, 4.71f, 8.12f, +CUBIC_TO, 4.17f, 8.66f, 3.68f, 9.31f, 3.24f, 10.07f, +CUBIC_TO, 4.62f, 12.75f, 6.79f, 14, 10, 14, +CUBIC_TO, 10.19f, 14, 10.39f, 14, 10.57f, 13.99f, +CLOSE
diff --git a/ash/webui/demo_mode_app_ui/BUILD.gn b/ash/webui/demo_mode_app_ui/BUILD.gn index 32b7196..6022034 100644 --- a/ash/webui/demo_mode_app_ui/BUILD.gn +++ b/ash/webui/demo_mode_app_ui/BUILD.gn
@@ -22,6 +22,7 @@ ] deps = [ + "//ash/constants", "//ash/webui/demo_mode_app_ui/mojom", "//ash/webui/resources:demo_mode_app_resources", "//content/public/browser",
diff --git a/ash/webui/demo_mode_app_ui/demo_mode_app_ui.cc b/ash/webui/demo_mode_app_ui/demo_mode_app_ui.cc index 842b9f8..7af2835 100644 --- a/ash/webui/demo_mode_app_ui/demo_mode_app_ui.cc +++ b/ash/webui/demo_mode_app_ui/demo_mode_app_ui.cc
@@ -4,17 +4,35 @@ #include "ash/webui/demo_mode_app_ui/demo_mode_app_ui.h" +#include "ash/constants/ash_features.h" #include "ash/webui/demo_mode_app_ui/demo_mode_page_handler.h" #include "ash/webui/demo_mode_app_ui/url_constants.h" #include "ash/webui/grit/ash_demo_mode_app_resources.h" #include "ash/webui/grit/ash_demo_mode_app_resources_map.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui_data_source.h" +#include "content/public/common/url_constants.h" #include "services/network/public/mojom/content_security_policy.mojom.h" #include "ui/views/widget/widget.h" namespace ash { +DemoModeAppUIConfig::DemoModeAppUIConfig() + : content::WebUIConfig(content::kChromeUIScheme, kChromeUIDemoModeAppHost) { +} + +DemoModeAppUIConfig::~DemoModeAppUIConfig() = default; + +std::unique_ptr<content::WebUIController> +DemoModeAppUIConfig::CreateWebUIController(content::WebUI* web_ui) { + return std::make_unique<DemoModeAppUI>(web_ui); +} + +bool DemoModeAppUIConfig::IsWebUIEnabled( + content::BrowserContext* browser_context) { + return ash::features::IsDemoModeSWAEnabled(); +} + DemoModeAppUI::DemoModeAppUI(content::WebUI* web_ui) : ui::MojoWebUIController(web_ui) { content::WebUIDataSource* html_source =
diff --git a/ash/webui/demo_mode_app_ui/demo_mode_app_ui.h b/ash/webui/demo_mode_app_ui/demo_mode_app_ui.h index 05727e2..4fe4d81 100644 --- a/ash/webui/demo_mode_app_ui/demo_mode_app_ui.h +++ b/ash/webui/demo_mode_app_ui/demo_mode_app_ui.h
@@ -6,6 +6,7 @@ #define ASH_WEBUI_DEMO_MODE_APP_UI_DEMO_MODE_APP_UI_H_ #include "ash/webui/demo_mode_app_ui/mojom/demo_mode_app_ui.mojom.h" +#include "content/public/browser/webui_config.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -13,6 +14,17 @@ namespace ash { +class DemoModeAppUIConfig : public content::WebUIConfig { + public: + DemoModeAppUIConfig(); + ~DemoModeAppUIConfig() override; + + std::unique_ptr<content::WebUIController> CreateWebUIController( + content::WebUI* web_ui) override; + + bool IsWebUIEnabled(content::BrowserContext* browser_context) override; +}; + // The WebUI for chrome://demo-mode-app class DemoModeAppUI : public ui::MojoWebUIController, public mojom::demo_mode::PageHandlerFactory {
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_grid_item_element.html b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_grid_item_element.html index 0f09dc4..319a2800d 100644 --- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_grid_item_element.html +++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_grid_item_element.html
@@ -141,7 +141,9 @@ <div class="item" aria-selected$="[[selected]]" style$="[[getItemPlaceholderAnimationDelay_(index)]]"> <template is="dom-if" if="[[isImageVisible_(imageSrc)]]"> - <img is="cr-auto-img" auto-src="[[imageSrc]]" clear-src is-google-photos></img> + <img is="cr-auto-img" aria-hidden="true" auto-src="[[imageSrc]]" clear-src + is-google-photos> + </img> </template> <template is="dom-if" if="[[isTextVisible_(primaryText, secondaryText)]]"> <div class="text">
diff --git a/ash/webui/projector_app/resources/annotator/annotator_embedder.css b/ash/webui/projector_app/resources/annotator/annotator_embedder.css index 59357ac..304e8674 100644 --- a/ash/webui/projector_app/resources/annotator/annotator_embedder.css +++ b/ash/webui/projector_app/resources/annotator/annotator_embedder.css
@@ -5,14 +5,15 @@ body { background-color: transparent; height: 100vh; - width: 100vw; + margin: 0; overflow: hidden; + width: 100vw; } .marker-iframe { - border:0px; - height:100vh; - margin:0px; - overflow:hidden; - width:100vw; + border: none; + height: 100vh; + margin: 0; + overflow: hidden; + width: 100vw; }
diff --git a/ash/webui/shimless_rma/resources/base_page.html b/ash/webui/shimless_rma/resources/base_page.html index 38dc6121..447b37a 100644 --- a/ash/webui/shimless_rma/resources/base_page.html +++ b/ash/webui/shimless_rma/resources/base_page.html
@@ -28,6 +28,7 @@ #leftPane { box-sizing: border-box; margin-inline-end: 80px; + margin-top: 112px; width: 40%; } @@ -35,16 +36,9 @@ box-sizing: border-box; width: 60%; } - - #optionalIcon { - height: 112px; - } </style> <div id="pageWrapper"> <div id="leftPane"> - <div id="optionalIcon"> - <slot name="optional-icon"></slot> - </div> <slot name="left-pane"></slot> </div> <div id="rightPane">
diff --git a/ash/webui/shimless_rma/resources/fake_shimless_rma_service.js b/ash/webui/shimless_rma/resources/fake_shimless_rma_service.js index 4e23d05..bade04e 100644 --- a/ash/webui/shimless_rma/resources/fake_shimless_rma_service.js +++ b/ash/webui/shimless_rma/resources/fake_shimless_rma_service.js
@@ -1231,6 +1231,7 @@ this.methods_.register('setSameOwner'); this.methods_.register('setDifferentOwner'); + this.methods_.register('setWipeDevice'); this.methods_.register('chooseManuallyDisableWriteProtect'); this.methods_.register('chooseRsuDisableWriteProtect');
diff --git a/ash/webui/shimless_rma/resources/onboarding_network_page.html b/ash/webui/shimless_rma/resources/onboarding_network_page.html index f9ae486f..2fa83b6 100644 --- a/ash/webui/shimless_rma/resources/onboarding_network_page.html +++ b/ash/webui/shimless_rma/resources/onboarding_network_page.html
@@ -3,12 +3,6 @@ display: inline-flex; } - iron-icon { - color: rgba(var(--google-blue-600-rgb), 1); - height: 20px; - width: 20px; - } - .error { color: var(--cros-text-color-alert); font-weight: 500; @@ -21,8 +15,6 @@ </style> <base-page> - <iron-icon slot="optional-icon" icon="shimless-icon:wifi"> - </iron-icon> <div slot="left-pane"> <h1>[[i18n('connectNetworkTitleText')]]</h1> <div class="instructions">[[i18n('connectNetworkDescriptionText')]]</div>
diff --git a/ash/webui/shimless_rma/resources/repair_component_chip.html b/ash/webui/shimless_rma/resources/repair_component_chip.html index aea407c..62a1795 100644 --- a/ash/webui/shimless_rma/resources/repair_component_chip.html +++ b/ash/webui/shimless_rma/resources/repair_component_chip.html
@@ -37,6 +37,11 @@ position: absolute; } + :host([checked]) #componentName, + :host([checked]) #componentIdentifier { + color: var(--google-blue-700); + } + #componentName { color: var(--shimless-component-text-color); font-family: var(--shimless-component-font-family); @@ -53,10 +58,6 @@ line-height: var(--shimless-component-description-line-height); } - :host([checked]) #labelDiv { - color: var(--google-blue-700); - } - iron-icon { margin-top: 6px; }
diff --git a/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html b/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html index 5273e11..997f847 100644 --- a/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html +++ b/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html
@@ -60,6 +60,7 @@ font-weight: var(--shimless-medium-font-weight); line-height: var(--shimless-title-line-height); margin-bottom: var(--title-bottom-margin); + margin-top: 0; } .instructions { @@ -181,13 +182,6 @@ overflow: auto; } - [slot=optional-icon] { - height: 32px; - margin-bottom: 40px; - margin-top: 40px; - width: 32px; - } - [slot=right-pane] { height: 100%; width: 100%;
diff --git a/ash/wm/desks/desk_mini_view.cc b/ash/wm/desks/desk_mini_view.cc index 15b8270..7d8c2c56 100644 --- a/ash/wm/desks/desk_mini_view.cc +++ b/ash/wm/desks/desk_mini_view.cc
@@ -105,9 +105,8 @@ desk_name_view_ = AddChildView(std::move(desk_name_view)); if (features::IsDesksCloseAllEnabled()) { - // TODO(crbug.com/1308429): Replace PLACEHOLDER with the name of the initial - // target desk for combine desks operation. - std::u16string initial_combine_desks_target_name = u"PLACEHOLDER"; + const std::u16string initial_combine_desks_target_name = + DesksController::Get()->GetCombineDesksTargetName(desk_); desk_action_view_ = AddChildView(std::make_unique<DeskActionView>( initial_combine_desks_target_name, @@ -132,8 +131,6 @@ DeskCloseType::kCloseAllWindowsAndWait), base::BindRepeating(&DeskMiniView::OnContextMenuClosed, base::Unretained(this))); - - // TODO(crbug.com/1308429): Can initialize highlight overlay here. } else { close_desk_button_ = AddChildView(std::make_unique<CloseButton>( base::BindRepeating(&DeskMiniView::OnRemovingDesk, @@ -249,9 +246,9 @@ is_context_menu_open_ = true; UpdateDeskButtonVisibility(); - // TODO(crbug.com/1308429): Should set highlight overlay to visible and update - // context menu item label for combining desks here to tell the user where the - // windows will go. + desk_preview_->SetHighlightOverlayVisibility(true); + context_menu_->UpdateCombineDesksTargetName( + DesksController::Get()->GetCombineDesksTargetName(desk_)); // Only show the combine desks context menu option if there are app windows in // the desk, or if the desk is active and there are windows that should be @@ -284,8 +281,6 @@ kCloseButtonMargin, kCloseButtonMargin, desk_action_view_size.width(), desk_action_view_size.height()); - - // TODO(crbug.com/1308429): Set bounds for a highlight overlay. } else { DCHECK(close_desk_button_); const int close_button_size = @@ -602,7 +597,7 @@ void DeskMiniView::OnContextMenuClosed() { is_context_menu_open_ = false; UpdateDeskButtonVisibility(); - // TODO(crbug.com/1308429): Make highlight overlay visibility false here. + desk_preview_->SetHighlightOverlayVisibility(false); } void DeskMiniView::OnDeskPreviewPressed() {
diff --git a/ash/wm/desks/desk_preview_view.cc b/ash/wm/desks/desk_preview_view.cc index 8e7791a..6ade218 100644 --- a/ash/wm/desks/desk_preview_view.cc +++ b/ash/wm/desks/desk_preview_view.cc
@@ -9,6 +9,7 @@ #include "ash/public/cpp/window_properties.h" #include "ash/shell.h" +#include "ash/style/ash_color_provider.h" #include "ash/wallpaper/wallpaper_base_view.h" #include "ash/wm/desks/desk_mini_view.h" #include "ash/wm/desks/desk_name_view.h" @@ -59,6 +60,9 @@ constexpr int kCornerRadius = 4; constexpr gfx::RoundedCornersF kCornerRadii(kCornerRadius); +// Used for painting the highlight when the context menu is open. +constexpr float kHighlightTransparency = 0.3f * 0xFF; + // Holds data about the original desk's layers to determine what we should do // when we attempt to mirror those layers. struct LayerData { @@ -288,6 +292,16 @@ contents_view_layer->SetIsFastRoundedCorner(true); AddChildView(desk_mirrored_contents_view_); + if (features::IsDesksCloseAllEnabled()) { + highlight_overlay_ = AddChildView(std::make_unique<views::View>()); + highlight_overlay_->SetPaintToLayer(ui::LAYER_SOLID_COLOR); + highlight_overlay_->SetVisible(false); + ui::Layer* highlight_overlay_layer = highlight_overlay_->layer(); + highlight_overlay_layer->SetName("DeskPreviewView highlight overlay"); + highlight_overlay_layer->SetRoundedCornerRadius(kCornerRadii); + highlight_overlay_layer->SetIsFastRoundedCorner(true); + } + auto border = std::make_unique<WmHighlightItemBorder>(kBorderCornerRadius); border_ptr_ = border.get(); SetBorder(std::move(border)); @@ -315,6 +329,11 @@ SchedulePaint(); } +void DeskPreviewView::SetHighlightOverlayVisibility(bool visible) { + DCHECK(highlight_overlay_); + highlight_overlay_->SetVisible(visible); +} + void DeskPreviewView::OnRemovingDesk() { // Since the mini view has a remove animation, we don't want this desk preview // to be pressed while it's animating. The desk will have already be removed @@ -373,6 +392,9 @@ wallpaper_preview_->SetBoundsRect(bounds); desk_mirrored_contents_view_->SetBoundsRect(bounds); + if (features::IsDesksCloseAllEnabled()) + highlight_overlay_->SetBoundsRect(bounds); + // The desk's contents mirrored layer needs to be scaled down so that it fits // exactly in the center of the view. const auto root_size = mini_view_->root_window()->layer()->size(); @@ -442,4 +464,15 @@ Button::OnGestureEvent(event); } +void DeskPreviewView::OnThemeChanged() { + views::Button::OnThemeChanged(); + + if (features::IsDesksCloseAllEnabled()) { + highlight_overlay_->layer()->SetColor( + SkColorSetA(AshColorProvider::Get()->GetControlsLayerColor( + AshColorProvider::ControlsLayerType::kHighlightColor1), + kHighlightTransparency)); + } +} + } // namespace ash
diff --git a/ash/wm/desks/desk_preview_view.h b/ash/wm/desks/desk_preview_view.h index a5628dc4..6f5438b1 100644 --- a/ash/wm/desks/desk_preview_view.h +++ b/ash/wm/desks/desk_preview_view.h
@@ -26,19 +26,24 @@ // A view that shows the contents of the corresponding desk in its mini_view. // This view has the following layer hierarchy: // -// +-----+ -// | <--+------ This view's layer. -// +-----+ -// / | \ ----->>>>> Higher in Z-order. -// / | \ -// +-----+ +-----+ +-----+ -// | | | | | | -// +-----+ +-----+ +-----+ -// ^ ^ ^ \ -// | | | \ +-----+ -// | | | | | -// | | | +-----+ -// | | | ^ +// +---------------------------+ +// | <-------------+------ This view's layer. +// +---------------------------+ +// / | | \ ----->>>>> Higher in Z-order. +// / | | \ +// +-----+ +-----+ +-----+ +-----+ +// | | | | | | | | +// +-----+ +-----+ +-----+ +-----+ +// ^ ^ ^ \ ^ +// | | | \ +-----+ | +// | | | | | | +// | | | +-----+ | +// | | | ^ | +// | | | | `highlight_overlay_`'s layer: +// | | | | A solid color layer that is +// | | | | visible when `mini_view_`'s +// | | | | `DeskActionContextMenu` is open. +// | | | | // | | | | // | | | The root layer of the desk's mirrored // | | | contents layer tree. This tree is owned by @@ -56,10 +61,11 @@ // | // `shadow_layer_`: A layer that paints a shadow behind this view. // -// Note that both |desk_mirrored_contents_view_| and |wallpaper_preview_| paint -// to layers with rounded corners. In order to use the fast rounded corners -// implementation we must make them sibling layers, rather than one being a -// descendant of the other. Otherwise, this will trigger a render surface. +// Note that `desk_mirrored_contents_view_`, `wallpaper_preview_`, and +// `highlight_overlay_` paint to layers with rounded corners. In order to use +// the fast rounded corners implementation we must make them sibling layers, +// rather than one being a descendant of the other. Otherwise, this will trigger +// a render surface. class ASH_EXPORT DeskPreviewView : public views::Button { public: DeskPreviewView(PressedCallback callback, DeskMiniView* mini_view); @@ -82,6 +88,10 @@ void SetBorderColor(SkColor color); + // Sets the visibility of `highlight_overlay_` to `visible`. If `visible` is + // true, this `DeskPreviewView` becomes highlighted. + void SetHighlightOverlayVisibility(bool visible); + // Called when the CloseDeskButton is pressed, and the desk is about to be // removed. void OnRemovingDesk(); @@ -97,8 +107,11 @@ bool OnMouseDragged(const ui::MouseEvent& event) override; void OnMouseReleased(const ui::MouseEvent& event) override; void OnGestureEvent(ui::GestureEvent* event) override; + void OnThemeChanged() override; private: + friend class DesksTestApi; + DeskMiniView* const mini_view_; // A view that paints the wallpaper in the mini_view. It avoids the dimming @@ -111,6 +124,11 @@ // tree. Owned by the views hierarchy. views::View* desk_mirrored_contents_view_; + // An overlay that becomes visible on top of the + // `desk_mirrored_contents_view_` when the `mini_view_`'s + // `DeskActionContextMenu` is active. Owned by the views hierarchy. + views::View* highlight_overlay_ = nullptr; + // Owned by this View via `View::border_`. This is just a convenient pointer // to it. WmHighlightItemBorder* border_ptr_;
diff --git a/ash/wm/desks/desks_bar_view.cc b/ash/wm/desks/desks_bar_view.cc index 361e7d036..b4276cf 100644 --- a/ash/wm/desks/desks_bar_view.cc +++ b/ash/wm/desks/desks_bar_view.cc
@@ -18,6 +18,7 @@ #include "ash/strings/grit/ash_strings.h" #include "ash/style/ash_color_provider.h" #include "ash/utility/haptics_util.h" +#include "ash/wm/desks/desk_action_view.h" #include "ash/wm/desks/desk_drag_proxy.h" #include "ash/wm/desks/desk_mini_view.h" #include "ash/wm/desks/desk_mini_view_animations.h" @@ -678,6 +679,10 @@ Shell::Get()->desks_controller()->UpdateDesksDefaultNames(); Shell::Get()->cursor_manager()->SetCursor(ui::mojom::CursorType::kPointer); + // We update combine desks tooltips here to reflect the updated desk default + // names. + MaybeUpdateCombineDesksTooltips(); + // Stop scroll even if the desk is on the scroll arrow buttons. left_scroll_button_->OnDeskHoverEnd(); right_scroll_button_->OnDeskHoverEnd(); @@ -789,6 +794,7 @@ DeskNameView::CommitChanges(GetWidget()); const bool is_expanding_bar_view = zero_state_new_desk_button_->GetVisible(); UpdateNewMiniViews(/*initializing_bar_view=*/false, is_expanding_bar_view); + MaybeUpdateCombineDesksTooltips(); } void DesksBarView::OnDeskRemoved(const Desk* desk) { @@ -840,6 +846,8 @@ std::vector<DeskMiniView*>(partition_iter, mini_views_.end()), expanded_state_new_desk_button_, expanded_state_desks_templates_button_, begin_x - GetFirstMiniViewXOffset()); + + MaybeUpdateCombineDesksTooltips(); } void DesksBarView::OnDeskReordered(int old_index, int new_index) { @@ -853,6 +861,7 @@ // Call the animation function after reorder the mini views. PerformReorderDeskMiniViewAnimation(old_index, new_index, mini_views_); + MaybeUpdateCombineDesksTooltips(); } void DesksBarView::OnDeskActivationChanged(const Desk* activated, @@ -869,7 +878,9 @@ void DesksBarView::OnDeskSwitchAnimationFinished() {} void DesksBarView::OnDeskNameChanged(const Desk* desk, - const std::u16string& new_name) {} + const std::u16string& new_name) { + MaybeUpdateCombineDesksTooltips(); +} void DesksBarView::UpdateNewMiniViews(bool initializing_bar_view, bool expanding_bar_view) { @@ -1251,6 +1262,16 @@ GetWidget()->GetNativeWindow()->GetRootWindow()); } +void DesksBarView::MaybeUpdateCombineDesksTooltips() { + if (!features::IsDesksCloseAllEnabled()) + return; + + for (auto* mini_view : mini_views_) { + mini_view->desk_action_view()->UpdateCombineDesksTooltip( + DesksController::Get()->GetCombineDesksTargetName(mini_view->desk())); + } +} + void DesksBarView::OnContentsScrolled() { UpdateScrollButtonsVisibility(); UpdateGradientZone();
diff --git a/ash/wm/desks/desks_bar_view.h b/ash/wm/desks/desks_bar_view.h index 139e6b6..4c8f628 100644 --- a/ash/wm/desks/desks_bar_view.h +++ b/ash/wm/desks/desks_bar_view.h
@@ -257,6 +257,11 @@ void OnDesksTemplatesButtonPressed(); + // If the `DesksCloseAll` flag is enabled, this function cycles through + // `mini_views_` and updates the tooltip for each mini view's combine desks + // button. + void MaybeUpdateCombineDesksTooltips(); + // Scrollview callbacks. void OnContentsScrolled(); void OnContentsScrollEnded();
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc index 09fa375..fdc29f4 100644 --- a/ash/wm/desks/desks_controller.cc +++ b/ash/wm/desks/desks_controller.cc
@@ -353,6 +353,21 @@ return l10n_util::GetStringUTF16(kDeskDefaultNameIds[desk_index]); } +const std::u16string& DesksController::GetCombineDesksTargetName( + const Desk* desk) const { + if (desk == active_desk_ && desks_.size() > 1) { + Desk* target = GetPreviousDesk(); + + if (!target) + target = GetNextDesk(); + + DCHECK(target); + return target->name(); + } + + return active_desk_->name(); +} + const Desk* DesksController::GetTargetActiveDesk() const { if (animation_) return desks_[animation_->ending_desk_index()].get();
diff --git a/ash/wm/desks/desks_controller.h b/ash/wm/desks/desks_controller.h index 4f1a142..f007ae3 100644 --- a/ash/wm/desks/desks_controller.h +++ b/ash/wm/desks/desks_controller.h
@@ -117,6 +117,11 @@ DeskAnimationBase* animation() const { return animation_.get(); } + // Finds and returns the name of the desk that `desk` would be combined with + // when the user clicks or presses the combine desks button or context menu + // item. + const std::u16string& GetCombineDesksTargetName(const Desk* desk) const; + // Returns the current |active_desk()| or the soon-to-be active desk if a desk // switch animation is in progress. const Desk* GetTargetActiveDesk() const;
diff --git a/ash/wm/desks/desks_test_api.cc b/ash/wm/desks/desks_test_api.cc index b1a9e65..6e36d9e5 100644 --- a/ash/wm/desks/desks_test_api.cc +++ b/ash/wm/desks/desks_test_api.cc
@@ -10,6 +10,7 @@ #include "ash/wm/desks/desk.h" #include "ash/wm/desks/desk_action_context_menu.h" #include "ash/wm/desks/desk_mini_view.h" +#include "ash/wm/desks/desk_preview_view.h" #include "ash/wm/desks/desks_bar_view.h" #include "ash/wm/desks/desks_restore_util.h" #include "ash/wm/desks/expanded_desks_bar_button.h" @@ -105,6 +106,13 @@ return GetContextMenuForDesk(index)->context_menu_model_; } +views::View* DesksTestApi::GetHighlightOverlayForDeskPreview(int index) { + return GetDesksBarView() + ->mini_views()[index] + ->desk_preview() + ->highlight_overlay_; +} + // static bool DesksTestApi::HasVerticalDotsButton() { return GetDesksBarView()->vertical_dots_button_;
diff --git a/ash/wm/desks/desks_test_api.h b/ash/wm/desks/desks_test_api.h index 1c90b55b..e117256 100644 --- a/ash/wm/desks/desks_test_api.h +++ b/ash/wm/desks/desks_test_api.h
@@ -13,6 +13,7 @@ namespace views { class LabelButton; class ScrollView; +class View; } // namespace views namespace ui { @@ -46,6 +47,7 @@ static DeskActionContextMenu* GetContextMenuForDesk(int index); static views::LabelButton* GetCloseAllUndoToastDismissButton(); static const ui::SimpleMenuModel& GetContextMenuModelForDesk(int index); + static views::View* GetHighlightOverlayForDeskPreview(int index); static bool HasVerticalDotsButton(); static bool DesksControllerHasDesk(Desk* desk); static bool DesksControllerCanUndoDeskRemoval();
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc index 95f6740..c86131d 100644 --- a/ash/wm/desks/desks_unittests.cc +++ b/ash/wm/desks/desks_unittests.cc
@@ -7442,9 +7442,179 @@ EXPECT_FALSE(window2.is_valid()); } -// TODO(crbug.com/1308429): Should have tests for opening and closing the -// DeskActionContextMenu (which should also add and remove the highlight -// overview on the desk preview). +// Checks that the desk preview highlight overlay is visible on a desk preview +// view only when its corresponding desk mini view's `DeskActionContextMenu` is +// active. +TEST_F(DesksCloseAllTest, DeskPreviewHighlightShowsWhenContextMenuIsOpen) { + // We need to make the display this large so that the preview view is + // right-clickable. + UpdateDisplay("1366x768"); + NewDesk(); + + EnterOverview(); + ASSERT_TRUE(Shell::Get()->overview_controller()->InOverviewSession()); + + // The highlight overlay should start out invisible. + views::View* highlight_overlay = + DesksTestApi::GetHighlightOverlayForDeskPreview(0); + ASSERT_FALSE(highlight_overlay->GetVisible()); + + // Open the context menu for the first desk and check that highlight overlay + // is now visible. + DeskPreviewView* desk_preview_view = + GetPrimaryRootDesksBarView()->mini_views()[0]->desk_preview(); + gfx::Point desk_preview_view_center = + desk_preview_view->GetBoundsInScreen().CenterPoint(); + auto* event_generator = GetEventGenerator(); + event_generator->MoveMouseTo(desk_preview_view_center); + event_generator->ClickRightButton(); + ASSERT_TRUE(Shell::Get()->overview_controller()->InOverviewSession()); + ASSERT_TRUE(highlight_overlay->GetVisible()); + + // Close the context menu and check that the highlight overlay is no longer + // visible. + event_generator->ClickLeftButton(); + + // We need to wait for the `DeskActionContextMenu` to close, because + // `SimpleMenuModel::MenuWillClose()` runs post tasks asynchronously. + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE(highlight_overlay->GetVisible()); +} + +// Checks that the combine desks tooltip's validity is maintained whenever the +// user adds a desk, closes a desk, moves a desk, or changes the name of a desk. +TEST_F(DesksCloseAllTest, CombineDesksTooltipIsUpdatedOnUserActions) { + // Possible sources for tooltip updates. + enum class UpdateSource { + kAddDesk, + kCloseDesk, + kMoveActiveDesk, + kMoveNonActiveDesk, + kChangeActiveDeskName, + kChangeNonActiveDeskName, + }; + + struct { + const std::string scope_trace; + const UpdateSource source; + + // The desk name that we expect `desk_1` in the test case to point to as the + // target for its combine desks operation after the test is performed. + const std::u16string expected_target_1; + + // The desk name that we expect `desk_2` in the test case to point to as the + // target for its combine desks operation after the test is performed. + const std::u16string expected_target_2; + } kTestCases[] = { + {"Adding desk", UpdateSource::kAddDesk, u"Desk 2", u"Desk 1"}, + {"Closing desk", UpdateSource::kCloseDesk, u"Desk 2", u"Desk 1"}, + {"Moving active desk", UpdateSource::kMoveActiveDesk, u"Desk 1", + u"Desk 2"}, + {"Moving non-active desk", UpdateSource::kMoveNonActiveDesk, u"Desk 2", + u"Desk 1"}, + {"Changing active desk name", UpdateSource::kChangeActiveDeskName, + u"Desk 2", u"goo"}, + {"Changing non-active desk name", UpdateSource::kChangeNonActiveDeskName, + u"gle", u"goo"}, + }; + + // We need to make the display this large so that the mini views are + // draggable. + UpdateDisplay("1366x768"); + auto* controller = DesksController::Get(); + + // Create two initial desks with one window each. + NewDesk(); + ASSERT_EQ(2u, controller->desks().size()); + Desk* desk_1 = controller->desks()[0].get(); + Desk* desk_2 = controller->desks()[1].get(); + + WindowHolder win1(CreateAppWindow()); + WindowHolder win2(CreateAppWindow()); + controller->SendToDeskAtIndex(win1.window(), 0); + controller->SendToDeskAtIndex(win2.window(), 1); + ASSERT_EQ(1u, desk_1->windows().size()); + ASSERT_EQ(1u, desk_2->windows().size()); + + EnterOverview(); + ASSERT_TRUE(Shell::Get()->overview_controller()->InOverviewSession()); + + const DesksBarView* desks_bar_view = GetPrimaryRootDesksBarView(); + + // Cache the mini views and their name views and combine desks buttons. + DeskMiniView* mini_view_1 = desks_bar_view->mini_views()[0]; + DeskMiniView* mini_view_2 = desks_bar_view->mini_views()[1]; + DeskNameView* desk_name_view_1 = mini_view_1->desk_name_view(); + DeskNameView* desk_name_view_2 = mini_view_2->desk_name_view(); + CloseButton* combine_desks_button_1 = + mini_view_1->desk_action_view()->combine_desks_button(); + CloseButton* combine_desks_button_2 = + mini_view_2->desk_action_view()->combine_desks_button(); + + const std::u16string tooltip_prefix = u"Combine with "; + auto* event_generator = GetEventGenerator(); + for (const auto& test_case : kTestCases) { + SCOPED_TRACE(test_case.scope_trace); + + ASSERT_TRUE(Shell::Get()->overview_controller()->InOverviewSession()); + ASSERT_EQ(tooltip_prefix + controller->GetCombineDesksTargetName(desk_1), + combine_desks_button_1->GetTooltipText()); + ASSERT_EQ(tooltip_prefix + controller->GetCombineDesksTargetName(desk_2), + combine_desks_button_2->GetTooltipText()); + + switch (test_case.source) { + case UpdateSource::kAddDesk: + NewDesk(); + break; + case UpdateSource::kCloseDesk: + ASSERT_EQ(3u, controller->desks().size()); + RemoveDesk(controller->desks()[2].get()); + break; + case UpdateSource::kMoveActiveDesk: + ASSERT_TRUE(controller->desks()[0]->is_active()); + StartDragDeskPreview(mini_view_1, event_generator); + ASSERT_TRUE(desks_bar_view->IsDraggingDesk()); + event_generator->MoveMouseTo( + mini_view_2->GetPreviewBoundsInScreen().CenterPoint()); + event_generator->ReleaseLeftButton(); + break; + case UpdateSource::kMoveNonActiveDesk: + ASSERT_FALSE(controller->desks()[0]->is_active()); + StartDragDeskPreview(mini_view_2, event_generator); + EXPECT_TRUE(desks_bar_view->IsDraggingDesk()); + event_generator->MoveMouseTo( + mini_view_1->GetPreviewBoundsInScreen().CenterPoint()); + event_generator->ReleaseLeftButton(); + break; + case UpdateSource::kChangeActiveDeskName: + ASSERT_TRUE(controller->desks()[0]->is_active()); + event_generator->MoveMouseTo( + desk_name_view_1->GetBoundsInScreen().CenterPoint()); + event_generator->ClickLeftButton(); + SendKey(ui::VKEY_G); + SendKey(ui::VKEY_O); + SendKey(ui::VKEY_O); + SendKey(ui::VKEY_RETURN); + break; + case UpdateSource::kChangeNonActiveDeskName: + ASSERT_EQ(u"goo", mini_view_1->desk()->name()); + ASSERT_FALSE(controller->desks()[1]->is_active()); + event_generator->MoveMouseTo( + desk_name_view_2->GetBoundsInScreen().CenterPoint()); + event_generator->ClickLeftButton(); + SendKey(ui::VKEY_G); + SendKey(ui::VKEY_L); + SendKey(ui::VKEY_E); + SendKey(ui::VKEY_RETURN); + break; + } + + EXPECT_EQ(tooltip_prefix + test_case.expected_target_1, + combine_desks_button_1->GetTooltipText()); + EXPECT_EQ(tooltip_prefix + test_case.expected_target_2, + combine_desks_button_2->GetTooltipText()); + } +} // TODO(afakhry): Add more tests: // - Always on top windows are not tracked by any desk.
diff --git a/ash/wm/desks/templates/desks_templates_unittest.cc b/ash/wm/desks/templates/desks_templates_unittest.cc index 4fcffb3..e7f6a2d 100644 --- a/ash/wm/desks/templates/desks_templates_unittest.cc +++ b/ash/wm/desks/templates/desks_templates_unittest.cc
@@ -63,6 +63,7 @@ #include "components/app_restore/full_restore_utils.h" #include "components/app_restore/window_info.h" #include "components/app_restore/window_properties.h" +#include "components/desks_storage/core/desk_template_util.h" #include "components/prefs/pref_service.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/window.h" @@ -133,6 +134,12 @@ for (size_t i = 0; i < num_windows.size(); ++i) { const std::string app_id = base::NumberToString(i); + // We need to add each `app_id` to app registry cache since our desk + // template serialization requires an updated app cache to get the app + // info. + desks_storage::desk_template_util::AddAppIdToAppRegistryCache( + account_id_, cache_.get(), app_id.c_str()); + for (int32_t window_id = 0; window_id < num_windows[i]; ++window_id) { restore_data->AddAppLaunchInfo( std::make_unique<app_restore::AppLaunchInfo>(app_id, window_id)); @@ -901,6 +908,8 @@ // Tests that the save desk as template button and save for later button are // enabled and disabled as expected based on the number of templates. TEST_F(DesksTemplatesTest, SaveDeskButtonsEnabledDisabled) { + desks_storage::LocalDeskDataManager:: + SetExcludeSaveAndRecallDeskInMaxEntryCountForTesting(true); // Create an app window which should be supported. auto no_app_id_window = CreateAppWindow(); auto* delegate = Shell::Get()->desks_templates_delegate(); @@ -3492,7 +3501,7 @@ SavedDeskItemView* second_item = GetItemViewFromTemplatesGrid(1); auto new_desk_template = second_item->desk_template()->Clone(); new_desk_template->set_template_name(u"Desk 2"); - DeskTemplate* new_desk_template_ptr = new_desk_template.get(); + const base::GUID uuid = new_desk_template->uuid(); base::RunLoop loop; desk_model()->AddOrUpdateEntry( @@ -3505,12 +3514,24 @@ })); loop.Run(); - // `LocalDeskStorage` does not support `EntriesAddedOrUpdatedRemotely`, so - // manually call it to simluate what the real model would do. - DesksTemplatesPresenter::Get()->EntriesAddedOrUpdatedRemotely( - {new_desk_template_ptr}); - ASSERT_EQ(u"Desk 2", second_item->name_view()->GetText()); - ASSERT_EQ(u"Desk 2", second_item->desk_template()->template_name()); + base::RunLoop loop1; + desk_model()->GetEntryByUUID( + uuid.AsLowercaseString(), + base::BindLambdaForTesting( + [&](desks_storage::DeskModel::GetEntryByUuidStatus status, + std::unique_ptr<ash::DeskTemplate> entry) { + EXPECT_EQ(desks_storage::DeskModel::GetEntryByUuidStatus::kOk, + status); + // `LocalDeskStorage` does not support + // `EntriesAddedOrUpdatedRemotely`, so + // manually call it to simluate what the real model would do. + DesksTemplatesPresenter::Get()->EntriesAddedOrUpdatedRemotely( + {entry.get()}); + ASSERT_EQ(u"Desk 2", second_item->name_view()->GetText()); + ASSERT_EQ(u"Desk 2", second_item->desk_template()->template_name()); + loop1.Quit(); + })); + loop1.Run(); // Save template 2 under new name and confirm, this will trigger replace // dialog.
diff --git a/ash/wm/overview/overview_test_base.cc b/ash/wm/overview/overview_test_base.cc index 4fb24de0..61c3f00 100644 --- a/ash/wm/overview/overview_test_base.cc +++ b/ash/wm/overview/overview_test_base.cc
@@ -21,6 +21,9 @@ #include "ash/wm/overview/scoped_overview_transform_window.h" #include "ash/wm/tablet_mode/tablet_mode_controller_test_api.h" #include "ash/wm/window_preview_view.h" +#include "components/app_constants/constants.h" +#include "components/desks_storage/core/desk_template_util.h" +#include "components/services/app_service/public/cpp/app_registry_cache_wrapper.h" #include "ui/aura/client/aura_constants.h" #include "ui/compositor/layer.h" #include "ui/compositor/presentation_time_recorder.h" @@ -169,10 +172,15 @@ AshTestBase::SetUp(); // Set the created model as the one shell will reference. - EXPECT_TRUE(desk_model_temp_dir_.CreateUniqueTempDir()); + EXPECT_TRUE(user_data_temp_dir_.CreateUniqueTempDir()); + account_id_ = AccountId::FromUserEmail("test@gmail.com"); + cache_ = std::make_unique<apps::AppRegistryCache>(); desk_model_ = std::make_unique<desks_storage::LocalDeskDataManager>( - desk_model_temp_dir_.GetPath()); + user_data_temp_dir_.GetPath(), account_id_); + desk_model_->SetExcludeSaveAndRecallDeskInMaxEntryCountForTesting(false); desk_model_->EnsureCacheIsLoaded(); + desks_storage::desk_template_util::PopulateAppRegistryCache(account_id_, + cache_.get()); static_cast<TestDesksTemplatesDelegate*>( Shell::Get()->desks_templates_delegate()) ->set_desk_model(desk_model_.get());
diff --git a/ash/wm/overview/overview_test_base.h b/ash/wm/overview/overview_test_base.h index b785465..5d6c2d5 100644 --- a/ash/wm/overview/overview_test_base.h +++ b/ash/wm/overview/overview_test_base.h
@@ -13,7 +13,9 @@ #include "ash/test/ash_test_base.h" #include "base/files/scoped_temp_dir.h" #include "base/test/metrics/histogram_tester.h" +#include "components/account_id/account_id.h" #include "components/desks_storage/core/local_desk_data_manager.h" +#include "components/services/app_service/public/cpp/app_registry_cache.h" namespace views { class Label; @@ -111,13 +113,15 @@ views::Widget* expected_next); base::HistogramTester histograms_; + std::unique_ptr<apps::AppRegistryCache> cache_; + AccountId account_id_; private: void CheckOverviewHistogram(const std::string& histogram, const std::vector<int>& counts); std::unique_ptr<desks_storage::LocalDeskDataManager> desk_model_; - base::ScopedTempDir desk_model_temp_dir_; + base::ScopedTempDir user_data_temp_dir_; std::unique_ptr<ShelfViewTestAPI> shelf_view_test_api_; std::vector<std::string> trace_names_; };
diff --git a/ash/wm/window_util.cc b/ash/wm/window_util.cc index 9894d0f2..eb5c5645 100644 --- a/ash/wm/window_util.cc +++ b/ash/wm/window_util.cc
@@ -86,8 +86,11 @@ } // namespace aura::Window* GetActiveWindow() { - return ::wm::GetActivationClient(Shell::GetPrimaryRootWindow()) - ->GetActiveWindow(); + if (auto* activation_client = + wm::GetActivationClient(Shell::GetPrimaryRootWindow())) { + return activation_client->GetActiveWindow(); + } + return nullptr; } aura::Window* GetFocusedWindow() {
diff --git a/base/BUILD.gn b/base/BUILD.gn index 8339521..434c6a4 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -2513,7 +2513,10 @@ buildflag_header("logging_buildflags") { header = "logging_buildflags.h" - flags = [ "ENABLE_LOG_ERROR_NOT_REACHED=$enable_log_error_not_reached" ] + flags = [ + "ENABLE_LOG_ERROR_NOT_REACHED=$enable_log_error_not_reached", + "USE_RUNTIME_VLOG=$use_runtime_vlog", + ] } buildflag_header("orderfile_buildflags") {
diff --git a/base/logging.cc b/base/logging.cc index 46484b9..26f8e04 100644 --- a/base/logging.cc +++ b/base/logging.cc
@@ -140,8 +140,10 @@ namespace { +#if BUILDFLAG(USE_RUNTIME_VLOG) VlogInfo* g_vlog_info = nullptr; VlogInfo* g_vlog_info_prev = nullptr; +#endif // BUILDFLAG(USE_RUNTIME_VLOG) const char* const log_severity_names[] = {"INFO", "WARNING", "ERROR", "FATAL"}; static_assert(LOGGING_NUM_SEVERITIES == std::size(log_severity_names), @@ -415,6 +417,7 @@ g_log_format = settings.log_format; #endif +#if BUILDFLAG(USE_RUNTIME_VLOG) if (base::CommandLine::InitializedForCurrentProcess()) { base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); // Don't bother initializing |g_vlog_info| unless we use one of the @@ -433,6 +436,7 @@ &g_min_log_level); } } +#endif // defined(USE_RUNTIME_VLOG) g_logging_destination = settings.logging_dest; @@ -511,12 +515,17 @@ int GetVlogLevelHelper(const char* file, size_t N) { DCHECK_GT(N, 0U); + +#if BUILDFLAG(USE_RUNTIME_VLOG) // Note: |g_vlog_info| may change on a different thread during startup // (but will always be valid or nullptr). VlogInfo* vlog_info = g_vlog_info; return vlog_info ? vlog_info->GetVlogLevel(base::StringPiece(file, N - 1)) : GetVlogVerbosity(); +#else + return GetVlogVerbosity(); +#endif // BUILDFLAG(USE_RUNTIME_VLOG) } void SetLogItems(bool enable_process_id, bool enable_thread_id, @@ -1158,6 +1167,12 @@ } #endif +#if !BUILDFLAG(USE_RUNTIME_VLOG) +int GetDisableAllVLogLevel() { + return -1; +} +#endif // !BUILDFLAG(USE_RUNTIME_VLOG) + } // namespace logging std::ostream& std::operator<<(std::ostream& out, const wchar_t* wstr) {
diff --git a/base/logging.h b/base/logging.h index a3ff92f0..30d05d79 100644 --- a/base/logging.h +++ b/base/logging.h
@@ -16,6 +16,7 @@ #include "base/callback_forward.h" #include "base/compiler_specific.h" #include "base/dcheck_is_on.h" +#include "base/logging_buildflags.h" #include "base/scoped_clear_last_error.h" #include "base/strings/string_piece_forward.h" #include "build/build_config.h" @@ -88,7 +89,17 @@ // VLOG(2) << "I'm printed when you run the program with --v=2 or more"; // // These always log at the INFO log level (when they log at all). -// The verbose logging can also be turned on module-by-module. For instance, +// +// There is a build flag USE_RUNTIME_VLOG that controls whether verbose +// logging is processed at runtime or at build time. +// +// When USE_RUNTIME_VLOG is not set, the verbose logging is processed at +// build time. VLOG(n) is only included and compiled when `n` is less than or +// equal to the verbose level defined by ENABLED_VLOG_LEVEL macro. Command line +// switch --v and --vmodule are ignored in this mode. +// +// When USE_RUNTIME_VLOG is set, the verbose logging is controlled at +// runtime and can be turned on module-by-module. For instance, // --vmodule=profile=2,icon_loader=1,browser_*=3,*/chromeos/*=4 --v=0 // will cause: // a. VLOG(2) and lower messages to be printed from profile.{h,cc} @@ -428,13 +439,55 @@ #define LOG_IS_ON(severity) \ (::logging::ShouldCreateLogMessage(::logging::LOGGING_##severity)) +#if !BUILDFLAG(USE_RUNTIME_VLOG) + +// When USE_RUNTIME_VLOG is not set, --vmodule is completely ignored and +// ENABLED_VLOG_LEVEL macro is used to determine the enabled VLOG levels +// at build time. +// +// Files that need VLOG would need to redefine ENABLED_VLOG_LEVEL to a desired +// VLOG level number, +// e.g. +// To enable VLOG(1) output, +// +// For a source cc file: +// +// #undef ENABLED_VLOG_LEVEL +// #define ENABLED_VLOG_LEVEL 1 +// +// For all cc files in a build target of a BUILD.gn: +// +// source_set("build_target") { +// ... +// +// defines = ["ENABLED_VLOG_LEVEL=1"] +// } + +// Returns a vlog level that suppresses all vlogs. Using this function so that +// compiler cannot calculate VLOG_IS_ON() and generate unreached code +// warnings. +BASE_EXPORT int GetDisableAllVLogLevel(); + +// Define the default ENABLED_VLOG_LEVEL if it is not defined. This is to +// allow ENABLED_VLOG_LEVEL to be overridden from defines in cc flags. +#if !defined(ENABLED_VLOG_LEVEL) +#define ENABLED_VLOG_LEVEL (logging::GetDisableAllVLogLevel()) +#endif // !defined(ENABLED_VLOG_LEVEL) + +#define VLOG_IS_ON(verboselevel) ((verboselevel) <= (ENABLED_VLOG_LEVEL)) + +#else + // We don't do any caching tricks with VLOG_IS_ON() like the // google-glog version since it increases binary size. This means // that using the v-logging functions in conjunction with --vmodule // may be slow. + #define VLOG_IS_ON(verboselevel) \ ((verboselevel) <= ::logging::GetVlogLevel(__FILE__)) +#endif + // Helper macro which avoids evaluating the arguments to a stream if // the condition doesn't hold. Condition is evaluated once and only once. #define LAZY_STREAM(stream, condition) \
diff --git a/base/logging_unittest.cc b/base/logging_unittest.cc index 911340d96..c4fa7438 100644 --- a/base/logging_unittest.cc +++ b/base/logging_unittest.cc
@@ -86,15 +86,37 @@ TEST_F(LoggingTest, BasicLogging) { MockLogSource mock_log_source; + + // 4 base logs: LOG, LOG_IF, PLOG, and PLOG_IF + int expected_logs = 4; + + // 4 verbose logs: VLOG, VLOG_IF, PVLOG, PVLOG_IF. + if (VLOG_IS_ON(0)) + expected_logs += 4; + + // 4 debug logs: DLOG, DLOG_IF, DPLOG, DPLOG_IF. + if (DCHECK_IS_ON()) + expected_logs += 4; + + // 4 verbose debug logs: DVLOG, DVLOG_IF, DVPLOG, DVPLOG_IF + if (VLOG_IS_ON(0) && DCHECK_IS_ON()) + expected_logs += 4; + EXPECT_CALL(mock_log_source, Log()) - .Times(DCHECK_IS_ON() ? 16 : 8) + .Times(expected_logs) .WillRepeatedly(Return("log message")); SetMinLogLevel(LOGGING_INFO); EXPECT_TRUE(LOG_IS_ON(INFO)); EXPECT_EQ(DCHECK_IS_ON(), DLOG_IS_ON(INFO)); + +#if BUILDFLAG(USE_RUNTIME_VLOG) EXPECT_TRUE(VLOG_IS_ON(0)); +#else + // VLOG defaults to off when not USE_RUNTIME_VLOG. + EXPECT_FALSE(VLOG_IS_ON(0)); +#endif // BUILDFLAG(USE_RUNTIME_VLOG) LOG(INFO) << mock_log_source.Log(); LOG_IF(INFO, true) << mock_log_source.Log(); @@ -840,6 +862,40 @@ } } +#if !BUILDFLAG(USE_RUNTIME_VLOG) +TEST_F(LoggingTest, BuildTimeVLOG) { + // Use a static because only captureless lambdas can be converted to a + // function pointer for SetLogMessageHandler(). + static base::NoDestructor<std::string> log_string; + SetLogMessageHandler([](int severity, const char* file, int line, + size_t start, const std::string& str) -> bool { + *log_string = str; + return true; + }); + + // No VLOG by default. + EXPECT_FALSE(VLOG_IS_ON(0)); + VLOG(1) << "Expect not logged"; + EXPECT_TRUE(log_string->empty()); + + // Re-define ENABLED_VLOG_LEVEL to enable VLOG(1). + // Note that ENABLED_VLOG_LEVEL has impact on all the code after it so please + // keep this test case the last one in this file. +#undef ENABLED_VLOG_LEVEL +#define ENABLED_VLOG_LEVEL 1 + + EXPECT_TRUE(VLOG_IS_ON(1)); + EXPECT_FALSE(VLOG_IS_ON(2)); + + VLOG(1) << "Expect logged"; + EXPECT_THAT(*log_string, ::testing::MatchesRegex(".* Expect logged\n")); + + log_string->clear(); + VLOG(2) << "Expect not logged"; + EXPECT_TRUE(log_string->empty()); +} +#endif // !BUILDFLAG(USE_RUNTIME_VLOG) + } // namespace } // namespace logging
diff --git a/base/metrics/statistics_recorder_unittest.cc b/base/metrics/statistics_recorder_unittest.cc index f9304d8d..d6fa89c 100644 --- a/base/metrics/statistics_recorder_unittest.cc +++ b/base/metrics/statistics_recorder_unittest.cc
@@ -703,6 +703,14 @@ EXPECT_EQ(callback_callcount, 1u); } +#if BUILDFLAG(USE_RUNTIME_VLOG) +// The following check that StatisticsRecorder::InitLogOnShutdownWhileLocked +// dumps the histogram graph to vlog if VLOG_IS_ON(1) at runtime. When +// USE_RUNTIME_VLOG is not set, all vlog levels are determined at build time +// and default to off. Since we do not want StatisticsRecorder to dump all the +// time, VLOG in its code stays off. As a result, the following tests would +// fail. + TEST_P(StatisticsRecorderTest, LogOnShutdownNotInitialized) { ResetVLogInitialized(); logging::SetMinLogLevel(logging::LOG_WARNING); @@ -732,6 +740,7 @@ EXPECT_TRUE(VLOG_IS_ON(1)); EXPECT_TRUE(IsVLogInitialized()); } +#endif // BUILDFLAG(USE_RUNTIME_VLOG) class TestHistogramProvider : public StatisticsRecorder::HistogramProvider { public:
diff --git a/build/config/logging.gni b/build/config/logging.gni index c2f94e9..ac19109 100644 --- a/build/config/logging.gni +++ b/build/config/logging.gni
@@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/buildflag_header.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/dcheck_always_on.gni") @@ -10,4 +11,22 @@ enable_log_error_not_reached = is_chromeos_ash && !(is_debug || dcheck_always_on) enable_stack_trace_line_numbers = false + + # Use runtime vlog everywhere except for ash-chrome. + # When `use_runtime_vlog` is true, + # command line switch `--vmodule=xxx` or `--v=x` could be used to + # control vlog level at runtime. + # when `use_runtime_volog` is false, + # verbose log level is controlled by `ENABLE_VLOG_LEVEL` macro. VLOG(n) + # is kept and generate output if `n` is less than or equal to the vlog + # level defined by the macro. + # Command line switch `--vmodule=xxx`, or `--v=x` would have no effect. + # + # Runtime vlog is used everywhere except on ash-chrome. + # Ash-chrome has a few vmodule patterns that need to be used indefinitely + # to investigate problems from logs in feedback reports. These vmodule + # patterns are using too much cpu cycles (see http://crbug/489441). Turning + # off runtime vlog and using build time vlog would avoid paying that cpu tax + # and have a nice side effect of a smaller production binary. + use_runtime_vlog = !is_chromeos_ash }
diff --git a/cc/base/math_util.cc b/cc/base/math_util.cc index 1aed6c1..7c700f83 100644 --- a/cc/base/math_util.cc +++ b/cc/base/math_util.cc
@@ -1007,6 +1007,7 @@ res->AppendDouble(rect.GetCornerRadii(gfx::RRectF::Corner::kLowerRight).y()); res->AppendDouble(rect.GetCornerRadii(gfx::RRectF::Corner::kLowerLeft).x()); res->AppendDouble(rect.GetCornerRadii(gfx::RRectF::Corner::kLowerLeft).y()); + res->EndArray(); } void MathUtil::AddToTracedValue(const char* name,
diff --git a/cc/trees/effect_node.cc b/cc/trees/effect_node.cc index b08f9cf..ffaddba 100644 --- a/cc/trees/effect_node.cc +++ b/cc/trees/effect_node.cc
@@ -182,7 +182,7 @@ value); if (mask_filter_info.HasRoundedCorners()) { MathUtil::AddCornerRadiiToTracedValue( - "mask_filter_rounded_corner_raii", + "mask_filter_rounded_corners_radii", mask_filter_info.rounded_corner_bounds(), value); value->SetBoolean("mask_filter_is_fast_rounded_corner", is_fast_rounded_corner);
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index f3f1d19..8879c58a 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -1486,23 +1486,6 @@ num_missing_tiles, total_visible_area); } - if (active_tree_->has_ever_been_drawn()) { - UMA_HISTOGRAM_COUNTS_100( - "Compositing.RenderPass.AppendQuadData.NumMissingTiles", - num_missing_tiles); - UMA_HISTOGRAM_COUNTS_100( - "Compositing.RenderPass.AppendQuadData.NumIncompleteTiles", - num_incomplete_tiles); - UMA_HISTOGRAM_COUNTS_1M( - "Compositing.RenderPass.AppendQuadData." - "CheckerboardedNoRecordingContentArea", - checkerboarded_no_recording_content_area); - UMA_HISTOGRAM_COUNTS_1M( - "Compositing.RenderPass.AppendQuadData." - "CheckerboardedNeedRasterContentArea", - checkerboarded_needs_raster_content_area); - } - TRACE_EVENT_END2("cc,benchmark", "LayerTreeHostImpl::CalculateRenderPasses", "draw_result", draw_result, "missing tiles", num_missing_tiles); @@ -2561,7 +2544,6 @@ } active_tree_->ResetAllChangeTracking(); - active_tree_->set_has_ever_been_drawn(true); devtools_instrumentation::DidDrawFrame( id_, frame->begin_frame_ack.frame_id.sequence_number); benchmark_instrumentation::IssueImplThreadRenderingStatsEvent(
diff --git a/cc/trees/layer_tree_host_pixeltest_filters.cc b/cc/trees/layer_tree_host_pixeltest_filters.cc index a4b25ed..75640ed 100644 --- a/cc/trees/layer_tree_host_pixeltest_filters.cc +++ b/cc/trees/layer_tree_host_pixeltest_filters.cc
@@ -149,14 +149,6 @@ } TEST_P(LayerTreeHostFiltersPixelTest, BackdropFilterBlurRadius) { -#if BUILDFLAG(IS_FUCHSIA) - // TODO(crbug.com/1311459): This test case fails on SwiftShader FEMU due - // to a new implementation of log/exp functions in SwiftShader. We should - // re-enable the test case once the bug is fixed. - if (renderer_type() == viz::RendererType::kSkiaVk) { - GTEST_SKIP(); - } -#endif if (use_software_renderer()) { // TODO(989238): Software renderer does not support/implement // kClamp_TileMode. @@ -178,7 +170,9 @@ gfx::RRectF backdrop_filter_bounds(gfx::RectF(gfx::SizeF(blur->bounds())), 0); blur->SetBackdropFilterBounds(backdrop_filter_bounds); -#if BUILDFLAG(IS_WIN) || defined(ARCH_CPU_ARM64) +#if BUILDFLAG(IS_FUCHSIA) + pixel_comparator_ = std::make_unique<FuzzyPixelOffByOneComparator>(false); +#elif BUILDFLAG(IS_WIN) || defined(ARCH_CPU_ARM64) // Windows and ARM64 have 436 pixels off by 1: crbug.com/259915 float percentage_pixels_large_error = 1.09f; // 436px / (200*200) float percentage_pixels_small_error = 0.0f; @@ -551,14 +545,6 @@ } TEST_P(LayerTreeHostFiltersPixelTest, ImageFilterScaled) { -#if BUILDFLAG(IS_FUCHSIA) - // TODO(crbug.com/1311459): This test case fails on SwiftShader FEMU due - // to a new implementation of log/exp functions in SwiftShader. We should - // re-enable the test case once the bug is fixed. - if (renderer_type() == viz::RendererType::kSkiaVk) { - GTEST_SKIP(); - } -#endif scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorWHITE); @@ -597,7 +583,11 @@ filter->SetBackdropFilters(filters); filter->ClearBackdropFilterBounds(); -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS_ASH) || \ +#if BUILDFLAG(IS_FUCHSIA) + if (renderer_type() == viz::RendererType::kSkiaVk) { + pixel_comparator_ = std::make_unique<FuzzyPixelOffByOneComparator>(false); + } +#elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS_ASH) || \ defined(_MIPS_ARCH_LOONGSON) || defined(ARCH_CPU_ARM64) #if BUILDFLAG(IS_WIN) // Windows has 153 pixels off by at most 2: crbug.com/225027
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index a24e4c0..e6d81ea 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc
@@ -166,7 +166,6 @@ needs_full_tree_sync_(true), needs_surface_ranges_sync_(false), next_activation_forces_redraw_(false), - has_ever_been_drawn_(false), handle_visibility_changed_(false), have_scroll_event_handlers_(false), event_listener_properties_(), @@ -735,8 +734,6 @@ if (commit_state.force_send_metadata_request) RequestForceSendMetadata(); - set_has_ever_been_drawn(false); - // TODO(ericrk): The viewport changes caused by |top_controls_shown_ratio_| // changes should propagate back to the main tree. This does not currently // happen, so we must force the impl tree to update its viewports if @@ -862,8 +859,6 @@ else target_tree->set_hud_layer(nullptr); - target_tree->has_ever_been_drawn_ = false; - // Note: this needs to happen after SetPropertyTrees. target_tree->HandleTickmarksVisibilityChange(); target_tree->HandleScrollbarShowRequests();
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h index 31063c4..28f07d2 100644 --- a/cc/trees/layer_tree_impl.h +++ b/cc/trees/layer_tree_impl.h
@@ -493,11 +493,6 @@ void ForceRedrawNextActivation() { next_activation_forces_redraw_ = true; } - void set_has_ever_been_drawn(bool has_drawn) { - has_ever_been_drawn_ = has_drawn; - } - bool has_ever_been_drawn() const { return has_ever_been_drawn_; } - void set_ui_resource_request_queue(UIResourceRequestQueue queue); const RenderSurfaceList& GetRenderSurfaceList() const; @@ -897,8 +892,6 @@ bool next_activation_forces_redraw_; - bool has_ever_been_drawn_; - bool handle_visibility_changed_; std::vector<std::unique_ptr<SwapPromise>> swap_promise_list_;
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 12d89e83..7d3f9bb 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -12,8 +12,7 @@ import("//chrome/android/chrome_java_resources.gni") import("//chrome/android/chrome_public_apk_tmpl.gni") import("//chrome/android/features/dev_ui/dev_ui_module.gni") -import( - "//chrome/android/features/start_surface/public/start_surface_public_java_sources.gni") +import("//chrome/android/features/start_surface/start_surface_java_sources.gni") import("//chrome/android/features/tab_ui/buildflags.gni") import("//chrome/android/features/tab_ui/tab_management_java_sources.gni") import("//chrome/android/features/vr/public_vr_java_sources.gni") @@ -340,8 +339,8 @@ "$google_play_services_package:google_play_services_vision_java", "//cc:cc_java", "//chrome/android/features/keyboard_accessory:public_java", + "//chrome/android/features/start_surface:java_resources", "//chrome/android/features/start_surface:public_java", - "//chrome/android/features/start_surface/internal:java_resources", "//chrome/android/modules/cablev2_authenticator/public:java", "//chrome/android/modules/image_editor/provider:java", "//chrome/android/modules/stack_unwinder/provider:java", @@ -689,7 +688,7 @@ # Include sources from public_tab_management_java_sources.gni. sources += public_tab_management_java_sources - sources += start_surface_public_java_sources + sources += start_surface_java_sources if (enable_arcore) { deps += [ @@ -722,7 +721,7 @@ } proguard_enabled = true proguard_configs += - [ "//chrome/android/features/start_surface/internal/proguard.flags" ] + [ "//chrome/android/features/start_surface/proguard.flags" ] } resources_package = "org.chromium.chrome" @@ -1362,8 +1361,8 @@ "//build/config/android/test/resource_overlay:javatests", "//cc:cc_java", "//chrome/android:chrome_java", + "//chrome/android/features/start_surface:java_resources", "//chrome/android/features/start_surface:public_java", - "//chrome/android/features/start_surface/internal:java_resources", "//chrome/android/features/tab_ui:java", "//chrome/android/features/tab_ui:java_resources", "//chrome/android/webapk/libs/client:client_java",
diff --git a/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected b/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected index 5ba49b6..89f622d 100644 --- a/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected +++ b/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected
@@ -379,24 +379,6 @@ # any sub-packages of that package can still be obfuscated. -keep public class org.chromium.support_lib_boundary.* { public *; } -# File: ../../chrome/android/features/start_surface/internal/proguard.flags -# Copyright 2019 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - - -# To fix crbug/1017396. This is because AppBarLayout$ScrollingViewBehavior -# is instantiated via java.lang.reflect.Constructor in CoordinatorLayout.java. -# Note that AppBarLayout$Behavior is needed to keep the scrolling behavior. --keep class com.google.android.material.appbar.AppBarLayout$Behavior { - public <init>(android.content.Context, android.util.AttributeSet); - public <init>(); -} --keep class com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior { - public <init>(android.content.Context, android.util.AttributeSet); - public <init>(); -} - # File: ../../android_webview/nonembedded/java/proguard.flags # Copyright 2016 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be @@ -457,6 +439,24 @@ public boolean requiresSignIn(); } +# File: ../../chrome/android/features/start_surface/proguard.flags +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + + +# To fix crbug/1017396. This is because AppBarLayout$ScrollingViewBehavior +# is instantiated via java.lang.reflect.Constructor in CoordinatorLayout.java. +# Note that AppBarLayout$Behavior is needed to keep the scrolling behavior. +-keep class com.google.android.material.appbar.AppBarLayout$Behavior { + public <init>(android.content.Context, android.util.AttributeSet); + public <init>(); +} +-keep class com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior { + public <init>(android.content.Context, android.util.AttributeSet); + public <init>(); +} + # File: obj/third_party/androidx/androidx_appcompat_appcompat_java/proguard.txt # Copyright (C) 2018 The Android Open Source Project #
diff --git a/chrome/android/features/start_surface/BUILD.gn b/chrome/android/features/start_surface/BUILD.gn index c067176..ae5b59d5 100644 --- a/chrome/android/features/start_surface/BUILD.gn +++ b/chrome/android/features/start_surface/BUILD.gn
@@ -4,39 +4,99 @@ import("//build/config/android/config.gni") import("//build/config/android/rules.gni") +import("//build/config/locales.gni") import("//chrome/browser/buildflags.gni") +import("//chrome/common/features.gni") +import("//components/feed/features.gni") +import("//tools/grit/grit_rule.gni") + +java_strings_grd("java_strings_grd") { + defines = chrome_grit_defines + grd_file = "java/strings/android_chrome_start_surface_strings.grd" + outputs = [ "values/android_chrome_start_surface_strings.xml" ] + process_file_template( + android_bundle_locales_as_resources, + [ "values-{{source_name_part}}/android_chrome_start_surface_strings.xml" ]) +} + +android_resources("java_resources") { + sources = [ + "java/res/drawable-hdpi/ic_explore.png", + "java/res/drawable-hdpi/ic_home.png", + "java/res/drawable-mdpi/ic_explore.png", + "java/res/drawable-mdpi/ic_home.png", + "java/res/drawable-xhdpi/ic_explore.png", + "java/res/drawable-xhdpi/ic_home.png", + "java/res/drawable-xxhdpi/ic_explore.png", + "java/res/drawable-xxhdpi/ic_home.png", + "java/res/drawable-xxxhdpi/ic_explore.png", + "java/res/drawable-xxxhdpi/ic_home.png", + "java/res/drawable/single_tab_background.xml", + "java/res/layout/query_tiles_layout.xml", + "java/res/layout/single_tab_view_layout.xml", + "java/res/layout/ss_bottom_bar_layout.xml", + "java/res/layout/ss_explore_button.xml", + "java/res/layout/ss_home_button.xml", + "java/res/layout/tasks_surface_search_box_layout.xml", + "java/res/layout/tasks_view_layout.xml", + "java/res/values/dimens.xml", + "java/res/values/ids.xml", + ] + deps = [ + ":java_strings_grd", + "//chrome/android:chrome_app_java_resources", + "//chrome/android/features/tab_ui:java_resources", + ] +} android_library("public_java") { sources = [ - "public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java", - "public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceState.java", - "public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceUserData.java", + "java/src/org/chromium/chrome/features/start_surface/ReturnToStartSurfaceUtil.java", + "java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java", + "java/src/org/chromium/chrome/features/start_surface/StartSurfaceState.java", + "java/src/org/chromium/chrome/features/start_surface/StartSurfaceUserData.java", + "java/src/org/chromium/chrome/features/tasks/SingleTabView.java", + "java/src/org/chromium/chrome/features/tasks/SingleTabViewBinder.java", + "java/src/org/chromium/chrome/features/tasks/SingleTabViewProperties.java", ] deps = [ + ":java_resources", "//base:base_java", "//base:jni_java", "//build/android:build_java", + "//chrome/android:chrome_app_java_resources", + "//chrome/browser/android/lifecycle:java", + "//chrome/browser/browser_controls/android:java", "//chrome/browser/flags:java", "//chrome/browser/preferences:java", "//chrome/browser/profiles/android:java", + "//chrome/browser/share:java", "//chrome/browser/tab:java", + "//chrome/browser/tabmodel:java", "//chrome/browser/ui/android/layouts:java", + "//chrome/browser/ui/android/omnibox:java", + "//chrome/browser/ui/messages/android:java", "//chrome/browser/util:java", + "//components/browser_ui/widget/android:java", + "//components/content_settings/android:content_settings_enums_java", "//components/prefs/android:java", "//components/user_prefs/android:java", "//third_party/androidx:androidx_annotation_annotation_java", "//third_party/metrics_proto:metrics_proto_java", + "//ui/android:ui_no_recycler_view_java", "//url:gurl_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] + resources_package = "org.chromium.chrome.start_surface" } generate_jni("jni_headers") { - sources = [ "public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java" ] + sources = [ "java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java" ] } android_library("test_support_java") { - sources = [ "internal/javatests/src/org/chromium/chrome/features/start_surface/ViewIds.java" ] + sources = [ + "javatests/src/org/chromium/chrome/features/start_surface/ViewIds.java", + ] deps = [ "//chrome/android:chrome_java" ] }
diff --git a/chrome/android/features/start_surface/internal/BUILD.gn b/chrome/android/features/start_surface/internal/BUILD.gn deleted file mode 100644 index f33295a..0000000 --- a/chrome/android/features/start_surface/internal/BUILD.gn +++ /dev/null
@@ -1,47 +0,0 @@ -# Copyright 2019 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//build/config/android/rules.gni") -import("//build/config/locales.gni") -import("//chrome/common/features.gni") -import("//components/feed/features.gni") -import("//tools/grit/grit_rule.gni") - -java_strings_grd("java_strings_grd") { - defines = chrome_grit_defines - grd_file = "java/strings/android_chrome_start_surface_strings.grd" - outputs = [ "values/android_chrome_start_surface_strings.xml" ] + process_file_template( - android_bundle_locales_as_resources, - [ "values-{{source_name_part}}/android_chrome_start_surface_strings.xml" ]) -} - -android_resources("java_resources") { - sources = [ - "java/res/drawable-hdpi/ic_explore.png", - "java/res/drawable-hdpi/ic_home.png", - "java/res/drawable-mdpi/ic_explore.png", - "java/res/drawable-mdpi/ic_home.png", - "java/res/drawable-xhdpi/ic_explore.png", - "java/res/drawable-xhdpi/ic_home.png", - "java/res/drawable-xxhdpi/ic_explore.png", - "java/res/drawable-xxhdpi/ic_home.png", - "java/res/drawable-xxxhdpi/ic_explore.png", - "java/res/drawable-xxxhdpi/ic_home.png", - "java/res/drawable/single_tab_background.xml", - "java/res/layout/query_tiles_layout.xml", - "java/res/layout/single_tab_view_layout.xml", - "java/res/layout/ss_bottom_bar_layout.xml", - "java/res/layout/ss_explore_button.xml", - "java/res/layout/ss_home_button.xml", - "java/res/layout/tasks_surface_search_box_layout.xml", - "java/res/layout/tasks_view_layout.xml", - "java/res/values/dimens.xml", - "java/res/values/ids.xml", - ] - deps = [ - ":java_strings_grd", - "//chrome/android:chrome_app_java_resources", - "//chrome/android/features/tab_ui:java_resources", - ] -}
diff --git a/chrome/android/features/start_surface/internal/javatests/start_surface_test_java_sources.gni b/chrome/android/features/start_surface/internal/javatests/start_surface_test_java_sources.gni deleted file mode 100644 index 980b80b0..0000000 --- a/chrome/android/features/start_surface/internal/javatests/start_surface_test_java_sources.gni +++ /dev/null
@@ -1,26 +0,0 @@ -# Copyright 2019 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -start_surface_test_java_sources = [ - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/BottomBarViewBinderTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinderTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartFeedTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartNewTabFromLauncherTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTabSwitcherTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartToolbarTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinderTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceFinaleTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTestUtils.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinderTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/tasks/SingleTabViewBinderTest.java", - "//chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/tasks/TasksViewBinderTest.java", -]
diff --git a/chrome/android/features/start_surface/internal/junit/start_surface_junit_java_sources.gni b/chrome/android/features/start_surface/internal/junit/start_surface_junit_java_sources.gni deleted file mode 100644 index f10b77c..0000000 --- a/chrome/android/features/start_surface/internal/junit/start_surface_junit_java_sources.gni +++ /dev/null
@@ -1,9 +0,0 @@ -# Copyright 2019 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -start_surface_junit_java_sources = [ - "//chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java", - "//chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediatorUnitTest.java", - "//chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/tasks/TasksSurfaceMediatorUnitTest.java", -]
diff --git a/chrome/android/features/start_surface/internal/java/res/drawable-hdpi/ic_explore.png b/chrome/android/features/start_surface/java/res/drawable-hdpi/ic_explore.png similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/drawable-hdpi/ic_explore.png rename to chrome/android/features/start_surface/java/res/drawable-hdpi/ic_explore.png Binary files differ
diff --git a/chrome/android/features/start_surface/internal/java/res/drawable-hdpi/ic_home.png b/chrome/android/features/start_surface/java/res/drawable-hdpi/ic_home.png similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/drawable-hdpi/ic_home.png rename to chrome/android/features/start_surface/java/res/drawable-hdpi/ic_home.png Binary files differ
diff --git a/chrome/android/features/start_surface/internal/java/res/drawable-mdpi/ic_explore.png b/chrome/android/features/start_surface/java/res/drawable-mdpi/ic_explore.png similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/drawable-mdpi/ic_explore.png rename to chrome/android/features/start_surface/java/res/drawable-mdpi/ic_explore.png Binary files differ
diff --git a/chrome/android/features/start_surface/internal/java/res/drawable-mdpi/ic_home.png b/chrome/android/features/start_surface/java/res/drawable-mdpi/ic_home.png similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/drawable-mdpi/ic_home.png rename to chrome/android/features/start_surface/java/res/drawable-mdpi/ic_home.png Binary files differ
diff --git a/chrome/android/features/start_surface/internal/java/res/drawable-xhdpi/ic_explore.png b/chrome/android/features/start_surface/java/res/drawable-xhdpi/ic_explore.png similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/drawable-xhdpi/ic_explore.png rename to chrome/android/features/start_surface/java/res/drawable-xhdpi/ic_explore.png Binary files differ
diff --git a/chrome/android/features/start_surface/internal/java/res/drawable-xhdpi/ic_home.png b/chrome/android/features/start_surface/java/res/drawable-xhdpi/ic_home.png similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/drawable-xhdpi/ic_home.png rename to chrome/android/features/start_surface/java/res/drawable-xhdpi/ic_home.png Binary files differ
diff --git a/chrome/android/features/start_surface/internal/java/res/drawable-xxhdpi/ic_explore.png b/chrome/android/features/start_surface/java/res/drawable-xxhdpi/ic_explore.png similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/drawable-xxhdpi/ic_explore.png rename to chrome/android/features/start_surface/java/res/drawable-xxhdpi/ic_explore.png Binary files differ
diff --git a/chrome/android/features/start_surface/internal/java/res/drawable-xxhdpi/ic_home.png b/chrome/android/features/start_surface/java/res/drawable-xxhdpi/ic_home.png similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/drawable-xxhdpi/ic_home.png rename to chrome/android/features/start_surface/java/res/drawable-xxhdpi/ic_home.png Binary files differ
diff --git a/chrome/android/features/start_surface/internal/java/res/drawable-xxxhdpi/ic_explore.png b/chrome/android/features/start_surface/java/res/drawable-xxxhdpi/ic_explore.png similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/drawable-xxxhdpi/ic_explore.png rename to chrome/android/features/start_surface/java/res/drawable-xxxhdpi/ic_explore.png Binary files differ
diff --git a/chrome/android/features/start_surface/internal/java/res/drawable-xxxhdpi/ic_home.png b/chrome/android/features/start_surface/java/res/drawable-xxxhdpi/ic_home.png similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/drawable-xxxhdpi/ic_home.png rename to chrome/android/features/start_surface/java/res/drawable-xxxhdpi/ic_home.png Binary files differ
diff --git a/chrome/android/features/start_surface/internal/java/res/drawable/single_tab_background.xml b/chrome/android/features/start_surface/java/res/drawable/single_tab_background.xml similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/drawable/single_tab_background.xml rename to chrome/android/features/start_surface/java/res/drawable/single_tab_background.xml
diff --git a/chrome/android/features/start_surface/internal/java/res/layout/query_tiles_layout.xml b/chrome/android/features/start_surface/java/res/layout/query_tiles_layout.xml similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/layout/query_tiles_layout.xml rename to chrome/android/features/start_surface/java/res/layout/query_tiles_layout.xml
diff --git a/chrome/android/features/start_surface/internal/java/res/layout/single_tab_view_layout.xml b/chrome/android/features/start_surface/java/res/layout/single_tab_view_layout.xml similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/layout/single_tab_view_layout.xml rename to chrome/android/features/start_surface/java/res/layout/single_tab_view_layout.xml
diff --git a/chrome/android/features/start_surface/internal/java/res/layout/ss_bottom_bar_layout.xml b/chrome/android/features/start_surface/java/res/layout/ss_bottom_bar_layout.xml similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/layout/ss_bottom_bar_layout.xml rename to chrome/android/features/start_surface/java/res/layout/ss_bottom_bar_layout.xml
diff --git a/chrome/android/features/start_surface/internal/java/res/layout/ss_explore_button.xml b/chrome/android/features/start_surface/java/res/layout/ss_explore_button.xml similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/layout/ss_explore_button.xml rename to chrome/android/features/start_surface/java/res/layout/ss_explore_button.xml
diff --git a/chrome/android/features/start_surface/internal/java/res/layout/ss_home_button.xml b/chrome/android/features/start_surface/java/res/layout/ss_home_button.xml similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/layout/ss_home_button.xml rename to chrome/android/features/start_surface/java/res/layout/ss_home_button.xml
diff --git a/chrome/android/features/start_surface/internal/java/res/layout/tasks_surface_search_box_layout.xml b/chrome/android/features/start_surface/java/res/layout/tasks_surface_search_box_layout.xml similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/layout/tasks_surface_search_box_layout.xml rename to chrome/android/features/start_surface/java/res/layout/tasks_surface_search_box_layout.xml
diff --git a/chrome/android/features/start_surface/internal/java/res/layout/tasks_view_layout.xml b/chrome/android/features/start_surface/java/res/layout/tasks_view_layout.xml similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/layout/tasks_view_layout.xml rename to chrome/android/features/start_surface/java/res/layout/tasks_view_layout.xml
diff --git a/chrome/android/features/start_surface/internal/java/res/values/dimens.xml b/chrome/android/features/start_surface/java/res/values/dimens.xml similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/values/dimens.xml rename to chrome/android/features/start_surface/java/res/values/dimens.xml
diff --git a/chrome/android/features/start_surface/internal/java/res/values/ids.xml b/chrome/android/features/start_surface/java/res/values/ids.xml similarity index 100% rename from chrome/android/features/start_surface/internal/java/res/values/ids.xml rename to chrome/android/features/start_surface/java/res/values/ids.xml
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/BackgroundTabAnimation.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/BackgroundTabAnimation.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/BackgroundTabAnimation.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/BackgroundTabAnimation.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/BottomBarCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/BottomBarCoordinator.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/BottomBarCoordinator.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/BottomBarCoordinator.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/BottomBarView.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/BottomBarView.java similarity index 99% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/BottomBarView.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/BottomBarView.java index 2ccead9c..ad68a5ff 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/BottomBarView.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/BottomBarView.java
@@ -18,7 +18,6 @@ /** The bottom bar view. */ // TODO(crbug.com/982018): Support dark mode. class BottomBarView extends FrameLayout { - private TabLayout mTabLayout; private TabLayout.Tab mHomeTab; private TabLayout.Tab mExploreTab;
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/BottomBarViewBinder.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/BottomBarViewBinder.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/BottomBarViewBinder.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/BottomBarViewBinder.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinator.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinator.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinator.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinatorFactory.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinatorFactory.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinatorFactory.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinatorFactory.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceFeedLifecycleManager.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceFeedLifecycleManager.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceFeedLifecycleManager.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceFeedLifecycleManager.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceNavigationDelegate.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceNavigationDelegate.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceNavigationDelegate.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceNavigationDelegate.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinder.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinder.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinder.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinder.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/FeedPlaceholderCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/FeedPlaceholderCoordinator.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/FeedPlaceholderCoordinator.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/FeedPlaceholderCoordinator.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ReturnToStartSurfaceUtil.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ReturnToStartSurfaceUtil.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ReturnToStartSurfaceUtil.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ReturnToStartSurfaceUtil.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinder.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinder.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinder.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinder.java
diff --git a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java similarity index 100% rename from chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java
diff --git a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java similarity index 100% rename from chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceProperties.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceProperties.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceProperties.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceProperties.java
diff --git a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceState.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceState.java similarity index 100% rename from chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceState.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceState.java
diff --git a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceUserData.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceUserData.java similarity index 99% rename from chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceUserData.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceUserData.java index 2430ab2..65909d01a 100644 --- a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceUserData.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceUserData.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.features.start_surface; import androidx.annotation.Nullable; + import org.chromium.base.UserData; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabLaunchType;
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinder.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinder.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinder.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinder.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabView.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabView.java similarity index 96% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabView.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabView.java index 0c7d93d..0c794405 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabView.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabView.java
@@ -11,7 +11,7 @@ import android.widget.LinearLayout; import android.widget.TextView; -import org.chromium.chrome.R; +import org.chromium.chrome.start_surface.R; /** View of the tab on the single tab tab switcher. */ class SingleTabView extends LinearLayout {
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabViewBinder.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabViewBinder.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabViewBinder.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabViewBinder.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabViewProperties.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabViewProperties.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabViewProperties.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabViewProperties.java
diff --git a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/tasks/TasksSurface.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurface.java similarity index 100% rename from chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/tasks/TasksSurface.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurface.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksSurfaceMediator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceMediator.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksSurfaceMediator.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceMediator.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksSurfaceProperties.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceProperties.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksSurfaceProperties.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceProperties.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksView.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksView.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksView.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksView.java
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksViewBinder.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksViewBinder.java similarity index 100% rename from chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksViewBinder.java rename to chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksViewBinder.java
diff --git a/chrome/android/features/start_surface/internal/java/strings/android_chrome_start_surface_strings.grd b/chrome/android/features/start_surface/java/strings/android_chrome_start_surface_strings.grd similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/android_chrome_start_surface_strings.grd rename to chrome/android/features/start_surface/java/strings/android_chrome_start_surface_strings.grd
diff --git a/chrome/android/features/start_surface/java/strings/android_chrome_start_surface_strings_grd/IDS_ACCESSIBILITY_START_SURFACE_BOTTOM_EXPLORE_BUTTON.png.sha1 b/chrome/android/features/start_surface/java/strings/android_chrome_start_surface_strings_grd/IDS_ACCESSIBILITY_START_SURFACE_BOTTOM_EXPLORE_BUTTON.png.sha1 new file mode 100644 index 0000000..dddd845 --- /dev/null +++ b/chrome/android/features/start_surface/java/strings/android_chrome_start_surface_strings_grd/IDS_ACCESSIBILITY_START_SURFACE_BOTTOM_EXPLORE_BUTTON.png.sha1
@@ -0,0 +1 @@ +391d15f5411f3fcb9deddc1d33770a5c7354e185 \ No newline at end of file
diff --git a/chrome/android/features/start_surface/java/strings/android_chrome_start_surface_strings_grd/IDS_ACCESSIBILITY_START_SURFACE_BOTTOM_HOME_BUTTON.png.sha1 b/chrome/android/features/start_surface/java/strings/android_chrome_start_surface_strings_grd/IDS_ACCESSIBILITY_START_SURFACE_BOTTOM_HOME_BUTTON.png.sha1 new file mode 100644 index 0000000..dddd845 --- /dev/null +++ b/chrome/android/features/start_surface/java/strings/android_chrome_start_surface_strings_grd/IDS_ACCESSIBILITY_START_SURFACE_BOTTOM_HOME_BUTTON.png.sha1
@@ -0,0 +1 @@ +391d15f5411f3fcb9deddc1d33770a5c7354e185 \ No newline at end of file
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_af.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_af.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_af.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_af.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_am.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_am.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_am.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_am.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ar.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ar.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ar.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ar.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_as.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_as.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_as.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_as.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_az.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_az.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_az.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_az.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_be.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_be.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_be.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_be.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_bg.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_bg.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_bg.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_bg.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_bn.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_bn.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_bn.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_bn.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_bs.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_bs.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_bs.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_bs.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ca.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ca.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ca.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ca.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_cs.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_cs.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_cs.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_cs.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_cy.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_cy.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_cy.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_cy.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_da.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_da.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_da.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_da.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_de.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_de.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_de.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_de.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_el.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_el.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_el.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_el.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_en-GB.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_en-GB.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_en-GB.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_en-GB.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_es-419.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_es-419.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_es-419.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_es-419.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_es.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_es.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_es.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_es.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_et.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_et.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_et.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_et.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_eu.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_eu.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_eu.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_eu.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_fa.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_fa.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_fa.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_fa.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_fi.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_fi.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_fi.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_fi.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_fil.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_fil.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_fil.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_fil.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_fr-CA.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_fr-CA.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_fr-CA.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_fr-CA.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_fr.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_fr.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_fr.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_fr.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_gl.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_gl.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_gl.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_gl.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_gu.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_gu.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_gu.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_gu.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_hi.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_hi.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_hi.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_hi.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_hr.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_hr.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_hr.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_hr.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_hu.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_hu.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_hu.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_hu.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_hy.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_hy.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_hy.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_hy.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_id.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_id.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_id.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_id.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_is.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_is.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_is.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_is.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_it.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_it.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_it.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_it.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_iw.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_iw.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_iw.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_iw.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ja.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ja.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ja.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ja.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ka.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ka.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ka.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ka.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_kk.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_kk.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_kk.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_kk.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_km.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_km.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_km.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_km.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_kn.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_kn.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_kn.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_kn.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ko.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ko.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ko.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ko.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ky.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ky.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ky.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ky.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_lo.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_lo.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_lo.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_lo.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_lt.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_lt.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_lt.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_lt.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_lv.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_lv.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_lv.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_lv.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_mk.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_mk.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_mk.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_mk.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ml.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ml.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ml.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ml.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_mn.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_mn.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_mn.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_mn.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_mr.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_mr.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_mr.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_mr.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ms.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ms.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ms.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ms.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_my.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_my.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_my.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_my.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ne.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ne.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ne.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ne.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_nl.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_nl.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_nl.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_nl.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_no.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_no.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_no.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_no.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_or.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_or.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_or.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_or.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_pa.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_pa.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_pa.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_pa.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_pl.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_pl.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_pl.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_pl.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_pt-BR.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_pt-BR.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_pt-BR.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_pt-BR.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_pt-PT.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_pt-PT.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_pt-PT.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_pt-PT.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ro.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ro.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ro.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ro.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ru.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ru.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ru.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ru.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_si.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_si.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_si.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_si.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_sk.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_sk.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_sk.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_sk.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_sl.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_sl.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_sl.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_sl.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_sq.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_sq.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_sq.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_sq.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_sr-Latn.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_sr-Latn.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_sr-Latn.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_sr-Latn.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_sr.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_sr.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_sr.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_sr.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_sv.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_sv.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_sv.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_sv.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_sw.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_sw.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_sw.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_sw.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ta.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ta.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ta.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ta.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_te.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_te.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_te.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_te.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_th.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_th.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_th.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_th.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_tr.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_tr.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_tr.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_tr.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_uk.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_uk.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_uk.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_uk.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ur.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ur.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_ur.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_ur.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_uz.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_uz.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_uz.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_uz.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_vi.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_vi.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_vi.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_vi.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_zh-CN.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_zh-CN.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_zh-CN.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_zh-CN.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_zh-HK.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_zh-HK.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_zh-HK.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_zh-HK.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_zh-TW.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_zh-TW.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_zh-TW.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_zh-TW.xtb
diff --git a/chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_zu.xtb b/chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_zu.xtb similarity index 100% rename from chrome/android/features/start_surface/internal/java/strings/translations/android_chrome_start_surface_strings_zu.xtb rename to chrome/android/features/start_surface/java/strings/translations/android_chrome_start_surface_strings_zu.xtb
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/BottomBarViewBinderTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/BottomBarViewBinderTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/BottomBarViewBinderTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/BottomBarViewBinderTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinderTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinderTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinderTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinderTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartFeedTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartFeedTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartFeedTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartFeedTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartNewTabFromLauncherTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartNewTabFromLauncherTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartNewTabFromLauncherTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartNewTabFromLauncherTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTabSwitcherTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTabSwitcherTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTabSwitcherTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTabSwitcherTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartToolbarTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartToolbarTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartToolbarTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartToolbarTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinderTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinderTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinderTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinderTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceFinaleTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceFinaleTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceFinaleTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceFinaleTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTestUtils.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTestUtils.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTestUtils.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTestUtils.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinderTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinderTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinderTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinderTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/ViewIds.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/ViewIds.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/ViewIds.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/ViewIds.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/tasks/SingleTabViewBinderTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/tasks/SingleTabViewBinderTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/tasks/SingleTabViewBinderTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/tasks/SingleTabViewBinderTest.java
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/tasks/TasksViewBinderTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/tasks/TasksViewBinderTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/tasks/TasksViewBinderTest.java rename to chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/tasks/TasksViewBinderTest.java
diff --git a/chrome/android/features/start_surface/javatests/start_surface_test_java_sources.gni b/chrome/android/features/start_surface/javatests/start_surface_test_java_sources.gni new file mode 100644 index 0000000..12b6a64 --- /dev/null +++ b/chrome/android/features/start_surface/javatests/start_surface_test_java_sources.gni
@@ -0,0 +1,26 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +start_surface_test_java_sources = [ + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/BottomBarViewBinderTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinderTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartFeedTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartNewTabFromLauncherTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTabSwitcherTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartToolbarTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinderTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceFinaleTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTestUtils.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinderTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/tasks/SingleTabViewBinderTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/tasks/TasksViewBinderTest.java", +]
diff --git a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java rename to chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
diff --git a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediatorUnitTest.java b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediatorUnitTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediatorUnitTest.java rename to chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediatorUnitTest.java
diff --git a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/tasks/TasksSurfaceMediatorUnitTest.java b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/TasksSurfaceMediatorUnitTest.java similarity index 100% rename from chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/tasks/TasksSurfaceMediatorUnitTest.java rename to chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/TasksSurfaceMediatorUnitTest.java
diff --git a/chrome/android/features/start_surface/junit/start_surface_junit_java_sources.gni b/chrome/android/features/start_surface/junit/start_surface_junit_java_sources.gni new file mode 100644 index 0000000..622e98cb --- /dev/null +++ b/chrome/android/features/start_surface/junit/start_surface_junit_java_sources.gni
@@ -0,0 +1,9 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +start_surface_junit_java_sources = [ + "//chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java", + "//chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediatorUnitTest.java", + "//chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/TasksSurfaceMediatorUnitTest.java", +]
diff --git a/chrome/android/features/start_surface/internal/proguard.flags b/chrome/android/features/start_surface/proguard.flags similarity index 100% rename from chrome/android/features/start_surface/internal/proguard.flags rename to chrome/android/features/start_surface/proguard.flags
diff --git a/chrome/android/features/start_surface/public/start_surface_public_java_sources.gni b/chrome/android/features/start_surface/public/start_surface_public_java_sources.gni deleted file mode 100644 index c84126f88..0000000 --- a/chrome/android/features/start_surface/public/start_surface_public_java_sources.gni +++ /dev/null
@@ -1,37 +0,0 @@ -# Copyright 2019 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# TODO: Move this to the target public_java too. -start_surface_public_java_sources = [ - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/BackgroundTabAnimation.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/BottomBarCoordinator.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/BottomBarView.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/BottomBarViewBinder.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinator.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinatorFactory.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceFeedLifecycleManager.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceNavigationDelegate.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinder.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/FeedPlaceholderCoordinator.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/ReturnToStartSurfaceUtil.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinder.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceProperties.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinder.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabView.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabViewBinder.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/SingleTabViewProperties.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksSurfaceMediator.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksSurfaceProperties.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksView.java", - "//chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/tasks/TasksViewBinder.java", - "//chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java", - "//chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/tasks/TasksSurface.java", -]
diff --git a/chrome/android/features/start_surface/start_surface_java_sources.gni b/chrome/android/features/start_surface/start_surface_java_sources.gni new file mode 100644 index 0000000..b9b7ebbc --- /dev/null +++ b/chrome/android/features/start_surface/start_surface_java_sources.gni
@@ -0,0 +1,33 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# TODO: Move this to the target public_java too. +start_surface_java_sources = [ + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/BackgroundTabAnimation.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/BottomBarCoordinator.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/BottomBarView.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/BottomBarViewBinder.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinator.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinatorFactory.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceFeedLifecycleManager.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceNavigationDelegate.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceViewBinder.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/FeedPlaceholderCoordinator.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinder.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceProperties.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinder.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurface.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceMediator.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceProperties.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksView.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksViewBinder.java", +]
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java index 9d7aa73..40557b4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -320,6 +320,7 @@ PropertyModel propertyModel = AppMenuUtil.menuItemToPropertyModel(item); propertyModel.set(AppMenuItemProperties.ICON_COLOR_RES, getMenuItemIconColorRes(item)); propertyModel.set(AppMenuItemProperties.SUPPORT_ENTER_ANIMATION, true); + propertyModel.set(AppMenuItemProperties.MENU_ICON_AT_START, isMenuIconAtStart()); if (item.hasSubMenu()) { // Only support top level menu items have SUBMENU, and a SUBMENU item cannot have a // SUBMENU. @@ -982,6 +983,11 @@ getUmaEnumForMenuItem(menuItemId), AppMenuHighlightItem.NUM_ENTRIES); } + @Override + public boolean isMenuIconAtStart() { + return false; + } + private int getUmaEnumForMenuItem(@Nullable @IdRes Integer menuItemId) { if (menuItemId == null) return AppMenuHighlightItem.UNKNOWN;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java index eeab157..3fd3f96 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java
@@ -366,6 +366,10 @@ @Override public AppMenuPropertiesDelegate createAppMenuPropertiesDelegate() { + // Menu icon is at the other side of the toolbar relative to the close button, so it will be + // at the start when the close button is at the end. + boolean isMenuIconAtStart = mIntentDataProvider.getCloseButtonPosition() + == BrowserServicesIntentDataProvider.CLOSE_BUTTON_POSITION_END; return new CustomTabAppMenuPropertiesDelegate(this, getActivityTabProvider(), getMultiWindowModeStateDispatcher(), getTabModelSelector(), getToolbarManager(), getWindow().getDecorView(), mBookmarkBridgeSupplier, mVerifier, @@ -373,7 +377,8 @@ mIntentDataProvider.isOpenedByChrome(), mIntentDataProvider.shouldShowShareMenuItem(), mIntentDataProvider.shouldShowStarButton(), - mIntentDataProvider.shouldShowDownloadButton(), mIntentDataProvider.isIncognito()); + mIntentDataProvider.shouldShowDownloadButton(), mIntentDataProvider.isIncognito(), + isMenuIconAtStart); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java index 86e2af0..a0d7221 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
@@ -55,6 +55,7 @@ private final boolean mShowDownload; private final boolean mIsOpenedByChrome; private final boolean mIsIncognito; + private final boolean mIsStartIconMenu; private final List<String> mMenuEntries; private final Map<String, Integer> mTitleToItemIdMap = new HashMap<String, Integer>(); @@ -69,7 +70,8 @@ TabModelSelector tabModelSelector, ToolbarManager toolbarManager, View decorView, ObservableSupplier<BookmarkBridge> bookmarkBridgeSupplier, Verifier verifier, @CustomTabsUiType final int uiType, List<String> menuEntries, boolean isOpenedByChrome, - boolean showShare, boolean showStar, boolean showDownload, boolean isIncognito) { + boolean showShare, boolean showStar, boolean showDownload, boolean isIncognito, + boolean isStartIconMenu) { super(context, activityTabProvider, multiWindowModeStateDispatcher, tabModelSelector, toolbarManager, decorView, null, null, bookmarkBridgeSupplier); mVerifier = verifier; @@ -80,6 +82,7 @@ mShowStar = showStar; mShowDownload = showDownload; mIsIncognito = isIncognito; + mIsStartIconMenu = isStartIconMenu; } @Override @@ -262,4 +265,9 @@ } return AppMenuPropertiesDelegate.INVALID_ITEM_ID; } + + @Override + public boolean isMenuIconAtStart() { + return mIsStartIconMenu; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/crow/CrowButtonDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/share/crow/CrowButtonDelegateImpl.java index 434a9f1..851f423 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/share/crow/CrowButtonDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/share/crow/CrowButtonDelegateImpl.java
@@ -10,8 +10,11 @@ import androidx.annotation.VisibleForTesting; import androidx.browser.customtabs.CustomTabsIntent; +import org.chromium.base.Callback; import org.chromium.chrome.browser.customtabs.CustomTabActivity; import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl; +import org.chromium.chrome.browser.tab.Tab; import org.chromium.ui.util.ColorUtils; import org.chromium.url.GURL; @@ -39,11 +42,9 @@ } @Override - public void launchCustomTab(Activity currentActivity, GURL pageUrl) { - // TODO(skare): Fetch canonical URL, based on ShareDelegate.shouldFetchCanonicalUrl() - // and ShareDelegate.getUrlToShare. - String customTabUrl = buildServerUrl( - new GURL(getServerUrl()), pageUrl, pageUrl, getPublicationId(pageUrl)); + public void launchCustomTab(Activity currentActivity, GURL pageUrl, GURL canonicalUrl) { + String customTabUrl = buildServerUrl(new GURL(getServerUrl()), pageUrl, canonicalUrl, + getPublicationId(pageUrl), areMetricsEnabled()); CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); builder.setShowTitle(true); @@ -102,14 +103,28 @@ ChromeFeatureList.SHARE_CROW_BUTTON, APP_MENU_BUTTON_TEXT_PARAM); } + @Override + public void requestCanonicalUrl(Tab tab, Callback<GURL> callback) { + if (tab.getWebContents() == null || tab.getWebContents().getMainFrame() == null + || tab.getUrl().isEmpty()) { + callback.onResult(GURL.emptyGURL()); + return; + } + tab.getWebContents().getMainFrame().getCanonicalUrlForSharing(callback); + } + private String getServerUrl() { return ChromeFeatureList.getFieldTrialParamByFeature( ChromeFeatureList.SHARE_CROW_BUTTON, DEBUG_SERVER_URL_PARAM); } + private boolean areMetricsEnabled() { + return PrivacyPreferencesManagerImpl.getInstance().isUsageAndCrashReportingPermitted(); + } + @VisibleForTesting - public String buildServerUrl( - GURL serverUrl, GURL pageUrl, GURL canonicalPageUrl, String publicationId) { + public String buildServerUrl(GURL serverUrl, GURL pageUrl, GURL canonicalPageUrl, + String publicationId, boolean allowMetrics) { String serverSpec = serverUrl.getSpec(); if (serverSpec.isEmpty()) return ""; Uri.Builder builder = Uri.parse(serverSpec).buildUpon(); @@ -117,8 +132,7 @@ builder.appendQueryParameter("entry", "menu"); builder.appendQueryParameter("relCanonUrl", canonicalPageUrl.getSpec()); builder.appendQueryParameter("publicationId", publicationId); - // TODO(skare): query PrivacyPreferencesManagerImpl - builder.appendQueryParameter("metrics", "false"); + builder.appendQueryParameter("metrics", allowMetrics ? "true" : "false"); return builder.build().toString(); } }
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index 0268b36c..1b97166 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -8,9 +8,9 @@ import("//chrome/android/chrome_test_java_sources.gni") import("//chrome/android/features/autofill_assistant/public/java_sources.gni") import( - "//chrome/android/features/start_surface/internal/javatests/start_surface_test_java_sources.gni") + "//chrome/android/features/start_surface/javatests/start_surface_test_java_sources.gni") import( - "//chrome/android/features/start_surface/internal/junit/start_surface_junit_java_sources.gni") + "//chrome/android/features/start_surface/junit/start_surface_junit_java_sources.gni") import("//chrome/android/features/tab_ui/tab_management_java_sources.gni") import("//chrome/android/feed/feed_java_sources.gni") import(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchInstrumentationBase.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchInstrumentationBase.java index 8437310..60b4c079 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchInstrumentationBase.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchInstrumentationBase.java
@@ -304,7 +304,7 @@ protected static final String RELATED_SEARCHES_NODE = "intelligence"; private static final String TAG = "CSIBase"; - private static final int TEST_TIMEOUT = 15000; + private static final int TEST_TIMEOUT = 1500; private static final int TEST_EXPECTED_FAILURE_TIMEOUT = 1000; private static final int PANEL_INTERACTION_MAX_RETRIES = 3; @@ -622,6 +622,8 @@ success = true; } catch (AssertionError | TimeoutException e) { if (tries > PANEL_INTERACTION_MAX_RETRIES) { + Log.e(TAG, "ctxs Failed interactions and giving up.", e); + Thread.dumpStack(); throw e; } else { Log.e(TAG, "Failed to peek panel bar, trying again.", e);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/share/crow/CrowButtonDelegateImplTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/share/crow/CrowButtonDelegateImplTest.java index 9fd73af3..3f0304e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/share/crow/CrowButtonDelegateImplTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/share/crow/CrowButtonDelegateImplTest.java
@@ -39,29 +39,38 @@ final GURL serverUrlWithoutQueryString = new GURL("http://www.foo.com/v1/api"); final GURL shareUrl1 = new GURL("https://testSiteWeAreSharing.com/blog/entry"); final GURL shareUrl2 = new GURL("https://testSiteWeAreSharing.com/?blog=1&entry=2"); + boolean allowMetrics = true; - assertEquals("", delegate.buildServerUrl(GURL.emptyGURL(), shareUrl1, shareUrl1, "")); + assertEquals("", + delegate.buildServerUrl(GURL.emptyGURL(), shareUrl1, shareUrl1, "", allowMetrics)); // Baseline/common case. assertEquals( - "https://www.foo.com/v1/api?q=hi&pageUrl=https%3A%2F%2Ftestsitewearesharing.com%2Fblog%2Fentry&entry=menu&relCanonUrl=https%3A%2F%2Ftestsitewearesharing.com%2Fblog%2Fentry&publicationId=pubId1&metrics=false", - delegate.buildServerUrl(serverUrl, shareUrl1, shareUrl1, "pubId1")); + "https://www.foo.com/v1/api?q=hi&pageUrl=https%3A%2F%2Ftestsitewearesharing.com%2Fblog%2Fentry&entry=menu&relCanonUrl=https%3A%2F%2Ftestsitewearesharing.com%2Fblog%2Fentry&publicationId=pubId1&metrics=true", + delegate.buildServerUrl(serverUrl, shareUrl1, shareUrl1, "pubId1", allowMetrics)); // Sending a URL with urlparams of its own. assertEquals( - "https://www.foo.com/v1/api?q=hi&pageUrl=https%3A%2F%2Ftestsitewearesharing.com%2F%3Fblog%3D1%26entry%3D2&entry=menu&relCanonUrl=https%3A%2F%2Ftestsitewearesharing.com%2F%3Fblog%3D1%26entry%3D2&publicationId=pubId2&metrics=false", - delegate.buildServerUrl(serverUrl, shareUrl2, shareUrl2, "pubId2")); + "https://www.foo.com/v1/api?q=hi&pageUrl=https%3A%2F%2Ftestsitewearesharing.com%2F%3Fblog%3D1%26entry%3D2&entry=menu&relCanonUrl=https%3A%2F%2Ftestsitewearesharing.com%2F%3Fblog%3D1%26entry%3D2&publicationId=pubId2&metrics=true", + delegate.buildServerUrl(serverUrl, shareUrl2, shareUrl2, "pubId2", allowMetrics)); // Empty canonical URL is ok, passes as empty param. assertEquals( - "https://www.foo.com/v1/api?q=hi&pageUrl=https%3A%2F%2Ftestsitewearesharing.com%2Fblog%2Fentry&entry=menu&relCanonUrl=&publicationId=pubId1&metrics=false", - delegate.buildServerUrl(serverUrl, shareUrl1, GURL.emptyGURL(), "pubId1")); + "https://www.foo.com/v1/api?q=hi&pageUrl=https%3A%2F%2Ftestsitewearesharing.com%2Fblog%2Fentry&entry=menu&relCanonUrl=&publicationId=pubId1&metrics=true", + delegate.buildServerUrl( + serverUrl, shareUrl1, GURL.emptyGURL(), "pubId1", allowMetrics)); // Experimental URL can be passed with an empty set of params. assertEquals( - "http://www.foo.com/v1/api?pageUrl=https%3A%2F%2Ftestsitewearesharing.com%2Fblog%2Fentry&entry=menu&relCanonUrl=https%3A%2F%2Ftestsitewearesharing.com%2Fblog%2Fentry&publicationId=pubId1&metrics=false", + "http://www.foo.com/v1/api?pageUrl=https%3A%2F%2Ftestsitewearesharing.com%2Fblog%2Fentry&entry=menu&relCanonUrl=https%3A%2F%2Ftestsitewearesharing.com%2Fblog%2Fentry&publicationId=pubId1&metrics=true", delegate.buildServerUrl( - serverUrlWithoutQueryString, shareUrl1, shareUrl1, "pubId1")); + serverUrlWithoutQueryString, shareUrl1, shareUrl1, "pubId1", allowMetrics)); + + // Metrics off should be reflected. + allowMetrics = false; + assertEquals( + "https://www.foo.com/v1/api?q=hi&pageUrl=https%3A%2F%2Ftestsitewearesharing.com%2Fblog%2Fentry&entry=menu&relCanonUrl=https%3A%2F%2Ftestsitewearesharing.com%2Fblog%2Fentry&publicationId=pubId1&metrics=false", + delegate.buildServerUrl(serverUrl, shareUrl1, shareUrl1, "pubId1", allowMetrics)); } @Test
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index 265ef46..e61a9ea 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -2934,6 +2934,9 @@ <message name="IDS_ENTERPRISE_ENROLLMENT_SCREEN_TITLE" desc="The title on the enterprise enrollment dialog."> Enterprise enrollment </message> + <message name="IDS_ENTERPRISE_ENROLLMENT_SCREEN_PROGRESS_LABEL" desc="The a11y label for enrollment in progress dialog with spinner."> + Enterprise enrollment in progress + </message> <message name="IDS_ENTERPRISE_ACCOUNT_CHECK_TITLE" desc="The title of spinner dialog shown during account check."> Checking eligibility </message> @@ -2983,11 +2986,14 @@ Confirm kiosk and signage device enrollment? </message> <message name="IDS_ENTERPRISE_ENROLLMENT_KIOSK_CONFIRM_MESSAGE" desc="Message of kiosk confirm enrollment screen."> - You will use a Kiosk & Signage Upgrade which only allows the device to run in kiosk or signage mode. If you would like users to sign into the device, please go back and enroll using Chrome Enterpirse Upgrade. + You will use a Kiosk & Signage Upgrade which only allows the device to run in kiosk or signage mode. If you would like users to sign into the device, please go back and enroll using Chrome Enterprise Upgrade. </message> <message name="IDS_ENTERPRISE_ENROLLMENT_KIOSK_CONFIRM_POWERWASH_MESSAGE" desc="Message of kiosk confirm enrollment screen."> If you want to switch after enrollment, you will need to factory reset (powerwash) your device. </message> + <message name="IDS_ENTERPRISE_ENROLLMENT_KIOSK_CANCEL_BUTTON" desc="Label for the decline button on the cofirm kiosk enrollment screen in the enterprise enrollment dialog."> + Decline + </message> <message name="IDS_ENTERPRISE_ENROLLMENT_KIOSK_CONFIRM_BUTTON" desc="Label for the confirm button on the cofirm kiosk enrollment screen in the enterprise enrollment dialog."> Confirm </message>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_KIOSK_CANCEL_BUTTON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_KIOSK_CANCEL_BUTTON.png.sha1 new file mode 100644 index 0000000..586f3781 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_KIOSK_CANCEL_BUTTON.png.sha1
@@ -0,0 +1 @@ +f28ab8c54252346ea2a61b22413e0f3df8c5affd \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_KIOSK_CONFIRM_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_KIOSK_CONFIRM_MESSAGE.png.sha1 index 14b0bfa..8a50cd5 100644 --- a/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_KIOSK_CONFIRM_MESSAGE.png.sha1 +++ b/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_KIOSK_CONFIRM_MESSAGE.png.sha1
@@ -1 +1 @@ -bd6af00db9309ed625672d6df68a9643b819663a \ No newline at end of file +b492cd6444314787f34216f5c21a450b76693e92 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_SCREEN_PROGRESS_LABEL.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_SCREEN_PROGRESS_LABEL.png.sha1 new file mode 100644 index 0000000..36b3021 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_SCREEN_PROGRESS_LABEL.png.sha1
@@ -0,0 +1 @@ +8fe26efd3bb2710fb94a6d1350019cceae5c716f \ No newline at end of file
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index 971e2d8..53930ac 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -235,11 +235,6 @@ <include name="IDR_PRODUCT_CHROMEOS_SYNC_CONSENT_SCREEN_ICONS" file="internal\resources\chromeos-sync-consent-icons.html" type="BINDATA" /> <include name="IDR_PRODUCT_CHROMEOS_SYNC_CONSENT_SCREEN_ICONS_M_JS" file="internal\resources\chromeos-sync-consent-icons.m.js" type="BINDATA" /> </if> - <if expr="not is_android"> - <include name="IDR_IDENTITY_INTERNALS_HTML" file="resources\identity_internals\identity_internals.html" type="BINDATA" /> - <include name="IDR_IDENTITY_INTERNALS_CSS" file="resources\identity_internals\identity_internals.css" type="BINDATA" /> - <include name="IDR_IDENTITY_INTERNALS_JS" file="resources\identity_internals\identity_internals.js" type="BINDATA" /> - </if> <if expr="_google_chrome"> <include name="IDR_PREF_HASH_SEED_BIN" file="resources\settings_internal\pref_hash_seed.bin" type="BINDATA" /> <include name="IDR_ADDITIONAL_MODULE_IDS" file="${additional_modules_list_file}" use_base_dir="false" type="BINDATA" />
diff --git a/chrome/browser/content_language/OWNERS b/chrome/browser/content_language/OWNERS index 5c719443..3a6e0c84 100644 --- a/chrome/browser/content_language/OWNERS +++ b/chrome/browser/content_language/OWNERS
@@ -1,2 +1 @@ -abeyad@chromium.org victortan@chromium.org \ No newline at end of file
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItem.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItem.java index 8e3b0d2..bb3404e 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItem.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItem.java
@@ -274,7 +274,9 @@ if (mTab == null) return; RecordUserAction.record("Crow.LaunchCustomTab.AppMenu"); Activity activity = mTab.getWindowAndroid().getActivity().get(); - mCrowButtonDelegate.launchCustomTab(activity, mUrl); + mCrowButtonDelegate.requestCanonicalUrl(mTab, (canonicalUrl) -> { + mCrowButtonDelegate.launchCustomTab(activity, mUrl, canonicalUrl); + }); }); RecordUserAction.record("Crow.EntryPointShown.AppMenu"); mCrowButton.setVisibility(View.VISIBLE);
diff --git a/chrome/browser/history_clusters/java/res/layout/history_clusters_bottom_sheet_content.xml b/chrome/browser/history_clusters/java/res/layout/history_clusters_bottom_sheet_content.xml index 84c8cd3..d006195 100644 --- a/chrome/browser/history_clusters/java/res/layout/history_clusters_bottom_sheet_content.xml +++ b/chrome/browser/history_clusters/java/res/layout/history_clusters_bottom_sheet_content.xml
@@ -2,9 +2,14 @@ <!-- Copyright 2022 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> - -<androidx.recyclerview.widget.RecyclerView +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + <include layout="@layout/history_clusters_bottom_sheet_toolbar"/> + <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" - android:layout_height="match_parent" /> \ No newline at end of file + android:layout_height="wrap_content" /> +</LinearLayout> \ No newline at end of file
diff --git a/chrome/browser/history_clusters/java/res/layout/history_clusters_bottom_sheet_toolbar.xml b/chrome/browser/history_clusters/java/res/layout/history_clusters_bottom_sheet_toolbar.xml index f7713f54..c173522 100644 --- a/chrome/browser/history_clusters/java/res/layout/history_clusters_bottom_sheet_toolbar.xml +++ b/chrome/browser/history_clusters/java/res/layout/history_clusters_bottom_sheet_toolbar.xml
@@ -7,8 +7,9 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/bottom_sheet_toolbar" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="70dp" android:orientation="vertical" android:layout_gravity="start|bottom"> <ImageView
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersBottomSheetContent.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersBottomSheetContent.java index bb3cc76..c76a126 100644 --- a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersBottomSheetContent.java +++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersBottomSheetContent.java
@@ -28,7 +28,7 @@ @Nullable @Override public View getToolbarView() { - return mToolbarView; + return null; } @Override @@ -86,8 +86,4 @@ void setContentView(View contentView) { mContentView = contentView; } - - void setToolbarView(View toolbarView) { - mToolbarView = toolbarView; - } }
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java index 90493af5..d477e582 100644 --- a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java +++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java
@@ -149,15 +149,15 @@ recyclerView.getContext(), LinearLayoutManager.VERTICAL, false)); recyclerView.setItemAnimator(null); recyclerView.setAdapter(mAdapter); + contentView.setLayoutParams(new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - View bottomSheetToolbar = - layoutInflater.inflate(R.layout.history_clusters_bottom_sheet_toolbar, null); + View bottomSheetToolbar = contentView.findViewById(R.id.bottom_sheet_toolbar); PropertyModelChangeProcessor.create(mBottomSheetToolbarModel, bottomSheetToolbar, HistoryClustersViewBinder::bindBottomSheetToolbar); mBottomSheetContent.setContentView(contentView); - mBottomSheetContent.setToolbarView(bottomSheetToolbar); mBottomSheetInflated = true; }
diff --git a/chrome/browser/navigation_predictor/anchor_element_preloader_browsertest.cc b/chrome/browser/navigation_predictor/anchor_element_preloader_browsertest.cc index 4a344b5..b8ad3a1 100644 --- a/chrome/browser/navigation_predictor/anchor_element_preloader_browsertest.cc +++ b/chrome/browser/navigation_predictor/anchor_element_preloader_browsertest.cc
@@ -109,7 +109,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), R"( const a = document.getElementById('anchor1'); - var e = new PointerEvent('pointerdown'); + var e = new PointerEvent('pointerdown', {isPrimary: true}); a.dispatchEvent(e); )")); WaitForPreresolveCountForURL(1); @@ -144,7 +144,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), R"( const a = document.getElementById('anchor2'); - var e = new PointerEvent('pointerdown'); + var e = new PointerEvent('pointerdown', {isPrimary: true}); a.dispatchEvent(e); )")); EXPECT_EQ(0, preresolve_count_); @@ -174,7 +174,7 @@ const iframe = document.getElementById('iframe1'); const iframe_doc = iframe.contentWindow.document; const a = iframe_doc.getElementById('iframe_anchor'); - var e = new PointerEvent('pointerdown'); + var e = new PointerEvent('pointerdown', {isPrimary: true}); a.dispatchEvent(e); )")); WaitForPreresolveCountForURL(1); @@ -213,7 +213,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), R"( const a = document.getElementById('anchor1'); - var e = new PointerEvent('pointerdown'); + var e = new PointerEvent('pointerdown', {isPrimary: true}); a.dispatchEvent(e); )")); EXPECT_EQ(0, preresolve_count_); @@ -255,7 +255,7 @@ browser()->tab_strip_model()->GetActiveWebContents(), R"( const a = document.getElementById('anchor1'); - var e = new PointerEvent('pointerdown'); + var e = new PointerEvent('pointerdown', {isPrimary: true}); a.dispatchEvent(e); )")); EXPECT_EQ(0, preresolve_count_);
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn index 45c71ad..7c39ee9 100644 --- a/chrome/browser/resources/BUILD.gn +++ b/chrome/browser/resources/BUILD.gn
@@ -139,7 +139,6 @@ "ntp4:closure_compile", "omnibox:closure_compile", "settings:closure_compile", - "sync_file_system_internals:closure_compile", "usb_internals:closure_compile", ] }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/live_regions_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/live_regions_test.js index 591d9845..9836c6b 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/live_regions_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/live_regions_test.js
@@ -359,3 +359,32 @@ mockParentNode.state[chrome.automation.StateType.INVISIBLE] = true; assertTrue(liveRegions.shouldIgnoreLiveRegion_(mockNode)); }); + +TEST_F('ChromeVoxLiveRegionsTest', 'LiveIgnoredToUnignored', async function() { + const mockFeedback = this.createMockFeedback(); + const root = await this.runWithLoadedTree(` + <button></button> + <div aria-live="polite" style="display:none">hello</div> + <div aria-live="polite" hidden>there</div> + <script> + const [button, div1, div2] = document.body.children; + let clickCount = 0; + button.addEventListener('click', () => { + clickCount++; + switch (clickCount) { + case 1: + div1.style.display = 'block'; + break; + case 2: + div2.hidden = false; + } + }); + </script> + `); + const button = root.find({role: chrome.automation.RoleType.BUTTON}); + mockFeedback.call(button.doDefault.bind(button)) + .expectSpeech('hello') + .call(button.doDefault.bind(button)) + .expectSpeech('there') + .replay(); +});
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js index 16ea957c..ae702cc 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
@@ -36,6 +36,7 @@ goog.require('Output'); goog.require('OutputEventType'); goog.require('PanelCommand'); +goog.require('PanelNodeMenuData'); goog.require('PhoneticData'); goog.require('QueueMode'); goog.require('Spannable'); @@ -50,3 +51,5 @@ goog.require('constants'); goog.require('cursors.Cursor'); goog.require('cursors.Range'); + +goog.require('ALL_NODE_MENU_DATA');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js index eabec89..acae7a9 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js
@@ -6,15 +6,18 @@ * @fileoverview Handles logic for the ChromeVox panel that requires state from * the background context. */ -import {ISearch} from './i_search.js'; -import {ISearchHandler} from './i_search_handler.js'; +import {ISearch} from '/chromevox/background/panel/i_search.js'; +import {ISearchHandler} from '/chromevox/background/panel/i_search_handler.js'; +import {PanelNodeMenuBackground} from '/chromevox/background/panel/panel_node_menu_background.js'; + +const AutomationNode = chrome.automation.AutomationNode; /** @implements {ISearchHandler} */ export class PanelBackground { constructor() { /** @private {ISearch} */ this.iSearch_; - /** @private {chrome.automation.AutomationNode} */ + /** @private {AutomationNode} */ this.nodeForActions_; } @@ -23,6 +26,11 @@ throw 'Trying to create two copies of singleton PanelBackground'; } PanelBackground.instance = new PanelBackground(); + // Temporarily expose the panel background instance on the window object so + // it can be accessed from other renderers as we transition the logic to the + // background context. + window.panelBackground = PanelBackground.instance; + PanelBackground.stateObserver_ = new PanelStateObserver(); BridgeHelper.registerHandler( @@ -61,6 +69,22 @@ } /** + * @param {function(!PanelNodeMenuItemData)} addMenuItemFromData A callback + * to add a menu item to the specified menu. + * @param {string=} opt_activateMenuTitleId Optional string specifying the + * activated menu. + */ + createAllNodeMenuBackgrounds(addMenuItemFromData, opt_activateMenuTitleId) { + const node = ChromeVoxState.instance.currentRange.start.node; + for (const data of ALL_NODE_MENU_DATA) { + const isActivatedMenu = opt_activateMenuTitleId === data.titleId; + const menuBackground = new PanelNodeMenuBackground( + data, node, isActivatedMenu, addMenuItemFromData); + menuBackground.populate(); + } + } + + /** * Creates a new ISearch object, ready to search starting from the current * ChromeVox focus. * @private
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js index c1d6db5..c525926 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_node_menu_background.js
@@ -7,11 +7,12 @@ * panel. */ +const AutomationNode = chrome.automation.AutomationNode; + export class PanelNodeMenuBackground { /** * @param {!PanelNodeMenuData} menuData - * @param {chrome.automation.AutomationNode} node ChromeVox's current - * position. + * @param {AutomationNode} node ChromeVox's current position. * @param {boolean} isActivated Whether the menu was explicitly activated. * If false, the menu is populated asynchronously by posting a task * after searching each chunk of nodes. @@ -19,10 +20,12 @@ * that adds an item to the corresponding menu in the panel. */ constructor(menuData, node, isActivated, addMenuItemFromData) { - /** @private {chrome.automation.AutomationNode} */ + /** @private {AutomationNode} */ this.node_ = node; /** @private {AutomationPredicate.Unary} */ this.pred_ = menuData.predicate; + /** @private {!PanelNodeMenuId} */ + this.menuId_ = menuData.menuId; /** @private {boolean} */ this.isActivated_ = isActivated; /** @private {function(!PanelNodeMenuItemData)} */ @@ -87,7 +90,8 @@ cursors.Range.fromNode(node)); }); const isActive = node === this.node_ && this.isActivated_; - this.addMenuItemFromData_({title, callback, isActive}); + const menuId = this.menuId_; + this.addMenuItemFromData_({title, callback, isActive, menuId}); } if (!this.isActivated_) { @@ -112,7 +116,8 @@ this.addMenuItemFromData_({ title: Msgs.getMsg('panel_menu_item_none'), callback() {}, - isActive: false + isActive: false, + menuId: this.menuId_, }); } }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/panel_menu_data.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/panel_menu_data.js index ab86acc..4fca1fd 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/panel_menu_data.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/panel_menu_data.js
@@ -8,25 +8,65 @@ */ goog.provide('PanelNodeMenuData'); +goog.provide('PanelNodeMenuId'); goog.provide('PanelNodeMenuItemData'); goog.provide('ALL_NODE_MENU_DATA'); goog.require('AutomationPredicate'); -/** @typedef {{titleId: string, predicate: !AutomationPredicate.Unary}} */ +/** @enum {number} */ +PanelNodeMenuId = { + HEADING: 1, + LANDMARK: 2, + LINK: 3, + FORM_CONTROL: 4, + TABLE: 5 +}; + +/** + * @typedef {{ + * menuId: !PanelNodeMenuId, + * titleId: string, + * predicate: !AutomationPredicate.Unary + * }} + */ let PanelNodeMenuData; -/** @typedef {{title: string, callback: function(), isActive: boolean}} */ +/** + * @typedef {{ + * title: string, + * callback: function(), + * isActive: boolean, + * menuId: !PanelNodeMenuId + * }} + */ let PanelNodeMenuItemData; /** @const {!Array<!PanelNodeMenuData>} */ ALL_NODE_MENU_DATA = [ - {titleId: 'role_heading', predicate: AutomationPredicate.heading}, - {titleId: 'role_landmark', predicate: AutomationPredicate.landmark}, - {titleId: 'role_link', predicate: AutomationPredicate.link}, { + menuId: PanelNodeMenuId.HEADING, + titleId: 'role_heading', + predicate: AutomationPredicate.heading + }, + { + menuId: PanelNodeMenuId.LANDMARK, + titleId: 'role_landmark', + predicate: AutomationPredicate.landmark + }, + { + menuId: PanelNodeMenuId.LINK, + titleId: 'role_link', + predicate: AutomationPredicate.link + }, + { + menuId: PanelNodeMenuId.FORM_CONTROL, titleId: 'panel_menu_form_controls', predicate: AutomationPredicate.formField }, - {titleId: 'role_table', predicate: AutomationPredicate.table}, + { + menuId: PanelNodeMenuId.TABLE, + titleId: 'role_table', + predicate: AutomationPredicate.table + }, ];
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js index 2f19070..896a53c0 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js
@@ -496,12 +496,11 @@ }); for (const menuData of ALL_NODE_MENU_DATA) { - // Create node menus asynchronously (because it may require - // searching a long document) unless that's the specific menu the - // user requested. - const isActivatedMenu = (menuData.titleId === opt_activateMenuTitle); - Panel.addNodeMenu(menuData, node, isActivatedMenu); + Panel.addNodeMenu(menuData); } + chrome.extension.getBackgroundPage() + .panelBackground.createAllNodeMenuBackgrounds( + Panel.addNodeMenuItem, opt_activateMenuTitle); const actions = await BackgroundBridge.PanelBackground.getActionsForCurrentNode(); @@ -739,13 +738,9 @@ /** * Create a new node menu with the given name and add it to the menu bar. * @param {!PanelNodeMenuData} menuData The title/predicate for the new menu. - * @param {!chrome.automation.AutomationNode} node - * @param {boolean} isActivatedMenu Whether the menu was explicitly activated - * or not. If not, defer population to asynchronous callbacks. - * @return {PanelMenu} The menu just created. */ - static addNodeMenu(menuData, node, isActivatedMenu) { - const menu = new PanelNodeMenu(menuData, node, isActivatedMenu); + static addNodeMenu(menuData) { + const menu = new PanelNodeMenu(menuData.titleId); $('menu-bar').appendChild(menu.menuBarItemElement); menu.menuBarItemElement.addEventListener('mouseover', () => { Panel.activateMenu(menu, true /* activateFirstItem */); @@ -754,7 +749,12 @@ 'mouseup', event => Panel.onMouseUpOnMenuTitle_(menu, event)); $('menus_background').appendChild(menu.menuContainerElement); Panel.menus_.push(menu); - return menu; + Panel.nodeMenuDictionary_[menuData.menuId] = menu; + } + + /** @param {!PanelNodeMenuItemData} itemData */ + static addNodeMenuItem(itemData) { + Panel.nodeMenuDictionary_[itemData.menuId].addItemFromData(itemData); } /** @@ -1256,6 +1256,9 @@ /** @private {string} */ Panel.lastMenu_ = ''; +/** @private {!Object<!PanelNodeMenuId, !PanelNodeMenu>} */ +Panel.nodeMenuDictionary_ = {}; + window.addEventListener('load', function() { Panel.init();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_menu.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_menu.js index f46e70d7..100a29a5 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_menu.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_menu.js
@@ -5,7 +5,6 @@ /** * @fileoverview A drop-down menu in the ChromeVox panel. */ -import {PanelNodeMenuBackground} from '/chromevox/background/panel/panel_node_menu_background.js'; import {PanelMenuItem} from '/chromevox/panel/panel_menu_item.js'; export class PanelMenu { @@ -311,23 +310,6 @@ export class PanelNodeMenu extends PanelMenu { - /** - * @param {!PanelNodeMenuData} data - * @param {chrome.automation.AutomationNode} node ChromeVox's current - * position. - * @param {boolean} isActivated Whether the menu was explicitly activated. - * If false, the menu is populated asynchronously by posting a task - * after searching each chunk of nodes. - */ - constructor(data, node, isActivated) { - super(data.titleId); - /** @private {!PanelNodeMenuBackground} */ - this.background_ = new PanelNodeMenuBackground( - data, node, isActivated, (itemData) => this.addItemFromData_(itemData)); - - this.background_.populate(); - } - /** @override */ activate(activateFirstItem) { super.activate(false); @@ -339,11 +321,8 @@ } } - /** - * @param {!PanelNodeMenuItemData} data - * @private - */ - addItemFromData_(data) { + /** @param {!PanelNodeMenuItemData} data */ + addItemFromData(data) { this.addMenuItem(data.title, '', '', '', data.callback); if (data.isActive) { this.activeIndex_ = this.items_.length - 1;
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn index 8ff76a6..0410643 100644 --- a/chrome/browser/resources/chromeos/login/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -102,6 +102,7 @@ "images/enrollment_complete.svg", "images/error.svg", "images/kids_turn.svg", + "images/kiosk_enrollment.svg", "images/parental_control.svg", "images/powerwash.svg", "images/pin_illustration.svg", @@ -190,8 +191,8 @@ "components/oobe_vars/oobe_shared_vars_css.html", "components/oobe_carousel/oobe_carousel.html", "components/oobe_carousel/oobe_carousel.js", - "components/oobe_slide/oobe_slide.html", - "components/oobe_slide/oobe_slide.js", + "components/oobe_slide.html", + "components/oobe_slide.js", "components/progress_list_item/progress_list_item.html", "components/progress_list_item/progress_list_item.js", "components/hd_iron_icon.html", @@ -395,7 +396,7 @@ "components/common_styles/oobe_dialog_host_styles.m.js", "components/common_styles/oobe_flex_layout_styles.m.js", "components/oobe_carousel/oobe_carousel.m.js", - "components/oobe_slide/oobe_slide.m.js", + "components/oobe_slide.m.js", "components/oobe_vars/oobe_shared_vars_css.m.js", "components/progress_list_item/progress_list_item.m.js", "components/display_manager_types.m.js",
diff --git a/chrome/browser/resources/chromeos/login/components/BUILD.gn b/chrome/browser/resources/chromeos/login/components/BUILD.gn index 29c1136..0cdb644 100644 --- a/chrome/browser/resources/chromeos/login/components/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/components/BUILD.gn
@@ -15,7 +15,6 @@ "common_styles:closure_compile", "dialogs:closure_compile", "oobe_carousel:closure_compile", - "oobe_slide:closure_compile", "oobe_vars:closure_compile", "progress_list_item:closure_compile", @@ -37,6 +36,7 @@ ":oobe_icons.m", ":oobe_network_icons.m", ":oobe_select.m", + ":oobe_slide.m", ":oobe_types.m", ":security_token_pin.m", ":test_util.m", @@ -51,7 +51,6 @@ "behaviors:modulize", "buttons:polymer3_elements", "oobe_carousel:polymer3_elements", - "oobe_slide:polymer3_elements", "common_styles:polymer3_elements", "dialogs:polymer3_elements", "oobe_vars:polymer3_elements", @@ -73,6 +72,7 @@ ":oobe_a11y_option_module", ":oobe_icons_module", ":oobe_network_icons_module", + ":oobe_slide_module", ":security_token_pin_module", ":throbber_notice_module", ] + [ ":modulize" ] @@ -208,6 +208,14 @@ extra_deps = [ ":modulize" ] } +js_library("oobe_slide.m") { + sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/oobe_slide.m.js" ] + deps = [ + "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", + ] + extra_deps = [ ":oobe_slide_module" ] +} + js_library("oobe_types.m") { sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/oobe_types.m.js" ] deps = [] @@ -283,6 +291,8 @@ js_file = "hd_iron_icon.js" html_file = "hd_iron_icon.html" html_type = "dom-module" + auto_imports = oobe_auto_imports + namespace_rewrites = oobe_namespace_rewrites } polymer_modulizer("long_touch_detector") { @@ -343,6 +353,14 @@ html_type = "iron-iconset" } +polymer_modulizer("oobe_slide") { + js_file = "oobe_slide.js" + html_file = "oobe_slide.html" + html_type = "dom-module" + auto_imports = oobe_auto_imports + namespace_rewrites = oobe_namespace_rewrites +} + polymer_modulizer("security_token_pin") { js_file = "security_token_pin.js" html_file = "security_token_pin.html"
diff --git a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.html b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.html index 4f84c7f3..2b06673 100644 --- a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.html +++ b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.html
@@ -29,7 +29,9 @@ <oobe-adaptive-dialog id="dialog" role="dialog"> <slot slot="icon" name="icon"></slot> <h1 slot="title"> - <slot name="title">[[i18nDynamic(locale, titleKey)]]</slot> + <slot name="title" aria-label="[[i18nDynamic(locale, titleLabelKey)]]"> + [[i18nDynamic(locale, titleKey)]] + </slot> </h1> <div slot="subtitle">[[localizeSubtitle_(locale, subtitleKey)]]</div> <div slot="content" class="flex layout vertical center center-justified">
diff --git a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.js b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.js index 6cb8be9..e4a7d327 100644 --- a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.js +++ b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_loading_dialog.js
@@ -12,6 +12,10 @@ type: String, }, + titleLabelKey: { + type: String, + }, + subtitleKey: { type: String, value: '',
diff --git a/chrome/browser/resources/chromeos/login/components/hd_iron_icon.html b/chrome/browser/resources/chromeos/login/components/hd_iron_icon.html index c46d55f..549d96b 100644 --- a/chrome/browser/resources/chromeos/login/components/hd_iron_icon.html +++ b/chrome/browser/resources/chromeos/login/components/hd_iron_icon.html
@@ -5,7 +5,7 @@ <link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="/components/common_styles/common_styles.html"> +<link rel="import" href="./common_styles/common_styles.html"> <!-- <iron-icon> that automatically displays one of the two icons depending on
diff --git a/chrome/browser/resources/chromeos/login/components/hd_iron_icon.js b/chrome/browser/resources/chromeos/login/components/hd_iron_icon.js index 137745f..c30fea8 100644 --- a/chrome/browser/resources/chromeos/login/components/hd_iron_icon.js +++ b/chrome/browser/resources/chromeos/login/components/hd_iron_icon.js
@@ -2,13 +2,26 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -Polymer({ - is: 'hd-iron-icon', +/* #js_imports_placeholder */ - properties: { - icon1x: String, - icon2x: String, - src1x: String, - src2x: String, - }, -}); +/** + * @polymer + */ +class HdIronIcon extends Polymer.Element { + static get is() { + return 'hd-iron-icon'; + } + + /* #html_template_placeholder */ + + static get properties() { + return { + icon1x: String, + icon2x: String, + src1x: String, + src2x: String, + }; + } +} + +customElements.define(HdIronIcon.is, HdIronIcon);
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_icons.html b/chrome/browser/resources/chromeos/login/components/oobe_icons.html index 23e3b5f..c531a640 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_icons.html +++ b/chrome/browser/resources/chromeos/login/components/oobe_icons.html
@@ -82,6 +82,9 @@ <path d="M16.5 7.767c2.13 0 4.04.732 5.543 2.168l4.16-4.158C23.69 3.437 20.407 2 16.5 2 10.832 2 5.928 5.25 3.542 9.988l4.845 3.757c1.14-3.427 4.336-5.978 8.113-5.978z" fill="#EA4335"></path> <path d="M2 2h29v29H2"></path> </g> + <g id="kiosk" fill-rule="evenodd" clip-rule="evenodd"> + <path d="M2.6665 5.33317C2.6665 3.86041 3.86041 2.6665 5.33317 2.6665H26.6665C28.1393 2.6665 29.3332 3.86041 29.3332 5.33317V17.3332C29.3332 18.8059 28.1393 19.9998 26.6665 19.9998H19.9998V26.6665H23.9998V29.3332H7.99984V26.6665H11.9998V19.9998H5.33317C3.86041 19.9998 2.6665 18.8059 2.6665 17.3332V5.33317ZM5.33317 5.33317H26.6665V17.3332H5.33317V5.33317ZM14.6665 26.6665H17.3332V19.9998H14.6665V26.6665Z" fill="#1A73E8"></path> + </g> <g id="enterprise" fill-rule="evenodd"> <path fill-rule="evenodd" d="M16 10V4H3v24h26V10H16zM8.2 25.3333333H5.6v-2.6666666h2.6v2.6666666zM8.2 20H5.6v-2.6666667h2.6V20zm0-5.3333333H5.6V12h2.6v2.6666667zm0-5.33333337H5.6V6.66666667h2.6v2.66666666zm5.2 15.99999997h-2.6v-2.6666666h2.6v2.6666666zM13.4 20h-2.6v-2.6666667h2.6V20zm0-5.3333333h-2.6V12h2.6v2.6666667zm0-5.33333337h-2.6V6.66666667h2.6v2.66666666zM27.0385742 25.3333333H16v-2.6666666h2.6V20H16v-2.6666667h2.6v-2.6666666H16V12h11.0385742v13.3333333zM23.8 14.6666667h-2.6v2.6666666h2.6v-2.6666666zM23.8 20h-2.6v2.6666667h2.6V20z"></path> </g>
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_slide/oobe_slide.html b/chrome/browser/resources/chromeos/login/components/oobe_slide.html similarity index 97% rename from chrome/browser/resources/chromeos/login/components/oobe_slide/oobe_slide.html rename to chrome/browser/resources/chromeos/login/components/oobe_slide.html index 70de0bd..345b3ae 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_slide/oobe_slide.html +++ b/chrome/browser/resources/chromeos/login/components/oobe_slide.html
@@ -4,7 +4,7 @@ <link rel="import" href="chrome://resources/html/polymer.html"> -<link rel="import" href="../common_styles/oobe_dialog_host_styles.html"> +<link rel="import" href="./common_styles/oobe_dialog_host_styles.html"> <!-- Simple OOBE polymer element which is used for displaying single slide in a
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_slide.js b/chrome/browser/resources/chromeos/login/components/oobe_slide.js new file mode 100644 index 0000000..8ba14f6a --- /dev/null +++ b/chrome/browser/resources/chromeos/login/components/oobe_slide.js
@@ -0,0 +1,30 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/* #js_imports_placeholder */ + +/** + * @polymer + */ +class OobeSlide extends Polymer.Element { + + static get is() { + return 'oobe-slide'; + } + + /* #html_template_placeholder */ + + static get properties() { + return { + /* If true title is colored red, else blue. + */ + isWarning: { + type: Boolean, + value: false, + }, + }; + } +} + +customElements.define(OobeSlide.is, OobeSlide); \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_slide/BUILD.gn b/chrome/browser/resources/chromeos/login/components/oobe_slide/BUILD.gn deleted file mode 100644 index b2e6a99..0000000 --- a/chrome/browser/resources/chromeos/login/components/oobe_slide/BUILD.gn +++ /dev/null
@@ -1,35 +0,0 @@ -# Copyright 2020 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//third_party/closure_compiler/compile_js.gni") -import("//tools/polymer/polymer.gni") -import("../../oobe_auto_imports.gni") - -group("polymer3_elements") { - public_deps = [ ":oobe_slide_module" ] -} - -js_type_check("closure_compile") { - is_polymer3 = true - deps = [ ":oobe_slide.m" ] -} - -#### Polymer3 / JS Modules libraries - -js_library("oobe_slide.m") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/oobe_slide/oobe_slide.m.js" ] - deps = [ - "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - ] - extra_deps = [ ":oobe_slide_module" ] -} - -#### Polymer3 auto generation - -polymer_modulizer("oobe_slide") { - js_file = "oobe_slide.js" - html_file = "oobe_slide.html" - html_type = "dom-module" - auto_imports = oobe_auto_imports -}
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_slide/oobe_slide.js b/chrome/browser/resources/chromeos/login/components/oobe_slide/oobe_slide.js deleted file mode 100644 index b4960f9..0000000 --- a/chrome/browser/resources/chromeos/login/components/oobe_slide/oobe_slide.js +++ /dev/null
@@ -1,16 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -Polymer({ - is: 'oobe-slide', - - properties: { - /* If true title is colored red, else blue. - */ - isWarning: { - type: Boolean, - value: false, - }, - }, -});
diff --git a/chrome/browser/resources/chromeos/login/images/kiosk_enrollment.svg b/chrome/browser/resources/chromeos/login/images/kiosk_enrollment.svg new file mode 100644 index 0000000..3407a2a --- /dev/null +++ b/chrome/browser/resources/chromeos/login/images/kiosk_enrollment.svg
@@ -0,0 +1 @@ +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" viewBox="0 0 400 400" xml:space="preserve"><style>.st1{fill:none;stroke:#4285f4;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10}.st3{fill:#4285f4}.st4{fill:none;stroke:#2785fc;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.st4,.st5,.st7{stroke-miterlimit:10}.st5{stroke-width:2;stroke-linecap:round;stroke-linejoin:round;fill:none;stroke:#fff}.st7{fill:#4285f4;stroke:#4285f4}</style><path d="M194.6 286.8H91.4c-2.5 0-4.5-2-4.5-4.5V130c0-2.5 2-4.5 4.5-4.5h103.2c2.5 0 4.5 2 4.5 4.5v152.3c-.1 2.5-2.1 4.5-4.5 4.5z" fill="#d2e3fc" stroke="#4285f4" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path class="st1" d="M185.6 335H99.5c-1.6 0-3-1.3-3-3v-6.5h92v6.5c0 1.7-1.3 3-2.9 3zm-81.5-24.1h77.2c1.3 0 2.4.8 2.8 2l4.4 12.6h-92s3.3-8.7 4.8-12.6c.4-1.2 1.5-2 2.8-2z"/><path d="M167.4 319h-49.9c-1.6 0-3-1.3-3-3v-28.6h55.9V316c0 1.6-1.3 3-3 3z" fill="#fff" stroke="#4285f4" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path class="st3" d="M215.6 348.3l-.7 8.2c-.4 2.9-2.5 4.4-3.6 4.8-1.1.4-2.4.9-3.1 1.8-1.1 1.3-1.3 2.7-1.3 3.8h37.5l1.6-18-30.4-.6zm87.5-16.7l7 4.2c2.4 1.7 2.8 4.2 2.7 5.4-.2 1.2-.3 2.5.2 3.6.7 1.5 1.8 2.3 2.9 2.8 1.1-2.2 6.4-12.9 7.5-15.2l9.1-18.4-15.4-9.4-14 27z"/><circle class="st1" cx="250" cy="174.1" r="7.5"/><path class="st4" d="M232.4 217.7c-7.6 11.6-15.4 23.2-28.2 20.7-4.4-.9-8.7-4.3-11.4-7.9-2.7-3.6-4.5-7.8-6.9-11.6-2.7-4.2-6.3-8.3-6.3-13.2m.7-26.8c-3.7-.4-5.2 2.7-5.1 5.2.1 2.4 1.2 4.9 2.7 6.7.5.6 1.1 1.2 1.8 1.6s1.5.3 2.1-.2c.7-.6.6-2.3.4-3.2"/><path class="st4" d="M175.2 183.4c-1.2.2-1.7 1.1-2 2-.3.9-.3 1.9-.1 2.9.3 2.2 1.4 4.3 3.2 5.5 1.2.7 2.8 1 3.8 0 .3-.3.5-.6.5-1"/><path class="st4" d="M172.6 187.4c-.9-.1-1.7.8-2 1.7-.2.9 0 1.9.4 2.8.4 1 .8 1.9 1.6 2.7.7.8 1.7 1.3 2.7 1.3 1 0 2.1-.5 2.5-1.4m54.8 33.3h40M199.4 197l-19.9 8.7m65.3-19.5l1.6-5m-14 17.5v29.1m23.3-41.7l-2.2-4.8m53.8 63.4c-1.5-5.3-4.8-12.5-6.5-17.8-1.4-4.3-2.8-8.6-4.5-12.8-3.5-8.9-11-18.5-19.4-23.7-2.3-1.4-4.8-2.5-7.4-3.2-3.9-1-13-1.2-13.7-1.2l-10.8.1c-9.4-.1-17.1 4.2-23.1 11.9-3.7 4.8-10.6 13.9-13 17.4-4.3-8.5-13.5-27.7-19.5-35.8-2.3-3-5.2-6.5-8.8-8-1-.4-2.2-.7-3.2-.3-.4.1-.8.4-1.1.8-.3.5-.3 1.1-.1 1.6.5 1.4 1.9 2.3 3 3.3 1.3 1.3 2.5 2.5 3.5 4 .8 1.1 1.5 2.3 2.1 3.6"/><path class="st4" d="M291.8 260c0 1.9-.2 5.4-.6 7.2-.3 1-.6 2.1-1.3 2.9-1.3 1.5-3 .2-3.4-1.4-.4-1.6.1-3.1.2-4.7.1-2.3.5-4.6.4-6.8-.1-2.4-.1-4.6.7-7.1 0 0-12.9-28.8-20.7-46.4m-78.5-16.5c-.7-.6-1.4-1-2.2-1.5-1.7-.9-3.1-1.6-4.8-1.6-.6 0-1.2.2-1.6.7-.4.6-.4 1.4 0 2s.9 1.1 1.5 1.5c1.2.8 2.5 1.4 3.8 2.1 0 0-.5.7-.8.9-.9 1.1-1.2 2.3-1.2 3.7.1 1.4.6 2.8 1.5 3.8m-7.3-3.8c.4 3.6 2.4 7.1 5.8 8.6M291.8 260c.6 2.2 1 4.4 1.1 6.6.2 2.4-.1 4.6-.2 7 0 .8.3 2.1 1.1 2.6 2.8 1.4 4.1-3.8 4.4-5.5.7-4.5.3-8.5-1-12.8"/><path class="st4" d="M296.7 275.4c.3.6.8 1 1.6.9 2.4-.1 3.4-2.8 3.8-4.8.7-3.1.9-5.7.8-8.8-.1-2-.3-4.1-.9-5.7"/><path class="st4" d="M305 255.9c.9 2.8 1.2 5.8 1.1 8.7 0 1.9-.2 3.9-.8 5.7-.5 1.7-1.7 3.9-3.7 3.9"/><path class="st4" d="M306 267.7c1.1-2.4 1.5-5.1 1.3-7.8-.3-4.7-1.6-9.3-3.5-13.6m-57.6 102.2l-1.6 18h-37.5c0-1.2.2-2.6 1.3-3.8.8-.9 2-1.4 3.1-1.8 1.1-.4 3.2-1.8 3.6-4.8l.7-8.2m16.6-120.1c-13.7 34.1-20.6 120-20.6 120l38.5.1c2.3-5.3 1.2-11.3.9-17.1-.3-5.4-1.8-10.7-1.3-16.1.6-6.2 5.3-13.6 3.5-24.8"/><path class="st4" d="M249.2 251.3c1 15.7 0 32.3 7.3 46.7 8.5 16.8 45.3 33.3 46.4 33.9l15-30.6c-2.5-.5-9-2.9-13.1-5-4.3-2.2-6.8-5.3-8.7-6.9-6.7-5.6-11-4-16.6-9.2 0-21.6-.9-40.1-6.9-52.3l.2-11.3m15 33.5l19.5-5.4"/><path class="st1" d="M246.4 176.3c.7.5 1.8.5 2.5 0"/><path class="st4" d="M242.9 208.5h-.8c-2.6 0-4.8-2.1-4.8-4.8v-5.6h10.4v5.6c0 2.6-2.2 4.8-4.8 4.8z"/><path class="st5" d="M215.9 352.8h4.9m-4.9 3.3h4.9"/><path class="st4" d="M302.9 331.9l6.6 3.1c.8.4 1.5.9 2.1 1.6 1.3 1.5 1.4 3.3 1.3 4.2-.2 1.2-.3 2.5.2 3.6.7 1.5 1.8 2.4 2.9 2.9 1.1-2.2 6.6-12.8 7.7-15.1l9.4-18.3-16.5-8.3"/><path class="st5" d="M307.4 333.7l2.3-4.4m.7 5.9l2.2-4.4"/><path class="st3" d="M254.6 164.6c.3-3.3 3.3-5.7 6.6-5.4 1.8.2 3.4 1.2 4.4 2.6-.1-.5-.1-.9 0-1.4.3-3.3 3.3-5.7 6.6-5.4 1.2.1 2.3-.8 2.4-2.1v-.5c.4-2.8 2.8-5 5.6-5.1.7 0 1.3 0 1.9.2 1.2.3 2.5-.6 2.6-1.9l.3-4.4c.2-3.4 4-5.4 6.9-3.6 2.9 1.8 2.9 6 0 7.8l-4.9 2.9c-.9.5-1.3 1.7-.8 2.6.4.9.6 2 .5 3-.3 3.3-3.3 5.7-6.6 5.4-1.2-.1-2.3.8-2.4 2v.3c-.3 3.3-3.3 5.7-6.6 5.4-1.8-.2-3.4-1.2-4.4-2.6.1.5.1.9 0 1.4-.3 3.3-3.3 5.7-6.6 5.4-3.4-.4-5.8-3.3-5.5-6.6z"/><path class="st7" d="M215.6 348.3l-.7 8.2c-.4 2.9-2.5 4.4-3.6 4.8-1.1.4-2.4.9-3.1 1.8-1.1 1.3-1.3 2.7-1.3 3.8h37.5l1.6-18-30.4-.6zm87.5-16.7l7 4.2c2.4 1.7 2.8 4.2 2.7 5.4-.2 1.2-.3 2.5.2 3.6.7 1.5 1.8 2.3 2.9 2.8 1.1-2.2 6.4-12.9 7.5-15.2l9.1-18.4-15.4-9.4-14 27z"/><circle class="st1" cx="250" cy="174.1" r="7.5"/><path class="st1" d="M232.4 217.7c-7.6 11.6-15.4 23.2-28.2 20.7-4.4-.9-8.7-4.3-11.4-7.9-2.7-3.6-4.5-7.8-6.9-11.6-2.7-4.2-6.3-8.3-6.3-13.2m.7-26.8c-3.7-.4-5.2 2.7-5.1 5.2.1 2.4 1.2 4.9 2.7 6.7.5.6 1.1 1.2 1.8 1.6s1.5.3 2.1-.2c.7-.6.6-2.3.4-3.2"/><path class="st1" d="M175.2 183.4c-1.2.2-1.7 1.1-2 2-.3.9-.3 1.9-.1 2.9.3 2.2 1.4 4.3 3.2 5.5 1.2.7 2.8 1 3.8 0 .3-.3.5-.6.5-1"/><path class="st1" d="M172.6 187.4c-.9-.1-1.7.8-2 1.7-.2.9 0 1.9.4 2.8.4 1 .8 1.9 1.6 2.7.7.8 1.7 1.3 2.7 1.3 1 0 2.1-.5 2.5-1.4m54.8 33.3h40M199.4 197l-19.9 8.7m65.3-19.5l1.6-5m-14 17.5v29.1m23.3-41.7l-2.2-4.8m53.8 63.4c-1.5-5.3-4.8-12.5-6.5-17.8-1.4-4.3-2.8-8.6-4.5-12.8-3.5-8.9-11-18.5-19.4-23.7-2.3-1.4-4.8-2.5-7.4-3.2-3.9-1-13-1.2-13.7-1.2l-10.8.1c-9.4-.1-17.1 4.2-23.1 11.9-3.7 4.8-10.6 13.9-13 17.4-4.3-8.5-13.5-27.7-19.5-35.8-2.3-3-5.2-6.5-8.8-8-1-.4-2.2-.7-3.2-.3-.4.1-.8.4-1.1.8-.3.5-.3 1.1-.1 1.6.5 1.4 1.9 2.3 3 3.3 1.3 1.3 2.5 2.5 3.5 4 .8 1.1 1.5 2.3 2.1 3.6"/><path class="st1" d="M291.8 260c0 1.9-.2 5.4-.6 7.2-.3 1-.6 2.1-1.3 2.9-1.3 1.5-3 .2-3.4-1.4-.4-1.6.1-3.1.2-4.7.1-2.3.5-4.6.4-6.8-.1-2.4-.1-4.6.7-7.1 0 0-12.9-28.8-20.7-46.4m-78.5-16.5c-.7-.6-1.4-1-2.2-1.5-1.7-.9-3.1-1.6-4.8-1.6-.6 0-1.2.2-1.6.7-.4.6-.4 1.4 0 2s.9 1.1 1.5 1.5c1.2.8 2.5 1.4 3.8 2.1 0 0-.5.7-.8.9-.9 1.1-1.2 2.3-1.2 3.7.1 1.4.6 2.8 1.5 3.8m-7.3-3.8c.4 3.6 2.4 7.1 5.8 8.6M291.8 260c.6 2.2 1 4.4 1.1 6.6.2 2.4-.1 4.6-.2 7 0 .8.3 2.1 1.1 2.6 2.8 1.4 4.1-3.8 4.4-5.5.7-4.5.3-8.5-1-12.8"/><path class="st1" d="M296.7 275.4c.3.6.8 1 1.6.9 2.4-.1 3.4-2.8 3.8-4.8.7-3.1.9-5.7.8-8.8-.1-2-.3-4.1-.9-5.7"/><path class="st1" d="M305 255.9c.9 2.8 1.2 5.8 1.1 8.7 0 1.9-.2 3.9-.8 5.7-.5 1.7-1.7 3.9-3.7 3.9"/><path class="st1" d="M306 267.7c1.1-2.4 1.5-5.1 1.3-7.8-.3-4.7-1.6-9.3-3.5-13.6m-57.6 102.2l-1.6 18h-37.5c0-1.2.2-2.6 1.3-3.8.8-.9 2-1.4 3.1-1.8 1.1-.4 3.2-1.8 3.6-4.8l.7-8.2m16.6-120.1c-13.7 34.1-20.6 120-20.6 120l38.5.1c2.3-5.3 1.2-11.3.9-17.1-.3-5.4-1.8-10.7-1.3-16.1.6-6.2 5.3-13.6 3.5-24.8"/><path class="st1" d="M249.2 251.3c1 15.7 0 32.3 7.3 46.7 8.5 16.8 45.3 33.3 46.4 33.9l15-30.6c-2.5-.5-9-2.9-13.1-5-4.3-2.2-6.8-5.3-8.7-6.9-6.7-5.6-11-4-16.6-9.2 0-21.6-.9-40.1-6.9-52.3l.2-11.3m15 33.5l19.5-5.4m-60.9-68.4c.7.5 1.8.5 2.5 0m-6 32.2h-.8c-2.6 0-4.8-2.1-4.8-4.8v-5.6h10.4v5.6c0 2.6-2.2 4.8-4.8 4.8z"/><path class="st5" d="M215.9 352.8h4.9m-4.9 3.3h4.9"/><path class="st4" d="M302.9 331.9l6.6 3.1c.8.4 1.5.9 2.1 1.6 1.3 1.5 1.4 3.3 1.3 4.2-.2 1.2-.3 2.5.2 3.6.7 1.5 1.8 2.4 2.9 2.9 1.1-2.2 6.6-12.8 7.7-15.1l9.4-18.3-16.5-8.3"/><path class="st5" d="M307.4 333.7l2.3-4.4m.7 5.9l2.2-4.4"/><path class="st7" d="M254.6 164.6c.3-3.3 3.3-5.7 6.6-5.4 1.8.2 3.4 1.2 4.4 2.6-.1-.5-.1-.9 0-1.4.3-3.3 3.3-5.7 6.6-5.4 1.2.1 2.3-.8 2.4-2.1v-.5c.4-2.8 2.8-5 5.6-5.1.7 0 1.3 0 1.9.2 1.2.3 2.5-.6 2.6-1.9l.3-4.4c.2-3.4 4-5.4 6.9-3.6 2.9 1.8 2.9 6 0 7.8l-4.9 2.9c-.9.5-1.3 1.7-.8 2.6.4.9.6 2 .5 3-.3 3.3-3.3 5.7-6.6 5.4-1.2-.1-2.3.8-2.4 2v.3c-.3 3.3-3.3 5.7-6.6 5.4-1.8-.2-3.4-1.2-4.4-2.6.1.5.1.9 0 1.4-.3 3.3-3.3 5.7-6.6 5.4-3.4-.4-5.8-3.3-5.5-6.6z"/><path class="st7" d="M245.6 168.2s2.1 6.3 11.6 8.1c0 0-.1-5.4-3-8.2-2.8-2.9-8.6.1-8.6.1z"/><g fill-rule="evenodd" clip-rule="evenodd"><path d="M107.6 68.3L81.3 73c-.5.1-.9.2-1.3.4l2.1 2.2c1.1 1.2.5 3.1-1.1 3.5l-3.2.7L80 91.6c.5 2.6 3 4.3 5.6 3.9L99 93.1l9.8 6.8c.8.6 2-.1 1.8-1.2l-1.4-7.5 2.5-.4c2.6-.5 4.3-3 3.8-5.6l-2.4-13.1c-.4-2.5-2.9-4.3-5.5-3.8z" fill="#e8eaed"/><path d="M80 73.4l-5.6-6.1c-1.1-1.2-3.1-.7-3.6.8L67.2 79c-.5 1.5.8 3 2.4 2.6l8-1.8-.2-1.3c-.3-2.1.8-4.1 2.6-5.1z" fill="#ea4335"/></g><path class="st3" d="M164.3 25.1c.3-.2.7-.1.9.2 1.7 3.5.4 7.8-3 9.8-3.4 2-7.7 1.1-10-2.1-.2-.3-.1-.7.2-.9l11.9-7z"/><path d="M127.5 69h0c-.1.8-.1 1.5 0 2.3v2.4c0 2.2-.8 4.2-2.3 5.8l-1.9 2-.8.9h0c-.2.2-.3.5-.5.7-1.9 3.3-.7 7.5 2.6 9.3 3.3 1.9 7.5.7 9.3-2.6.1-.3.3-.5.4-.8h.1s.3-1.1.3-1.2l.7-2.7c.5-2.1 1.9-3.9 3.7-5l2.1-1.2c.7-.3 1.3-.7 1.9-1.2h0c1.3-1 2.3-2.2 3-3.8 1.9-4.4.4-9.6-3.6-12.2-4.8-3.1-11.1-1.5-13.9 3.4-.6 1.3-1 2.6-1.1 3.9z" fill="none" stroke="#4285f4" stroke-width="1.227" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><circle cx="149.7" cy="60.8" r="14.4" fill="#fbbc04"/><path d="M117.1 135.5c3.3-.1 6.4 1.9 7.6 5.2l6.5 17.7c1.5 4.1-.6 8.6-4.7 10.1-.8.3-1.6.5-2.5.5-3.3.1-6.4-1.9-7.6-5.2l-6.5-17.7c-1.5-4.1.6-8.6 4.7-10.1.8-.4 1.6-.5 2.5-.5z" fill="#34a853"/><path d="M130.5 185.3c5-7.8 5.4-8.4 9.4-14.6.3-.5 1-.4 1.2.1l7.5 15.4c.2.5-.1 1-.7 1l-16.9-.7c-.5-.1-.8-.7-.5-1.2z" fill="#ee5ffa"/><path d="M142.8 61.4c-2.3-1.5-4.9-2-7.5-1.5v1.3c2.4-.5 4.8-.1 6.9 1.3 3.8 2.4 5.2 7.3 3.4 11.4-.1.3-.3.5-.4.8l1.2.3.3-.6c2-4.7.4-10.3-3.9-13z" fill="#fff"/><circle cx="149.7" cy="60.8" r="14.4" fill="none"/><path d="M106.6 114.5l2.2-4.4c.3-.6 1-.8 1.5-.5l4.5 2.2c.6.3.8 1 .5 1.5l-2.2 4.4c-.3.6-1 .8-1.5.5l-4.5-2.2c-.6-.2-.8-.9-.5-1.5z" fill="#30e2ea"/><path d="M160.7 179.9l-6.8-2.9c-1.1-.5-2.3-.3-3.3.4l-6 4.4c-1 .7-1.5 1.9-1.3 3l.9 7.4c.1 1.2.9 2.2 2 2.7l6.8 2.9c1.1.5 2.3.3 3.3-.4l6-4.4c1-.7 1.5-1.9 1.3-3l-.9-7.4c-.1-1.2-.9-2.2-2-2.7z" fill="none" stroke="#fff" stroke-width="1.227" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M144 184.7c-.1-1 .3-1.9 1.1-2.5l1.3-.9-.5-1.1-1.5 1.1c-1.1.8-1.7 2.2-1.6 3.6l.2 2 1.2.1-.2-2.3z" fill="#e5e5e5"/><defs><path id="SVGID_1_" d="M193.5 286.8H91.4c-2.4 0-4.4-2-4.4-4.4V130c0-2.4 2-4.4 4.4-4.4h102.1c2.4 0 4.4 2 4.4 4.4v152.3c.1 2.5-1.9 4.5-4.4 4.5z"/></defs><clipPath id="SVGID_00000181809045262022818410000007462327013839387318_"><use xlink:href="#SVGID_1_" overflow="visible"/></clipPath><path d="M177.1 191.5c-1.5-1.8-2.5-4-2.8-6.1-.1.1-.1.2-.2.4-.2.6-.2 1.4-.1 2.4.3 2.1 1.3 3.9 2.8 4.8.7.4 1.7.7 2.3.3-.6-.4-1.3-1-2-1.8z" clip-path="url(#SVGID_00000181809045262022818410000007462327013839387318_)" fill="none"/><path d="M183.7 202.8l14.3-6.3c-3.3-6.3-6.8-12.5-9.6-16.2-2.3-3-5.1-6.3-8.4-7.7-1-.4-1.9-.5-2.5-.3-.2.1-.4.2-.5.4-.1.2-.1.5 0 .8.3.8 1 1.4 1.8 2.1l.9.9.2.2c1.2 1.2 2.5 2.5 3.5 3.9.8 1.1 1.5 2.3 2.1 3.5.5.2 1 .5 1.6.8.7.4 1.5.9 2.4 1.6.4.4.5 1 .1 1.4-.4.4-1 .5-1.4.1-.7-.6-1.4-1-2-1.3-1.5-.8-2.9-1.5-4.3-1.5-.3 0-.7.1-.8.3-.2.2-.1.6 0 1 .2.4.6.8 1.1 1.2.9.6 1.8 1.1 2.8 1.6l.9.5c.3.1.5.4.5.7.1.3 0 .6-.2.8 0 0-.5.6-.8.9-.7.9-1 1.8-.9 3.1 0 1.2.5 2.3 1.3 3.2.4.4.3 1.1-.1 1.4-.2.2-.4.2-.6.2-.3 0-.6-.1-.8-.4-1-1.3-1.7-2.8-1.7-4.4 0-.9.1-1.7.3-2.4l-.1.1c-.3.3-.6.4-1 .5-.1.3-.4.7-.6.9-.6.6-1.4.9-2.2.9 0 2.8 1.6 6.1 4.7 7.5z" clip-path="url(#SVGID_00000181809045262022818410000007462327013839387318_)" fill="none"/><path d="M180.1 191.5c.3.1.7.2 1 0 .2-.2.3-1 .2-1.9-.1-.1-.3-.2-.4-.3-.8-.5-1.4-1.2-1.8-1.9-.5-1-.5-2.3.1-3.1.5-.7 1.4-1.1 2.4-1.1.3 0 .7 0 1 .1-.3-.5-.6-1-1-1.5-.4-.6-.9-1.2-1.5-1.8-1.1-.1-2 .1-2.7.8-1 .9-1.3 2.3-1.3 3.4 0 2.1 1 4.3 2.5 6.1.6.6 1.1 1 1.5 1.2zm.5 14.8c.2 3.5 2.4 6.6 4.5 9.7.6.8 1.1 1.6 1.6 2.4 1.1 1.6 2 3.4 2.9 5 1.2 2.2 2.5 4.5 4 6.6 1.3 1.8 3.2 3.7 5.4 5.2v-36.7c0-.1-.1-.1-.1-.2l-18.3 8zm2.7-15.6c0 .2 0 .5-.1.7.1-.2.2-.4.4-.5-.1-.1-.2-.1-.3-.2zm-11.2-2.1c-.2.2-.4.4-.5.8-.1.6 0 1.3.3 2.2.4 1 .8 1.8 1.3 2.3.6.6 1.3 1 2 1 .3 0 .5-.1.7-.2-.1-.1-.2-.1-.3-.2-1.8-1.1-3.1-3.3-3.5-5.9z" clip-path="url(#SVGID_00000181809045262022818410000007462327013839387318_)" fill="none"/><path d="M193.6 230c-1.5-2-2.8-4.3-4-6.6-.9-1.7-1.8-3.4-2.9-5-.5-.8-1.1-1.6-1.6-2.4-2.1-3-4.3-6.2-4.5-9.7l18.3-8c0 .1.1.1.1.2v-4.3c-3.2-5.9-6.4-11.6-9.1-15.1-2.4-3.2-5.4-6.8-9.2-8.4-1.5-.6-2.8-.8-4-.4-.7.2-1.3.7-1.6 1.3-.4.7-.5 1.6-.1 2.5.5 1.3 1.5 2.2 2.4 2.9.3.3.6.5.8.8l.2.2c-.9.2-1.6.6-2.3 1.2-.9.9-1.6 2.1-1.8 3.5-1.4.6-1.9 1.9-2.1 2.4-.1.4-.2.9-.3 1.4-1.2.3-2 1.3-2.3 2.4-.3 1.3.1 2.5.4 3.4.5 1.3 1.1 2.2 1.8 3 .9 1 2.2 1.6 3.4 1.6h.1c.5 0 1-.1 1.5-.3.7 3 2.4 5.6 4.6 7.1l-2.3 1-.1.1c-.1 0-.1.1-.2.1 0 0-.1.1-.1.2s-.1.1-.1.2 0 .2-.1.2v.1c0 4.3 2.5 7.9 4.9 11.4.5.8 1.1 1.6 1.6 2.4 1 1.6 1.9 3.3 2.8 4.9 1.2 2.3 2.5 4.6 4.1 6.8 1.6 2.2 4.1 4.7 7 6.4v-2.3c-2.1-1.5-4-3.5-5.3-5.2zm-16.1-49.3c.7-.6 1.6-.9 2.7-.8l1.5 1.8c.4.5.7 1 1 1.5-.3 0-.7-.1-1-.1-1 0-1.9.4-2.4 1.1-.6.8-.7 2-.1 3.1.4.7 1 1.4 1.8 1.9.1.1.3.2.4.3.2.9 0 1.7-.2 1.9-.3.2-.7.2-1 0-.5-.2-.9-.6-1.5-1.3-1.5-1.8-2.4-4.1-2.5-6.1-.1-1 .3-2.4 1.3-3.3zm-2.2 14.2c-.7 0-1.4-.4-2-1-.5-.6-1-1.3-1.3-2.3-.4-1-.5-1.7-.3-2.2.1-.3.3-.6.5-.8.5 2.6 1.8 4.8 3.6 6 .1.1.2.1.3.2-.3.1-.5.1-.8.1zm1.5-2c-1.4-.9-2.4-2.6-2.8-4.8-.2-1-.1-1.7.1-2.4.1-.2.1-.3.2-.4.3 2.1 1.3 4.3 2.8 6.1.7.8 1.3 1.4 2 1.7-.6.5-1.6.2-2.3-.2zm1.8 2.5c.8 0 1.6-.3 2.2-.9.3-.3.5-.6.6-.9.4-.1.7-.3 1-.5l.1-.1c-.2.7-.3 1.5-.3 2.4.1 1.6.7 3.2 1.7 4.4.2.2.5.4.8.4.2 0 .5-.1.6-.2.4-.4.5-1 .1-1.4-.8-.9-1.2-2.1-1.3-3.2-.1-1.3.2-2.2.9-3.1.2-.3.8-.9.8-.9.2-.2.3-.5.2-.8-.1-.3-.2-.6-.5-.7l-.9-.5c-1-.5-1.9-1-2.8-1.6-.5-.3-.9-.7-1.1-1.2-.2-.3-.2-.7 0-1 .2-.2.5-.3.8-.3 1.5 0 2.8.7 4.3 1.5.6.3 1.3.7 2 1.3.4.4 1.1.3 1.4-.1.4-.4.3-1.1-.1-1.4-.8-.7-1.6-1.2-2.4-1.6-.5-.3-1-.5-1.6-.8-.6-1.2-1.3-2.4-2.1-3.5-1-1.5-2.3-2.7-3.5-3.9l-.2-.2-.9-.9c-.8-.7-1.5-1.3-1.8-2.1-.1-.3-.1-.6 0-.8.1-.2.3-.3.5-.4.7-.2 1.5-.1 2.5.3 3.4 1.4 6.1 4.7 8.4 7.7 2.8 3.7 6.3 9.8 9.6 16.2l-14.3 6.3c-2.7-1.5-4.3-4.8-4.7-7.5zm4.7-4c0-.2.1-.5.1-.7.1.1.2.1.3.2-.2.2-.3.4-.4.5z" clip-path="url(#SVGID_00000181809045262022818410000007462327013839387318_)" fill="#fff"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.html b/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.html index abad232e..784fb94c 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.html +++ b/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.html
@@ -15,7 +15,7 @@ <link rel="import" href="../../components/common_styles/oobe_dialog_host_styles.html"> <link rel="import" href="../../components/dialogs/oobe_loading_dialog.html"> <link rel="import" href="../../components/oobe_icons.html"> -<link rel="import" href="../../components/oobe_slide/oobe_slide.html"> +<link rel="import" href="../../components/oobe_slide.html"> <dom-module id="lacros-data-migration-element"> <template>
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn index ce5ada76..062d060 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn
@@ -179,7 +179,7 @@ "../../components/buttons:oobe_back_button.m", "../../components/buttons:oobe_next_button.m", "../../components/dialogs:oobe_adaptive_dialog.m", - "../../components/oobe_slide:oobe_slide.m", + "../../components:oobe_slide.m", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] extra_deps = [ ":update_module" ]
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.html b/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.html index 54ca58e..0a03f0c 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.html
@@ -83,8 +83,9 @@ <!-- ENROLLMENT IN PROGRESS (SPINNER) DIALOG --> <oobe-loading-dialog title-key="[[getWorkingTitleKey_(licenseType_)]]" - id="step-working" for-step="working"> - <iron-icon slot="icon" icon="oobe-32:enterprise"></iron-icon> + title-label-key="enollmentInProgress" id="step-working" + for-step="working"> + <iron-icon slot="icon" icon="[[getIcon_(licenseType_)]]"></iron-icon> </oobe-loading-dialog> <!-- ACCOUNT CHECK IN PROGRESS (SPINNER) DIALOG --> @@ -123,7 +124,7 @@ <div id="errorMsg" slot="subtitle">[[errorText_]]</div> <div slot="content" class="flex layout vertical center center-justified"> - <img src="images/error.svg" class="oobe-illustration"> + <img src="images/error.svg" alt="" class="oobe-illustration"> </div> <div slot="back-navigation"> <!-- BACK - Shown when the generic cancel button is hidden --> @@ -170,10 +171,9 @@ </oobe-adaptive-dialog> <!-- KIOSK CONFIRM DIALOG --> - <!-- TODO(crbug.com/1308403): Update image, recheck back button. --> <oobe-adaptive-dialog id="step-kiosk-enrollment" for-step="kiosk-enrollment" role="alert" footer-shrinkable> - <iron-icon slot="icon" icon="oobe-32:enterprise"></iron-icon> + <iron-icon slot="icon" icon="oobe-32:kiosk"></iron-icon> <h1 slot="title"> [[i18nDynamic(locale, 'oauthEnrollKioskEnrollmentConfirmTitle')]] </h1> @@ -183,14 +183,12 @@ 'oauthEnrollKioskEnrollmentConfirmPowerwashMessage')]] </div> <div slot="content" class="flex layout vertical center center-justified"> - <img src="images/enrollment_complete.svg" - class="oobe-illustration"> - </div> - <div slot="back-navigation"> - <oobe-back-button id="cancelKioskEnrollmentButton" - on-click="onCancelKiosk_"></oobe-back-button> + <img src="images/kiosk_enrollment.svg" alt="" class="oobe-illustration"> </div> <div slot="bottom-buttons"> + <oobe-text-button id="cancelKioskEnrollmentButton" + text-key="oauthEnrollKioskCancelEnrollmentButton" + on-click="onCancelKiosk_"></oobe-text-button> <oobe-text-button inverse id="enrollKioskButton" text-key="oauthEnrollKioskEnrollmentConfirmButton" on-click="onEnrollKiosk_" class="focus-on-show"></oobe-text-button> @@ -200,7 +198,7 @@ <!-- SUCCESS DIALOG --> <oobe-adaptive-dialog id="step-success" for-step="success" role="alert" footer-shrinkable> - <iron-icon slot="icon" icon="oobe-32:enterprise"></iron-icon> + <iron-icon slot="icon" icon="[[getIcon_(licenseType_)]]"></iron-icon> <h1 slot="title"> [[getSuccessTitle_(locale, licenseType_)]] </h1> @@ -218,9 +216,9 @@ </div> </div> <div slot="content" class="flex layout vertical center center-justified"> - <img src="images/enrollment_complete.svg" + <img src="images/enrollment_complete.svg" alt="" class="oobe-illustration" hidden="[[isMeet_]]"> - <img src="images/cfm/enrollment.svg" + <img src="images/cfm/enrollment.svg" alt="" class="oobe-illustration" hidden="[[!isMeet_]]"> </div> <div slot="bottom-buttons">
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js b/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js index da64741..7f5ceae5 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js +++ b/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js
@@ -580,6 +580,19 @@ } /** + * Returns icon for enrollment steps. + * @param {*} licenseType + * @returns {string} + * @private + */ + getIcon_(licenseType) { + if (licenseType == OobeTypes.LicenseType.ENTERPRISE) { + return 'oobe-32:enterprise'; + } + return 'oobe-32:kiosk'; + } + + /** * Return title for success enrollment screen. * @param {string} licenseType * @returns {string}
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/update.html b/chrome/browser/resources/chromeos/login/screens/oobe/update.html index 77a87c9..0c5b27c 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/update.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/update.html
@@ -18,7 +18,7 @@ <link rel="import" href="../../components/dialogs/oobe_adaptive_dialog.html"> <link rel="import" href="../../components/dialogs/oobe_loading_dialog.html"> <link rel="import" href="../../components/oobe_carousel/oobe_carousel.html"> -<link rel="import" href="../../components/oobe_slide/oobe_slide.html"> +<link rel="import" href="../../components/oobe_slide.html"> <dom-module id="update-element"> <template>
diff --git a/chrome/browser/resources/identity_internals/BUILD.gn b/chrome/browser/resources/identity_internals/BUILD.gn new file mode 100644 index 0000000..60e52478 --- /dev/null +++ b/chrome/browser/resources/identity_internals/BUILD.gn
@@ -0,0 +1,71 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//chrome/common/features.gni") +import("//tools/grit/grit_rule.gni") +import("//tools/grit/preprocess_if_expr.gni") +import("//tools/polymer/html_to_js.gni") +import("//tools/typescript/ts_library.gni") +import("//ui/webui/resources/tools/generate_grd.gni") + +assert(!is_android) + +preprocess_folder = "preprocessed" +html_to_js("web_components") { + js_files = [ "token_list_item.ts" ] +} + +preprocess_if_expr("preprocess_src") { + in_folder = "." + in_files = [ "identity_internals.ts" ] + out_folder = "$target_gen_dir/$preprocess_folder" +} + +preprocess_if_expr("preprocess_gen") { + in_folder = target_gen_dir + in_files = [ "token_list_item.ts" ] + deps = [ ":web_components" ] + out_folder = "$target_gen_dir/$preprocess_folder" +} + +ts_library("build_ts") { + root_dir = "$target_gen_dir/$preprocess_folder" + out_dir = "$target_gen_dir/tsc" + in_files = [ + "identity_internals.ts", + "token_list_item.ts", + ] + deps = [ "//ui/webui/resources:library" ] + extra_deps = [ + ":preprocess_gen", + ":preprocess_src", + ] + definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ] +} + +generate_grd("build_grd") { + grd_prefix = "identity_internals" + out_grd = "$target_gen_dir/resources.grd" + input_files = [ + "identity_internals.css", + "identity_internals.html", + ] + input_files_base_dir = rebase_path(".", "//") + manifest_files = [ "$target_gen_dir/tsconfig.manifest" ] + deps = [ ":build_ts" ] +} + +grit("resources") { + source = "$target_gen_dir/resources.grd" + deps = [ ":build_grd" ] + enable_input_discovery_for_gn_analyze = false + defines = chrome_grit_defines + outputs = [ + "grit/identity_internals_resources.h", + "grit/identity_internals_resources_map.cc", + "grit/identity_internals_resources_map.h", + "identity_internals_resources.pak", + ] + output_dir = "$root_gen_dir/chrome" +}
diff --git a/chrome/browser/resources/identity_internals/identity_internals.css b/chrome/browser/resources/identity_internals/identity_internals.css index e1b04cd..243b26a 100644 --- a/chrome/browser/resources/identity_internals/identity_internals.css +++ b/chrome/browser/resources/identity_internals/identity_internals.css
@@ -11,17 +11,3 @@ #token-list { width: 100%; } - -tr:nth-child(odd) { - background: rgb(239, 243, 255); -} - -td.label { - font-weight: bold; - vertical-align: top; - white-space: nowrap; -} - -td.token-actions { - text-align: center; -}
diff --git a/chrome/browser/resources/identity_internals/identity_internals.js b/chrome/browser/resources/identity_internals/identity_internals.js deleted file mode 100644 index e02d674..0000000 --- a/chrome/browser/resources/identity_internals/identity_internals.js +++ /dev/null
@@ -1,200 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {assert} from 'chrome://resources/js/assert.m.js'; -import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; -import {define} from 'chrome://resources/js/cr/ui.m.js'; -import {$} from 'chrome://resources/js/util.m.js'; - -let tokenList; - -/** - * Creates an identity token item. - * @param {!Object} tokenInfo Object containing token information. - * @constructor - */ -function TokenListItem(tokenInfo) { - const el = document.createElement('div'); - el.data_ = tokenInfo; - el.__proto__ = TokenListItem.prototype; - el.decorate(); - return el; -} - -TokenListItem.prototype = { - __proto__: HTMLDivElement.prototype, - - /** @override */ - decorate() { - this.textContent = ''; - this.id = this.data_.accessToken; - - const table = this.ownerDocument.createElement('table'); - const tbody = this.ownerDocument.createElement('tbody'); - tbody.appendChild(this.createEntry_( - 'Access Token', this.data_.accessToken, 'access-token')); - tbody.appendChild(this.createEntry_( - 'Extension Name', this.data_.extensionName, 'extension-name')); - tbody.appendChild(this.createEntry_( - 'Extension Id', this.data_.extensionId, 'extension-id')); - tbody.appendChild( - this.createEntry_('Account Id', this.data_.accountId, 'account-id')); - tbody.appendChild( - this.createEntry_('Token Status', this.data_.status, 'token-status')); - tbody.appendChild(this.createEntry_( - 'Expiration Time', this.data_.expirationTime, 'expiration-time')); - tbody.appendChild(this.createEntryForScopes_()); - table.appendChild(tbody); - const tfoot = this.ownerDocument.createElement('tfoot'); - tfoot.appendChild(this.createButtons_()); - table.appendChild(tfoot); - this.appendChild(table); - }, - - /** - * Creates an entry for a single property of the token. - * @param {string} label A label of the token's property name. - * @param {string} value A value of the token property. - * @param {string} accessor Additional class to tag the field for testing. - * @return {HTMLElement} An HTML element with the property name and value. - */ - createEntry_(label, value, accessor) { - const row = this.ownerDocument.createElement('tr'); - const labelField = this.ownerDocument.createElement('td'); - labelField.classList.add('label'); - labelField.textContent = label; - row.appendChild(labelField); - const valueField = this.ownerDocument.createElement('td'); - valueField.classList.add('value'); - valueField.classList.add(accessor); - valueField.textContent = value; - row.appendChild(valueField); - return row; - }, - - /** - * Creates an entry for a list of token scopes. - * @return {!HTMLElement} An HTML element with scopes. - */ - createEntryForScopes_() { - const row = this.ownerDocument.createElement('tr'); - const labelField = this.ownerDocument.createElement('td'); - labelField.classList.add('label'); - labelField.textContent = 'Scopes'; - row.appendChild(labelField); - const valueField = this.ownerDocument.createElement('td'); - valueField.classList.add('value'); - valueField.classList.add('scope-list'); - this.data_.scopes.forEach(function(scope) { - valueField.appendChild(this.ownerDocument.createTextNode(scope)); - valueField.appendChild(this.ownerDocument.createElement('br')); - }, this); - row.appendChild(valueField); - return row; - }, - - /** - * Creates buttons for the token. - * @return {HTMLElement} An HTML element with actionable buttons for the - * token. - */ - createButtons_() { - const row = this.ownerDocument.createElement('tr'); - const buttonHolder = this.ownerDocument.createElement('td'); - buttonHolder.colSpan = 2; - buttonHolder.classList.add('token-actions'); - buttonHolder.appendChild(this.createRevokeButton_()); - row.appendChild(buttonHolder); - return row; - }, - - /** - * Creates a revoke button with an event sending a revoke token message - * to the controller. - * @return {!HTMLButtonElement} The created revoke button. - * @private - */ - createRevokeButton_() { - const revokeButton = this.ownerDocument.createElement('button'); - revokeButton.classList.add('revoke-button'); - revokeButton.addEventListener('click', function() { - sendWithPromise( - 'identityInternalsRevokeToken', this.data_.extensionId, - this.data_.accessToken) - .then(token => tokenList.removeTokenNode_(token)); - }.bind(this)); - revokeButton.textContent = 'Revoke'; - return revokeButton; - }, -}; - -/** - * Creates a new list of identity tokens. - * @param {Object=} opt_propertyBag Optional properties. - * @constructor - */ -const TokenList = define('div'); - -TokenList.prototype = { - __proto__: HTMLDivElement.prototype, - - /** @override */ - decorate() { - this.textContent = ''; - this.showTokenNodes_(); - }, - - /** - * Populates the list of tokens. - */ - showTokenNodes_() { - this.data_.forEach(function(tokenInfo) { - this.appendChild(new TokenListItem(tokenInfo)); - }, this); - }, - - /** - * Removes a token node related to the specified token ID from both the - * internals data source as well as the user interface. - * @param {string} accessToken The id of the token to remove. - * @private - */ - removeTokenNode_(accessToken) { - let tokenIndex; - for (let index = 0; index < this.data_.length; index++) { - if (this.data_[index].accessToken === accessToken) { - tokenIndex = index; - break; - } - } - - // Remove from the data_ source if token found. - if (tokenIndex) { - this.data_.splice(tokenIndex, 1); - } - - // Remove from the user interface. - const tokenNode = $(accessToken); - if (tokenNode) { - this.removeChild(tokenNode); - } - - this.dispatchEvent( - new CustomEvent('token-removed-for-test', {detail: accessToken})); - }, -}; - -/** - * Initializes the UI by asking the controller for list of identity tokens. - */ -document.addEventListener('DOMContentLoaded', () => { - tokenList = $('token-list'); - tokenList.data_ = []; - tokenList.__proto__ = TokenList.prototype; - tokenList.decorate(); - sendWithPromise('identityInternalsGetTokens').then(tokens => { - tokenList.data_ = tokens; - tokenList.showTokenNodes_(); - }); -});
diff --git a/chrome/browser/resources/identity_internals/identity_internals.ts b/chrome/browser/resources/identity_internals/identity_internals.ts new file mode 100644 index 0000000..df381b3 --- /dev/null +++ b/chrome/browser/resources/identity_internals/identity_internals.ts
@@ -0,0 +1,57 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import './token_list_item.js'; + +import {assert} from 'chrome://resources/js/assert_ts.js'; +import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; + +let data: Array<{[key: string]: string | string[]}> = []; +let list: HTMLElement; + +/** + * Removes a token node related to the specified token ID from both the + * internals data source as well as the user interface. + * @param e Contains the id of the token to remove. + */ +function removeTokenNode(e: CustomEvent<string>) { + const accessToken = e.detail; + let tokenIndex: number = -1; + for (let index = 0; index < data.length; index++) { + if (data[index]!['accessToken'] === accessToken) { + tokenIndex = index; + break; + } + } + + // Remove from the tokens_ source if token found. + if (tokenIndex > -1) { + data.splice(tokenIndex, 1); + } + + // Remove from the user interface. + const tokenNode = list.querySelector<HTMLElement>(`#${accessToken}`); + if (tokenNode) { + list.removeChild(tokenNode); + } + + list.dispatchEvent( + new CustomEvent('token-removed-for-test', {detail: accessToken})); +} + +document.addEventListener('DOMContentLoaded', () => { + const listEl = document.querySelector<HTMLElement>('#token-list'); + assert(listEl); + list = listEl; + sendWithPromise('identityInternalsGetTokens').then(tokens => { + data = tokens; + data.forEach(tokenInfo => { + const item = document.createElement('token-list-item'); + list.appendChild(item); + item.configure(tokenInfo); + }); + }); + + list.addEventListener('remove-token', e => removeTokenNode(e)); +});
diff --git a/chrome/browser/resources/identity_internals/token_list_item.html b/chrome/browser/resources/identity_internals/token_list_item.html new file mode 100644 index 0000000..e5cff466 --- /dev/null +++ b/chrome/browser/resources/identity_internals/token_list_item.html
@@ -0,0 +1,54 @@ +<style> + tr:nth-child(odd) { + background: rgb(239, 243, 255); + } + + td.label { + font-weight: bold; + vertical-align: top; + white-space: nowrap; + } + + td.token-actions { + text-align: center; + } +</style> +<table> + <tbody> + <tr> + <td class="label">Access Token</td> + <td class="value access-token"></td> + </tr> + <tr> + <td class="label">Extension Name</td> + <td class="value extension-name"></td> + </tr> + <tr> + <td class="label">Extension Id</td> + <td class="value extension-id"></td> + </tr> + <tr> + <td class="label">Account Id</td> + <td class="value account-id"></td> + </tr> + <tr> + <td class="label">Token Status</td> + <td class="value status"></td> + </tr> + <tr> + <td class="label">Expiration Time</td> + <td class="value expiration-time"></td> + </tr> + <tr> + <td class="label">Scopes</td> + <td class="value scope-list"></td> + </tr> + </tbody> + <tfoot> + <tr> + <td class="token-actions" colspan="2"> + <button class="revoke-button">Revoke</button> + </td> + </tr> + </tfoot> +</table>
diff --git a/chrome/browser/resources/identity_internals/token_list_item.ts b/chrome/browser/resources/identity_internals/token_list_item.ts new file mode 100644 index 0000000..f10fd74 --- /dev/null +++ b/chrome/browser/resources/identity_internals/token_list_item.ts
@@ -0,0 +1,75 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {assert} from 'chrome://resources/js/assert_ts.js'; +import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; +import {CustomElement} from 'chrome://resources/js/custom_element.js'; +import {getTrustedHTML} from 'chrome://resources/js/static_types.js'; + +declare global { + interface HTMLElementEventMap { + 'remove-token': CustomEvent<string>; + } +} + +function dashToCamelCase(dashId: string): string { + const words = dashId.split('-'); + let output = words[0]; + assert(output); + words.slice(1).forEach(word => { + output += word.charAt(0).toUpperCase() + word.slice(1); + }); + return output; +} + +class TokenListItemElement extends CustomElement { + static override get template() { + return getTrustedHTML`{__html_template__}`; + } + + extensionId: string = ''; + + configure(data: {[key: string]: string|string[]}) { + this.id = data['accessToken'] as string; + this.extensionId = data['extensionId'] as string; + + ['access-token', 'extension-name', 'extension-id', 'account-id', 'status', + 'expiration-time'] + .forEach(identifier => { + const element = + this.shadowRoot!.querySelector<HTMLElement>(`.${identifier}`); + if (element) { + element.textContent = data[dashToCamelCase(identifier)] as string; + } + }); + + const scopeList = + this.shadowRoot!.querySelector<HTMLElement>('.scope-list'); + assert(scopeList); + (data['scopes'] as string[]).forEach(scope => { + scopeList.appendChild(document.createTextNode(scope)); + scopeList.appendChild(document.createElement('br')); + }); + + const revokeButton = + this.shadowRoot!.querySelector<HTMLElement>('.revoke-button'); + assert(revokeButton); + revokeButton.addEventListener('click', () => { + sendWithPromise('identityInternalsRevokeToken', this.extensionId, this.id) + .then(token => { + this.dispatchEvent(new CustomEvent( + 'remove-token', + {bubbles: true, composed: true, detail: token})); + }); + }); + } +} + +declare global { + interface HTMLElementTagNameMap { + 'token-list-item': TokenListItemElement; + } +} + +customElements.define('token-list-item', TokenListItemElement);
diff --git a/chrome/browser/resources/settings/people_page/sync_browser_proxy.ts b/chrome/browser/resources/settings/people_page/sync_browser_proxy.ts index 5dc573e2..eb45e23f 100644 --- a/chrome/browser/resources/settings/people_page/sync_browser_proxy.ts +++ b/chrome/browser/resources/settings/people_page/sync_browser_proxy.ts
@@ -16,6 +16,8 @@ }; /** + * TODO(crbug.com/1322559): signedIn doesn't indicate if the user is signed-in, + * but instead if the user is syncing. * TODO(crbug.com/1107771): childUser and supervisedUser are only consumed * together and the latter implies the former, so it should be enough to have * only one of them here. The linked bug has other clean-up suggestions.
diff --git a/chrome/browser/resources/sync_file_system_internals/BUILD.gn b/chrome/browser/resources/sync_file_system_internals/BUILD.gn index d6ffd39..ea41ef3 100644 --- a/chrome/browser/resources/sync_file_system_internals/BUILD.gn +++ b/chrome/browser/resources/sync_file_system_internals/BUILD.gn
@@ -4,9 +4,9 @@ import("//chrome/common/features.gni") import("//extensions/buildflags/buildflags.gni") -import("//third_party/closure_compiler/compile_js.gni") import("//tools/grit/grit_rule.gni") import("//tools/grit/preprocess_if_expr.gni") +import("//tools/typescript/ts_library.gni") import("//ui/webui/resources/tools/generate_grd.gni") assert(enable_extensions, "enable extensions check failed") @@ -32,18 +32,16 @@ generate_grd("build_grd") { grd_prefix = "sync_file_system_internals" out_grd = "$target_gen_dir/resources.grd" - input_files = [ - "dump_database.js", - "extension_statuses.js", - "file_metadata.js", - "main.html", - "sync_service.js", - "task_log.js", - "utils.js", - ] + input_files = [ "main.html" ] input_files_base_dir = rebase_path(".", "//") - manifest_files = [ "$target_gen_dir/$preprocess_manifest" ] - deps = [ ":preprocess" ] + manifest_files = [ + "$target_gen_dir/$preprocess_manifest", + "$target_gen_dir/tsconfig.manifest", + ] + deps = [ + ":build_ts", + ":preprocess", + ] } preprocess_if_expr("preprocess") { @@ -53,59 +51,17 @@ in_files = [ "main.css" ] } -js_type_check("closure_compile") { - deps = [ - ":dump_database", - ":extension_statuses", - ":file_metadata", - ":sync_service", - ":task_log", - ":utils", +ts_library("build_ts") { + root_dir = "." + out_dir = "$target_gen_dir/tsc" + in_files = [ + "dump_database.ts", + "extension_statuses.ts", + "file_metadata.ts", + "sync_service.ts", + "task_log.ts", + "utils.ts", ] -} - -js_library("dump_database") { - deps = [ - ":utils", - "//ui/webui/resources/js:cr.m", - "//ui/webui/resources/js:util.m", - ] -} - -js_library("extension_statuses") { - deps = [ - ":utils", - "//ui/webui/resources/js:cr.m", - "//ui/webui/resources/js:util.m", - ] -} - -js_library("file_metadata") { - deps = [ - ":utils", - "//ui/webui/resources/js:cr.m", - "//ui/webui/resources/js:icon", - "//ui/webui/resources/js:util.m", - ] -} - -js_library("sync_service") { - deps = [ - ":utils", - "//ui/webui/resources/js:cr.m", - "//ui/webui/resources/js:util.m", - "//ui/webui/resources/js/cr:ui.m", - "//ui/webui/resources/js/cr/ui:tabs", - ] -} - -js_library("task_log") { - deps = [ - ":utils", - "//ui/webui/resources/js:cr.m", - "//ui/webui/resources/js:util.m", - ] -} - -js_library("utils") { + deps = [ "//ui/webui/resources:library" ] + definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ] }
diff --git a/chrome/browser/resources/sync_file_system_internals/dump_database.js b/chrome/browser/resources/sync_file_system_internals/dump_database.js deleted file mode 100644 index a0e4481..0000000 --- a/chrome/browser/resources/sync_file_system_internals/dump_database.js +++ /dev/null
@@ -1,81 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * Handles DumpDatabase tab for syncfs-internals. - */ - -import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; -import {$} from 'chrome://resources/js/util.m.js'; -import {createElementFromText} from './utils.js'; - -/** - * Get the database dump. - */ -function refreshDatabaseDump() { - sendWithPromise('getDatabaseDump').then(onGetDatabaseDump); -} - -/** - * Creates a table by filling |header| and |body|. - * @param {!HTMLElement} div The outer container of the table to be - * renderered. - * @param {!HTMLElement} header The table header element to be fillied by - * this function. - * @param {!HTMLElement} body The table body element to be filled by this - * function. - * @param {Array} databaseDump List of dictionaries for the database dump. - * The first element must have metadata of the entry. - * The remaining elements must be dictionaries for the database dump, - * which can be iterated using the 'keys' fields given by the first - * element. - */ -function createDatabaseDumpTable(div, header, body, databaseDump) { - const metadata = databaseDump.shift(); - div.appendChild(createElementFromText('h3', metadata['title'])); - - let tr = document.createElement('tr'); - for (let i = 0; i < metadata.keys.length; ++i) { - tr.appendChild(createElementFromText('td', metadata.keys[i])); - } - header.appendChild(tr); - - for (let i = 0; i < databaseDump.length; i++) { - const entry = databaseDump[i]; - tr = document.createElement('tr'); - for (let k = 0; k < metadata.keys.length; ++k) { - tr.appendChild(createElementFromText('td', entry[metadata.keys[k]])); - } - body.appendChild(tr); - } -} - -/** - * Handles callback from onGetDatabaseDump. - * @param {Array} databaseDump List of lists for the database dump. - */ -function onGetDatabaseDump(databaseDump) { - const placeholder = $('dump-database-placeholder'); - placeholder.innerHTML = trustedTypes.emptyHTML; - for (let i = 0; i < databaseDump.length; ++i) { - const div = /** @type {!HTMLElement} */ (document.createElement('div')); - const table = document.createElement('table'); - const header = - /** @type {!HTMLElement} */ (document.createElement('thead')); - const body = - /** @type {!HTMLElement} */ (document.createElement('tbody')); - createDatabaseDumpTable(div, header, body, databaseDump[i]); - table.appendChild(header); - table.appendChild(body); - div.appendChild(table); - placeholder.appendChild(div); - } -} - -function main() { - refreshDatabaseDump(); - $('refresh-database-dump').addEventListener('click', refreshDatabaseDump); -} - -document.addEventListener('DOMContentLoaded', main);
diff --git a/chrome/browser/resources/sync_file_system_internals/dump_database.ts b/chrome/browser/resources/sync_file_system_internals/dump_database.ts new file mode 100644 index 0000000..db3f67b --- /dev/null +++ b/chrome/browser/resources/sync_file_system_internals/dump_database.ts
@@ -0,0 +1,90 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * Handles DumpDatabase tab for syncfs-internals. + */ + +import {assert} from 'chrome://resources/js/assert_ts.js'; +import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; + +import {createElementFromText} from './utils.js'; + +/** + * Get the database dump. + */ +function refreshDatabaseDump() { + sendWithPromise('getDatabaseDump').then(onGetDatabaseDump); +} + +/** + * Creates a table by filling |header| and |body|. + * @param div The outer container of the table to be + * renderered. + * @param header The table header element to be fillied by + * this function. + * @param body The table body element to be filled by this + * function. + * @param databaseDump List of dictionaries for the database dump. + * The first element must have metadata of the entry. + * The remaining elements must be dictionaries for the database dump, + * which can be iterated using the 'keys' fields given by the first + * element. + */ +function createDatabaseDumpTable( + div: HTMLElement, header: HTMLElement, body: HTMLElement, + databaseDump: Array<{[key: string]: string | string[]}>) { + const metadata = databaseDump.shift(); + assert(metadata); + div.appendChild(createElementFromText('h3', metadata['title'] as string)); + const keys = metadata['keys'] as string[]; + + let tr = document.createElement('tr'); + for (let i = 0; i < keys.length; ++i) { + tr.appendChild(createElementFromText('td', keys[i]!)); + } + header.appendChild(tr); + + for (let i = 0; i < databaseDump.length; i++) { + const entry = databaseDump[i]!; + tr = document.createElement('tr'); + for (let k = 0; k < keys.length; ++k) { + tr.appendChild(createElementFromText('td', entry[keys[k]!] as string)); + } + body.appendChild(tr); + } +} + +/** + * Handles callback from onGetDatabaseDump. + * @param databaseDump List of lists for the database dump. + */ +function onGetDatabaseDump( + databaseDump: Array<Array<{[key: string]: string | string[]}>>) { + const placeholder = + document.querySelector<HTMLElement>('#dump-database-placeholder'); + assert(placeholder); + assert(window.trustedTypes); + placeholder.innerHTML = window.trustedTypes.emptyHTML as unknown as string; + for (let i = 0; i < databaseDump.length; ++i) { + const div = document.createElement('div'); + const table = document.createElement('table'); + const header = document.createElement('thead'); + const body = document.createElement('tbody'); + createDatabaseDumpTable(div, header, body, databaseDump[i]!); + table.appendChild(header); + table.appendChild(body); + div.appendChild(table); + placeholder.appendChild(div); + } +} + +function main() { + refreshDatabaseDump(); + const refresh = document.querySelector<HTMLElement>('#refresh-database-dump'); + assert(refresh); + refresh.addEventListener('click', refreshDatabaseDump); +} + +document.addEventListener('DOMContentLoaded', main);
diff --git a/chrome/browser/resources/sync_file_system_internals/extension_statuses.js b/chrome/browser/resources/sync_file_system_internals/extension_statuses.ts similarity index 67% rename from chrome/browser/resources/sync_file_system_internals/extension_statuses.js rename to chrome/browser/resources/sync_file_system_internals/extension_statuses.ts index d5f8850..2e99c5a25 100644 --- a/chrome/browser/resources/sync_file_system_internals/extension_statuses.js +++ b/chrome/browser/resources/sync_file_system_internals/extension_statuses.ts
@@ -6,8 +6,9 @@ * Handles the Extension ID -> SyncStatus tab for syncfs-internals. */ +import {assert} from 'chrome://resources/js/assert_ts.js'; import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; -import {$} from 'chrome://resources/js/util.m.js'; + import {createElementFromText} from './utils.js'; /** @@ -20,18 +21,19 @@ /** * Handles callback from onGetExtensionStatuses. - * @param {!Array<!{ - * extensionName: string, - * extensionID: string, - * status: string, - * }>} extensionStatuses */ -function onGetExtensionStatuses(extensionStatuses) { - const itemContainer = $('extension-entries'); +function onGetExtensionStatuses(extensionStatuses: Array<{ + extensionName: string, + extensionID: string, + status: string, +}>) { + const itemContainer = + document.querySelector<HTMLElement>('#extension-entries'); + assert(itemContainer); itemContainer.textContent = ''; for (let i = 0; i < extensionStatuses.length; i++) { - const originEntry = extensionStatuses[i]; + const originEntry = extensionStatuses[i]!; const tr = document.createElement('tr'); tr.appendChild(createElementFromText('td', originEntry.extensionName)); tr.appendChild(createElementFromText('td', originEntry.extensionID)); @@ -42,8 +44,10 @@ function main() { refreshExtensionStatuses(); - $('refresh-extensions-statuses') - .addEventListener('click', refreshExtensionStatuses); + const refresh = + document.querySelector<HTMLElement>('#refresh-extensions-statuses'); + assert(refresh); + refresh.addEventListener('click', refreshExtensionStatuses); } document.addEventListener('DOMContentLoaded', main);
diff --git a/chrome/browser/resources/sync_file_system_internals/file_metadata.js b/chrome/browser/resources/sync_file_system_internals/file_metadata.ts similarity index 63% rename from chrome/browser/resources/sync_file_system_internals/file_metadata.js rename to chrome/browser/resources/sync_file_system_internals/file_metadata.ts index 81db152e..603d0a0 100644 --- a/chrome/browser/resources/sync_file_system_internals/file_metadata.js +++ b/chrome/browser/resources/sync_file_system_internals/file_metadata.ts
@@ -6,12 +6,19 @@ * WebUI to monitor File Metadata per Extension ID. */ +import {assert} from 'chrome://resources/js/assert_ts.js'; import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; import {getImage} from 'chrome://resources/js/icon.js'; -import {$} from 'chrome://resources/js/util.m.js'; import {createElementFromDictionary, createElementFromText} from './utils.js'; +function getSelect(): HTMLSelectElement { + const select = + document.querySelector<HTMLSelectElement>('#extensions-select'); + assert(select); + return select; +} + /** * Gets extension data so the select drop down can be filled. */ @@ -21,15 +28,13 @@ /** * Renders result of getFileMetadata as a table. - * @param {!Array<!{ - * extensionName: string, - * extensionID: string, - * status: string, - * }>} extensionStatuses of dictionaries containing 'extensionName', - * 'extensionID', 'status'. */ -function onGetExtensions(extensionStatuses) { - const select = $('extensions-select'); +function onGetExtensions(extensionStatuses: Array<{ + extensionName: string, + extensionID: string, + status: string, +}>) { + const select = getSelect(); // Record existing drop down extension ID. If it's still there after the // refresh then keep it as the selected value. @@ -37,8 +42,7 @@ select.textContent = ''; for (let i = 0; i < extensionStatuses.length; i++) { - const originEntry = extensionStatuses[i]; - const tr = document.createElement('tr'); + const originEntry = extensionStatuses[i]!; const title = originEntry.extensionName + ' [' + originEntry.status + ']'; select.options.add(new Option(title, originEntry.extensionID)); @@ -46,7 +50,7 @@ if (originEntry.extensionID !== oldSelectedExtension) { continue; } - select.options[select.options.length - 1].selected = true; + select.options[select.options.length - 1]!.selected = true; } // After drop down has been loaded with options, file metadata can be loaded @@ -54,12 +58,12 @@ } /** - * @return {?string} extension ID that's currently selected in drop down box. + * @return extension ID that's currently selected in drop down box. */ -function getSelectedExtensionId() { - const dropDown = $('extensions-select').options; - if (dropDown.selectedIndex >= 0) { - return dropDown[dropDown.selectedIndex].value; +function getSelectedExtensionId(): string|null { + const select = getSelect(); + if (select.selectedIndex >= 0) { + return select.options[select.selectedIndex]!.value; } return null; @@ -70,10 +74,15 @@ * down if any. */ function refreshFileMetadata() { - const dropDown = $('extensions-select'); + const dropDown = getSelect(); if (dropDown.options.length === 0) { - $('file-metadata-header').textContent = ''; - $('file-metadata-entries').textContent = 'No file metadata available.'; + const header = document.querySelector<HTMLElement>('#file-metadata-header'); + assert(header); + header.textContent = ''; + const entries = + document.querySelector<HTMLElement>('#file-metadata-entries'); + assert(entries); + entries.textContent = 'No file metadata available.'; return; } @@ -85,8 +94,14 @@ /** * Renders result of getFileMetadata as a table. */ -function onGetFileMetadata(fileMetadataMap) { - const header = $('file-metadata-header'); +function onGetFileMetadata(fileMetadataMap: Array<{ + type: string, + status: string, + path: string, + details: {[key: string]: string}, +}>) { + const header = document.querySelector<HTMLElement>('#file-metadata-header'); + assert(header); // Only draw the header if it hasn't been drawn yet if (header.children.length === 0) { const tr = document.createElement('tr'); @@ -98,10 +113,12 @@ } // Add row entries. - const itemContainer = $('file-metadata-entries'); + const itemContainer = + document.querySelector<HTMLElement>('#file-metadata-entries'); + assert(itemContainer); itemContainer.textContent = ''; for (let i = 0; i < fileMetadataMap.length; i++) { - const metadatEntry = fileMetadataMap[i]; + const metadatEntry = fileMetadataMap[i]!; const tr = document.createElement('tr'); tr.appendChild(createFileIconCell(metadatEntry.type)); tr.appendChild(createElementFromText('td', metadatEntry.status)); @@ -112,10 +129,10 @@ } /** - * @param {string} type file type string. - * @return {!HTMLElement} TD with file or folder icon depending on type. + * @param type file type string. + * @return TD with file or folder icon depending on type. */ -function createFileIconCell(type) { +function createFileIconCell(type: string): HTMLElement { const img = document.createElement('div'); const lowerType = type.toLowerCase(); if (lowerType === 'file') { @@ -128,7 +145,7 @@ const imgWrapper = document.createElement('div'); imgWrapper.appendChild(img); - const td = /** @type {!HTMLElement} */ (document.createElement('td')); + const td = document.createElement('td'); td.className = 'file-icon-cell'; td.appendChild(imgWrapper); td.appendChild(document.createTextNode(type)); @@ -137,8 +154,11 @@ function main() { refreshExtensions(); - $('refresh-metadata-button').addEventListener('click', refreshExtensions); - $('extensions-select').addEventListener('change', refreshFileMetadata); + const refresh = + document.querySelector<HTMLElement>('#refresh-metadata-button'); + assert(refresh); + refresh.addEventListener('click', refreshExtensions); + getSelect().addEventListener('change', refreshFileMetadata); } document.addEventListener('DOMContentLoaded', main);
diff --git a/chrome/browser/resources/sync_file_system_internals/main.css b/chrome/browser/resources/sync_file_system_internals/main.css index 828f7fc..90160b6 100644 --- a/chrome/browser/resources/sync_file_system_internals/main.css +++ b/chrome/browser/resources/sync_file_system_internals/main.css
@@ -2,7 +2,7 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -tabbox { +cr-tab-box { min-height: 650px; } @@ -13,9 +13,9 @@ th, td { font-size: 14px; - padding-left: 0.5em; - padding-right: 0.5em; - text-align: left; + padding-inline-end: 0.5em; + padding-inline-start: 0.5em; + text-align: start; vertical-align: top; }
diff --git a/chrome/browser/resources/sync_file_system_internals/main.html b/chrome/browser/resources/sync_file_system_internals/main.html index 1a82485..39728c27 100644 --- a/chrome/browser/resources/sync_file_system_internals/main.html +++ b/chrome/browser/resources/sync_file_system_internals/main.html
@@ -8,7 +8,6 @@ <meta charset="utf-8"> <title>Sync File System Internals</title> <link rel="stylesheet" href="chrome://resources/css/text_defaults.css"> -<link rel="stylesheet" href="chrome://resources/css/tabs.css"> <link rel="stylesheet" href="main.css"> <script type="module" src="sync_service.js"></script> <script type="module" src="task_log.js"></script> @@ -18,84 +17,80 @@ <body> -<tabbox> - <tabs> - <tab>Sync Service</tab> - <tab>Task Log</tab> - <tab>Extension Statuses</tab> - <tab>File Metadata</tab> - <tab>Database Dump</tab> - </tabs> - <tabpanels> - <tabpanel> - <table> - <tbody> - <tr> - <td>Service Status</td> - <td id="service-status">N/A</td> - </tr> - <tr> - <td>Notification Source</td> - <td id="notification-source">N/A</td> - </tr> - </tbody> - </table> - <br> +<cr-tab-box hidden> + <div slot="tab">Sync Service</div> + <div slot="tab">Task Log</div> + <div slot="tab">Extension Statuses</div> + <div slot="tab">File Metadata</div> + <div slot="tab">Database Dump</div> + <div slot="panel"> + <table> + <tbody> + <tr> + <td>Service Status</td> + <td id="service-status">N/A</td> + </tr> + <tr> + <td>Notification Source</td> + <td id="notification-source">N/A</td> + </tr> + </tbody> + </table> + <br> - <button id="clear-log-button">Clear old logs</button> - <h3>Debug Log</h3> - <table> - <thead> - <tr> - <td class="log-time">Time</td> - <td class="log-event">Log Event</td> - </tr> - </thead> - <tbody id="log-entries"></tbody> - </table> - </tabpanel> - <tabpanel> - <h3>Task Log</h3> - <table> - <thead> - <tr> - <td>Duration</td> - <td>Task</td> - <td>Result</td> - <td>Details</td> - </tr> - </thead> - <tbody id="task-log-entries"></tbody> - </table> - </tabpanel> - <tabpanel> - <button id="refresh-extensions-statuses">Refresh</button> - <table> - <thead> - <tr> - <td>Extension Name</td> - <td>ID</td> - <td>Sync Status</td> - </tr> - </thead> - <tbody id="extension-entries"></tbody> - </table> - </tabpanel> - <tabpanel> - <select id="extensions-select"></select> - <button id="refresh-metadata-button">Refresh</button> + <button id="clear-log-button">Clear old logs</button> + <h3>Debug Log</h3> + <table> + <thead> + <tr> + <td class="log-time">Time</td> + <td class="log-event">Log Event</td> + </tr> + </thead> + <tbody id="log-entries"></tbody> + </table> + </div> + <div slot="panel"> + <h3>Task Log</h3> + <table> + <thead> + <tr> + <td>Duration</td> + <td>Task</td> + <td>Result</td> + <td>Details</td> + </tr> + </thead> + <tbody id="task-log-entries"></tbody> + </table> + </div> + <div slot="panel"> + <button id="refresh-extensions-statuses">Refresh</button> + <table> + <thead> + <tr> + <td>Extension Name</td> + <td>ID</td> + <td>Sync Status</td> + </tr> + </thead> + <tbody id="extension-entries"></tbody> + </table> + </div> + <div slot="panel"> + <select id="extensions-select"></select> + <button id="refresh-metadata-button">Refresh</button> - <table style="table-layout:fixed"> - <thead id="file-metadata-header"></thead> - <tbody id="file-metadata-entries"></tbody> - </table> - </tabpanel> - <tabpanel> - <button id="refresh-database-dump">Refresh</button> - <div id="dump-database-placeholder"></div> - </tabpanel> - </tabpanels> -</tabbox> + <table style="table-layout:fixed"> + <thead id="file-metadata-header"></thead> + <tbody id="file-metadata-entries"></tbody> + </table> + </div> + <div slot="panel"> + <button id="refresh-database-dump">Refresh</button> + <div id="dump-database-placeholder"></div> + </div> +</cr-tab-box> </body> </html>
diff --git a/chrome/browser/resources/sync_file_system_internals/sync_service.js b/chrome/browser/resources/sync_file_system_internals/sync_service.js deleted file mode 100644 index 7a28070..0000000 --- a/chrome/browser/resources/sync_file_system_internals/sync_service.js +++ /dev/null
@@ -1,103 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * WebUI to monitor the Sync File System Service. - */ - -import {addWebUIListener, sendWithPromise} from 'chrome://resources/js/cr.m.js'; -import {decorate} from 'chrome://resources/js/cr/ui.m.js'; -import {TabBox} from 'chrome://resources/js/cr/ui/tabs.js'; -import {$} from 'chrome://resources/js/util.m.js'; - -import {createElementFromText} from './utils.js'; - -/** - * Request Sync Service Status. - */ -function refreshServiceStatus() { - sendWithPromise('getServiceStatus').then(onGetServiceStatus); -} - -/** - * Called when service status is initially retrieved or updated via events. - * @param {string} statusString Service status enum as a string. - */ -function onGetServiceStatus(statusString) { - $('service-status').textContent = statusString; -} - -/** - * Request Google Drive Notification Source. e.g. XMPP or polling. - */ -function refreshNotificationSource() { - sendWithPromise('getNotificationSource').then(onGetNotificationSource); -} - -/** - * Handles callback from getNotificationSource. - * @param {string} sourceString Notification source as a string. - */ -function onGetNotificationSource(sourceString) { - $('notification-source').textContent = sourceString; -} - -// Keeps track of the last log event seen so it's not reprinted. -let lastLogEventId = -1; - -/** - * Request debug log. - */ -function refreshLog() { - sendWithPromise('getLog', lastLogEventId).then(onGetLog); -} - -/** - * Clear old logs. - */ -function clearLogs() { - chrome.send('clearLogs'); - $('log-entries').innerHTML = trustedTypes.emptyHTML; -} - -/** - * Handles callback from getUpdateLog. - * @param {!Array<!{ - * id: number, - * logEvent: string, - * time: string, - * }>} logEntries List of dictionaries containing 'id', 'time', 'logEvent'. - */ -function onGetLog(logEntries) { - const itemContainer = $('log-entries'); - for (let i = 0; i < logEntries.length; i++) { - const logEntry = logEntries[i]; - const tr = document.createElement('tr'); - const error = /ERROR/.test(logEntry.logEvent) ? ' error' : ''; - tr.appendChild( - createElementFromText('td', logEntry.time, {'class': 'log-time'})); - tr.appendChild(createElementFromText( - 'td', logEntry.logEvent, {'class': 'log-event' + error})); - itemContainer.appendChild(tr); - - lastLogEventId = logEntry.id; - } -} - -/** - * Get initial sync service values and set listeners to get updated values. - */ -function main() { - decorate('tabbox', TabBox); - $('clear-log-button').addEventListener('click', clearLogs); - refreshServiceStatus(); - refreshNotificationSource(); - - addWebUIListener('service-status-changed', onGetServiceStatus); - - // TODO: Look for a way to push entries to the page when necessary. - window.setInterval(refreshLog, 1000); -} - -document.addEventListener('DOMContentLoaded', main);
diff --git a/chrome/browser/resources/sync_file_system_internals/sync_service.ts b/chrome/browser/resources/sync_file_system_internals/sync_service.ts new file mode 100644 index 0000000..a9f160d --- /dev/null +++ b/chrome/browser/resources/sync_file_system_internals/sync_service.ts
@@ -0,0 +1,112 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * WebUI to monitor the Sync File System Service. + */ + +import 'chrome://resources/cr_elements/cr_tab_box/cr_tab_box.js'; + +import {assert} from 'chrome://resources/js/assert_ts.js'; +import {addWebUIListener, sendWithPromise} from 'chrome://resources/js/cr.m.js'; + +import {createElementFromText} from './utils.js'; + +/** + * Request Sync Service Status. + */ +function refreshServiceStatus() { + sendWithPromise('getServiceStatus').then(onGetServiceStatus); +} + +/** + * Called when service status is initially retrieved or updated via events. + * @param statusString Service status enum as a string. + */ +function onGetServiceStatus(statusString: string) { + const serviceStatus = document.querySelector<HTMLElement>('#service-status'); + assert(serviceStatus); + serviceStatus.textContent = statusString; +} + +/** + * Request Google Drive Notification Source. e.g. XMPP or polling. + */ +function refreshNotificationSource() { + sendWithPromise('getNotificationSource').then(onGetNotificationSource); +} + +/** + * Handles callback from getNotificationSource. + * @param sourceString Notification source as a string. + */ +function onGetNotificationSource(sourceString: string) { + const notificationSource = + document.querySelector<HTMLElement>('#notification-source'); + assert(notificationSource); + notificationSource.textContent = sourceString; +} + +// Keeps track of the last log event seen so it's not reprinted. +let lastLogEventId: number = -1; + +/** + * Request debug log. + */ +function refreshLog() { + sendWithPromise('getLog', lastLogEventId).then(onGetLog); +} + +/** + * Clear old logs. + */ +function clearLogs() { + chrome.send('clearLogs'); + const logEntries = document.querySelector<HTMLElement>('#log-entries'); + assert(logEntries); + assert(window.trustedTypes); + logEntries.innerHTML = window.trustedTypes.emptyHTML as unknown as string; +} + +/** + * Handles callback from getUpdateLog. + */ +function onGetLog( + logEntries: Array<{id: number, logEvent: string, time: string}>) { + const itemContainer = document.querySelector<HTMLElement>('#log-entries'); + assert(itemContainer); + for (let i = 0; i < logEntries.length; i++) { + const logEntry = logEntries[i]!; + const tr = document.createElement('tr'); + const error = /ERROR/.test(logEntry.logEvent) ? ' error' : ''; + tr.appendChild( + createElementFromText('td', logEntry.time, {'class': 'log-time'})); + tr.appendChild(createElementFromText( + 'td', logEntry.logEvent, {'class': 'log-event' + error})); + itemContainer.appendChild(tr); + + lastLogEventId = logEntry.id; + } +} + +/** + * Get initial sync service values and set listeners to get updated values. + */ +function main() { + const tabBox = document.querySelector('cr-tab-box'); + assert(tabBox); + tabBox.hidden = false; + const clearButton = document.querySelector<HTMLElement>('#clear-log-button'); + assert(clearButton); + clearButton.addEventListener('click', clearLogs); + refreshServiceStatus(); + refreshNotificationSource(); + + addWebUIListener('service-status-changed', onGetServiceStatus); + + // TODO: Look for a way to push entries to the page when necessary. + window.setInterval(refreshLog, 1000); +} + +document.addEventListener('DOMContentLoaded', main);
diff --git a/chrome/browser/resources/sync_file_system_internals/task_log.js b/chrome/browser/resources/sync_file_system_internals/task_log.ts similarity index 82% rename from chrome/browser/resources/sync_file_system_internals/task_log.js rename to chrome/browser/resources/sync_file_system_internals/task_log.ts index ddcf3207..35db1d8 100644 --- a/chrome/browser/resources/sync_file_system_internals/task_log.js +++ b/chrome/browser/resources/sync_file_system_internals/task_log.ts
@@ -2,22 +2,20 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {assert} from 'chrome://resources/js/assert_ts.js'; import {addWebUIListener} from 'chrome://resources/js/cr.m.js'; -import {$} from 'chrome://resources/js/util.m.js'; -import {createElementFromText} from './utils.js'; -const nextTaskLogSeq = 1; +import {createElementFromText} from './utils.js'; /** * Handles per-task log event. - * @param {!{ - * duration: number, - * task_description: string, - * result_description: string, - * details: !Array, - * }} taskLog */ -function onTaskLogRecorded(taskLog) { +function onTaskLogRecorded(taskLog: { + duration: number, + task_description: string, + result_description: string, + details: string[], +}) { const details = document.createElement('td'); details.classList.add('task-log-details'); @@ -31,7 +29,7 @@ const ul = document.createElement('ul'); for (let i = 0; i < taskLog.details.length; ++i) { - ul.appendChild(createElementFromText('li', taskLog.details[i])); + ul.appendChild(createElementFromText('li', taskLog.details[i]!)); } label.appendChild(ul); @@ -44,7 +42,9 @@ 'td', taskLog.result_description, {'class': 'task-log-result'})); tr.appendChild(details); - $('task-log-entries').appendChild(tr); + const entries = document.querySelector<HTMLElement>('#task-log-entries'); + assert(entries); + entries.appendChild(tr); } /**
diff --git a/chrome/browser/resources/sync_file_system_internals/utils.js b/chrome/browser/resources/sync_file_system_internals/utils.js deleted file mode 100644 index bd23d91..0000000 --- a/chrome/browser/resources/sync_file_system_internals/utils.js +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * Creates an element named |elementName| containing the content |text|. - * @param {string} elementName Name of the new element to be created. - * @param {string} text Text to be contained in the new element. - * @param {Object=} opt_attributes Optional attribute dictionary for the - * element. - * @return {!HTMLElement} The newly created HTML element. - */ -export function createElementFromText(elementName, text, opt_attributes) { - const element = - /** @type {!HTMLElement} */ (document.createElement(elementName)); - element.appendChild(document.createTextNode(text)); - if (opt_attributes) { - for (const key in opt_attributes) { - element.setAttribute(key, opt_attributes[key]); - } - } - return element; -} - -/** - * Creates an element with |tagName| containing the content |dict|. - * @param {string} elementName Name of the new element to be created. - * @param {Object<string>} dict Dictionary to be contained in the new - * element. - * @return {!HTMLElement} The newly created HTML element. - */ -export function createElementFromDictionary(elementName, dict) { - const element = - /** @type {!HTMLElement} */ (document.createElement(elementName)); - for (const key in dict) { - element.appendChild(document.createTextNode(key + ': ' + dict[key])); - element.appendChild(document.createElement('br')); - } - return element; -}
diff --git a/chrome/browser/resources/sync_file_system_internals/utils.ts b/chrome/browser/resources/sync_file_system_internals/utils.ts new file mode 100644 index 0000000..b3cc75a --- /dev/null +++ b/chrome/browser/resources/sync_file_system_internals/utils.ts
@@ -0,0 +1,40 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * Creates an element named |elementName| containing the content |text|. + * @param elementName Name of the new element to be created. + * @param text Text to be contained in the new element. + * @param attributes Optional attribute dictionary for the + * element. + * @return The newly created HTML element. + */ +export function createElementFromText( + elementName: string, text: string, + attributes?: {[key: string]: string}): HTMLElement { + const element = document.createElement(elementName); + element.appendChild(document.createTextNode(text)); + if (attributes) { + for (const key in attributes) { + element.setAttribute(key, attributes[key]!); + } + } + return element; +} + +/** + * Creates an element with |tagName| containing the content |dict|. + * @param elementName Name of the new element to be created. + * @param dict Dictionary to be contained in the new element. + * @return The newly created HTML element. + */ +export function createElementFromDictionary( + elementName: string, dict: {[key: string]: string}): HTMLElement { + const element = document.createElement(elementName); + for (const key in dict) { + element.appendChild(document.createTextNode(key + ': ' + dict[key])); + element.appendChild(document.createElement('br')); + } + return element; +}
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/crow/CrowButtonDelegate.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/crow/CrowButtonDelegate.java index dc50872..614f26d1b 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/crow/CrowButtonDelegate.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/crow/CrowButtonDelegate.java
@@ -6,6 +6,8 @@ import android.app.Activity; +import org.chromium.base.Callback; +import org.chromium.chrome.browser.tab.Tab; import org.chromium.url.GURL; /** @@ -28,11 +30,19 @@ * entry point. * @param pageUrl URL for the page; passed in rather than derived from currentTab * or WebContents's lastCommittedURL as it was used to construct UI in the caller. + * @param canonicalUrl Canonical URL for 'pageUrl.' May be empty. */ - void launchCustomTab(Activity currentActivity, GURL pageUrl); + void launchCustomTab(Activity currentActivity, GURL pageUrl, GURL canonicalUrl); /** * @return experiment-configured chip text. */ String getButtonText(); + + /** + * Obtains the Canonical URL for a Tab. + * @param tab The tab for which to find the canonical URL. + * @param Callback<String> callback returning the canonical URL, or empty. + */ + void requestCanonicalUrl(Tab tab, Callback<GURL> url); }
diff --git a/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc b/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc index 6191777..2276683 100644 --- a/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc
@@ -25,6 +25,7 @@ #include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app_install_info.h" #include "chrome/browser/web_applications/web_app_install_manager.h" +#include "chrome/browser/web_applications/web_app_install_params.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/browser/web_applications/web_app_registrar.h" #include "chrome/browser/web_applications/web_app_sync_bridge.h" @@ -114,7 +115,7 @@ ->install_manager() .InstallWebAppFromManifestWithFallback( browser->tab_strip_model()->GetActiveWebContents(), - WebAppInstallManager::WebAppInstallFlow::kInstallSite, source, + WebAppInstallFlow::kInstallSite, source, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting([&](const AppId& new_app_id, webapps::InstallResultCode code) {
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index cab5b284..2fa127f3 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -1757,6 +1757,7 @@ "//chrome/browser/profile_resetter:profile_reset_report_proto", "//chrome/browser/resource_coordinator:tab_metrics_event_proto", "//chrome/browser/resource_coordinator/tab_ranker", + "//chrome/browser/resources/identity_internals:resources", "//chrome/browser/resources/support_tool:resources", "//chrome/browser/safe_browsing", "//chrome/browser/safe_browsing:advanced_protection",
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java index d284e04..22eca15a 100644 --- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java +++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java
@@ -173,12 +173,14 @@ * @param groupDividerResourceId The resource id of divider menu items. This will be used to * determine the number of dividers that appear in the menu. * @param customViewBinders See {@link AppMenuPropertiesDelegate#getCustomViewBinders()}. + * @param isMenuIconAtStart Whether the menu is being shown from a menu icon positioned at + * the start. */ void show(Context context, final View anchorView, boolean isByPermanentButton, int screenRotation, Rect visibleDisplayFrame, int screenHeight, @IdRes int footerResourceId, @IdRes int headerResourceId, @IdRes int groupDividerResourceId, Integer highlightedItemId, - @Nullable List<CustomViewBinder> customViewBinders) { + @Nullable List<CustomViewBinder> customViewBinders, boolean isMenuIconAtStart) { mPopup = new PopupWindow(context); mPopup.setFocusable(true); mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); @@ -219,7 +221,10 @@ // Make sure that the popup window will be closed when touch outside of it. mPopup.setOutsideTouchable(true); - if (!isByPermanentButton) mPopup.setAnimationStyle(R.style.EndIconMenuAnim); + if (!isByPermanentButton) { + mPopup.setAnimationStyle( + isMenuIconAtStart ? R.style.StartIconMenuAnim : R.style.EndIconMenuAnim); + } // Turn off window animations for low end devices. if (SysUtils.isLowEndDevice()) mPopup.setAnimationStyle(0);
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java index 134caf9f..8e05909 100644 --- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java +++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java
@@ -219,7 +219,7 @@ } mAppMenu.show(wrapper, anchorView, isByPermanentButton, rotation, appRect, pt.y, footerResourceId, headerResourceId, mDelegate.getGroupDividerId(), mHighlightMenuId, - customViewBinders); + customViewBinders, mDelegate.isMenuIconAtStart()); mAppMenuDragHelper.onShow(startDragging); clearMenuHighlight(); RecordUserAction.record("MobileMenuShow");
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinder.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinder.java index fd0c62f..e5829103 100644 --- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinder.java +++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinder.java
@@ -181,8 +181,9 @@ setupImageButton(buttons[i], iconList.get(i).model, appMenuClickHandler); } - view.setTag( - R.id.menu_item_enter_anim_id, AppMenuUtil.buildIconItemEnterAnimator(buttons)); + boolean isMenuIconAtStart = model.get(AppMenuItemProperties.MENU_ICON_AT_START); + view.setTag(R.id.menu_item_enter_anim_id, + AppMenuUtil.buildIconItemEnterAnimator(buttons, isMenuIconAtStart)); // Tint action bar's background. view.setBackgroundResource(R.drawable.menu_action_bar_bg);
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/TestAppMenuPropertiesDelegate.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/TestAppMenuPropertiesDelegate.java index c760178..594b760 100644 --- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/TestAppMenuPropertiesDelegate.java +++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/TestAppMenuPropertiesDelegate.java
@@ -170,4 +170,9 @@ protected int getAppMenuLayoutId() { return R.menu.test_menu; } + + @Override + public boolean isMenuIconAtStart() { + return false; + } }
diff --git a/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemProperties.java b/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemProperties.java index 3c109160..033536b 100644 --- a/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemProperties.java +++ b/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemProperties.java
@@ -62,6 +62,13 @@ new WritableObjectPropertyKey<>(true /* skipEquality */, "CLICK_HANDLER"); /** + * Whether the menu is shown from a menu icon positioned at start. This is used to determine the + * horizontal animation direction of the item. + */ + public static final WritableBooleanPropertyKey MENU_ICON_AT_START = + new WritableBooleanPropertyKey(); + + /** * The sub menu for the menu item, this is used for the menu item which has sub menu items. ex. * icon row. * The {link ModelList} here do not need a view type since this diverges from other, non @@ -74,5 +81,5 @@ public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {MENU_ITEM_ID, TITLE, TITLE_CONDENSED, ENABLED, HIGHLIGHTED, CHECKABLE, CHECKED, ICON, ICON_COLOR_RES, - POSITION, SUPPORT_ENTER_ANIMATION, CLICK_HANDLER, SUBMENU}; + POSITION, SUPPORT_ENTER_ANIMATION, CLICK_HANDLER, MENU_ICON_AT_START, SUBMENU}; } \ No newline at end of file
diff --git a/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPropertiesDelegate.java b/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPropertiesDelegate.java index 43a32eb2..ea869d49 100644 --- a/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPropertiesDelegate.java +++ b/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPropertiesDelegate.java
@@ -148,4 +148,7 @@ * Called to record that user clicked on highlighted menu item {@code menuItemId}. */ void recordHighlightedMenuItemClicked(@Nullable @IdRes Integer menuItemId); + + /** Returns whether the menu icon is positioned at the start. */ + boolean isMenuIconAtStart(); }
diff --git a/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuUtil.java b/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuUtil.java index 4473d60..a014bf2 100644 --- a/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuUtil.java +++ b/chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuUtil.java
@@ -62,13 +62,16 @@ * it will animate the alpha from 0 to 1 and translate the views from 10dp to 0dp on the x axis. * * @param buttons The list of icons in the menu item that should be animated. + * @param isMenuIconAtStart Whether the menu was triggered from a menu icon positioned at start. * @return The {@link Animator}. */ - public static Animator buildIconItemEnterAnimator(final ImageView[] buttons) { + public static Animator buildIconItemEnterAnimator( + final ImageView[] buttons, boolean isMenuIconAtStart) { if (buttons.length < 1) return new AnimatorSet(); float dpToPx = buttons[0].getContext().getResources().getDisplayMetrics().density; final boolean rtl = LocalizationUtils.isLayoutRtl(); - final float offsetXPx = ENTER_STANDARD_ITEM_OFFSET_X_DP * dpToPx * (rtl ? -1.f : 1.f); + float offsetSign = (rtl == /* XNOR */ isMenuIconAtStart) ? 1.f : -1.f; + final float offsetXPx = ENTER_STANDARD_ITEM_OFFSET_X_DP * dpToPx * offsetSign; final int maxViewsToAnimate = buttons.length; AnimatorSet animation = new AnimatorSet();
diff --git a/chrome/browser/ui/app_list/app_context_menu.cc b/chrome/browser/ui/app_list/app_context_menu.cc index c073f9900..167adc8 100644 --- a/chrome/browser/ui/app_list/app_context_menu.cc +++ b/chrome/browser/ui/app_list/app_context_menu.cc
@@ -125,8 +125,7 @@ case ash::REORDER_BY_COLOR: return ash::kSortColorIcon; case ash::HIDE_CONTINUE_SECTION: - // TODO(crbug.com/1317428): Custom icon. - return ash::kLockScreenPasswordInvisibleIcon; + return ash::kLauncherHideContinueSectionIcon; case ash::NOTIFICATION_CONTAINER: NOTREACHED() << "NOTIFICATION_CONTAINER does not have an icon, and it is " "added to the model by NotificationMenuController.";
diff --git a/chrome/browser/ui/app_list/search/omnibox_result.cc b/chrome/browser/ui/app_list/search/omnibox_result.cc index 9b0ac6f0..fd7e280 100644 --- a/chrome/browser/ui/app_list/search/omnibox_result.cc +++ b/chrome/browser/ui/app_list/search/omnibox_result.cc
@@ -166,6 +166,7 @@ UpdateTitleAndDetails(); if (is_zero_suggestion_) { + DCHECK(!ash::features::IsProductivityLauncherEnabled()); InitializeButtonActions({ash::SearchResultActionType::kRemove, ash::SearchResultActionType::kAppend}); } else if (is_omnibox_search && @@ -373,24 +374,16 @@ const std::vector<ash::SearchResultActionType>& button_actions) { Actions actions; for (ash::SearchResultActionType button_action : button_actions) { - gfx::ImageSkia button_image; std::u16string button_tooltip; bool visible_on_hover = false; - const int kImageButtonIconSize = kSystemIconDimension; switch (button_action) { case ash::SearchResultActionType::kRemove: - button_image = - gfx::CreateVectorIcon(ash::kSearchResultRemoveIcon, - kImageButtonIconSize, GetGenericIconColor()); button_tooltip = l10n_util::GetStringFUTF16( IDS_APP_LIST_REMOVE_SUGGESTION_ACCESSIBILITY_NAME, title()); visible_on_hover = true; // visible upon hovering break; case ash::SearchResultActionType::kAppend: - button_image = - gfx::CreateVectorIcon(ash::kSearchResultAppendIcon, - kImageButtonIconSize, GetGenericIconColor()); button_tooltip = l10n_util::GetStringFUTF16( IDS_APP_LIST_APPEND_SUGGESTION_ACCESSIBILITY_NAME, title()); visible_on_hover = false; // always visible @@ -398,8 +391,7 @@ default: NOTREACHED(); } - Action search_action(button_action, button_image, button_tooltip, - visible_on_hover); + Action search_action(button_action, button_tooltip, visible_on_hover); actions.emplace_back(search_action); }
diff --git a/chrome/browser/ui/ash/assistant/assistant_browsertest.cc b/chrome/browser/ui/ash/assistant/assistant_browsertest.cc index 6049a7ec..30607f4 100644 --- a/chrome/browser/ui/ash/assistant/assistant_browsertest.cc +++ b/chrome/browser/ui/ash/assistant/assistant_browsertest.cc
@@ -3,6 +3,8 @@ // found in the LICENSE file. #include "ash/components/audio/cras_audio_handler.h" +#include "ash/constants/ash_features.h" +#include "ash/public/cpp/test/app_list_test_api.h" #include "base/command_line.h" #include "base/run_loop.h" #include "base/test/bind.h" @@ -67,6 +69,13 @@ void ShowAssistantUi() { if (!tester()->IsVisible()) tester()->PressAssistantKey(); + + // Make sure that the app list bubble finished showing when productivity + // launcher is enabled. + if (ash::features::IsProductivityLauncherEnabled()) { + ash::AppListTestApi().WaitForBubbleWindow( + /*wait_for_opening_animation=*/false); + } } void CloseAssistantUi() { @@ -139,6 +148,14 @@ tester()->PressAssistantKey(); + // Make sure that the app list bubble finished showing when productivity + // launcher is enabled (the app list view gets created asynchronously for + // productivity launcher). + if (ash::features::IsProductivityLauncherEnabled()) { + ash::AppListTestApi().WaitForBubbleWindow( + /*wait_for_opening_animation=*/false); + } + EXPECT_TRUE(tester()->IsVisible()); }
diff --git a/chrome/browser/ui/ash/assistant/assistant_timers_browsertest.cc b/chrome/browser/ui/ash/assistant/assistant_timers_browsertest.cc index f468b27..c1cdb2c 100644 --- a/chrome/browser/ui/ash/assistant/assistant_timers_browsertest.cc +++ b/chrome/browser/ui/ash/assistant/assistant_timers_browsertest.cc
@@ -6,6 +6,8 @@ #include <string> #include <vector> +#include "ash/constants/ash_features.h" +#include "ash/public/cpp/test/app_list_test_api.h" #include "ash/shelf/shelf.h" #include "ash/shelf/shelf_widget.h" #include "ash/shell.h" @@ -213,6 +215,10 @@ void ShowAssistantUi() { if (!tester()->IsVisible()) tester()->PressAssistantKey(); + if (ash::features::IsProductivityLauncherEnabled()) { + ash::AppListTestApi().WaitForBubbleWindow( + /*wait_for_opening_animation=*/true); + } } AssistantTestMixin* tester() { return &tester_; }
diff --git a/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc b/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc index b774c04..3796d1d 100644 --- a/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc +++ b/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc
@@ -193,7 +193,7 @@ if (!chromeos::features::IsDeskTemplateSyncEnabled()) { storage_manager_ = std::make_unique<desks_storage::LocalDeskDataManager>( - active_profile_->GetPath()); + active_profile_->GetPath(), account_id); } auto policy_desk_templates_it =
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc index f8865f3..f09dc30 100644 --- a/chrome/browser/ui/browser_command_controller.cc +++ b/chrome/browser/ui/browser_command_controller.cc
@@ -47,7 +47,7 @@ #include "chrome/browser/ui/web_applications/web_app_dialog_utils.h" #include "chrome/browser/ui/web_applications/web_app_launch_utils.h" #include "chrome/browser/ui/webui/inspect_ui.h" -#include "chrome/browser/web_applications/web_app_install_manager.h" +#include "chrome/browser/web_applications/web_app_install_params.h" #include "chrome/common/chrome_features.h" #include "chrome/common/content_restriction.h" #include "chrome/common/pref_names.h" @@ -701,14 +701,12 @@ case IDC_CREATE_SHORTCUT: base::RecordAction(base::UserMetricsAction("CreateShortcut")); web_app::CreateWebAppFromCurrentWebContents( - browser_, - web_app::WebAppInstallManager::WebAppInstallFlow::kCreateShortcut); + browser_, web_app::WebAppInstallFlow::kCreateShortcut); break; case IDC_INSTALL_PWA: base::RecordAction(base::UserMetricsAction("InstallWebAppFromMenu")); web_app::CreateWebAppFromCurrentWebContents( - browser_, - web_app::WebAppInstallManager::WebAppInstallFlow::kInstallSite); + browser_, web_app::WebAppInstallFlow::kInstallSite); break; case IDC_DEV_TOOLS: ToggleDevToolsWindow(browser_, DevToolsToggleAction::Show(),
diff --git a/chrome/browser/ui/quick_answers/ui/quick_answers_view.cc b/chrome/browser/ui/quick_answers/ui/quick_answers_view.cc index 7d2f28c..e5eacd51 100644 --- a/chrome/browser/ui/quick_answers/ui/quick_answers_view.cc +++ b/chrome/browser/ui/quick_answers/ui/quick_answers_view.cc
@@ -81,6 +81,7 @@ // Buttons view. constexpr int kButtonsViewMarginDip = 4; +constexpr int kButtonsSpacingDip = 4; constexpr int kDogfoodButtonSizeDip = 20; constexpr int kSettingsButtonSizeDip = 14; constexpr int kSettingsButtonBorderDip = 3; @@ -507,7 +508,8 @@ AddContentView(); - AddSettingsButton(); + // Add util buttons in the top-right corner. + AddFrameButtons(); } void QuickAnswersView::InitWidget() { @@ -547,14 +549,16 @@ std::make_unique<QuickAnswersTextLabel>(QuickAnswerResultText(loading))); } -void QuickAnswersView::AddSettingsButton() { +void QuickAnswersView::AddFrameButtons() { auto* buttons_view = AddChildView(std::make_unique<views::View>()); auto* layout = buttons_view->SetLayoutManager(std::make_unique<views::FlexLayout>()); layout->SetOrientation(views::LayoutOrientation::kHorizontal) - .SetInteriorMargin(gfx::Insets(kButtonsViewMarginDip)) .SetMainAxisAlignment(views::LayoutAlignment::kEnd) - .SetCrossAxisAlignment(views::LayoutAlignment::kStart); + .SetCrossAxisAlignment(views::LayoutAlignment::kStart) + .SetInteriorMargin(gfx::Insets(kButtonsViewMarginDip)) + .SetDefault(views::kMarginsKey, + gfx::Insets::TLBR(0, kButtonsSpacingDip, 0, 0)); if (is_internal_) { dogfood_feedback_button_ = buttons_view->AddChildView(
diff --git a/chrome/browser/ui/quick_answers/ui/quick_answers_view.h b/chrome/browser/ui/quick_answers/ui/quick_answers_view.h index fd7db59..14b15174 100644 --- a/chrome/browser/ui/quick_answers/ui/quick_answers_view.h +++ b/chrome/browser/ui/quick_answers/ui/quick_answers_view.h
@@ -62,7 +62,7 @@ void InitLayout(); void InitWidget(); void AddContentView(); - void AddSettingsButton(); + void AddFrameButtons(); void AddPhoneticsAudioButton( const quick_answers::PhoneticsInfo& phonetics_info, View* container);
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 3b2930f..32bdb0e9 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -3976,28 +3976,17 @@ } } - // Toggle fullscreen mode; move the window between displays as needed. - // TODO(crbug.com/1034783): Implement at lower layers to avoid transitions. -#if BUILDFLAG(IS_MAC) - bool entering_cross_screen_fullscreen = false; - const bool fullscreen_controller_mac_enabled = - base::FeatureList::IsEnabled(views::features::kFullscreenControllerMac); -#else // BUILDFLAG(IS_MAC) - const bool fullscreen_controller_mac_enabled = false; -#endif // BUILDFLAG(IS_MAC) bool swapping_screens_during_fullscreen = false; - if (fullscreen && display_id != display::kInvalidDisplayId && - !fullscreen_controller_mac_enabled) { +#if BUILDFLAG(IS_MAC) + frame_->SetFullscreen(fullscreen, display_id); +#else // BUILDFLAG(IS_MAC) + if (fullscreen && display_id != display::kInvalidDisplayId) { display::Screen* screen = display::Screen::GetScreen(); display::Display display; display::Display current_display = screen->GetDisplayNearestWindow(GetNativeWindow()); if (screen && screen->GetDisplayWithDisplayId(display_id, &display) && current_display.id() != display_id) { -#if BUILDFLAG(IS_MAC) - entering_cross_screen_fullscreen = true; -#endif // BUILDFLAG(IS_MAC) - // Fullscreen windows must exit fullscreen to move to another display. if (IsFullscreen()) { swapping_screens_during_fullscreen = true; @@ -4042,23 +4031,7 @@ frame_->GetWindowBoundsInScreen().size()}); } } - -#if BUILDFLAG(IS_MAC) - // On Mac, the fullscreen state change must be requested with a delay after - // moving the window to the target display; see http://crbug.com/1210548 - base::TimeDelta delay; - if (swapping_screens_during_fullscreen) - delay = base::Milliseconds(1000); - else if (entering_cross_screen_fullscreen) - delay = base::Milliseconds(1); - frame_->SetFullscreen(fullscreen, delay, - fullscreen_controller_mac_enabled - ? display_id - : display::kInvalidDisplayId); -#else // BUILDFLAG(IS_MAC) frame_->SetFullscreen(fullscreen); - // On Mac, the pre-fullscreen bounds must be restored after an asynchronous - // transition out of the fullscreen workspace; see http://crbug.com/1039874 if (!fullscreen && restore_pre_fullscreen_bounds_callback_) std::move(restore_pre_fullscreen_bounds_callback_).Run(); #endif // BUILDFLAG(IS_MAC)
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc index 8a0a585..f91a729 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc
@@ -11,6 +11,7 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/webui/side_panel/read_anything/read_anything.mojom.h" +#include "content/public/browser/page.h" #include "ui/accessibility/ax_node.h" #include "ui/accessibility/ax_role_properties.h" #include "ui/accessibility/ax_tree.h" @@ -58,6 +59,7 @@ DCHECK(browser_); if (browser_->tab_strip_model()) browser_->tab_strip_model()->RemoveObserver(this); + WebContentsObserver::Observe(nullptr); } void ReadAnythingController::OnFontChoiceChanged(int new_choice) { @@ -77,12 +79,17 @@ DistillAXTree(); } +void ReadAnythingController::PrimaryPageChanged(content::Page& page) { + DistillAXTree(); +} + void ReadAnythingController::DistillAXTree() { DCHECK(browser_); content::WebContents* web_contents = browser_->tab_strip_model()->GetActiveWebContents(); if (!web_contents) return; + WebContentsObserver::Observe(web_contents); // Read Anything just runs on the main frame and does not run on embedded // content.
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h index 8427aa2..22d8019 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h
@@ -13,8 +13,13 @@ #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h" #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h" #include "chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.h" +#include "content/public/browser/web_contents_observer.h" #include "ui/accessibility/ax_node_id_forward.h" +namespace content { +class Page; +} + namespace ui { struct AXTreeUpdate; } @@ -34,7 +39,8 @@ // class ReadAnythingController : public ReadAnythingToolbarView::Delegate, public ReadAnythingPageHandler::Delegate, - public TabStripModelObserver { + public TabStripModelObserver, + public content::WebContentsObserver { public: ReadAnythingController(ReadAnythingModel* model, Browser* browser); ReadAnythingController(const ReadAnythingController&) = delete; @@ -54,6 +60,9 @@ const TabStripModelChange& change, const TabStripSelectionChange& selection) override; + // content::WebContentsObserver: + void PrimaryPageChanged(content::Page& page) override; + // Requests a distilled AXTree for the main frame of the currently active // web contents. void DistillAXTree();
diff --git a/chrome/browser/ui/views/user_education/new_badge_label.cc b/chrome/browser/ui/views/user_education/new_badge_label.cc index 824ba5d7..2935c0d 100644 --- a/chrome/browser/ui/views/user_education/new_badge_label.cc +++ b/chrome/browser/ui/views/user_education/new_badge_label.cc
@@ -120,19 +120,9 @@ const int badge_x = views::NewBadge::kNewBadgeHorizontalMargin - extra_width + (base::i18n::IsRTL() ? width() - contents_bounds.x() : contents_bounds.right()); - int top = contents_bounds.y(); - switch (GetVerticalAlignment()) { - case gfx::VerticalAlignment::ALIGN_TOP: - break; - case gfx::VerticalAlignment::ALIGN_MIDDLE: - top += (contents_bounds.height() - font_list().GetHeight()) / 2; - break; - case gfx::VerticalAlignment::ALIGN_BOTTOM: - top += contents_bounds.height() - font_list().GetHeight(); - break; - } - views::NewBadge::DrawNewBadge(canvas, this, badge_x, top, font_list()); + views::NewBadge::DrawNewBadge(canvas, this, badge_x, GetFontListY(), + font_list()); } void NewBadgeLabel::UpdatePaddingForNewBadge() {
diff --git a/chrome/browser/ui/views/web_apps/web_app_tab_strip_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_tab_strip_browsertest.cc index f7ca8dc..ad770e0b3 100644 --- a/chrome/browser/ui/views/web_apps/web_app_tab_strip_browsertest.cc +++ b/chrome/browser/ui/views/web_apps/web_app_tab_strip_browsertest.cc
@@ -23,6 +23,7 @@ #include "chrome/browser/web_applications/web_app_constants.h" #include "chrome/browser/web_applications/web_app_install_info.h" #include "chrome/browser/web_applications/web_app_install_manager.h" +#include "chrome/browser/web_applications/web_app_install_params.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/browser/web_applications/web_app_registrar.h" #include "chrome/browser/web_applications/web_app_sync_bridge.h" @@ -148,7 +149,7 @@ test::WaitUntilReady(provider); provider->install_manager().InstallWebAppFromManifestWithFallback( browser()->tab_strip_model()->GetActiveWebContents(), - WebAppInstallManager::WebAppInstallFlow::kInstallSite, + WebAppInstallFlow::kInstallSite, webapps::WebappInstallSource::MENU_BROWSER_TAB, /*dialog_callback=*/ base::BindLambdaForTesting(
diff --git a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc index 347f7338..927753f 100644 --- a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc +++ b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
@@ -144,7 +144,8 @@ const content::IdentityRequestAccount& account) { auto row = std::make_unique<views::View>(); row->SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kVertical)); + views::BoxLayout::Orientation::kVertical, gfx::Insets::TLBR(0, 0, 4, 0))); + row->AddChildView(CreateAccountRow(account, /*should_hover=*/false)); // Prefer using the given name if it is provided, otherwise fallback to name. @@ -175,6 +176,12 @@ row->AddChildView(std::make_unique<views::StyledLabel>()); disclosure_label->SetHorizontalAlignment( gfx::HorizontalAlignment::ALIGN_LEFT); + + // Set custom top margin for `disclosure_label` in order to take + // (line_height - font_height) into account. + disclosure_label->SetBorder( + views::CreateEmptyBorder(gfx::Insets::TLBR(14, 0, 0, 0))); + std::vector<size_t> offsets; if (client_data_.terms_of_service_url.is_empty()) { // Case for when we only need to add a link for privacy policy URL, but not
diff --git a/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc b/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc index 483edc5..a3e1a589 100644 --- a/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc +++ b/chrome/browser/ui/web_applications/test/web_app_browsertest_util.cc
@@ -137,7 +137,7 @@ test::WaitUntilReady(provider); provider->install_manager().InstallWebAppFromManifestWithFallback( browser->tab_strip_model()->GetActiveWebContents(), - WebAppInstallManager::WebAppInstallFlow::kInstallSite, + WebAppInstallFlow::kInstallSite, webapps::WebappInstallSource::MENU_BROWSER_TAB, base::BindOnce(&AutoAcceptDialogCallback), base::BindLambdaForTesting( @@ -166,7 +166,7 @@ test::WaitUntilReady(provider); provider->install_manager().InstallWebAppFromManifestWithFallback( browser->tab_strip_model()->GetActiveWebContents(), - WebAppInstallManager::WebAppInstallFlow::kInstallSite, + WebAppInstallFlow::kInstallSite, webapps::WebappInstallSource::MENU_BROWSER_TAB, base::BindOnce(&AutoAcceptDialogCallback), base::BindLambdaForTesting(
diff --git a/chrome/browser/ui/web_applications/web_app_dialog_utils.cc b/chrome/browser/ui/web_applications/web_app_dialog_utils.cc index b15b0b9..8de74ee1 100644 --- a/chrome/browser/ui/web_applications/web_app_dialog_utils.cc +++ b/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
@@ -33,8 +33,6 @@ namespace web_app { -using WebAppInstallFlow = WebAppInstallManager::WebAppInstallFlow; - namespace { void OnWebAppInstallShowInstallDialog( @@ -105,9 +103,8 @@ !profile->IsOffTheRecord(); } -void CreateWebAppFromCurrentWebContents( - Browser* browser, - WebAppInstallManager::WebAppInstallFlow flow) { +void CreateWebAppFromCurrentWebContents(Browser* browser, + WebAppInstallFlow flow) { DCHECK(CanCreateWebApp(browser)); content::WebContents* web_contents = @@ -120,10 +117,9 @@ webapps::WebappInstallSource install_source = webapps::InstallableMetrics::GetInstallSource( - web_contents, - flow == WebAppInstallManager::WebAppInstallFlow::kCreateShortcut - ? webapps::InstallTrigger::CREATE_SHORTCUT - : webapps::InstallTrigger::MENU); + web_contents, flow == WebAppInstallFlow::kCreateShortcut + ? webapps::InstallTrigger::CREATE_SHORTCUT + : webapps::InstallTrigger::MENU); WebAppInstalledCallback callback = base::DoNothing(); @@ -143,14 +139,14 @@ if (!provider) return false; - provider->command_manager().EnqueueCommand( + provider->command_manager().ScheduleCommand( std::make_unique<FetchManifestAndInstallCommand>( &provider->install_finalizer(), &provider->registrar(), install_source, web_contents->GetWeakPtr(), bypass_service_worker_check, base::BindOnce(OnWebAppInstallShowInstallDialog, - WebAppInstallManager::WebAppInstallFlow::kInstallSite, - install_source, iph_state), + WebAppInstallFlow::kInstallSite, install_source, + iph_state), base::BindOnce(OnWebAppInstalled, std::move(installed_callback)))); return true; }
diff --git a/chrome/browser/ui/web_applications/web_app_dialog_utils.h b/chrome/browser/ui/web_applications/web_app_dialog_utils.h index f620ce0..86b0cae9 100644 --- a/chrome/browser/ui/web_applications/web_app_dialog_utils.h +++ b/chrome/browser/ui/web_applications/web_app_dialog_utils.h
@@ -24,6 +24,8 @@ namespace web_app { +enum class WebAppInstallFlow; + // TODO(loyso): Rework these functions (API). Move all of them into // WebAppDialogManager. @@ -39,9 +41,8 @@ webapps::InstallResultCode code)>; // Initiates user install of a WebApp for the current page. -void CreateWebAppFromCurrentWebContents( - Browser* browser, - WebAppInstallManager::WebAppInstallFlow flow); +void CreateWebAppFromCurrentWebContents(Browser* browser, + WebAppInstallFlow flow); // Starts install of a WebApp for a given |web_contents|, initiated from // a promotional banner or omnibox install icon.
diff --git a/chrome/browser/ui/webui/BUILD.gn b/chrome/browser/ui/webui/BUILD.gn index 6a23ff2..b915360 100644 --- a/chrome/browser/ui/webui/BUILD.gn +++ b/chrome/browser/ui/webui/BUILD.gn
@@ -60,7 +60,10 @@ "//chrome/browser/ash", ] if (!is_official_build) { - deps += [ "//ash/webui/sample_system_web_app_ui" ] + deps += [ + "//ash/webui/demo_mode_app_ui", + "//ash/webui/sample_system_web_app_ui", + ] } } }
diff --git a/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc b/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc index b98912a..1a0b535 100644 --- a/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc +++ b/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc
@@ -155,9 +155,12 @@ receiver_(this, std::move(page_handler)), cast_mode_set_(cast_mode_set), media_route_starter_(std::move(media_route_starter)) { - access_code_sink_service_ = AccessCodeCastSinkServiceFactory::GetForProfile( - media_route_starter_->GetProfile()); - Init(); + if (media_route_starter_) { + access_code_sink_service_ = + AccessCodeCastSinkServiceFactory::GetForProfile( + media_route_starter_->GetProfile()); + Init(); + } } AccessCodeCastHandler::AccessCodeCastHandler( @@ -175,7 +178,8 @@ } AccessCodeCastHandler::~AccessCodeCastHandler() { - media_route_starter_->RemoveMediaSinkWithCastModesObserver(this); + if (media_route_starter_) + media_route_starter_->RemoveMediaSinkWithCastModesObserver(this); } void AccessCodeCastHandler::Init() { @@ -191,6 +195,11 @@ const std::string& access_code, access_code_cast::mojom::CastDiscoveryMethod discovery_method, AddSinkCallback callback) { + DCHECK(media_route_starter_) << "Must have a MediaRouteStarter"; + if (!media_route_starter_) { + std::move(callback).Run(AddSinkResultCode::UNKNOWN_ERROR); + return; + } AddSinkCallback callback_with_metrics = std::move(base::BindOnce(&AddSinkMetricsCallback)) .Then(std::move(callback)); @@ -212,6 +221,7 @@ if (!add_sink_callback_) return; DCHECK(sink_id_) << "Must have a sink id to complete!"; + DCHECK(media_route_starter_) << "Must have a MediaRouteStarter to complete!"; // Verify that the sink is in QRM. if (std::find_if(cast_mode_set_.begin(), cast_mode_set_.end(), @@ -271,6 +281,12 @@ } void AccessCodeCastHandler::CastToSink(CastToSinkCallback callback) { + DCHECK(media_route_starter_) << "Must have a MediaRouteStarter"; + if (!media_route_starter_) { + std::move(callback).Run(RouteRequestResultCode::UNKNOWN_ERROR); + return; + } + DCHECK(sink_id_) << "Cast called without a valid sink id!"; GetMediaRouter()->GetLogger()->LogInfo(
diff --git a/chrome/browser/ui/webui/chrome_web_ui_configs_chromeos.cc b/chrome/browser/ui/webui/chrome_web_ui_configs_chromeos.cc index ed9f1501..e97fe32 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_configs_chromeos.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_configs_chromeos.cc
@@ -9,6 +9,7 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) #if !defined(OFFICIAL_BUILD) +#include "ash/webui/demo_mode_app_ui/demo_mode_app_ui.h" #include "ash/webui/sample_system_web_app_ui/sample_system_web_app_ui.h" #endif // !defined(OFFICIAL_BUILD) #endif // BUILDFLAG(IS_CHROMEOS_ASH) @@ -20,6 +21,7 @@ #if !defined(OFFICIAL_BUILD) auto& map = content::WebUIConfigMap::GetInstance(); map.AddWebUIConfig(std::make_unique<ash::SampleSystemWebAppUIConfig>()); + map.AddWebUIConfig(std::make_unique<ash::DemoModeAppUIConfig>()); #endif // !defined(OFFICIAL_BUILD) } #endif // BUILDFLAG(IS_CHROMEOS_ASH)
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 bdaedc43..dcfe8a4 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -291,8 +291,6 @@ #endif #if BUILDFLAG(IS_CHROMEOS_ASH) && !defined(OFFICIAL_BUILD) -#include "ash/webui/demo_mode_app_ui/demo_mode_app_ui.h" -#include "ash/webui/demo_mode_app_ui/url_constants.h" #include "chrome/browser/ui/webui/chromeos/emulator/device_emulator_ui.h" #endif @@ -1110,11 +1108,6 @@ return &NewWebUI<DeviceEmulatorUI>; } #endif // !defined(USE_REAL_DBUS_CLIENTS) - if (url.host_piece() == ash::kChromeUIDemoModeAppHost) { - if (ash::features::IsDemoModeSWAEnabled()) { - return &NewWebUI<ash::DemoModeAppUI>; - } - } #endif // !defined(OFFICIAL_BUILD) #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
diff --git a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc index e168395..1d89583 100644 --- a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
@@ -658,6 +658,8 @@ IDS_ENTERPRISE_ENROLLMENT_ENROLL_ENTERPRISE); builder->Add("kioskEnrollmentButton", IDS_ENTERPRISE_ENROLLMENT_ENROLL_KIOSK); + builder->Add("enollmentInProgress", + IDS_ENTERPRISE_ENROLLMENT_SCREEN_PROGRESS_LABEL); builder->Add("oauthEnrollRetry", IDS_ENTERPRISE_ENROLLMENT_RETRY); builder->Add("oauthEnrollManualEnrollment", IDS_ENTERPRISE_ENROLLMENT_ENROLL_MANUALLY); @@ -686,6 +688,8 @@ IDS_ENTERPRISE_ENROLLMENT_KIOSK_CONFIRM_MESSAGE); builder->Add("oauthEnrollKioskEnrollmentConfirmPowerwashMessage", IDS_ENTERPRISE_ENROLLMENT_KIOSK_CONFIRM_POWERWASH_MESSAGE); + builder->Add("oauthEnrollKioskCancelEnrollmentButton", + IDS_ENTERPRISE_ENROLLMENT_KIOSK_CANCEL_BUTTON); builder->Add("oauthEnrollKioskEnrollmentConfirmButton", IDS_ENTERPRISE_ENROLLMENT_KIOSK_CONFIRM_BUTTON); builder->Add("oauthEnrollKioskEnrollmentWorkingTitle",
diff --git a/chrome/browser/ui/webui/identity_internals_ui.cc b/chrome/browser/ui/webui/identity_internals_ui.cc index a9fe356a..5612c20 100644 --- a/chrome/browser/ui/webui/identity_internals_ui.cc +++ b/chrome/browser/ui/webui/identity_internals_ui.cc
@@ -16,8 +16,9 @@ #include "chrome/browser/extensions/api/identity/identity_api.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/url_constants.h" -#include "chrome/grit/browser_resources.h" #include "chrome/grit/generated_resources.h" +#include "chrome/grit/identity_internals_resources.h" +#include "chrome/grit/identity_internals_resources_map.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_controller.h" #include "content/public/browser/web_ui_data_source.h" @@ -316,12 +317,14 @@ content::WebUIDataSource::Create(chrome::kChromeUIIdentityInternalsHost); // Required resources - html_source->AddResourcePath("identity_internals.css", - IDR_IDENTITY_INTERNALS_CSS); - html_source->AddResourcePath("identity_internals.js", - IDR_IDENTITY_INTERNALS_JS); - html_source->SetDefaultResource(IDR_IDENTITY_INTERNALS_HTML); + html_source->AddResourcePaths(base::make_span( + kIdentityInternalsResources, kIdentityInternalsResourcesSize)); + html_source->SetDefaultResource( + IDR_IDENTITY_INTERNALS_IDENTITY_INTERNALS_HTML); + html_source->OverrideContentSecurityPolicy( + network::mojom::CSPDirectiveName::TrustedTypes, + "trusted-types static-types;"); content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), html_source); web_ui->AddMessageHandler(
diff --git a/chrome/browser/ui/webui/identity_internals_ui_browsertest.js b/chrome/browser/ui/webui/identity_internals_ui_browsertest.js index 448f30f8..0861951a 100644 --- a/chrome/browser/ui/webui/identity_internals_ui_browsertest.js +++ b/chrome/browser/ui/webui/identity_internals_ui_browsertest.js
@@ -35,7 +35,8 @@ * @return {!NodeList} Elements displaying token information. */ getTokens: function() { - return document.querySelectorAll('#token-list > div'); + return document.querySelector('#token-list') + .querySelectorAll('token-list-item'); }, /** @@ -46,7 +47,7 @@ getExpirationTime: function(tokenEntry) { // Full-date format has 'at' between date and time in en-US, but // ECMAScript's Date.parse cannot grok it. - return Date.parse(tokenEntry.querySelector('.expiration-time') + return Date.parse(tokenEntry.shadowRoot.querySelector('.expiration-time') .innerText.replace(' at ', ' ')); }, @@ -56,7 +57,7 @@ * @return {string} Extension Id of the token. */ getExtensionId: function(tokenEntry) { - return tokenEntry.querySelector('.extension-id').innerText; + return tokenEntry.shadowRoot.querySelector('.extension-id').innerText; }, /** @@ -65,7 +66,7 @@ * @return {string} Account Id of the token. */ getAccountId: function(tokenEntry) { - return tokenEntry.querySelector('.account-id').innerText; + return tokenEntry.shadowRoot.querySelector('.account-id').innerText; }, /** @@ -74,7 +75,7 @@ * @return {string} Extension Name of the token. */ getExtensionName: function(tokenEntry) { - return tokenEntry.querySelector('.extension-name').innerText; + return tokenEntry.shadowRoot.querySelector('.extension-name').innerText; }, /** @@ -83,7 +84,7 @@ * @return {HTMLButtonElement} Revoke button belonging related to the token. */ getRevokeButton: function(tokenEntry) { - return tokenEntry.querySelector('.revoke-button'); + return tokenEntry.shadowRoot.querySelector('.revoke-button'); }, /** @@ -92,7 +93,7 @@ * @return {string} Token ID of the token. */ getAccessToken: function(tokenEntry) { - return tokenEntry.querySelector('.access-token').innerText; + return tokenEntry.shadowRoot.querySelector('.access-token').innerText; }, /** @@ -101,7 +102,7 @@ * @return {string} Token status of the token. */ getTokenStatus: function(tokenEntry) { - return tokenEntry.querySelector('.token-status').innerText; + return tokenEntry.shadowRoot.querySelector('.status').innerText; }, /** @@ -110,7 +111,7 @@ * @return {string[]} Token scopes of the token. */ getScopes: function(tokenEntry) { - return tokenEntry.querySelector('.scope-list') + return tokenEntry.shadowRoot.querySelector('.scope-list') .innerHTML.split('<br>'); }, }; @@ -164,27 +165,31 @@ // correctly. They are implemented on the child class, because the parent does // not have any tokens to display. TEST_F('IdentityInternalsSingleTokenWebUITest', 'verifyGetters', function() { - const tokenListEntries = document.querySelectorAll('#token-list > div'); + const tokenListEntries = document.querySelector('#token-list') + .querySelectorAll('token-list-item'); const actualTokens = this.getTokens(); assertEquals(tokenListEntries.length, actualTokens.length); assertEquals(tokenListEntries[0], actualTokens[0]); assertEquals(this.getExtensionName(tokenListEntries[0]), - tokenListEntries[0].querySelector('.extension-name').innerText); + tokenListEntries[0].shadowRoot.querySelector('.extension-name') + .innerText); assertEquals(this.getExtensionId(tokenListEntries[0]), - tokenListEntries[0].querySelector('.extension-id').innerText); + tokenListEntries[0].shadowRoot.querySelector('.extension-id').innerText); assertEquals(this.getAccountId(tokenListEntries[0]), - tokenListEntries[0].querySelector('.account-id').innerText); + tokenListEntries[0].shadowRoot.querySelector('.account-id').innerText); assertEquals(this.getAccessToken(tokenListEntries[0]), - tokenListEntries[0].querySelector('.access-token').innerText); + tokenListEntries[0].shadowRoot.querySelector('.access-token').innerText); assertEquals(this.getTokenStatus(tokenListEntries[0]), - tokenListEntries[0].querySelector('.token-status').innerText); + tokenListEntries[0].shadowRoot.querySelector('.status').innerText); // Full-date format has 'at' between date and time in en-US, but // ECMAScript's Date.parse cannot grok it. assertEquals(this.getExpirationTime(tokenListEntries[0]), - Date.parse(tokenListEntries[0].querySelector('.expiration-time') + Date.parse( + tokenListEntries[0].shadowRoot.querySelector('.expiration-time') .innerText.replace(' at ', ' '))); const scopes = - tokenListEntries[0].querySelector('.scope-list').innerHTML.split('<br>'); + tokenListEntries[0].shadowRoot.querySelector('.scope-list') + .innerHTML.split('<br>'); const actualScopes = this.getScopes(tokenListEntries[0]); assertEquals(scopes.length, actualScopes.length); for (let i = 0; i < scopes.length; i++) {
diff --git a/chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_ui.cc b/chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_ui.cc index 4cd5ff6f..8444eeb5 100644 --- a/chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_ui.cc +++ b/chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_ui.cc
@@ -17,6 +17,7 @@ #include "chrome/grit/sync_file_system_internals_resources_map.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_data_source.h" +#include "services/network/public/mojom/content_security_policy.mojom.h" namespace { @@ -29,6 +30,9 @@ base::make_span(kSyncFileSystemInternalsResources, kSyncFileSystemInternalsResourcesSize)); source->SetDefaultResource(IDR_SYNC_FILE_SYSTEM_INTERNALS_MAIN_HTML); + source->OverrideContentSecurityPolicy( + network::mojom::CSPDirectiveName::TrustedTypes, + "trusted-types static-types;"); return source; }
diff --git a/chrome/browser/ui/webui/web_app_internals/web_app_internals_source.cc b/chrome/browser/ui/webui/web_app_internals/web_app_internals_source.cc index ec51c46d..6444b54 100644 --- a/chrome/browser/ui/webui/web_app_internals/web_app_internals_source.cc +++ b/chrome/browser/ui/webui/web_app_internals/web_app_internals_source.cc
@@ -5,9 +5,12 @@ #include "chrome/browser/ui/webui/web_app_internals/web_app_internals_source.h" #include "base/files/file_enumerator.h" +#include "base/files/file_util.h" #include "base/json/json_writer.h" #include "base/memory/ref_counted_memory.h" #include "base/ranges/algorithm.h" +#include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/task/task_runner.h" #include "base/task/thread_pool.h" #include "build/build_config.h" @@ -232,18 +235,41 @@ } #endif -base::Value BuildWebAppDiskStateJson(Profile* profile, base::Value root) { - base::Value file_list(base::Value::Type::LIST); +void BuildDirectoryState(base::FilePath file_or_folder, + base::Value::Dict* folder) { + base::File::Info info; + bool success = base::GetFileInfo(file_or_folder, &info); + if (!success) { + folder->Set(file_or_folder.AsUTF8Unsafe(), "Invalid file or folder"); + return; + } + // The path of files is fully printed to allow easy copy-paste for developer + // reference. + if (!info.is_directory) { + folder->Set(file_or_folder.AsUTF8Unsafe(), + base::StrCat({base::NumberToString(info.size / 1024), "kb"})); + return; + } - base::FileEnumerator files(web_app::GetWebAppsRootDirectory(profile), true, - base::FileEnumerator::FILES); + base::Value::Dict contents; + base::FileEnumerator files( + file_or_folder, false, + base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES); for (base::FilePath current = files.Next(); !current.empty(); current = files.Next()) { - file_list.Append(current.AsUTF8Unsafe()); + BuildDirectoryState(current, &contents); } - base::Value section(base::Value::Type::DICTIONARY); - section.SetKey(kWebAppDirectoryDiskState, std::move(file_list)); - root.Append(std::move(section)); + folder->Set(file_or_folder.BaseName().AsUTF8Unsafe(), std::move(contents)); +} + +base::Value BuildWebAppDiskStateJson(base::FilePath root_directory, + base::Value root) { + base::Value::Dict contents; + BuildDirectoryState(root_directory, &contents); + + base::Value::Dict section; + section.Set(kWebAppDirectoryDiskState, std::move(contents)); + root.Append(base::Value(std::move(section))); return root; } @@ -264,7 +290,9 @@ #endif base::ThreadPool::PostTaskAndReplyWithResult( FROM_HERE, {base::TaskPriority::USER_VISIBLE, base::MayBlock()}, - base::BindOnce(&BuildWebAppDiskStateJson, profile, std::move(root)), + base::BindOnce(&BuildWebAppDiskStateJson, + web_app::GetWebAppsRootDirectory(profile), + std::move(root)), std::move(callback)); }
diff --git a/chrome/browser/web_applications/commands/fetch_manifest_and_install_command.cc b/chrome/browser/web_applications/commands/fetch_manifest_and_install_command.cc index 8278df3..cb609f8 100644 --- a/chrome/browser/web_applications/commands/fetch_manifest_and_install_command.cc +++ b/chrome/browser/web_applications/commands/fetch_manifest_and_install_command.cc
@@ -4,17 +4,22 @@ #include "chrome/browser/web_applications/commands/fetch_manifest_and_install_command.h" +#include <memory> #include <utility> #include "base/bind.h" #include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" +#include "base/values.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/commands/web_app_command.h" #include "chrome/browser/web_applications/commands/web_app_install_command.h" #include "chrome/browser/web_applications/web_app_command_manager.h" #include "chrome/browser/web_applications/web_app_data_retriever.h" #include "chrome/browser/web_applications/web_app_helpers.h" +#include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents.h" +#include "fetch_manifest_and_install_command.h" namespace web_app { @@ -36,11 +41,101 @@ install_callback_(std::move(callback)), data_retriever_(std::make_unique<WebAppDataRetriever>()) {} +FetchManifestAndInstallCommand::FetchManifestAndInstallCommand( + WebAppInstallFinalizer* install_finalizer, + WebAppRegistrar* registrar, + webapps::WebappInstallSource install_surface, + base::WeakPtr<content::WebContents> contents, + bool bypass_service_worker_check, + WebAppInstallDialogCallback dialog_callback, + OnceInstallCallback callback, + bool use_fallback, + WebAppInstallFlow flow) + : WebAppCommand(WebAppCommandLock::CreateForNoOpLock()), + install_finalizer_(install_finalizer), + registrar_(registrar), + install_surface_(install_surface), + web_contents_(contents), + bypass_service_worker_check_(bypass_service_worker_check), + dialog_callback_(std::move(dialog_callback)), + install_callback_(std::move(callback)), + data_retriever_(std::make_unique<WebAppDataRetriever>()), + use_fallback_(use_fallback), + flow_(flow) {} + FetchManifestAndInstallCommand::~FetchManifestAndInstallCommand() = default; void FetchManifestAndInstallCommand::Start() { - if (!web_contents_ || web_contents_->IsBeingDestroyed()) - return Abort(webapps::InstallResultCode::kWebContentsDestroyed); + if (IsWebContentsDestroyed()) { + Abort(webapps::InstallResultCode::kWebContentsDestroyed); + return; + } + + if (use_fallback_) { + data_retriever_->GetWebAppInstallInfo( + web_contents_.get(), + base::BindOnce(&FetchManifestAndInstallCommand::OnGetWebAppInstallInfo, + weak_factory_.GetWeakPtr())); + } else { + install_info_ = std::make_unique<WebAppInstallInfo>(); + FetchManifest(); + } +} + +void FetchManifestAndInstallCommand::OnBeforeForcedUninstallFromSync() { + // TODO(crbug.com/1320086): remove after uninstall from sync is async. + Abort(webapps::InstallResultCode::kAppNotInRegistrarAfterCommit); +} + +void FetchManifestAndInstallCommand::OnShutdown() { + Abort(webapps::InstallResultCode::kCancelledOnWebAppProviderShuttingDown); +} + +base::Value FetchManifestAndInstallCommand::ToDebugValue() const { + auto debug_value = debug_log_.Clone(); + debug_value.Set("command_name", "FetchManifestAndInstallCommand"); + debug_value.Set("command_id", id()); + debug_value.Set("app_id", app_id_); + return base::Value(std::move(debug_value)); +} + +void FetchManifestAndInstallCommand::Abort(webapps::InstallResultCode code) { + if (!install_callback_) + return; + webapps::InstallableMetrics::TrackInstallResult(false); + SignalCompletionAndSelfDestruct( + CommandResult::kFailure, + base::BindOnce(std::move(install_callback_), AppId(), code)); +} + +bool FetchManifestAndInstallCommand::IsWebContentsDestroyed() { + return !web_contents_ || web_contents_->IsBeingDestroyed(); +} + +void FetchManifestAndInstallCommand::OnGetWebAppInstallInfo( + std::unique_ptr<WebAppInstallInfo> fallback_web_app_info) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + if (IsWebContentsDestroyed()) { + Abort(webapps::InstallResultCode::kWebContentsDestroyed); + return; + } + + if (!fallback_web_app_info) { + Abort(webapps::InstallResultCode::kGetWebAppInstallInfoFailed); + return; + } + + install_info_ = std::move(fallback_web_app_info); + LogInstallInfo(); + + return FetchManifest(); +} + +void FetchManifestAndInstallCommand::FetchManifest() { + if (IsWebContentsDestroyed()) { + Abort(webapps::InstallResultCode::kWebContentsDestroyed); + return; + } data_retriever_->CheckInstallabilityAndRetrieveManifest( web_contents_.get(), bypass_service_worker_check_, @@ -49,54 +144,49 @@ weak_factory_.GetWeakPtr())); } -void FetchManifestAndInstallCommand::Abort(webapps::InstallResultCode code) { - if (!install_callback_) - return; - webapps::InstallableMetrics::TrackInstallResult(false); - std::move(install_callback_).Run(AppId(), code); - SignalCompletionAndSelfDestruct(CommandResult::kFailure, base::DoNothing()); -} - void FetchManifestAndInstallCommand::OnDidPerformInstallableCheck( blink::mojom::ManifestPtr opt_manifest, const GURL& manifest_url, bool valid_manifest_for_web_app, bool is_installable) { - if (!web_contents_ || web_contents_->IsBeingDestroyed()) - return Abort(webapps::InstallResultCode::kWebContentsDestroyed); + if (IsWebContentsDestroyed()) { + Abort(webapps::InstallResultCode::kWebContentsDestroyed); + return; + } - if (!valid_manifest_for_web_app) { + if (!use_fallback_ && !valid_manifest_for_web_app) { LOG(WARNING) << "Did not install " << manifest_url.spec() << " because it didn't have a manifest for web app"; Abort(webapps::InstallResultCode::kNotValidManifestForWebApp); return; - } else { - DCHECK(opt_manifest); - AppId app_id = GenerateAppIdFromManifest(*opt_manifest); - - command_manager()->EnqueueCommand(std::make_unique<WebAppInstallCommand>( - app_id, Profile::FromBrowserContext(web_contents_->GetBrowserContext()), - install_finalizer_, std::move(data_retriever_), registrar_, - install_surface_, web_contents_, std::move(dialog_callback_), - std::move(install_callback_), std::make_unique<WebAppInstallInfo>(), - std::move(opt_manifest), manifest_url)); - SignalCompletionAndSelfDestruct(CommandResult::kSuccess, base::DoNothing()); } + + auto manifest_id = install_info_->manifest_id; + auto start_url = install_info_->start_url; + + if (opt_manifest) { + UpdateWebAppInfoFromManifest(*opt_manifest, manifest_url, + install_info_.get()); + LogInstallInfo(); + } + + app_id_ = GenerateAppId(install_info_->manifest_id, install_info_->start_url); + + command_manager()->ScheduleCommand(std::make_unique<WebAppInstallCommand>( + app_id_, Profile::FromBrowserContext(web_contents_->GetBrowserContext()), + install_finalizer_, std::move(data_retriever_), registrar_, + install_surface_, web_contents_, std::move(dialog_callback_), + std::move(install_callback_), std::move(install_info_), + std::move(opt_manifest), manifest_url, flow_)); + SignalCompletionAndSelfDestruct(CommandResult::kSuccess, base::DoNothing()); } -void FetchManifestAndInstallCommand::OnBeforeForcedUninstallFromSync() { - // TODO(crbug.com/1320086): remove after uninstall from sync is async. - return Abort(webapps::InstallResultCode::kAppNotInRegistrarAfterCommit); +void FetchManifestAndInstallCommand::LogInstallInfo() { + debug_log_.Set("manifest_id", + install_info_->manifest_id.has_value() + ? base::Value(install_info_->manifest_id.value()) + : base::Value()); + debug_log_.Set("start_url", install_info_->start_url.spec()); + debug_log_.Set("name", install_info_->title); } - -void FetchManifestAndInstallCommand::OnShutdown() { - return Abort( - webapps::InstallResultCode::kCancelledOnWebAppProviderShuttingDown); -} - -base::Value FetchManifestAndInstallCommand::ToDebugValue() const { - return base::Value( - base::StringPrintf("FetchManifestAndInstallCommand %d", id())); -} - } // namespace web_app
diff --git a/chrome/browser/web_applications/commands/fetch_manifest_and_install_command.h b/chrome/browser/web_applications/commands/fetch_manifest_and_install_command.h index 249babe8..a172c93 100644 --- a/chrome/browser/web_applications/commands/fetch_manifest_and_install_command.h +++ b/chrome/browser/web_applications/commands/fetch_manifest_and_install_command.h
@@ -10,6 +10,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/web_app_install_manager.h" #include "chrome/browser/web_applications/web_app_install_params.h" #include "components/webapps/browser/install_result_code.h" #include "components/webapps/browser/installable/installable_metrics.h" @@ -25,8 +26,7 @@ class WebAppInstallFinalizer; class WebAppRegistrar; -// Install web app from manifest for current `WebContents`. This is used by user -// initiated installs for promotable web apps. +// Install web app from manifest for current `WebContents`. class FetchManifestAndInstallCommand : public WebAppCommand { public: FetchManifestAndInstallCommand(WebAppInstallFinalizer* install_finalizer, @@ -36,6 +36,19 @@ bool bypass_service_worker_check, WebAppInstallDialogCallback dialog_callback, OnceInstallCallback callback); + + // `use_fallback` allows getting fallback information from current document + // to enable installing a non-promotable site. + FetchManifestAndInstallCommand(WebAppInstallFinalizer* install_finalizer, + WebAppRegistrar* registrar, + webapps::WebappInstallSource install_surface, + base::WeakPtr<content::WebContents> contents, + bool bypass_service_worker_check, + WebAppInstallDialogCallback dialog_callback, + OnceInstallCallback callback, + bool use_fallback, + WebAppInstallFlow flow); + ~FetchManifestAndInstallCommand() override; void Start() override; @@ -46,11 +59,17 @@ private: void Abort(webapps::InstallResultCode code); + bool IsWebContentsDestroyed(); + void FetchFallbackInstallInfo(); + void OnGetWebAppInstallInfo( + std::unique_ptr<WebAppInstallInfo> fallback_web_app_info); + void FetchManifest(); void OnDidPerformInstallableCheck(blink::mojom::ManifestPtr opt_manifest, const GURL& manifest_url, bool valid_manifest_for_web_app, bool is_installable); + void LogInstallInfo(); raw_ptr<WebAppInstallFinalizer> install_finalizer_; raw_ptr<WebAppRegistrar> registrar_; @@ -62,6 +81,15 @@ OnceInstallCallback install_callback_; std::unique_ptr<WebAppDataRetriever> data_retriever_; + std::unique_ptr<WebAppInstallInfo> install_info_; + + base::Value::Dict debug_log_; + + // Whether using fallback installation data from the document. + bool use_fallback_ = false; + WebAppInstallFlow flow_{}; + + AppId app_id_{}; base::WeakPtrFactory<FetchManifestAndInstallCommand> weak_factory_{this}; };
diff --git a/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_browsertest.cc b/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_browsertest.cc index e6706b7..dcac3446 100644 --- a/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_browsertest.cc +++ b/chrome/browser/web_applications/commands/fetch_manifest_and_install_command_browsertest.cc
@@ -39,7 +39,7 @@ auto* provider = WebAppProvider::GetForTest(profile()); base::RunLoop loop; - provider->command_manager().EnqueueCommand( + provider->command_manager().ScheduleCommand( std::make_unique<FetchManifestAndInstallCommand>( &provider->install_finalizer(), &provider->registrar(), webapps::WebappInstallSource::MENU_BROWSER_TAB, @@ -64,7 +64,7 @@ // Schedule two installs and both succeed. base::RunLoop loop; - provider->command_manager().EnqueueCommand( + provider->command_manager().ScheduleCommand( std::make_unique<FetchManifestAndInstallCommand>( &provider->install_finalizer(), &provider->registrar(), webapps::WebappInstallSource::MENU_BROWSER_TAB, @@ -76,7 +76,7 @@ EXPECT_TRUE(provider->registrar().IsLocallyInstalled(app_id)); }))); - provider->command_manager().EnqueueCommand( + provider->command_manager().ScheduleCommand( std::make_unique<FetchManifestAndInstallCommand>( &provider->install_finalizer(), &provider->registrar(), webapps::WebappInstallSource::MENU_BROWSER_TAB, @@ -100,7 +100,7 @@ auto* provider = WebAppProvider::GetForTest(profile()); base::RunLoop loop; - provider->command_manager().EnqueueCommand( + provider->command_manager().ScheduleCommand( std::make_unique<FetchManifestAndInstallCommand>( &provider->install_finalizer(), &provider->registrar(), webapps::WebappInstallSource::MENU_BROWSER_TAB, @@ -124,7 +124,7 @@ auto* provider = WebAppProvider::GetForTest(profile()); base::RunLoop loop; - provider->command_manager().EnqueueCommand( + provider->command_manager().ScheduleCommand( std::make_unique<FetchManifestAndInstallCommand>( &provider->install_finalizer(), &provider->registrar(), webapps::WebappInstallSource::MENU_BROWSER_TAB, @@ -151,7 +151,7 @@ base::RunLoop loop; auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); - provider->command_manager().EnqueueCommand( + provider->command_manager().ScheduleCommand( std::make_unique<FetchManifestAndInstallCommand>( &provider->install_finalizer(), &provider->registrar(), webapps::WebappInstallSource::MENU_BROWSER_TAB, @@ -169,4 +169,31 @@ loop.Run(); } +IN_PROC_BROWSER_TEST_F(FetchManifestAndInstallCommandTest, + InstallWithFallback) { + GURL test_url = https_server()->GetURL( + "/banners/" + "no_manifest_test_page.html"); + EXPECT_FALSE(NavigateAndAwaitInstallabilityCheck(browser(), test_url)); + auto* provider = WebAppProvider::GetForTest(profile()); + + base::RunLoop loop; + auto* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); + + provider->command_manager().ScheduleCommand( + std::make_unique<FetchManifestAndInstallCommand>( + &provider->install_finalizer(), &provider->registrar(), + webapps::WebappInstallSource::MENU_BROWSER_TAB, + web_contents->GetWeakPtr(), + /*bypass_service_worker_check=*/false, CreateDialogCallback(), + base::BindLambdaForTesting( + [&](const AppId& app_id, webapps::InstallResultCode code) { + EXPECT_EQ(code, webapps::InstallResultCode::kSuccessNewInstall); + EXPECT_TRUE(provider->registrar().IsLocallyInstalled(app_id)); + loop.Quit(); + }), + /*use_fallback=*/true, WebAppInstallFlow::kInstallSite)); + loop.Run(); +} + } // namespace web_app
diff --git a/chrome/browser/web_applications/commands/web_app_install_command.cc b/chrome/browser/web_applications/commands/web_app_install_command.cc index 1937ac03..d9bc9e2 100644 --- a/chrome/browser/web_applications/commands/web_app_install_command.cc +++ b/chrome/browser/web_applications/commands/web_app_install_command.cc
@@ -25,7 +25,8 @@ OnceInstallCallback callback, std::unique_ptr<WebAppInstallInfo> web_app_info, blink::mojom::ManifestPtr opt_manifest, - const GURL& manifest_url) + const GURL& manifest_url, + WebAppInstallFlow flow) : WebAppCommand(WebAppCommandLock::CreateForAppLock({app_id})), install_task_(profile, install_finalizer, @@ -38,19 +39,22 @@ web_app_info_(std::move(web_app_info)), opt_manifest_(std::move(opt_manifest)), manifest_url_(manifest_url), + flow_(flow), app_id_(app_id) {} WebAppInstallCommand::~WebAppInstallCommand() = default; void WebAppInstallCommand::Start() { - if (!web_contents_ || web_contents_->IsBeingDestroyed()) - return Abort(webapps::InstallResultCode::kWebContentsDestroyed); + if (!web_contents_ || web_contents_->IsBeingDestroyed()) { + Abort(webapps::InstallResultCode::kWebContentsDestroyed); + return; + } install_task_.InstallWebAppOnManifestValidated( web_contents_.get(), std::move(dialog_callback_), base::BindOnce(&WebAppInstallCommand::OnInstallCompleted, weak_factory_.GetWeakPtr()), - std::move(web_app_info_), std::move(opt_manifest_), manifest_url_); + std::move(web_app_info_), std::move(opt_manifest_), manifest_url_, flow_); } void WebAppInstallCommand::Abort(webapps::InstallResultCode code) { @@ -64,20 +68,21 @@ void WebAppInstallCommand::OnInstallCompleted(const AppId& app_id, webapps::InstallResultCode code) { std::move(install_callback_).Run(app_id, code); - return SignalCompletionAndSelfDestruct(webapps::IsSuccess(code) - ? CommandResult::kSuccess - : CommandResult::kFailure, - base::DoNothing()); + SignalCompletionAndSelfDestruct(webapps::IsSuccess(code) + ? CommandResult::kSuccess + : CommandResult::kFailure, + base::DoNothing()); } void WebAppInstallCommand::OnBeforeForcedUninstallFromSync() { // TODO(crbug.com/1320086): remove after uninstall from sync is async. - return Abort(webapps::InstallResultCode::kAppNotInRegistrarAfterCommit); + Abort(webapps::InstallResultCode::kAppNotInRegistrarAfterCommit); + return; } void WebAppInstallCommand::OnShutdown() { - return Abort( - webapps::InstallResultCode::kCancelledOnWebAppProviderShuttingDown); + Abort(webapps::InstallResultCode::kCancelledOnWebAppProviderShuttingDown); + return; } base::Value WebAppInstallCommand::ToDebugValue() const {
diff --git a/chrome/browser/web_applications/commands/web_app_install_command.h b/chrome/browser/web_applications/commands/web_app_install_command.h index f503585..ba33002 100644 --- a/chrome/browser/web_applications/commands/web_app_install_command.h +++ b/chrome/browser/web_applications/commands/web_app_install_command.h
@@ -41,7 +41,8 @@ OnceInstallCallback callback, std::unique_ptr<WebAppInstallInfo> web_app_info, blink::mojom::ManifestPtr opt_manifest, - const GURL& manifest_url); + const GURL& manifest_url, + WebAppInstallFlow flow); ~WebAppInstallCommand() override; void Start() override; @@ -64,6 +65,7 @@ std::unique_ptr<WebAppInstallInfo> web_app_info_; blink::mojom::ManifestPtr opt_manifest_; GURL manifest_url_; + WebAppInstallFlow flow_; AppId app_id_;
diff --git a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc index 856e1d6b..9571e1b8 100644 --- a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc +++ b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
@@ -45,6 +45,7 @@ #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_manager.h" +#include "chrome/browser/web_applications/web_app_install_params.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/browser/web_applications/web_app_registrar.h" #include "chrome/browser/web_applications/web_app_registry_update.h" @@ -401,7 +402,7 @@ base::RunLoop run_loop; GetProvider().install_manager().InstallWebAppFromManifestWithFallback( browser()->tab_strip_model()->GetActiveWebContents(), - WebAppInstallManager::WebAppInstallFlow::kInstallSite, + WebAppInstallFlow::kInstallSite, webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting(
diff --git a/chrome/browser/web_applications/web_app_command_manager.cc b/chrome/browser/web_applications/web_app_command_manager.cc index d623724..dd54b4c 100644 --- a/chrome/browser/web_applications/web_app_command_manager.cc +++ b/chrome/browser/web_applications/web_app_command_manager.cc
@@ -61,7 +61,7 @@ DCHECK(is_in_shutdown_); } -void WebAppCommandManager::EnqueueCommand( +void WebAppCommandManager::ScheduleCommand( std::unique_ptr<WebAppCommand> command) { if (is_in_shutdown_) { AddValueToLog(CreateLogValue(*command, CommandResult::kShutdown)); @@ -142,7 +142,7 @@ // To prevent map modification-during-iteration, make a copy of relevant // commands. The main complications that can occur are a command calling - // `CompleteAndDestruct` or `EnqueueCommand` inside of the + // `CompleteAndDestruct` or `ScheduleCommand` inside of the // `OnBeforeForcedUninstallFromSync` call. Because all commands are // `Start()`ed asynchronously, we will never have to notify any commands that // are newly scheduled. So at most one command needs to be notified per queue,
diff --git a/chrome/browser/web_applications/web_app_command_manager.h b/chrome/browser/web_applications/web_app_command_manager.h index 0fe881a1..4a627a2 100644 --- a/chrome/browser/web_applications/web_app_command_manager.h +++ b/chrome/browser/web_applications/web_app_command_manager.h
@@ -29,16 +29,14 @@ namespace web_app { -// The command manager is used to enqueue commands or callbacks to write & read -// from the WebAppProvider system. -// Commands are queued based on a `WebAppCommandQueueId`, and each queue is -// independent. To use, simply call `EnqueueCommand` to enqueue the given -// command or a CallbackCommand with given callback on it's respective queue. -// The queue of a command is determined by `WebAppCommand::queue_id()`. +// The command manager is used to schedule commands or callbacks to write & read +// from the WebAppProvider system. To use, simply call `ScheduleCommand` to +// schedule the given command or a CallbackCommand with given callback. // -// Commands will be executed (`Start()` will be called) in-order, and the next -// command will not execute until `SignalCompletionAndSelfDestruct()` was called -// by the last command. +// Commands will be executed (`Start()` will be called) in-order based on +// command's `WebAppCommandLock`, the `WebAppCommandLock` specifies which apps +// or particular entities it wants to lock on. The next command will not execute +// until `SignalCompletionAndSelfDestruct()` was called by the last command. class WebAppCommandManager { public: explicit WebAppCommandManager(Profile* profile); @@ -46,7 +44,7 @@ // Enqueues the given command in the queue corresponding to the command's // `queue_id()`. `Start()` will always be called asynchronously. - void EnqueueCommand(std::unique_ptr<WebAppCommand> command); + void ScheduleCommand(std::unique_ptr<WebAppCommand> command); // Called on system shutdown. This call is also forwarded to any commands that // have been `Start()`ed.
diff --git a/chrome/browser/web_applications/web_app_command_manager_unittest.cc b/chrome/browser/web_applications/web_app_command_manager_unittest.cc index b99c8e96..42794239 100644 --- a/chrome/browser/web_applications/web_app_command_manager_unittest.cc +++ b/chrome/browser/web_applications/web_app_command_manager_unittest.cc
@@ -195,7 +195,7 @@ WebAppCommandLock::CreateForFullSystemLock()); base::WeakPtr<MockCommand> command_ptr = mock_command->AsWeakPtr(); - manager().EnqueueCommand(std::move(mock_command)); + manager().ScheduleCommand(std::move(mock_command)); ASSERT_TRUE(command_ptr); EXPECT_FALSE(command_ptr->IsStarted()); { @@ -219,7 +219,7 @@ WebAppCommandLock::CreateForFullSystemLock()); base::WeakPtr<MockCommand> command_ptr = command->AsWeakPtr(); - manager().EnqueueCommand(std::move(command)); + manager().ScheduleCommand(std::move(command)); { base::RunLoop loop; testing::InSequence in_sequence; @@ -242,8 +242,8 @@ base::WeakPtr<MockCommand> command1_ptr = command1->AsWeakPtr(); base::WeakPtr<MockCommand> command2_ptr = command2->AsWeakPtr(); - manager().EnqueueCommand(std::move(command1)); - manager().EnqueueCommand(std::move(command2)); + manager().ScheduleCommand(std::move(command1)); + manager().ScheduleCommand(std::move(command2)); CheckCommandsRunInParallel(command1_ptr, command2_ptr); } @@ -255,8 +255,8 @@ base::WeakPtr<MockCommand> command1_ptr = command1->AsWeakPtr(); base::WeakPtr<MockCommand> command2_ptr = command2->AsWeakPtr(); - manager().EnqueueCommand(std::move(command1)); - manager().EnqueueCommand(std::move(command2)); + manager().ScheduleCommand(std::move(command1)); + manager().ScheduleCommand(std::move(command2)); // Global command blocks app command. CheckCommandsRunInOrder(command1_ptr, command2_ptr); @@ -267,8 +267,8 @@ command1_ptr = command1->AsWeakPtr(); command2_ptr = command2->AsWeakPtr(); - manager().EnqueueCommand(std::move(command1)); - manager().EnqueueCommand(std::move(command2)); + manager().ScheduleCommand(std::move(command1)); + manager().ScheduleCommand(std::move(command2)); // Global command blocks web contents command. CheckCommandsRunInOrder(command1_ptr, command2_ptr, /*check_web_contents_in_first=*/false, @@ -281,8 +281,8 @@ command1_ptr = command1->AsWeakPtr(); command2_ptr = command2->AsWeakPtr(); - manager().EnqueueCommand(std::move(command1)); - manager().EnqueueCommand(std::move(command2)); + manager().ScheduleCommand(std::move(command1)); + manager().ScheduleCommand(std::move(command2)); // App command and web contents command queue are independent. CheckCommandsRunInParallel(command1_ptr, command2_ptr, /*check_web_contents_in_first=*/false, @@ -298,8 +298,8 @@ WebAppCommandLock::CreateForAppLock({kTestAppId})); base::WeakPtr<MockCommand> command2_ptr = command2->AsWeakPtr(); - manager().EnqueueCommand(std::move(command1)); - manager().EnqueueCommand(std::move(command2)); + manager().ScheduleCommand(std::move(command1)); + manager().ScheduleCommand(std::move(command2)); CheckCommandsRunInOrder(command1_ptr, command2_ptr); } @@ -312,14 +312,12 @@ WebAppCommandLock::CreateForFullSystemLock()); base::WeakPtr<MockCommand> command2_ptr = command2->AsWeakPtr(); - manager().EnqueueCommand(std::move(command1)); - manager().EnqueueCommand(std::move(command2)); + manager().ScheduleCommand(std::move(command1)); + manager().ScheduleCommand(std::move(command2)); CheckCommandsRunInOrder(command1_ptr, command2_ptr); } TEST_F(WebAppCommandManagerTest, BackgroundWebContentsQueue) { - WebAppCommandManager manager(profile()); - auto command1 = std::make_unique<StrictMock<MockCommand>>( WebAppCommandLock::CreateForBackgroundWebContentsLock()); base::WeakPtr<MockCommand> command1_ptr = command1->AsWeakPtr(); @@ -328,20 +326,16 @@ WebAppCommandLock::CreateForBackgroundWebContentsLock()); base::WeakPtr<MockCommand> command2_ptr = command2->AsWeakPtr(); - manager.EnqueueCommand(std::move(command1)); - manager.EnqueueCommand(std::move(command2)); - CheckCommandsRunInOrder(command1_ptr, command2_ptr, - /*check_web_contents_in_first=*/true, - /*check_web_contents_in_second=*/true); - - manager.Shutdown(); + manager().ScheduleCommand(std::move(command1)); + manager().ScheduleCommand(std::move(command2)); + CheckCommandsRunInOrder(command1_ptr, command2_ptr); } TEST_F(WebAppCommandManagerTest, ShutdownPreStartCommand) { auto command = std::make_unique<StrictMock<MockCommand>>( WebAppCommandLock::CreateForFullSystemLock()); base::WeakPtr<MockCommand> command_ptr = command->AsWeakPtr(); - manager().EnqueueCommand(std::move(command)); + manager().ScheduleCommand(std::move(command)); EXPECT_CALL(*command_ptr, OnDestruction()).Times(1); manager().Shutdown(); } @@ -352,7 +346,7 @@ WebAppCommandLock::CreateForFullSystemLock()); base::WeakPtr<MockCommand> command_ptr = mock_command->AsWeakPtr(); - manager().EnqueueCommand(std::move(mock_command)); + manager().ScheduleCommand(std::move(mock_command)); ASSERT_TRUE(command_ptr); EXPECT_FALSE(command_ptr->IsStarted()); { @@ -378,8 +372,8 @@ WebAppCommandLock::CreateForFullSystemLock()); base::WeakPtr<MockCommand> command2_ptr = command2->AsWeakPtr(); - manager().EnqueueCommand(std::move(command1)); - manager().EnqueueCommand(std::move(command2)); + manager().ScheduleCommand(std::move(command1)); + manager().ScheduleCommand(std::move(command2)); { base::RunLoop loop; EXPECT_CALL(*command1_ptr, Start()).WillOnce([&]() { loop.Quit(); }); @@ -395,7 +389,7 @@ auto command = std::make_unique<StrictMock<MockCommand>>( WebAppCommandLock::CreateForFullSystemLock()); base::WeakPtr<MockCommand> command_ptr = command->AsWeakPtr(); - manager().EnqueueCommand(std::move(command)); + manager().ScheduleCommand(std::move(command)); { base::RunLoop loop; EXPECT_CALL(*command_ptr, Start()).WillOnce([&]() { loop.Quit(); }); @@ -419,7 +413,7 @@ auto command = std::make_unique<StrictMock<MockCommand>>( WebAppCommandLock::CreateForAppLock({kTestAppId})); base::WeakPtr<MockCommand> command_ptr = command->AsWeakPtr(); - manager().EnqueueCommand(std::move(command)); + manager().ScheduleCommand(std::move(command)); { base::RunLoop loop; EXPECT_CALL(*command_ptr, Start()).WillOnce([&]() { loop.Quit(); }); @@ -454,7 +448,7 @@ barrier.Run(app_id); }, app_id, barrier); - manager().EnqueueCommand(std::make_unique<CallbackCommand>( + manager().ScheduleCommand(std::make_unique<CallbackCommand>( WebAppCommandLock::CreateForAppLock({app_id}), std::move(callback))); } loop.Run(); @@ -473,9 +467,9 @@ testing::StrictMock<base::MockCallback<base::OnceClosure>> mock_closure; - manager().EnqueueCommand(std::move(command1)); - manager().EnqueueCommand(std::move(command2)); - manager().EnqueueCommand(std::move(command3)); + manager().ScheduleCommand(std::move(command1)); + manager().ScheduleCommand(std::move(command2)); + manager().ScheduleCommand(std::move(command3)); { base::RunLoop loop; testing::InSequence in_sequence; @@ -520,10 +514,10 @@ TEST_F(WebAppCommandManagerTest, ToDebugValue) { base::RunLoop loop; - manager().EnqueueCommand(std::make_unique<CallbackCommand>( + manager().ScheduleCommand(std::make_unique<CallbackCommand>( WebAppCommandLock::CreateForAppLock({kTestAppId}), base::BindLambdaForTesting([&]() { loop.Quit(); }))); - manager().EnqueueCommand(std::make_unique<CallbackCommand>( + manager().ScheduleCommand(std::make_unique<CallbackCommand>( WebAppCommandLock::CreateForAppLock({kTestAppId2}), base::DoNothing())); loop.Run(); manager().ToDebugValue();
diff --git a/chrome/browser/web_applications/web_app_install_manager.h b/chrome/browser/web_applications/web_app_install_manager.h index dac5314..e1bb661 100644 --- a/chrome/browser/web_applications/web_app_install_manager.h +++ b/chrome/browser/web_applications/web_app_install_manager.h
@@ -45,18 +45,6 @@ // TODO(loyso): Unify the API and merge similar InstallWebAppZZZZ functions. class WebAppInstallManager final : public SyncInstallDelegate { public: - // The different UI flows that exist for creating a web app. - enum class WebAppInstallFlow { - // TODO(crbug.com/1216457): This should be removed by adding all known flows - // to this enum. - kUnknown, - // The 'Create Shortcut' flow for adding the current page as a shortcut app. - kCreateShortcut, - // The 'Install Site' flow for installing the current site with an app - // experience determined by the site. - kInstallSite, - }; - explicit WebAppInstallManager(Profile* profile); WebAppInstallManager(const WebAppInstallManager&) = delete; WebAppInstallManager& operator=(const WebAppInstallManager&) = delete;
diff --git a/chrome/browser/web_applications/web_app_install_manager_unittest.cc b/chrome/browser/web_applications/web_app_install_manager_unittest.cc index da977c0..68660771 100644 --- a/chrome/browser/web_applications/web_app_install_manager_unittest.cc +++ b/chrome/browser/web_applications/web_app_install_manager_unittest.cc
@@ -295,7 +295,7 @@ InstallResult result; base::RunLoop run_loop; install_manager().InstallWebAppFromManifestWithFallback( - web_contents(), WebAppInstallManager::WebAppInstallFlow::kInstallSite, + web_contents(), WebAppInstallFlow::kInstallSite, webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting([&](const AppId& installed_app_id,
diff --git a/chrome/browser/web_applications/web_app_install_params.h b/chrome/browser/web_applications/web_app_install_params.h index 5970cf3..6df5c1c 100644 --- a/chrome/browser/web_applications/web_app_install_params.h +++ b/chrome/browser/web_applications/web_app_install_params.h
@@ -119,6 +119,18 @@ GURL install_url; }; +// The different UI flows that exist for creating a web app. +enum class WebAppInstallFlow { + // TODO(crbug.com/1216457): This should be removed by adding all known flows + // to this enum. + kUnknown, + // The 'Create Shortcut' flow for adding the current page as a shortcut app. + kCreateShortcut, + // The 'Install Site' flow for installing the current site with an app + // experience determined by the site. + kInstallSite, +}; + } // namespace web_app #endif // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_INSTALL_PARAMS_H_
diff --git a/chrome/browser/web_applications/web_app_install_task.cc b/chrome/browser/web_applications/web_app_install_task.cc index b4f9bc1..81dd6dd7 100644 --- a/chrome/browser/web_applications/web_app_install_task.cc +++ b/chrome/browser/web_applications/web_app_install_task.cc
@@ -634,10 +634,13 @@ OnceInstallCallback install_callback, std::unique_ptr<WebAppInstallInfo> web_app_info, blink::mojom::ManifestPtr opt_manifest, - const GURL& manifest_url) { + const GURL& manifest_url, + WebAppInstallFlow flow) { DCHECK(AreWebAppsUserInstallable(profile_)); CheckInstallPreconditions(); + flow_ = flow; + Observe(contents); dialog_callback_ = std::move(dialog_callback); install_callback_ = std::move(install_callback);
diff --git a/chrome/browser/web_applications/web_app_install_task.h b/chrome/browser/web_applications/web_app_install_task.h index a830f43..161b748 100644 --- a/chrome/browser/web_applications/web_app_install_task.h +++ b/chrome/browser/web_applications/web_app_install_task.h
@@ -57,8 +57,6 @@ using RetrieveWebAppInstallInfoWithIconsCallback = base::OnceCallback<void(WebAppInstallInfoOrErrorCode)>; - using WebAppInstallFlow = WebAppInstallManager::WebAppInstallFlow; - WebAppInstallTask(Profile* profile, WebAppInstallFinalizer* install_finalizer, std::unique_ptr<WebAppDataRetriever> data_retriever, @@ -153,7 +151,8 @@ OnceInstallCallback install_callback, std::unique_ptr<WebAppInstallInfo> web_app_info, blink::mojom::ManifestPtr opt_manifest, - const GURL& manifest_url); + const GURL& manifest_url, + WebAppInstallFlow flow); // Obtains WebAppInstallInfo about web app located at |start_url|, fallbacks // to title/favicon if manifest is not present.
diff --git a/chrome/browser/web_applications/web_app_install_task_unittest.cc b/chrome/browser/web_applications/web_app_install_task_unittest.cc index b74a5d2a..66c12aa 100644 --- a/chrome/browser/web_applications/web_app_install_task_unittest.cc +++ b/chrome/browser/web_applications/web_app_install_task_unittest.cc
@@ -270,7 +270,7 @@ InitializeInstallTaskAndRetriever( webapps::WebappInstallSource::MENU_BROWSER_TAB); install_task_->InstallWebAppFromManifestWithFallback( - web_contents(), WebAppInstallManager::WebAppInstallFlow::kInstallSite, + web_contents(), WebAppInstallFlow::kInstallSite, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting([&](const AppId& installed_app_id, webapps::InstallResultCode code) { @@ -462,7 +462,7 @@ bool callback_called = false; install_task_->InstallWebAppFromManifestWithFallback( - web_contents(), WebAppInstallManager::WebAppInstallFlow::kInstallSite, + web_contents(), WebAppInstallFlow::kInstallSite, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting( [&](const AppId& installed_app_id, webapps::InstallResultCode code) { @@ -518,7 +518,7 @@ bool callback_called = false; install_task_->InstallWebAppFromManifestWithFallback( - web_contents(), WebAppInstallManager::WebAppInstallFlow::kInstallSite, + web_contents(), WebAppInstallFlow::kInstallSite, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting([&](const AppId& force_installed_app_id, webapps::InstallResultCode code) { @@ -544,7 +544,7 @@ InitializeInstallTaskAndRetriever( webapps::WebappInstallSource::MENU_BROWSER_TAB); install_task_->InstallWebAppFromManifestWithFallback( - web_contents(), WebAppInstallManager::WebAppInstallFlow::kInstallSite, + web_contents(), WebAppInstallFlow::kInstallSite, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting( [&](const AppId& installed_app_id, webapps::InstallResultCode code) { @@ -570,7 +570,7 @@ bool callback_called = false; install_task_->InstallWebAppFromManifestWithFallback( - web_contents(), WebAppInstallManager::WebAppInstallFlow::kInstallSite, + web_contents(), WebAppInstallFlow::kInstallSite, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting( [&](const AppId& installed_app_id, webapps::InstallResultCode code) { @@ -600,7 +600,7 @@ bool callback_called = false; install_task_->InstallWebAppFromManifestWithFallback( - web_contents(), WebAppInstallManager::WebAppInstallFlow::kInstallSite, + web_contents(), WebAppInstallFlow::kInstallSite, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting( [&](const AppId& installed_app_id, webapps::InstallResultCode code) { @@ -653,7 +653,7 @@ bool callback_called = false; install_task_->InstallWebAppFromManifestWithFallback( - web_contents(), WebAppInstallManager::WebAppInstallFlow::kInstallSite, + web_contents(), WebAppInstallFlow::kInstallSite, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting( [&](const AppId& installed_app_id, webapps::InstallResultCode code) { @@ -946,7 +946,7 @@ bool callback_called = false; install_task_->InstallWebAppFromManifestWithFallback( - web_contents(), WebAppInstallManager::WebAppInstallFlow::kInstallSite, + web_contents(), WebAppInstallFlow::kInstallSite, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting( [&](const AppId& installed_app_id, webapps::InstallResultCode code) { @@ -981,7 +981,7 @@ bool callback_called = false; install_task_->InstallWebAppFromManifestWithFallback( - web_contents(), WebAppInstallManager::WebAppInstallFlow::kInstallSite, + web_contents(), WebAppInstallFlow::kInstallSite, base::BindOnce(test::TestDeclineDialogCallback), base::BindLambdaForTesting( [&](const AppId& installed_app_id, webapps::InstallResultCode code) { @@ -1060,8 +1060,7 @@ base::RunLoop run_loop; - install_task_->SetFlowForTesting( - WebAppInstallManager::WebAppInstallFlow::kInstallSite); + install_task_->SetFlowForTesting(WebAppInstallFlow::kInstallSite); install_task_->InstallWebAppFromInfo( std::move(web_app_info), /*overwrite_existing_manifest_fields=*/false, base::BindLambdaForTesting( @@ -1095,8 +1094,7 @@ base::RunLoop run_loop; - install_task_->SetFlowForTesting( - WebAppInstallManager::WebAppInstallFlow::kInstallSite); + install_task_->SetFlowForTesting(WebAppInstallFlow::kInstallSite); install_task_->InstallWebAppFromInfo( std::move(web_app_info), /*overwrite_existing_manifest_fields=*/false, base::BindLambdaForTesting([&](const AppId& installed_app_id, @@ -1133,7 +1131,7 @@ base::RunLoop run_loop; install_task_->InstallWebAppFromManifestWithFallback( - web_contents(), WebAppInstallManager::WebAppInstallFlow::kCreateShortcut, + web_contents(), WebAppInstallFlow::kCreateShortcut, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting([&](const AppId& installed_app_id, webapps::InstallResultCode code) { @@ -1187,7 +1185,7 @@ base::RunLoop run_loop; install_task_->InstallWebAppFromManifestWithFallback( - web_contents(), WebAppInstallManager::WebAppInstallFlow::kInstallSite, + web_contents(), WebAppInstallFlow::kInstallSite, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting( [&](const AppId& installed_app_id, webapps::InstallResultCode code) { @@ -1449,7 +1447,7 @@ bool callback_called = false; install_task_->InstallWebAppFromManifestWithFallback( - web_contents(), WebAppInstallManager::WebAppInstallFlow::kInstallSite, + web_contents(), WebAppInstallFlow::kInstallSite, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting( [&](const AppId& installed_app_id, webapps::InstallResultCode code) { @@ -1504,7 +1502,7 @@ bool callback_called = false; install_task_->InstallWebAppFromManifestWithFallback( - web_contents(), WebAppInstallManager::WebAppInstallFlow::kInstallSite, + web_contents(), WebAppInstallFlow::kInstallSite, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting( [&](const AppId& installed_app_id, webapps::InstallResultCode code) {
diff --git a/chrome/browser/web_applications/web_app_internals_browsertest.cc b/chrome/browser/web_applications/web_app_internals_browsertest.cc index e05bfa5..8848655 100644 --- a/chrome/browser/web_applications/web_app_internals_browsertest.cc +++ b/chrome/browser/web_applications/web_app_internals_browsertest.cc
@@ -16,6 +16,7 @@ #include "chrome/browser/web_applications/test/web_app_test_utils.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app_install_manager.h" +#include "chrome/browser/web_applications/web_app_install_params.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/browser/web_applications/web_app_registrar.h" #include "chrome/browser/web_applications/web_app_utils.h" @@ -90,7 +91,7 @@ base::RunLoop run_loop; GetProvider().install_manager().InstallWebAppFromManifestWithFallback( browser()->tab_strip_model()->GetActiveWebContents(), - WebAppInstallManager::WebAppInstallFlow::kInstallSite, + WebAppInstallFlow::kInstallSite, webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON, base::BindOnce(test::TestAcceptDialogCallback), base::BindLambdaForTesting(
diff --git a/chrome/browser/webid/federated_identity_api_permission_context.cc b/chrome/browser/webid/federated_identity_api_permission_context.cc index 4b472d8d..b94b1d2 100644 --- a/chrome/browser/webid/federated_identity_api_permission_context.cc +++ b/chrome/browser/webid/federated_identity_api_permission_context.cc
@@ -11,8 +11,12 @@ #include "components/content_settings/core/common/content_settings_types.h" #include "components/permissions/permission_decision_auto_blocker.h" #include "components/permissions/permission_result.h" +#include "content/public/common/content_features.h" #include "url/origin.h" +using PermissionStatus = + content::FederatedIdentityApiPermissionContextDelegate::PermissionStatus; + FederatedIdentityApiPermissionContext::FederatedIdentityApiPermissionContext( content::BrowserContext* browser_context) : host_content_settings_map_( @@ -26,8 +30,18 @@ FederatedIdentityApiPermissionContext:: ~FederatedIdentityApiPermissionContext() = default; -bool FederatedIdentityApiPermissionContext::HasApiPermission( +content::FederatedIdentityApiPermissionContextDelegate::PermissionStatus +FederatedIdentityApiPermissionContext::GetApiPermissionStatus( const url::Origin& rp_origin) { + if (!base::FeatureList::IsEnabled(features::kFedCm)) + return PermissionStatus::BLOCKED_VARIATIONS; + + // TODO(npm): FedCM is currently restricted to contexts where third party + // cookies are not blocked. Once the privacy improvements for the API are + // implemented, remove this restriction. See https://crbug.com/13043 + if (cookie_settings_->ShouldBlockThirdPartyCookies()) + return PermissionStatus::BLOCKED_THIRD_PARTY_COOKIES_BLOCKED; + const GURL rp_url = rp_origin.GetURL(); const ContentSetting setting = host_content_settings_map_->GetContentSetting( rp_url, rp_url, ContentSettingsType::FEDERATED_IDENTITY_API); @@ -35,21 +49,18 @@ case CONTENT_SETTING_ALLOW: break; case CONTENT_SETTING_BLOCK: - return false; + return PermissionStatus::BLOCKED_SETTINGS; default: NOTREACHED(); - return false; + return PermissionStatus::BLOCKED_SETTINGS; } - permissions::PermissionResult permission_result = + permissions::PermissionResult embargo_result = permission_autoblocker_->GetEmbargoResult( rp_url, ContentSettingsType::FEDERATED_IDENTITY_API); - return (permission_result.content_setting != - ContentSetting::CONTENT_SETTING_BLOCK); -} - -bool FederatedIdentityApiPermissionContext::AreThirdPartyCookiesBlocked() { - return cookie_settings_->ShouldBlockThirdPartyCookies(); + if (embargo_result.content_setting == ContentSetting::CONTENT_SETTING_BLOCK) + return PermissionStatus::BLOCKED_EMBARGO; + return PermissionStatus::GRANTED; } void FederatedIdentityApiPermissionContext::RecordDismissAndEmbargo(
diff --git a/chrome/browser/webid/federated_identity_api_permission_context.h b/chrome/browser/webid/federated_identity_api_permission_context.h index ba96227..18d427f 100644 --- a/chrome/browser/webid/federated_identity_api_permission_context.h +++ b/chrome/browser/webid/federated_identity_api_permission_context.h
@@ -38,8 +38,8 @@ const FederatedIdentityApiPermissionContext&) = delete; // content::FederatedIdentityApiPermissionContextDelegate: - bool HasApiPermission(const url::Origin& rp_origin) override; - bool AreThirdPartyCookiesBlocked() override; + content::FederatedIdentityApiPermissionContextDelegate::PermissionStatus + GetApiPermissionStatus(const url::Origin& rp_origin) override; void RecordDismissAndEmbargo(const url::Origin& rp_origin) override; void RemoveEmbargoAndResetCounts(const url::Origin& rp_origin) override;
diff --git a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/FeedActionsHandler.java b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/FeedActionsHandler.java index dd520be7..f03a6d63 100644 --- a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/FeedActionsHandler.java +++ b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/FeedActionsHandler.java
@@ -158,28 +158,35 @@ */ default void invalidateContentCacheFor(@FeedIdentifier int toInvalidate) {} - /** Actions that could occur for an info card. */ - @IntDef({InfoCardAction.INFO_CARD_TRACK_VIEW_STARTED, InfoCardAction.INFO_CARD_VIEWED, - InfoCardAction.INFO_CARD_CLICKED, InfoCardAction.INFO_CARD_DISMISSED_EXPLIICITLY, - InfoCardAction.TRACK_VIEW_WITH_STATE_RESET}) - @Retention(RetentionPolicy.SOURCE) - public @interface InfoCardAction { - // The info card is being tracked for its full visibility. - int INFO_CARD_TRACK_VIEW_STARTED = 0; - // The info card is fully visible in the viewport. - int INFO_CARD_VIEWED = 1; - // The user tapps the info card. - int INFO_CARD_CLICKED = 2; - // The user dismisses the info card explicitly by tapping the close button. - int INFO_CARD_DISMISSED_EXPLIICITLY = 3; - // The info card's state should be reset. - int TRACK_VIEW_WITH_STATE_RESET = 4; - } + /** + * Reports that the info card is being tracked for its full visibility. + * @param type Type of the info card. + */ + default void reportInfoCardTrackViewStarted(int type) {} /** - * Reports that an action has occurred for an info card. + * Reports that the info card is fully visible in the viewport. * @param type Type of the info card. - * @param action Action that occurred. + * @param minimumViewIntervalSeconds The minimum interval in seconds from the last time the info + * card is viewed in order for it to be considered viewed again. */ - default void reportInfoCardAction(int type, @InfoCardAction int action) {} + default void reportInfoCardViewed(int type, int minimumViewIntervalSeconds) {} + + /** + * Reports that the user tapps the info card. + * @param type Type of the info card. + */ + default void reportInfoCardClicked(int type) {} + + /** + * Reports that the user dismisses the info card explicitly by tapping the close button. + * @param type Type of the info card. + */ + default void reportInfoCardDismissedExplicitly(int type) {} + + /** + * Resets all the states of the info card. + * @param type Type of the info card. + */ + default void resetInfoCardStates(int type) {} }
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index cb9c38d..0253cf73 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1651751587-5fdbaa7bc5b1deae92c86c67b2e8d3b90a2f804b.profdata +chrome-linux-main-1651773593-a88faa6390c0d9aa66503690a46a6f0b98e3892e.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index c55ed50..8f7686e 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1651751587-59cbe26c2a7dd3eb3a231646c681b73002ae7da4.profdata +chrome-mac-arm-main-1651773593-b713dbfb2fc203562ed0c8d1d137f76d5435a7d4.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 5ed47b68..54f0ed5 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1651751587-39cf944afafa43ca3c7f6fb661a56d38812a7aca.profdata +chrome-mac-main-1651773593-da8788b562bec1362031ee6b8aec41196dff8e9b.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 843da7a6..bb9c8f1 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1651751587-7c6fd745490407fec4f6e9b020e737262f7aa665.profdata +chrome-win64-main-1651773593-7fb6dfd9074381ed140f6390122d01df3061ccfe.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni index 09196fa..a8cf6af0e 100644 --- a/chrome/chrome_paks.gni +++ b/chrome/chrome_paks.gni
@@ -153,6 +153,7 @@ "$root_gen_dir/chrome/feedback_webui_resources.pak", "$root_gen_dir/chrome/gaia_auth_host_resources.pak", "$root_gen_dir/chrome/history_resources.pak", + "$root_gen_dir/chrome/identity_internals_resources.pak", "$root_gen_dir/chrome/image_editor_resources.pak", "$root_gen_dir/chrome/image_editor_untrusted_resources.pak", "$root_gen_dir/chrome/management_resources.pak", @@ -186,6 +187,7 @@ "//chrome/browser/resources/feedback_webui:resources", "//chrome/browser/resources/gaia_auth_host:resources", "//chrome/browser/resources/history:resources", + "//chrome/browser/resources/identity_internals:resources", "//chrome/browser/resources/image_editor:trusted_resources", "//chrome/browser/resources/image_editor:untrusted_resources", "//chrome/browser/resources/management:resources",
diff --git a/chrome/test/chromedriver/chrome/log.cc b/chrome/test/chromedriver/chrome/log.cc index ac725baf..3be6b9d 100644 --- a/chrome/test/chromedriver/chrome/log.cc +++ b/chrome/test/chromedriver/chrome/log.cc
@@ -38,39 +38,34 @@ } } -std::unique_ptr<base::Value> SmartDeepCopy(const base::Value* value) { +base::Value SmartDeepCopy(const base::Value* value) { const size_t kMaxChildren = 20; - const base::DictionaryValue* dict = NULL; - if (value->GetAsDictionary(&dict)) { - std::unique_ptr<base::DictionaryValue> dict_copy( - new base::DictionaryValue()); - for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); - it.Advance()) { - if (dict_copy->DictSize() >= kMaxChildren - 1) { - dict_copy->SetKey("~~~", base::Value("...")); + if (value->is_dict()) { + base::Value::Dict dict_copy; + for (auto [key, value] : value->GetDict()) { + if (dict_copy.size() >= kMaxChildren - 1) { + dict_copy.Set("~~~", "..."); break; } - const base::Value* child = dict->FindKey(it.key()); - dict_copy->SetKey(it.key(), - base::Value::FromUniquePtrValue(SmartDeepCopy(child))); + dict_copy.Set(key, SmartDeepCopy(&value)); } - return std::move(dict_copy); + return base::Value(std::move(dict_copy)); } else if (value->is_list()) { - std::unique_ptr<base::ListValue> list_copy(new base::ListValue()); - for (const base::Value& child : value->GetListDeprecated()) { - if (list_copy->GetListDeprecated().size() >= kMaxChildren - 1) { - list_copy->Append("..."); + base::Value::List list_copy; + for (const base::Value& child : value->GetList()) { + if (list_copy.size() >= kMaxChildren - 1) { + list_copy.Append("..."); break; } - list_copy->Append(SmartDeepCopy(&child)); + list_copy.Append(SmartDeepCopy(&child)); } - return std::move(list_copy); + return base::Value(std::move(list_copy)); } else if (value->is_string()) { std::string data = value->GetString(); TruncateString(&data); - return std::make_unique<base::Value>(data); + return base::Value(std::move(data)); } - return base::Value::ToUniquePtrValue(value->Clone()); + return value->Clone(); } } // namespace @@ -95,8 +90,11 @@ } std::string FormatValueForDisplay(const base::Value& value) { - return PrettyPrintValue(Log::truncate_logged_params ? *SmartDeepCopy(&value) - : value); + if (Log::truncate_logged_params) { + return PrettyPrintValue(SmartDeepCopy(&value)); + } else { + return PrettyPrintValue(value); + } } std::string FormatJsonForDisplay(const std::string& json) {
diff --git a/chrome/test/chromedriver/commands.cc b/chrome/test/chromedriver/commands.cc index 22d45333..8b028a8 100644 --- a/chrome/test/chromedriver/commands.cc +++ b/chrome/test/chromedriver/commands.cc
@@ -100,11 +100,11 @@ (*session_remaining_count)--; if (value) { - std::unique_ptr<base::DictionaryValue> session(new base::DictionaryValue()); - session->GetDict().Set("id", session_id); - session->GetDict().Set("capabilities", - base::Value::FromUniquePtrValue(std::move(value))); - session_list->Append(std::move(session)); + base::Value::Dict session; + session.Set("id", session_id); + session.Set("capabilities", + base::Value::FromUniquePtrValue(std::move(value))); + session_list->GetList().Append(std::move(session)); } if (!*session_remaining_count) {
diff --git a/chrome/test/chromedriver/window_commands.cc b/chrome/test/chromedriver/window_commands.cc index d76df9f..4f312370 100644 --- a/chrome/test/chromedriver/window_commands.cc +++ b/chrome/test/chromedriver/window_commands.cc
@@ -2324,10 +2324,11 @@ Status status = GetVisibleCookies(session, web_view, &cookies); if (status.IsError()) return status; - std::unique_ptr<base::ListValue> cookie_list(new base::ListValue()); + auto cookie_list = std::make_unique<base::Value>(base::Value::Type::LIST); for (std::list<Cookie>::const_iterator it = cookies.begin(); it != cookies.end(); ++it) { - cookie_list->Append(CreateDictionaryFrom(*it)); + cookie_list->GetList().Append( + base::Value::FromUniquePtrValue(CreateDictionaryFrom(*it))); } *value = std::move(cookie_list); return Status(kOk);
diff --git a/chrome/test/data/webui/chromeos/personalization_app/wallpaper_grid_item_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/wallpaper_grid_item_element_test.ts index d17ef8f..af1b248 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/wallpaper_grid_item_element_test.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/wallpaper_grid_item_element_test.ts
@@ -49,6 +49,7 @@ // Verify state. assertEquals(querySelector('img')?.getAttribute('auto-src'), imageSrc); + assertEquals(querySelector('img')?.getAttribute('aria-hidden'), 'true'); assertEquals(querySelector('img')?.hasAttribute('clear-src'), true); assertEquals(querySelector('img')?.hasAttribute('is-google-photos'), true); assertEquals(querySelector('.text'), null);
diff --git a/chrome/test/data/webui/new_tab_page/modules/task_module/module_test.ts b/chrome/test/data/webui/new_tab_page/modules/task_module/module_test.ts index d4cfb2b3..38d14a4b 100644 --- a/chrome/test/data/webui/new_tab_page/modules/task_module/module_test.ts +++ b/chrome/test/data/webui/new_tab_page/modules/task_module/module_test.ts
@@ -7,6 +7,7 @@ import {DismissModuleEvent, recipeTasksDescriptor, TaskModuleElement, TaskModuleHandlerProxy} from 'chrome://new-tab-page/lazy_load.js'; import {$$, CrAutoImgElement} from 'chrome://new-tab-page/new_tab_page.js'; import {TaskModuleHandlerRemote} from 'chrome://new-tab-page/task_module.mojom-webui.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; import {eventToPromise, flushTasks} from 'chrome://webui-test/test_util.js'; @@ -241,4 +242,72 @@ // Assert. assertTrue(!!$$(moduleElement, 'ntp-info-dialog')); }); + + [true, false].forEach(historicalArm => { + test( + `change text for historical experiment arm ${historicalArm}`, + async () => { + // Arrange. + loadTimeData.overrideValues({ + modulesRecipeHistoricalExperimentEnabled: historicalArm, + }); + + const task = { + title: 'Hello world', + taskItems: [ + { + name: 'foo', + imageUrl: {url: 'https://foo.com/img.png'}, + siteName: 'Foo Site', + info: 'foo info', + targetUrl: {url: 'https://foo.com'}, + }, + { + name: 'bar', + imageUrl: {url: 'https://bar.com/img.png'}, + siteName: 'Bar Site', + info: 'bar info', + targetUrl: {url: 'https://bar.com'}, + }, + ] + }; + handler.setResultFor('getPrimaryTask', Promise.resolve({task})); + + // Act. + const moduleElement = + await recipeTasksDescriptor.initialize(0) as TaskModuleElement; + assertTrue(!!moduleElement); + document.body.append(moduleElement); + moduleElement.$.taskItemsRepeat.render(); + moduleElement.$.relatedSearchesRepeat.render(); + + const headerElement = + moduleElement.shadowRoot!.querySelector('ntp-module-header')!; + const menuElement = + headerElement.shadowRoot!.querySelector('#actionMenu')!; + const dismissButton = + menuElement.querySelector<HTMLElement>('#dismissButton')!; + const disableButton = + menuElement.querySelector<HTMLElement>('#disableButton')!; + + // Assert. + // check title + const title = historicalArm ? + loadTimeData.getString('modulesRecipeViewedTasksSentence') : + loadTimeData.getString('modulesRecipeTasksSentence'); + assertEquals(title, headerElement.innerText); + + // check menu hide text + const hideText = historicalArm ? + loadTimeData.getString('modulesRecipeViewedTasksLowerThese') : + loadTimeData.getString('modulesRecipeTasksLowerThese'); + assertTrue(dismissButton.innerText.includes(hideText)); + + // check menu don't show texts + const showText = historicalArm ? + loadTimeData.getString('modulesRecipeViewedTasksLower') : + loadTimeData.getString('modulesRecipeTasksLower'); + assertTrue(disableButton.innerText.includes(showText)); + }); + }); });
diff --git a/chromecast/media/api/BUILD.gn b/chromecast/media/api/BUILD.gn index 3c306cf..b1fb7d4 100644 --- a/chromecast/media/api/BUILD.gn +++ b/chromecast/media/api/BUILD.gn
@@ -6,6 +6,8 @@ cast_source_set("api") { sources = [ + "audio_clock_simulator.h", + "audio_provider.h", "cast_audio_decoder.h", "cast_audio_demuxer.h", "cast_audio_resampler.h",
diff --git a/chromecast/media/api/audio_clock_simulator.h b/chromecast/media/api/audio_clock_simulator.h new file mode 100644 index 0000000..0b0a748 --- /dev/null +++ b/chromecast/media/api/audio_clock_simulator.h
@@ -0,0 +1,42 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMECAST_MEDIA_API_AUDIO_CLOCK_SIMULATOR_H_ +#define CHROMECAST_MEDIA_API_AUDIO_CLOCK_SIMULATOR_H_ + +#include <cstddef> +#include <cstdint> +#include <memory> + +#include "chromecast/media/api/audio_provider.h" + +namespace chromecast { +namespace media { + +// Simulates a modifiable audio output clock rate by resampling. Note that this +// will always provide audio (FillFrames() always fills the entire buffer), +// even if the upstream provider does not provide any data. +class AudioClockSimulator : public AudioProvider { + public: + static std::unique_ptr<AudioClockSimulator> Create(AudioProvider* provider); + + // Sets the simulated audio clock rate. Returns the effective rate. + virtual double SetRate(double rate) = 0; + + // Returns the number of frames of additional delay due to audio stored + // internally. + virtual double DelayFrames() const = 0; + + // Sets a new playback sample rate. Needed to calculate timestamps correctly. + virtual void SetSampleRate(int sample_rate) = 0; + + // Sets the playback rate (rate at which samples are played out relative to + // the sample rate). Needed to calculate timestamps correctly. + virtual void SetPlaybackRate(double playback_rate) = 0; +}; + +} // namespace media +} // namespace chromecast + +#endif // CHROMECAST_MEDIA_API_AUDIO_CLOCK_SIMULATOR_H_
diff --git a/chromecast/media/audio/audio_provider.h b/chromecast/media/api/audio_provider.h similarity index 88% rename from chromecast/media/audio/audio_provider.h rename to chromecast/media/api/audio_provider.h index c19f68e..1f432c3 100644 --- a/chromecast/media/audio/audio_provider.h +++ b/chromecast/media/api/audio_provider.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMECAST_MEDIA_AUDIO_AUDIO_PROVIDER_H_ -#define CHROMECAST_MEDIA_AUDIO_AUDIO_PROVIDER_H_ +#ifndef CHROMECAST_MEDIA_API_AUDIO_PROVIDER_H_ +#define CHROMECAST_MEDIA_API_AUDIO_PROVIDER_H_ #include <cstdint> @@ -34,4 +34,4 @@ } // namespace media } // namespace chromecast -#endif // CHROMECAST_MEDIA_AUDIO_AUDIO_PROVIDER_H_ +#endif // CHROMECAST_MEDIA_API_AUDIO_PROVIDER_H_
diff --git a/chromecast/media/audio/BUILD.gn b/chromecast/media/audio/BUILD.gn index 835a030..f660ff1 100644 --- a/chromecast/media/audio/BUILD.gn +++ b/chromecast/media/audio/BUILD.gn
@@ -30,16 +30,16 @@ cast_source_set("processing") { sources = [ - "audio_clock_simulator.cc", - "audio_clock_simulator.h", "audio_fader.cc", "audio_fader.h", - "audio_provider.h", "cast_audio_bus.cc", "cast_audio_bus.h", ] - deps = [ "//base" ] + deps = [ + "//base", + "//chromecast/media/api", + ] # Use fastest possible float math. configs -= [ "//build/config/compiler:default_optimization" ] @@ -54,8 +54,8 @@ ] deps = [ - ":processing", "//base", + "//chromecast/media/api", "//media", ] } @@ -136,6 +136,7 @@ cast_source_set("audio") { sources = [ + "audio_clock_simulator_impl.cc", "cast_audio_input_stream.cc", "cast_audio_input_stream.h", "cast_audio_manager.cc", @@ -308,11 +309,13 @@ ] deps = [ + ":audio", ":interleaved_channel_mixer", ":playback_rate_shifter", ":processing", ":rate_adjuster", "//base", + "//chromecast/media/api", "//media", "//testing/gmock", "//testing/gtest",
diff --git a/chromecast/media/audio/audio_clock_simulator.cc b/chromecast/media/audio/audio_clock_simulator.cc deleted file mode 100644 index 9c019598..0000000 --- a/chromecast/media/audio/audio_clock_simulator.cc +++ /dev/null
@@ -1,277 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/media/audio/audio_clock_simulator.h" - -#include <algorithm> -#include <cmath> - -#include "base/check_op.h" -#include "base/cxx17_backports.h" - -namespace chromecast { -namespace media { - -constexpr int AudioClockSimulator::kInterpolateWindow; -constexpr double AudioClockSimulator::kMaxRate; -constexpr double AudioClockSimulator::kMinRate; -constexpr size_t AudioClockSimulator::kMaxChannels; - -AudioClockSimulator::AudioClockSimulator(AudioProvider* provider) - : provider_(provider), - sample_rate_(provider_->sample_rate()), - num_channels_(provider_->num_channels()), - scratch_buffer_( - CastAudioBus::Create(num_channels_, kInterpolateWindow + 1)) { - DCHECK(provider_); - DCHECK_GT(sample_rate_, 0); - DCHECK_GT(num_channels_, 0u); - DCHECK_LE(num_channels_, kMaxChannels); - - scratch_buffer_->Zero(); -} - -AudioClockSimulator::~AudioClockSimulator() = default; - -size_t AudioClockSimulator::num_channels() const { - return num_channels_; -} - -int AudioClockSimulator::sample_rate() const { - return sample_rate_; -} - -double AudioClockSimulator::SetRate(double rate) { - rate = base::clamp(rate, kMinRate, kMaxRate); - - if (clock_rate_ != rate) { - clock_rate_ = rate; - input_frames_ = 0; - output_frames_ = 0; - } - return rate; -} - -int AudioClockSimulator::DelayFrames() const { - if (state_ == State::kLengthening && first_frame_filled_) { - return 1; - } - return 0; -} - -void AudioClockSimulator::SetSampleRate(int sample_rate) { - sample_rate_ = sample_rate; -} - -void AudioClockSimulator::SetPlaybackRate(double playback_rate) { - playback_rate_ = playback_rate; -} - -int AudioClockSimulator::FillFrames(int num_frames, - int64_t playout_timestamp, - float* const* channel_data) { - int filled = 0; - while (filled < num_frames) { - if (state_ == State::kLengthening) { - auto result = - FillDataLengthen(num_frames, playout_timestamp, channel_data, filled); - filled += result.filled; - output_frames_ += result.filled; - if (!result.complete) { - break; - } - continue; - } - - if (state_ == State::kShortening) { - auto result = - FillDataShorten(num_frames, playout_timestamp, channel_data, filled); - filled += result.filled; - output_frames_ += result.filled; - if (!result.complete) { - break; - } - continue; - } - - int64_t end_input_frames = input_frames_ + kInterpolateWindow; - int64_t end_output_frames = output_frames_ + kInterpolateWindow; - int64_t desired_output_frames = std::round(end_input_frames / clock_rate_); - - if (end_output_frames > desired_output_frames) { - state_ = State::kShortening; - continue; - } else if (end_output_frames < desired_output_frames) { - state_ = State::kLengthening; - continue; - } - - DCHECK_EQ(state_, State::kPassthrough); - float* channels[kMaxChannels]; - for (size_t c = 0; c < num_channels_; ++c) { - channels[c] = channel_data[c] + filled; - } - int64_t timestamp = playout_timestamp + FramesToMicroseconds(filled); - int desired = std::min(num_frames - filled, kInterpolateWindow); - int provided = provider_->FillFrames(desired, timestamp, channels); - input_frames_ += provided; - output_frames_ += provided; - filled += provided; - - if (provided < desired) { - break; - } - } - - return filled; -} - -AudioClockSimulator::FillResult AudioClockSimulator::FillDataLengthen( - int num_frames, - int64_t playout_timestamp, - float* const* channel_data, - int offset) { - DCHECK_EQ(state_, State::kLengthening); - DCHECK_LT(interpolate_position_, kInterpolateWindow); - DCHECK_GE(interpolate_position_, 0); - - if (first_frame_filled_) { - for (size_t c = 0; c < num_channels_; ++c) { - channel_data[c][offset] = scratch_buffer_->channel(c)[0]; - } - first_frame_filled_ = false; - state_ = State::kPassthrough; // Finished current interpolation window. - return {true, 1}; - } - - int frames_for_window = kInterpolateWindow - interpolate_position_; - int desired_fill = std::min((num_frames - offset), frames_for_window); - float* channels[kMaxChannels]; - for (size_t c = 0; c < num_channels_; ++c) { - // The first sample from last call is still needed, so fill starting at - // index 1. - channels[c] = scratch_buffer_->channel(c) + 1; - } - int64_t timestamp = playout_timestamp + FramesToMicroseconds(offset); - int provided = provider_->FillFrames(desired_fill, timestamp, channels); - if (provided == 0) { - return {false, 0}; - } - - input_frames_ += provided; - InterpolateLonger(provided, channel_data, offset); - - return {(provided == desired_fill), provided}; -} - -void AudioClockSimulator::InterpolateLonger(int num_frames, - float* const* dest, - int offset) { - DCHECK_GT(num_frames, 0); - DCHECK_LE(interpolate_position_ + num_frames, kInterpolateWindow); - // When lengthening, we only set |first_frame_filled_| when we have finished - // the interpolation window (indicating the extra frame is available in - // the start of the scratch buffer). - DCHECK(!first_frame_filled_); - - for (size_t c = 0; c < num_channels_; ++c) { - float* source_channel = scratch_buffer_->channel(c); - float* dest_channel = dest[c] + offset; - - for (int s = 0; s < num_frames; ++s) { - int interpolate_point = interpolate_position_ + s; - dest_channel[s] = - (source_channel[s] * interpolate_point + - source_channel[s + 1] * (kInterpolateWindow - interpolate_point)) / - kInterpolateWindow; - } - - source_channel[0] = source_channel[num_frames]; - } - - interpolate_position_ += num_frames; - if (interpolate_position_ == kInterpolateWindow) { - interpolate_position_ = 0; - first_frame_filled_ = true; - // Don't set state to passthrough yet, because we still need to consume the - // last frame from the scratch buffer. - } -} - -AudioClockSimulator::FillResult AudioClockSimulator::FillDataShorten( - int num_frames, - int64_t playout_timestamp, - float* const* channel_data, - int offset) { - DCHECK_EQ(state_, State::kShortening); - DCHECK_LT(interpolate_position_, kInterpolateWindow); - DCHECK_GE(interpolate_position_, 0); - - int frames_for_window = kInterpolateWindow - interpolate_position_; - int desired_fill = std::min((num_frames - offset), frames_for_window); - int fill_offset = 1; // Leave the last frame of the previous step untouched. - if (!first_frame_filled_) { - DCHECK_EQ(interpolate_position_, 0); - // Fill an extra frame for the first step of interpolation. - desired_fill += 1; - fill_offset = 0; - } - - float* channels[kMaxChannels]; - for (size_t c = 0; c < num_channels_; ++c) { - channels[c] = scratch_buffer_->channel(c) + fill_offset; - } - int64_t timestamp = playout_timestamp + FramesToMicroseconds(offset); - int provided = provider_->FillFrames(desired_fill, timestamp, channels); - if (provided == 0) { - return {false, 0}; - } - - first_frame_filled_ = true; - input_frames_ += provided; - int output_frames = provided + fill_offset - 1; - InterpolateShorter(output_frames, channel_data, offset); - - return {(provided == desired_fill), output_frames}; -} - -void AudioClockSimulator::InterpolateShorter(int num_frames, - float* const* dest, - int offset) { - DCHECK_GT(num_frames, 0); - DCHECK_LE(interpolate_position_ + num_frames, kInterpolateWindow); - // When shortening, we must ensure that the first frame in the scratch buffer - // is filled with valid data in all cases (including when we start the - // interpolation window). - DCHECK(first_frame_filled_); - - for (size_t c = 0; c < num_channels_; ++c) { - float* source_channel = scratch_buffer_->channel(c); - float* dest_channel = dest[c] + offset; - - for (int s = 0; s < num_frames; ++s) { - int interpolate_point = interpolate_position_ + s + 1; - dest_channel[s] = - (source_channel[s] * (kInterpolateWindow - interpolate_point) + - source_channel[s + 1] * interpolate_point) / - kInterpolateWindow; - } - - source_channel[0] = source_channel[num_frames]; - } - - interpolate_position_ += num_frames; - if (interpolate_position_ == kInterpolateWindow) { - interpolate_position_ = 0; - first_frame_filled_ = false; - state_ = State::kPassthrough; // Finished current interpolation window. - } -} - -int64_t AudioClockSimulator::FramesToMicroseconds(int64_t frames) { - return frames * 1000000 / (sample_rate_ * playback_rate_); -} - -} // namespace media -} // namespace chromecast
diff --git a/chromecast/media/audio/audio_clock_simulator.h b/chromecast/media/audio/audio_clock_simulator.h deleted file mode 100644 index 348f8998..0000000 --- a/chromecast/media/audio/audio_clock_simulator.h +++ /dev/null
@@ -1,128 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_MEDIA_AUDIO_AUDIO_CLOCK_SIMULATOR_H_ -#define CHROMECAST_MEDIA_AUDIO_AUDIO_CLOCK_SIMULATOR_H_ - -#include <cstddef> -#include <cstdint> -#include <memory> - -#include "chromecast/media/audio/audio_provider.h" -#include "chromecast/media/audio/cast_audio_bus.h" - -namespace chromecast { -namespace media { - -// Simulates a modifiable audio output clock rate by interpolating as needed to -// add or remove single frames. -class AudioClockSimulator : public AudioProvider { - public: - // Number of frames to linearly interpolate over. One interpolation starts, - // it continues until the window is complete; rate changes only take effect - // once the window is complete. - static constexpr int kInterpolateWindow = 1024; - - // Maximum/minimum rate that this class supports. If the rate passed to - // SetRate() is outside of these bounds, it is clamped to within the bounds - // and the clamped value is returned. Note that the rate is essentially - // (num_input_frames) / (num_output_frames). - static constexpr double kMaxRate = - (kInterpolateWindow + 1.0) / kInterpolateWindow; - static constexpr double kMinRate = - kInterpolateWindow / (kInterpolateWindow + 1.0); - - // Maximum channels that this class supports. - static constexpr size_t kMaxChannels = 32; - - explicit AudioClockSimulator(AudioProvider* provider); - ~AudioClockSimulator() override; - - AudioClockSimulator(const AudioClockSimulator&) = delete; - AudioClockSimulator& operator=(const AudioClockSimulator&) = delete; - - // Sets the simulated audio clock rate. The rate is capped internally between - // kMinRate and kMaxRate. Returns the capped effective rate. - double SetRate(double rate); - - // Returns the number of frames of additional delay due to audio stored - // internally. Will always return 0 or 1. - int DelayFrames() const; - - // Sets a new playback sample rate. Needed to calculate timestamps correctly. - void SetSampleRate(int sample_rate); - - // Sets the playback rate (rate at which samples are played out relative to - // the sample rate). Needed to calculate timestamps correctly. - void SetPlaybackRate(double playback_rate); - - // AudioProvider implementation: - int FillFrames(int num_frames, - int64_t playout_timestamp, - float* const* channel_data) override; - size_t num_channels() const override; - int sample_rate() const override; - - private: - enum class State { - kPassthrough, - kLengthening, - kShortening, - }; - - struct FillResult { - bool complete; - int filled; - }; - - FillResult FillDataLengthen(int num_frames, - int64_t playout_timestamp, - float* const* channel_data, - int offset); - FillResult FillDataShorten(int num_frames, - int64_t playout_timestamp, - float* const* channel_data, - int offset); - void InterpolateLonger(int num_frames, - float* const* channel_data, - int offset); - void InterpolateShorter(int num_frames, - float* const* channel_data, - int offset); - - int64_t FramesToMicroseconds(int64_t frames); - - AudioProvider* const provider_; - int sample_rate_; - const size_t num_channels_; - double playback_rate_ = 1.0; - - double clock_rate_ = 1.0; - int64_t input_frames_ = 0; - int64_t output_frames_ = 0; - - State state_ = State::kPassthrough; - int interpolate_position_ = 0; - bool first_frame_filled_ = false; - - // Scratch buffer used to hold the filled original data before it is - // interpolated for output. The first frame (first sample across all channels) - // at index 0 is used to hold the last frame of the previous partial - // interpolation step. - // At the start of the interpolation window: - // * If we are interpolating to make the audio longer, the first frame is - // not used (the weight is 0), so it can be any value. - // * If we are interpolating to make the audio shorted, the first fill - // request to the provider fills in the first frame (so we request one - // extra frame of audio) - this accounts for the frame that is removed due - // to interpolation. - // The |first_frame_filled_| member var tracks whether or not the first frame - // of the |scratch_buffer_| contains valid audio. - std::unique_ptr<CastAudioBus> scratch_buffer_; -}; - -} // namespace media -} // namespace chromecast - -#endif // CHROMECAST_MEDIA_AUDIO_AUDIO_CLOCK_SIMULATOR_H_
diff --git a/chromecast/media/audio/audio_clock_simulator_impl.cc b/chromecast/media/audio/audio_clock_simulator_impl.cc new file mode 100644 index 0000000..100688d5 --- /dev/null +++ b/chromecast/media/audio/audio_clock_simulator_impl.cc
@@ -0,0 +1,149 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <algorithm> +#include <cmath> +#include <cstddef> +#include <cstdint> +#include <memory> + +#include "base/bind.h" +#include "base/check_op.h" +#include "chromecast/media/api/audio_clock_simulator.h" +#include "chromecast/media/api/audio_provider.h" +#include "media/base/audio_bus.h" +#include "media/base/multi_channel_resampler.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace chromecast { +namespace media { + +namespace { +constexpr size_t kMaxChannels = 32; +constexpr size_t kDefaultResampleBufferFrames = 2048; + +class AudioClockSimulatorImpl : public AudioClockSimulator { + public: + explicit AudioClockSimulatorImpl(AudioProvider* provider) + : provider_(provider), + sample_rate_(provider_->sample_rate()), + num_channels_(provider_->num_channels()) { + DCHECK(provider_); + DCHECK_GT(sample_rate_, 0); + DCHECK_GT(num_channels_, 0u); + DCHECK_LE(num_channels_, kMaxChannels); + + resample_buffer_ = + ::media::AudioBus::Create(num_channels_, kDefaultResampleBufferFrames); + resampler_ = std::make_unique<::media::MultiChannelResampler>( + num_channels_, 1.0, ::media::SincResampler::kKernelSize * 2, + base::BindRepeating(&AudioClockSimulatorImpl::ResamplerReadCallback, + base::Unretained(this))); + resampler_->PrimeWithSilence(); + } + + ~AudioClockSimulatorImpl() override = default; + + AudioClockSimulatorImpl(const AudioClockSimulatorImpl&) = delete; + AudioClockSimulatorImpl& operator=(const AudioClockSimulatorImpl&) = delete; + + // AudioClockSimulator implementation: + double SetRate(double rate) override { + if (in_fill_) { + pending_rate_ = rate; + return rate; + } + if (rate != clock_rate_) { + clock_rate_ = rate; + resampler_->SetRatio(clock_rate_); + } + return rate; + } + + double DelayFrames() const override { + return resampler_->BufferedFrames() + + ::media::SincResampler::kKernelSize / 2; + } + + void SetSampleRate(int sample_rate) override { sample_rate_ = sample_rate; } + + void SetPlaybackRate(double playback_rate) override { + playback_rate_ = playback_rate; + } + + int FillFrames(int num_frames, + int64_t playout_timestamp, + float* const* channel_data) override { + if (num_frames > resample_buffer_->frames()) { + resample_buffer_ = + ::media::AudioBus::Create(num_channels_, num_frames * 2); + } + request_timestamp_ = playout_timestamp; + // resampler_->BufferedFrames() gives incorrect values in the read callback, + // so track the number of buffered frames ourselves. + resampler_buffered_frames_ = DelayFrames(); + in_fill_ = true; + resampler_->Resample(num_frames, resample_buffer_.get()); + in_fill_ = false; + if (pending_rate_.has_value()) { + SetRate(pending_rate_.value()); + pending_rate_.reset(); + } + for (size_t c = 0; c < num_channels_; ++c) { + std::copy_n(resample_buffer_->channel(c), num_frames, channel_data[c]); + } + return num_frames; + } + + size_t num_channels() const override { return num_channels_; } + + int sample_rate() const override { return sample_rate_; } + + private: + void ResamplerReadCallback(int frame_delay, ::media::AudioBus* output) { + float* channels[kMaxChannels]; + for (size_t c = 0; c < num_channels_; ++c) { + channels[c] = output->channel(c); + } + + int64_t timestamp = + request_timestamp_ + FramesToMicroseconds(resampler_buffered_frames_); + const int needed_frames = output->frames(); + int filled = provider_->FillFrames(output->frames(), timestamp, channels); + if (filled < needed_frames) { + output->ZeroFramesPartial(filled, needed_frames - filled); + } + resampler_buffered_frames_ += output->frames(); + } + + int64_t FramesToMicroseconds(double frames) { + return std::round(frames * 1000000 / (sample_rate_ * playback_rate_)); + } + + AudioProvider* const provider_; + int sample_rate_; + const size_t num_channels_; + double playback_rate_ = 1.0; + + double clock_rate_ = 1.0; + + std::unique_ptr<::media::AudioBus> resample_buffer_; + std::unique_ptr<::media::MultiChannelResampler> resampler_; + + int64_t request_timestamp_ = 0; + double resampler_buffered_frames_ = 0.0; + bool in_fill_ = false; + absl::optional<double> pending_rate_; +}; + +} // namespace + +// static +std::unique_ptr<AudioClockSimulator> AudioClockSimulator::Create( + AudioProvider* provider) { + return std::make_unique<AudioClockSimulatorImpl>(provider); +} + +} // namespace media +} // namespace chromecast
diff --git a/chromecast/media/audio/audio_clock_simulator_unittest.cc b/chromecast/media/audio/audio_clock_simulator_unittest.cc index 12ad5e2c..f84efc8 100644 --- a/chromecast/media/audio/audio_clock_simulator_unittest.cc +++ b/chromecast/media/audio/audio_clock_simulator_unittest.cc
@@ -5,9 +5,10 @@ #include <cmath> #include <tuple> +#include "base/callback.h" #include "base/check_op.h" #include "base/logging.h" -#include "chromecast/media/audio/audio_clock_simulator.h" +#include "chromecast/media/api/audio_clock_simulator.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -26,7 +27,7 @@ constexpr int kBufferSize = 4096; int64_t FramesToTime(int64_t frames, int sample_rate) { - return frames * 1000000 / sample_rate; + return std::round(frames * 1000000.0 / sample_rate); } class FakeAudioProvider : public AudioProvider { @@ -38,6 +39,10 @@ .WillByDefault(Invoke(this, &FakeAudioProvider::FillFramesImpl)); } + void SetFillCallback(base::RepeatingCallback<void()> callback) { + fill_callback_ = std::move(callback); + } + // AudioProvider implementation: MOCK_METHOD(int, FillFrames, (int, int64_t, float* const*)); size_t num_channels() const override { return num_channels_; } @@ -52,6 +57,10 @@ } } next_ += num_frames; + + if (fill_callback_) { + fill_callback_.Run(); + } return num_frames; } @@ -60,6 +69,8 @@ private: const size_t num_channels_; int next_ = 0; + + base::RepeatingCallback<void()> fill_callback_; }; using TestParams = @@ -80,12 +91,12 @@ LOG(INFO) << "Request size = " << request_size << ", clock rate = " << clock_rate; NiceMock<FakeAudioProvider> provider(kDefaultChannels); - AudioClockSimulator clock(&provider); + auto clock = AudioClockSimulator::Create(&provider); if (request_size > kBufferSize) { return; } - EXPECT_EQ(clock.SetRate(clock_rate), clock_rate); + EXPECT_EQ(clock->SetRate(clock_rate), clock_rate); float output[kBufferSize]; std::fill_n(output, kBufferSize, 0); @@ -99,142 +110,54 @@ // Timestamp for requests to provider should not be before current fill // timestamp. EXPECT_CALL(provider, FillFrames(_, testing::Lt(timestamp), _)).Times(0); - int provided = clock.FillFrames(request_size, timestamp, test_data); + int provided = clock->FillFrames(request_size, timestamp, test_data); EXPECT_EQ(provided, request_size); - int delay = clock.DelayFrames(); + double delay = clock->DelayFrames(); EXPECT_GE(delay, 0); - EXPECT_LE(delay, 1); testing::Mock::VerifyAndClearExpectations(&provider); } - int leftover = kBufferSize - i; - if (leftover > 0) { - test_data[0] = output + kBufferSize - leftover; - int64_t timestamp = FramesToTime(i, kSampleRate); +} +TEST(AudioClockSimulatorTest, ChangeRateDuringFill) { + NiceMock<FakeAudioProvider> provider(2); + auto clock = AudioClockSimulator::Create(&provider); + + double rates[] = {0.9999, 1.0001, 0.9998, 1.0002, 1.0}; + int rate_index = 0; + provider.SetFillCallback(base::BindRepeating( + [](AudioClockSimulator* clock, double* rates, int* rate_index) { + if (*rate_index >= 5) { + return; + } + clock->SetRate(rates[*rate_index]); + *rate_index += 1; + }, + clock.get(), rates, &rate_index)); + + float output1[kBufferSize]; + float output2[kBufferSize]; + std::fill_n(output1, kBufferSize, 0); + std::fill_n(output2, kBufferSize, 0); + float* test_data[2] = {output1, output2}; + int requested_frames = 0; + while (true) { + int64_t timestamp = FramesToTime(requested_frames, kSampleRate); EXPECT_CALL(provider, FillFrames(_, _, _)).Times(testing::AnyNumber()); - EXPECT_CALL(provider, FillFrames(_, testing::Lt(timestamp), _)).Times(0); - int provided = clock.FillFrames(leftover, timestamp, test_data); - EXPECT_EQ(provided, leftover); - - int delay = clock.DelayFrames(); - EXPECT_GE(delay, 0); - EXPECT_LE(delay, 1); - } - - if (clock_rate < 1.0) { - EXPECT_LE(provider.consumed(), kBufferSize); - if (clock_rate == AudioClockSimulator::kMinRate) { - int windows = kBufferSize / (AudioClockSimulator::kInterpolateWindow + 1); - int extra = kBufferSize % (AudioClockSimulator::kInterpolateWindow + 1); - EXPECT_EQ(provider.consumed(), - windows * AudioClockSimulator::kInterpolateWindow + extra); + int provided = clock->FillFrames(kBufferSize, timestamp, test_data); + EXPECT_EQ(provided, kBufferSize); + testing::Mock::VerifyAndClearExpectations(&provider); + if (rate_index >= 5) { + return; } - } else if (clock_rate == 1.0) { - EXPECT_EQ(provider.consumed(), kBufferSize); - } else { - EXPECT_GE(provider.consumed(), kBufferSize); - if (clock_rate == AudioClockSimulator::kMaxRate) { - int windows = kBufferSize / AudioClockSimulator::kInterpolateWindow; - int extra = kBufferSize % AudioClockSimulator::kInterpolateWindow; - EXPECT_EQ( - provider.consumed(), - windows * (AudioClockSimulator::kInterpolateWindow + 1) + extra); - } - } - - for (int f = 0; f < kBufferSize - 1; ++f) { - EXPECT_LT(output[f], output[f + 1]); - float diff = output[f + 1] - output[f]; - EXPECT_GE(diff, 1.0 - 1.0 / AudioClockSimulator::kInterpolateWindow); - EXPECT_LE(diff, 1.0 + 1.0 / AudioClockSimulator::kInterpolateWindow); } } INSTANTIATE_TEST_SUITE_P( RequestSizes, AudioClockSimulatorTest, - testing::Combine( - ::testing::Values(1, - 2, - 100, - AudioClockSimulator::kInterpolateWindow - 1, - AudioClockSimulator::kInterpolateWindow, - AudioClockSimulator::kInterpolateWindow + 1, - AudioClockSimulator::kInterpolateWindow + 100), - ::testing::Values(1.0, - AudioClockSimulator::kMinRate, - AudioClockSimulator::kMaxRate, - (1.0 + AudioClockSimulator::kMinRate) / 2, - (1.0 + AudioClockSimulator::kMaxRate) / 2))); - -TEST(AudioClockSimulatorTest2, RateChange) { - NiceMock<FakeAudioProvider> provider(kDefaultChannels); - AudioClockSimulator clock(&provider); - - float output[kBufferSize]; - std::fill_n(output, kBufferSize, 0); - int index = 0; - float* test_data[1] = {output}; - - // First, some passthrough data. - int consumed = 0; - int requested = 100; - int provided = clock.FillFrames(requested, 0, test_data); - EXPECT_EQ(provided, requested); - EXPECT_EQ(provider.consumed() - consumed, requested); - consumed = provider.consumed(); - index += requested; - - // Change clock rate. When switching from passthrough, the rate change takes - // effect immediately. - clock.SetRate(AudioClockSimulator::kMinRate); - - test_data[0] = output + index; - requested = 100; - provided = clock.FillFrames(requested, 0, test_data); - EXPECT_EQ(provided, requested); - index += requested; - - // Change clock rate again. The new rate doesn't take effect until the - // interpolation window is complete. - clock.SetRate(AudioClockSimulator::kMaxRate); - test_data[0] = output + index; - requested = AudioClockSimulator::kInterpolateWindow + 1 - 100; - provided = clock.FillFrames(requested, 0, test_data); - EXPECT_EQ(provided, requested); - // Consume 1 less sample than requested over the entire interpolation window. - EXPECT_EQ(provider.consumed() - consumed, - AudioClockSimulator::kInterpolateWindow); - consumed = provider.consumed(); - index += requested; - - // Interpolation window should now be complete, start on new clock rate. - test_data[0] = output + index; - requested = 100; - provided = clock.FillFrames(requested, 0, test_data); - EXPECT_EQ(provided, requested); - index += requested; - - // Change clock rate again. - clock.SetRate(1.0); - - test_data[0] = output + index; - requested = AudioClockSimulator::kInterpolateWindow - 100; - provided = clock.FillFrames(requested, 0, test_data); - EXPECT_EQ(provided, requested); - // Consume 1 more sample than requested over the entire interpolation window. - EXPECT_EQ(provider.consumed() - consumed, - AudioClockSimulator::kInterpolateWindow + 1); - index += requested; - - for (int f = 0; f < index - 1; ++f) { - EXPECT_LT(output[f], output[f + 1]); - float diff = output[f + 1] - output[f]; - EXPECT_GE(diff, 1.0 - 1.0 / AudioClockSimulator::kInterpolateWindow); - EXPECT_LE(diff, 1.0 + 1.0 / AudioClockSimulator::kInterpolateWindow); - } -} + testing::Combine(::testing::Values(1, 2, 31, 63, 64, 65, 1000), + ::testing::Values(1.0, 0.999, 1.001, 0.9995, 1.0005))); class AudioClockSimulatorLongRunningTest : public testing::TestWithParam<double> { @@ -247,8 +170,8 @@ double rate = GetParam(); LOG(INFO) << "Rate = " << rate; NiceMock<FakeAudioProvider> provider(kDefaultChannels); - AudioClockSimulator clock(&provider); - clock.SetRate(rate); + auto clock = AudioClockSimulator::Create(&provider); + clock->SetRate(rate); const int kRequestSize = 1000; const int kIterations = 1000; @@ -256,7 +179,7 @@ float output[kRequestSize]; float* test_data[1] = {output}; for (int i = 0; i < kIterations; ++i) { - int provided = clock.FillFrames(kRequestSize, 0, test_data); + int provided = clock->FillFrames(kRequestSize, 0, test_data); EXPECT_EQ(provided, kRequestSize); } @@ -264,17 +187,12 @@ int output_frames = kRequestSize * kIterations; EXPECT_GE(input_frames, std::floor(rate * output_frames)); - EXPECT_LE(input_frames, std::ceil(rate * output_frames)); + EXPECT_LE(input_frames, std::ceil(rate * output_frames) + 64); } -INSTANTIATE_TEST_SUITE_P( - Rates, - AudioClockSimulatorLongRunningTest, - ::testing::Values(1.0, - AudioClockSimulator::kMinRate, - AudioClockSimulator::kMaxRate, - (1.0 + AudioClockSimulator::kMinRate) / 2, - (1.0 + AudioClockSimulator::kMaxRate) / 2)); +INSTANTIATE_TEST_SUITE_P(Rates, + AudioClockSimulatorLongRunningTest, + ::testing::Values(1.0, 0.999, 1.001, 0.9995, 1.0005)); } // namespace media } // namespace chromecast
diff --git a/chromecast/media/audio/audio_fader.h b/chromecast/media/audio/audio_fader.h index cc5e3f6b..224bb20 100644 --- a/chromecast/media/audio/audio_fader.h +++ b/chromecast/media/audio/audio_fader.h
@@ -9,7 +9,7 @@ #include <memory> #include "base/time/time.h" -#include "chromecast/media/audio/audio_provider.h" +#include "chromecast/media/api/audio_provider.h" #include "chromecast/media/audio/cast_audio_bus.h" namespace chromecast {
diff --git a/chromecast/media/audio/playback_rate_shifter.h b/chromecast/media/audio/playback_rate_shifter.h index ba0d6423..da842bdc 100644 --- a/chromecast/media/audio/playback_rate_shifter.h +++ b/chromecast/media/audio/playback_rate_shifter.h
@@ -9,7 +9,7 @@ #include <memory> #include "base/memory/scoped_refptr.h" -#include "chromecast/media/audio/audio_provider.h" +#include "chromecast/media/api/audio_provider.h" #include "media/base/channel_layout.h" #include "media/base/media_util.h"
diff --git a/chromecast/media/cma/backend/audio_decoder_for_mixer.cc b/chromecast/media/cma/backend/audio_decoder_for_mixer.cc index dca8ba16..d0c252b 100644 --- a/chromecast/media/cma/backend/audio_decoder_for_mixer.cc +++ b/chromecast/media/cma/backend/audio_decoder_for_mixer.cc
@@ -15,7 +15,6 @@ #include "chromecast/base/chromecast_switches.h" #include "chromecast/base/task_runner_impl.h" #include "chromecast/media/api/decoder_buffer_base.h" -#include "chromecast/media/audio/audio_clock_simulator.h" #include "chromecast/media/audio/mixer_service/mixer_service_transport.pb.h" #include "chromecast/media/audio/mixer_service/mixer_socket.h" #include "chromecast/media/audio/net/conversions.h" @@ -48,6 +47,9 @@ const int kInitialFillSizeFrames = 512; const double kPlaybackRateEpsilon = 0.001; +constexpr double kMinAudioClockRate = 0.99; +constexpr double kMaxAudioClockRate = 1.01; + const int64_t kDefaultInputQueueMs = 200; constexpr base::TimeDelta kFadeTime = base::Milliseconds(5); const int kDefaultStartThresholdMs = 70; @@ -269,8 +271,8 @@ } double AudioDecoderForMixer::SetAvSyncPlaybackRate(double rate) { - av_sync_clock_rate_ = std::max(AudioClockSimulator::kMinRate, - std::min(rate, AudioClockSimulator::kMaxRate)); + av_sync_clock_rate_ = + std::max(kMinAudioClockRate, std::min(rate, kMaxAudioClockRate)); if (mixer_input_) mixer_input_->SetAudioClockRate(av_sync_clock_rate_); return av_sync_clock_rate_;
diff --git a/chromecast/media/cma/backend/mixer/BUILD.gn b/chromecast/media/cma/backend/mixer/BUILD.gn index 1bbd81e..ce26876 100644 --- a/chromecast/media/cma/backend/mixer/BUILD.gn +++ b/chromecast/media/cma/backend/mixer/BUILD.gn
@@ -85,6 +85,7 @@ "//chromecast/base", "//chromecast/base:chromecast_switches", "//chromecast/base:thread_health_checker", + "//chromecast/media/api", "//chromecast/media/audio:audio_io_thread", "//chromecast/media/audio:audio_log", "//chromecast/media/audio:interleaved_channel_mixer",
diff --git a/chromecast/media/cma/backend/mixer/mixer_input_connection.cc b/chromecast/media/cma/backend/mixer/mixer_input_connection.cc index afb2109..52df6ed 100644 --- a/chromecast/media/cma/backend/mixer/mixer_input_connection.cc +++ b/chromecast/media/cma/backend/mixer/mixer_input_connection.cc
@@ -20,9 +20,9 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "chromecast/base/chromecast_switches.h" +#include "chromecast/media/api/audio_provider.h" #include "chromecast/media/audio/audio_fader.h" #include "chromecast/media/audio/audio_log.h" -#include "chromecast/media/audio/audio_provider.h" #include "chromecast/media/audio/mixer_service/mixer_service_transport.pb.h" #include "chromecast/media/audio/net/conversions.h" #include "chromecast/media/audio/rate_adjuster.h"
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index 93edc6a..88346a51 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -270,7 +270,7 @@ Enterprise enrollment </message> <message name="IDS_ASH_SHELF_SIGNIN_BUTTON" desc="Text shown on sign in button on enrollment screen."> - Use as personal device + Use as a personal device </message> <message name="IDS_ASH_SHELF_OS_INSTALL_BUTTON" desc="Text shown on install ChromeOS Flex button on login screen."> Install ChromeOS Flex @@ -2834,14 +2834,14 @@ Skip calibration </message> <!-- Setup calibration page --> - <message name="IDS_SHIMLESS_RMA_SETUP_CALIBRATION_PAGE_TITLE" translateable="false" desc="Title for the page that displays specific instructions required for some calibration steps."> - Prepare to calibrate device components + <message name="IDS_SHIMLESS_RMA_SETUP_CALIBRATION_PAGE_TITLE" desc="Title for the page that displays specific instructions required for some calibration steps."> + Calibrate components </message> - <message name="IDS_SHIMLESS_RMA_BASE_CALIBRATION_INSTRUCTIONS" translateable="false" desc="Instructions for calibrating gyroscope and accelerometer located in the base of the device."> - Please place the device on a flat surface before proceeding. + <message name="IDS_SHIMLESS_RMA_BASE_CALIBRATION_INSTRUCTIONS" desc="Instructions for calibrating gyroscope and accelerometer located in the base of the device."> + Before proceeding, place your laptop on a flat surface </message> - <message name="IDS_SHIMLESS_RMA_LID_CALIBRATION_INSTRUCTIONS" translateable="false" desc="Instructions for calibrating gyroscope and accelerometer located in the lid of the device."> - Please place the lid of the device on a flat surface before proceeding. + <message name="IDS_SHIMLESS_RMA_LID_CALIBRATION_INSTRUCTIONS" desc="Instructions for calibrating gyroscope and accelerometer located in the lid of the device."> + Before proceeding, place your whole device (base and lid) on a flat surface. </message> <!-- Finalize device page --> <message name="IDS_SHIMLESS_RMA_FINALIZE_PAGE_TITLE" translateable="false" desc="Title for the page shown when finalizing the device. Finalizing is the process of confirming the device is ready to return to the owner.">
diff --git a/chromeos/chromeos_strings_grd/IDS_ASH_SHELF_SIGNIN_BUTTON.png.sha1 b/chromeos/chromeos_strings_grd/IDS_ASH_SHELF_SIGNIN_BUTTON.png.sha1 index dbc2326..ba3ff295 100644 --- a/chromeos/chromeos_strings_grd/IDS_ASH_SHELF_SIGNIN_BUTTON.png.sha1 +++ b/chromeos/chromeos_strings_grd/IDS_ASH_SHELF_SIGNIN_BUTTON.png.sha1
@@ -1 +1 @@ -7c044f041a3bdc058653ab28845d6e6e99a5af13 \ No newline at end of file +2fdc7c05eaf4f16cc7d09961c359f1286c5de60d \ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_BASE_CALIBRATION_INSTRUCTIONS.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_BASE_CALIBRATION_INSTRUCTIONS.png.sha1 new file mode 100644 index 0000000..fbc8350 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_BASE_CALIBRATION_INSTRUCTIONS.png.sha1
@@ -0,0 +1 @@ +61745815ed8b78514ea3df9b4fa1d896198829ec \ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_LID_CALIBRATION_INSTRUCTIONS.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_LID_CALIBRATION_INSTRUCTIONS.png.sha1 new file mode 100644 index 0000000..e2d14ba --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_LID_CALIBRATION_INSTRUCTIONS.png.sha1
@@ -0,0 +1 @@ +93acde543d3c5f20d4e59fbca8f0178e7e0e14a4 \ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_SETUP_CALIBRATION_PAGE_TITLE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_SETUP_CALIBRATION_PAGE_TITLE.png.sha1 new file mode 100644 index 0000000..fbc8350 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_SETUP_CALIBRATION_PAGE_TITLE.png.sha1
@@ -0,0 +1 @@ +61745815ed8b78514ea3df9b4fa1d896198829ec \ No newline at end of file
diff --git a/chromeos/lacros/BUILD.gn b/chromeos/lacros/BUILD.gn index 987f3df7..bd02ab4 100644 --- a/chromeos/lacros/BUILD.gn +++ b/chromeos/lacros/BUILD.gn
@@ -110,4 +110,8 @@ "lacros.ShelfLaunch.unstable", ] } + + lacros_tast_tests("lacros_variations_tast_tests") { + tast_tests = [ "lacros.VariationSmoke" ] + } }
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt index 9b1b1e4..7997689 100644 --- a/chromeos/profiles/orderfile.newest.txt +++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@ -chromeos-chrome-orderfile-field-102-5005.22-1651486710-benchmark-102.0.5005.38-r1.orderfile.xz +chromeos-chrome-orderfile-field-103-4992.0-1650275085-benchmark-103.0.5018.0-r1.orderfile.xz
diff --git a/components/browser_ui/widget/android/java/res/anim/menu_exit_from_bottom_left.xml b/components/browser_ui/widget/android/java/res/anim/menu_exit_from_bottom_left.xml index 8043e12..9a5fbe8 100644 --- a/components/browser_ui/widget/android/java/res/anim/menu_exit_from_bottom_left.xml +++ b/components/browser_ui/widget/android/java/res/anim/menu_exit_from_bottom_left.xml
@@ -5,16 +5,16 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> - <scale android:interpolator="@android:anim/decelerate_interpolator" - android:fromXScale="1" - android:toXScale="0.5" - android:fromYScale="1" - android:toYScale="0.5" - android:pivotX="@fraction/menu_start_animation_pivot_x" - android:pivotY="5%" - android:duration="150" /> - <alpha android:interpolator="@android:anim/decelerate_interpolator" - android:fromAlpha="1" - android:toAlpha="0" - android:duration="150" /> + <scale android:interpolator="@android:anim/decelerate_interpolator" + android:fromXScale="1" + android:toXScale="0.5" + android:fromYScale="1" + android:toYScale="0.5" + android:pivotX="@fraction/menu_start_animation_pivot_x" + android:pivotY="100%" + android:duration="150" /> + <alpha android:interpolator="@android:anim/decelerate_interpolator" + android:fromAlpha="1" + android:toAlpha="0" + android:duration="150" /> </set>
diff --git a/components/browser_ui/widget/android/java/res/anim/menu_exit_from_top_left.xml b/components/browser_ui/widget/android/java/res/anim/menu_exit_from_top_left.xml index 47dbc247..970ea17 100644 --- a/components/browser_ui/widget/android/java/res/anim/menu_exit_from_top_left.xml +++ b/components/browser_ui/widget/android/java/res/anim/menu_exit_from_top_left.xml
@@ -5,16 +5,16 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> -<scale android:interpolator="@android:anim/decelerate_interpolator" - android:fromXScale="1" - android:toXScale="0.5" - android:fromYScale="1" - android:toYScale="0.5" - android:pivotX="@fraction/menu_start_animation_pivot_x" - android:pivotY="100%" - android:duration="150" /> -<alpha android:interpolator="@android:anim/decelerate_interpolator" - android:fromAlpha="1" - android:toAlpha="0" - android:duration="150" /> + <scale android:interpolator="@android:anim/decelerate_interpolator" + android:fromXScale="1" + android:toXScale="0.5" + android:fromYScale="1" + android:toYScale="0.5" + android:pivotX="@fraction/menu_start_animation_pivot_x" + android:pivotY="5%" + android:duration="150" /> + <alpha android:interpolator="@android:anim/decelerate_interpolator" + android:fromAlpha="1" + android:toAlpha="0" + android:duration="150" /> </set> \ No newline at end of file
diff --git a/components/cast_streaming/browser/cast_streaming_session.cc b/components/cast_streaming/browser/cast_streaming_session.cc index 9deb86c..ce88e796 100644 --- a/components/cast_streaming/browser/cast_streaming_session.cc +++ b/components/cast_streaming/browser/cast_streaming_session.cc
@@ -41,15 +41,15 @@ absl::optional<StreamingInitializationInfo::AudioStreamInfo> audio_stream_info; if (receivers.audio_receiver) { - audio_stream_info = {ToAudioDecoderConfig(receivers.audio_config), - receivers.audio_receiver}; + audio_stream_info.emplace(ToAudioDecoderConfig(receivers.audio_config), + receivers.audio_receiver); } absl::optional<StreamingInitializationInfo::VideoStreamInfo> video_stream_info; if (receivers.video_receiver) { - video_stream_info = {ToVideoDecoderConfig(receivers.video_config), - receivers.video_receiver}; + video_stream_info.emplace(ToVideoDecoderConfig(receivers.video_config), + receivers.video_receiver); } return {session, std::move(audio_stream_info), std::move(video_stream_info)}; @@ -93,14 +93,14 @@ base::Unretained(this))); } -base::RepeatingClosure +AudioDemuxerStreamDataProvider::RequestBufferCB CastStreamingSession::ReceiverSessionClient::GetAudioBufferRequester() { DCHECK(audio_consumer_); return base::BindRepeating(&StreamConsumer::ReadFrame, audio_consumer_->GetWeakPtr()); } -base::RepeatingClosure +VideoDemuxerStreamDataProvider::RequestBufferCB CastStreamingSession::ReceiverSessionClient::GetVideoBufferRequester() { DCHECK(video_consumer_); return base::BindRepeating(&StreamConsumer::ReadFrame, @@ -345,12 +345,14 @@ receiver_session_.reset(); } -base::RepeatingClosure CastStreamingSession::GetAudioBufferRequester() { +AudioDemuxerStreamDataProvider::RequestBufferCB +CastStreamingSession::GetAudioBufferRequester() { DCHECK(receiver_session_); return receiver_session_->GetAudioBufferRequester(); } -base::RepeatingClosure CastStreamingSession::GetVideoBufferRequester() { +VideoDemuxerStreamDataProvider::RequestBufferCB +CastStreamingSession::GetVideoBufferRequester() { DCHECK(receiver_session_); return receiver_session_->GetVideoBufferRequester(); }
diff --git a/components/cast_streaming/browser/cast_streaming_session.h b/components/cast_streaming/browser/cast_streaming_session.h index caa1c66d..825bdf10 100644 --- a/components/cast_streaming/browser/cast_streaming_session.h +++ b/components/cast_streaming/browser/cast_streaming_session.h
@@ -14,6 +14,7 @@ #include "base/timer/timer.h" #include "components/cast/message_port/message_port.h" #include "components/cast_streaming/browser/cast_message_port_impl.h" +#include "components/cast_streaming/browser/demuxer_stream_data_provider.h" #include "components/cast_streaming/browser/playback_command_dispatcher.h" #include "components/cast_streaming/browser/public/receiver_session.h" #include "components/cast_streaming/browser/remoting_session_client.h" @@ -103,8 +104,8 @@ // Return a callback that may be used to request a buffer of the specified // type, to be returned asynchronously through the client API. May only be // called following a call to Start() and prior to a call to Stop(). - base::RepeatingClosure GetAudioBufferRequester(); - base::RepeatingClosure GetVideoBufferRequester(); + AudioDemuxerStreamDataProvider::RequestBufferCB GetAudioBufferRequester(); + VideoDemuxerStreamDataProvider::RequestBufferCB GetVideoBufferRequester(); private: // Owns the Open Screen ReceiverSession. The Streaming Session is tied to the @@ -127,8 +128,8 @@ // Requests a new buffer of the specified type, which will be provided // Return a callback that may be used to request a buffer of the specified // type, to be returned asynchronously through the |client_|. - base::RepeatingClosure GetAudioBufferRequester(); - base::RepeatingClosure GetVideoBufferRequester(); + AudioDemuxerStreamDataProvider::RequestBufferCB GetAudioBufferRequester(); + VideoDemuxerStreamDataProvider::RequestBufferCB GetVideoBufferRequester(); private: void OnInitializationTimeout();
diff --git a/components/cast_streaming/browser/demuxer_stream_data_provider.h b/components/cast_streaming/browser/demuxer_stream_data_provider.h index d5dffe1..90755f698 100644 --- a/components/cast_streaming/browser/demuxer_stream_data_provider.h +++ b/components/cast_streaming/browser/demuxer_stream_data_provider.h
@@ -40,18 +40,27 @@ // media::AudioDecoderConfig or media::VideoDecoderConfig). typedef decltype(TStreamInfoType::element_type::decoder_config) ConfigType; + // The callback type which will be used to request a new buffer be read. The + // callback is expected to call ProvideBuffer() once a buffer is available. + // The callback parameter provided when calling a RequestBufferCB is to be + // called if there no buffers available for reading at time of calling. + typedef base::RepeatingCallback<void(base::OnceClosure)> RequestBufferCB; + // |request_buffer| is the callback which will be used to request a new // buffer be read. The callback is expected to call ProvideBuffer() once a // buffer is available. DemuxerStreamDataProvider( mojo::PendingReceiver<TMojoReceiverType> pending_receiver, - base::RepeatingClosure request_buffer, + RequestBufferCB request_buffer, base::OnceClosure on_mojo_disconnect, ConfigType config) : config_(std::move(config)), request_buffer_(std::move(request_buffer)), - receiver_(this, std::move(pending_receiver)) { - receiver_.set_disconnect_handler(std::move(on_mojo_disconnect)); + on_mojo_disconnect_(std::move(on_mojo_disconnect)), + receiver_(this, std::move(pending_receiver)), + weak_factory_(this) { + receiver_.set_disconnect_handler(base::BindOnce( + &DemuxerStreamDataProvider::OnFatalError, weak_factory_.GetWeakPtr())); } // Sets the new config to be passed to the renderer process as part of the @@ -76,11 +85,31 @@ .Run(std::move(next_stream_info_), std::move(buffer)); } - const ConfigType& config() const { return config_; } + const ConfigType& config() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + return config_; + } + + void SetOnNoBuffersAvailableCallback( + base::RepeatingClosure on_no_buffers_available) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + on_no_buffers_available_ = std::move(on_no_buffers_available); + } + + void SetOnErrorCallback(base::OnceClosure on_error) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + on_error_ = std::move(on_error); + } private: using GetBufferCallback = typename TMojoReceiverType::GetBufferCallback; + void OnFatalError() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + std::move(on_error_).Run(); + std::move(on_mojo_disconnect_).Run(); + } + // TMojoReceiverType implementation. void GetBuffer(GetBufferCallback callback) override { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -94,7 +123,7 @@ } current_callback_ = std::move(callback); - request_buffer_.Run(); + request_buffer_.Run(on_no_buffers_available_); } // The most recently set config. @@ -108,11 +137,23 @@ GetBufferCallback current_callback_; // Callback to request a new buffer be read from the receiver. - base::RepeatingClosure request_buffer_; + RequestBufferCB request_buffer_; + + // Callback called when no buffers are available for reading. + base::RepeatingClosure on_no_buffers_available_; + + // Callback called on an unrecoverable error, prior to shutdown of the + // component. + base::OnceClosure on_error_; + + // Callback called upon a mojo disconnection. + base::OnceClosure on_mojo_disconnect_; SEQUENCE_CHECKER(sequence_checker_); mojo::Receiver<TMojoReceiverType> receiver_; + + base::WeakPtrFactory<DemuxerStreamDataProvider> weak_factory_; }; } // namespace cast_streaming
diff --git a/components/cast_streaming/browser/demuxer_stream_data_provider_unittest.cc b/components/cast_streaming/browser/demuxer_stream_data_provider_unittest.cc index c5201896..15fc978 100644 --- a/components/cast_streaming/browser/demuxer_stream_data_provider_unittest.cc +++ b/components/cast_streaming/browser/demuxer_stream_data_provider_unittest.cc
@@ -47,6 +47,13 @@ base::Unretained(&callbacks_)), second_config_); + data_provider_->SetOnNoBuffersAvailableCallback(base::BindRepeating( + &DemuxerStreamDataProviderTest::Callbacks::OnNoBuffers, + base::Unretained(&callbacks_))); + data_provider_->SetOnErrorCallback( + base::BindRepeating(&DemuxerStreamDataProviderTest::Callbacks::OnError, + base::Unretained(&callbacks_))); + std::vector<uint8_t> data = {1, 2, 3}; first_buffer_ = media::DecoderBuffer::CopyFrom(data.data(), 3); first_buffer_->set_duration(base::Seconds(1)); @@ -70,7 +77,9 @@ protected: class Callbacks { public: - MOCK_METHOD0(RequestBuffer, void()); + MOCK_METHOD0(OnNoBuffers, void()); + MOCK_METHOD0(OnError, void()); + MOCK_METHOD1(RequestBuffer, void(base::OnceClosure)); MOCK_METHOD0(OnMojoDisconnect, void()); MOCK_METHOD0(OnGetBufferDoneCalled, void()); @@ -121,7 +130,7 @@ TEST_F(DemuxerStreamDataProviderTest, DataSentInOrderExpected) { // Test first call, providing a config and a buffer. - EXPECT_CALL(callbacks_, RequestBuffer()); + EXPECT_CALL(callbacks_, RequestBuffer(testing::_)); remote_->GetBuffer(base::BindOnce( &DemuxerStreamDataProviderTest::Callbacks::OnGetBufferDone, base::Unretained(&callbacks_), first_config_, first_buffer_)); @@ -138,7 +147,7 @@ EXPECT_TRUE(first_config_.Matches(data_provider_->config())); // Test second call, providing NO config but do provide a buffer. - EXPECT_CALL(callbacks_, RequestBuffer()); + EXPECT_CALL(callbacks_, RequestBuffer(testing::_)); remote_->GetBuffer(base::BindOnce( &DemuxerStreamDataProviderTest::Callbacks::OnGetBufferDone, base::Unretained(&callbacks_), absl::nullopt, second_buffer_)); @@ -152,7 +161,7 @@ task_environment_.RunUntilIdle(); // Test third call, providing a different config and a buffer. - EXPECT_CALL(callbacks_, RequestBuffer()); + EXPECT_CALL(callbacks_, RequestBuffer(testing::_)); remote_->GetBuffer(base::BindOnce( &DemuxerStreamDataProviderTest::Callbacks::OnGetBufferDone, base::Unretained(&callbacks_), second_config_, third_buffer_)); @@ -169,4 +178,27 @@ task_environment_.RunUntilIdle(); } +TEST_F(DemuxerStreamDataProviderTest, NoBuffersCallsWithCallback) { + EXPECT_CALL(callbacks_, RequestBuffer(testing::_)) + .WillOnce([](base::OnceClosure no_buffers_cb) { + std::move(no_buffers_cb).Run(); + }); + EXPECT_CALL(callbacks_, OnNoBuffers()); + remote_->GetBuffer(base::BindOnce( + &DemuxerStreamDataProviderTest::Callbacks::OnGetBufferDone, + base::Unretained(&callbacks_), first_config_, first_buffer_)); + task_environment_.RunUntilIdle(); +} + +TEST_F(DemuxerStreamDataProviderTest, NoBuffersCallsNoCallback) { + data_provider_->SetOnNoBuffersAvailableCallback(base::RepeatingClosure()); + EXPECT_CALL(callbacks_, RequestBuffer(testing::_)) + .WillOnce( + [](base::OnceClosure no_buffers_cb) { ASSERT_FALSE(no_buffers_cb); }); + remote_->GetBuffer(base::BindOnce( + &DemuxerStreamDataProviderTest::Callbacks::OnGetBufferDone, + base::Unretained(&callbacks_), first_config_, first_buffer_)); + task_environment_.RunUntilIdle(); +} + } // namespace cast_streaming
diff --git a/components/cast_streaming/browser/playback_command_dispatcher.cc b/components/cast_streaming/browser/playback_command_dispatcher.cc index e48f412..10185c8 100644 --- a/components/cast_streaming/browser/playback_command_dispatcher.cc +++ b/components/cast_streaming/browser/playback_command_dispatcher.cc
@@ -91,6 +91,7 @@ openscreen::cast::ReceiverSession::ConfiguredReceivers receivers) { DCHECK(dispatcher); DCHECK(session); + DCHECK(demuxer_stream_handler_); DCHECK(!streaming_init_info_); streaming_dispatcher_ = dispatcher; @@ -99,18 +100,43 @@ absl::optional<StreamingInitializationInfo::AudioStreamInfo> audio_stream_info; if (receivers.audio_receiver) { - audio_stream_info = {media::AudioDecoderConfig(), receivers.audio_receiver}; + auto no_buffers_cb = base::BindPostTask( + task_runner_, + base::BindRepeating( + &remoting::RpcDemuxerStreamHandler::RequestMoreAudioBuffers, + demuxer_stream_handler_->GetWeakPtr()), + FROM_HERE); + auto error_cb = base::BindPostTask( + task_runner_, + base::BindRepeating(&remoting::RpcDemuxerStreamHandler::OnAudioError, + demuxer_stream_handler_->GetWeakPtr()), + FROM_HERE); + audio_stream_info.emplace(media::AudioDecoderConfig(), + receivers.audio_receiver, + std::move(no_buffers_cb), std::move(error_cb)); } absl::optional<StreamingInitializationInfo::VideoStreamInfo> video_stream_info; if (receivers.video_receiver) { - video_stream_info = {media::VideoDecoderConfig(), receivers.video_receiver}; + auto no_buffers_cb = base::BindPostTask( + task_runner_, + base::BindRepeating( + &remoting::RpcDemuxerStreamHandler::RequestMoreVideoBuffers, + demuxer_stream_handler_->GetWeakPtr()), + FROM_HERE); + auto error_cb = base::BindPostTask( + task_runner_, + base::BindRepeating(&remoting::RpcDemuxerStreamHandler::OnVideoError, + demuxer_stream_handler_->GetWeakPtr()), + FROM_HERE); + video_stream_info.emplace(media::VideoDecoderConfig(), + receivers.video_receiver, + std::move(no_buffers_cb), std::move(error_cb)); } - streaming_init_info_ = StreamingInitializationInfo{ - receiver_session_, std::move(audio_stream_info), - std::move(video_stream_info)}; + streaming_init_info_.emplace(receiver_session_, std::move(audio_stream_info), + std::move(video_stream_info)); } void PlaybackCommandDispatcher::OnRemotingSessionEnded() {
diff --git a/components/cast_streaming/browser/receiver_session_impl.cc b/components/cast_streaming/browser/receiver_session_impl.cc index 36c9201..3f0cdfc 100644 --- a/components/cast_streaming/browser/receiver_session_impl.cc +++ b/components/cast_streaming/browser/receiver_session_impl.cc
@@ -97,6 +97,11 @@ base::BindOnce(&ReceiverSessionImpl::OnMojoDisconnect, weak_factory_.GetWeakPtr()), std::move(initialization_info.audio_stream_info->config)); + audio_demuxer_stream_data_provider_->SetOnNoBuffersAvailableCallback( + std::move( + initialization_info.audio_stream_info->on_no_buffers_callback)); + audio_demuxer_stream_data_provider_->SetOnErrorCallback( + std::move(initialization_info.audio_stream_info->on_error_callback)); audio_info = mojom::AudioStreamInitializationInfo::New( std::move(audio_receiver), mojom::AudioStreamInfo::New( @@ -114,6 +119,11 @@ base::BindOnce(&ReceiverSessionImpl::OnMojoDisconnect, weak_factory_.GetWeakPtr()), std::move(initialization_info.video_stream_info->config)); + video_demuxer_stream_data_provider_->SetOnNoBuffersAvailableCallback( + std::move( + initialization_info.video_stream_info->on_no_buffers_callback)); + video_demuxer_stream_data_provider_->SetOnErrorCallback( + std::move(initialization_info.video_stream_info->on_error_callback)); video_info = mojom::VideoStreamInitializationInfo::New( std::move(video_receiver), mojom::VideoStreamInfo::New( @@ -155,6 +165,11 @@ if (audio_pipe_consumer) { if (!audio_demuxer_stream_data_provider_->config().Matches( initialization_info.audio_stream_info->config)) { + audio_demuxer_stream_data_provider_->SetOnNoBuffersAvailableCallback( + std::move( + initialization_info.audio_stream_info->on_no_buffers_callback)); + audio_demuxer_stream_data_provider_->SetOnErrorCallback( + std::move(initialization_info.audio_stream_info->on_error_callback)); audio_demuxer_stream_data_provider_->OnNewStreamInfo( std::move(initialization_info.audio_stream_info->config), std::move(*audio_pipe_consumer)); @@ -167,6 +182,11 @@ if (video_pipe_consumer) { if (!video_demuxer_stream_data_provider_->config().Matches( initialization_info.video_stream_info->config)) { + video_demuxer_stream_data_provider_->SetOnNoBuffersAvailableCallback( + std::move( + initialization_info.video_stream_info->on_no_buffers_callback)); + video_demuxer_stream_data_provider_->SetOnErrorCallback( + std::move(initialization_info.video_stream_info->on_error_callback)); video_demuxer_stream_data_provider_->OnNewStreamInfo( std::move(initialization_info.video_stream_info->config), std::move(*video_pipe_consumer));
diff --git a/components/cast_streaming/browser/rpc_demuxer_stream_handler.cc b/components/cast_streaming/browser/rpc_demuxer_stream_handler.cc index 79c29ff..7b36dc2 100644 --- a/components/cast_streaming/browser/rpc_demuxer_stream_handler.cc +++ b/components/cast_streaming/browser/rpc_demuxer_stream_handler.cc
@@ -23,7 +23,8 @@ RpcProcessMessageCB message_processor) : client_(client), rpc_messenger_(rpc_messenger), - message_processor_(std::move(message_processor)) { + message_processor_(std::move(message_processor)), + weak_factory_(this) { DCHECK(rpc_messenger_); DCHECK(message_processor_); } @@ -110,6 +111,10 @@ std::move(message)); } +base::WeakPtr<RpcDemuxerStreamHandler> RpcDemuxerStreamHandler::GetWeakPtr() { + return weak_factory_.GetWeakPtr(); +} + void RpcDemuxerStreamHandler::OnRpcInitializeCallback( openscreen::cast::RpcMessenger::Handle handle, absl::optional<media::AudioDecoderConfig> audio_config,
diff --git a/components/cast_streaming/browser/rpc_demuxer_stream_handler.h b/components/cast_streaming/browser/rpc_demuxer_stream_handler.h index e4b638a..4b81d31d 100644 --- a/components/cast_streaming/browser/rpc_demuxer_stream_handler.h +++ b/components/cast_streaming/browser/rpc_demuxer_stream_handler.h
@@ -62,6 +62,8 @@ void OnAudioError(); void OnVideoError(); + base::WeakPtr<RpcDemuxerStreamHandler> GetWeakPtr(); + private: class MessageProcessor { public: @@ -133,6 +135,8 @@ std::unique_ptr<MessageProcessor> audio_message_processor_; std::unique_ptr<MessageProcessor> video_message_processor_; + + base::WeakPtrFactory<RpcDemuxerStreamHandler> weak_factory_; }; } // namespace cast_streaming::remoting
diff --git a/components/cast_streaming/browser/stream_consumer.cc b/components/cast_streaming/browser/stream_consumer.cc index 8966dea2..059bb0bd 100644 --- a/components/cast_streaming/browser/stream_consumer.cc +++ b/components/cast_streaming/browser/stream_consumer.cc
@@ -39,9 +39,11 @@ receiver_->SetConsumer(nullptr); } -void StreamConsumer::ReadFrame() { +void StreamConsumer::ReadFrame(base::OnceClosure no_frames_available_cb) { DCHECK(!is_read_pending_); + DCHECK(!no_frames_available_cb_); is_read_pending_ = true; + no_frames_available_cb_ = std::move(no_frames_available_cb); MaybeSendNextFrame(); } @@ -93,9 +95,13 @@ const int current_frame_buffer_size = receiver_->AdvanceToNextFrame(); if (current_frame_buffer_size == openscreen::cast::Receiver::kNoFramesReady) { + if (no_frames_available_cb_) { + std::move(no_frames_available_cb_).Run(); + } return; } + no_frames_available_cb_.Reset(); on_new_frame_.Run(); void* buffer = nullptr;
diff --git a/components/cast_streaming/browser/stream_consumer.h b/components/cast_streaming/browser/stream_consumer.h index 775c46ee..3c437d84 100644 --- a/components/cast_streaming/browser/stream_consumer.h +++ b/components/cast_streaming/browser/stream_consumer.h
@@ -47,8 +47,9 @@ // Informs the StreamConsumer that a new frame should be read asynchronously. // Eventually, the |frame_received_cb_| will be called with the data for this - // frame. - void ReadFrame(); + // frame. |no_frames_available_cb| will be called if no frames are immediately + // available when this callback first tries to read them. + void ReadFrame(base::OnceClosure no_frames_available_cb); // Returns a WeakPtr associated with this instance; base::WeakPtr<StreamConsumer> GetWeakPtr(); @@ -94,6 +95,8 @@ bool is_read_pending_ = false; + base::OnceClosure no_frames_available_cb_; + // Closure called on every new frame. base::RepeatingClosure on_new_frame_;
diff --git a/components/cast_streaming/browser/streaming_initialization_info.cc b/components/cast_streaming/browser/streaming_initialization_info.cc index 86950c62..f6e0ac0a 100644 --- a/components/cast_streaming/browser/streaming_initialization_info.cc +++ b/components/cast_streaming/browser/streaming_initialization_info.cc
@@ -4,6 +4,8 @@ #include "components/cast_streaming/browser/streaming_initialization_info.h" +#include "base/callback_helpers.h" + namespace cast_streaming { StreamingInitializationInfo::StreamingInitializationInfo() = default; @@ -21,4 +23,72 @@ StreamingInitializationInfo::~StreamingInitializationInfo() = default; +StreamingInitializationInfo::AudioStreamInfo::AudioStreamInfo() = default; + +StreamingInitializationInfo::AudioStreamInfo::AudioStreamInfo( + media::AudioDecoderConfig audio_config, + openscreen::cast::Receiver* cast_receiver) + : AudioStreamInfo(std::move(audio_config), + cast_receiver, + base::RepeatingClosure(), + base::OnceClosure()) {} + +StreamingInitializationInfo::AudioStreamInfo::AudioStreamInfo( + media::AudioDecoderConfig audio_config, + openscreen::cast::Receiver* cast_receiver, + base::RepeatingClosure on_no_buffers_cb, + base::OnceClosure on_error_cb) + : config(std::move(audio_config)), + receiver(cast_receiver), + on_no_buffers_callback(std::move(on_no_buffers_cb)), + on_error_callback(std::move(on_error_cb)) {} + +StreamingInitializationInfo::AudioStreamInfo::AudioStreamInfo( + const StreamingInitializationInfo::AudioStreamInfo& other) { + auto& old = const_cast<AudioStreamInfo&>(other); + auto cb_pair = base::SplitOnceCallback(std::move(old.on_error_callback)); + old.on_error_callback = std::move(cb_pair.first); + + config = other.config; + receiver = other.receiver; + on_no_buffers_callback = other.on_no_buffers_callback; + on_error_callback = std::move(cb_pair.second); +} + +StreamingInitializationInfo::AudioStreamInfo::~AudioStreamInfo() = default; + +StreamingInitializationInfo::VideoStreamInfo::VideoStreamInfo() = default; + +StreamingInitializationInfo::VideoStreamInfo::VideoStreamInfo( + media::VideoDecoderConfig video_config, + openscreen::cast::Receiver* cast_receiver) + : VideoStreamInfo(std::move(video_config), + cast_receiver, + base::RepeatingClosure(), + base::OnceClosure()) {} + +StreamingInitializationInfo::VideoStreamInfo::VideoStreamInfo( + media::VideoDecoderConfig video_config, + openscreen::cast::Receiver* cast_receiver, + base::RepeatingClosure on_no_buffers_cb, + base::OnceClosure on_error_cb) + : config(std::move(video_config)), + receiver(cast_receiver), + on_no_buffers_callback(std::move(on_no_buffers_cb)), + on_error_callback(std::move(on_error_cb)) {} + +StreamingInitializationInfo::VideoStreamInfo::VideoStreamInfo( + const StreamingInitializationInfo::VideoStreamInfo& other) { + auto& old = const_cast<VideoStreamInfo&>(other); + auto cb_pair = base::SplitOnceCallback(std::move(old.on_error_callback)); + old.on_error_callback = std::move(cb_pair.first); + + config = other.config; + receiver = other.receiver; + on_no_buffers_callback = other.on_no_buffers_callback; + on_error_callback = std::move(cb_pair.second); +} + +StreamingInitializationInfo::VideoStreamInfo::~VideoStreamInfo() = default; + } // namespace cast_streaming
diff --git a/components/cast_streaming/browser/streaming_initialization_info.h b/components/cast_streaming/browser/streaming_initialization_info.h index f1633a1..188f2faf 100644 --- a/components/cast_streaming/browser/streaming_initialization_info.h +++ b/components/cast_streaming/browser/streaming_initialization_info.h
@@ -5,6 +5,8 @@ #ifndef COMPONENTS_CAST_STREAMING_BROWSER_STREAMING_INITIALIZATION_INFO_H_ #define COMPONENTS_CAST_STREAMING_BROWSER_STREAMING_INITIALIZATION_INFO_H_ +#include "base/callback.h" +#include "base/callback_forward.h" #include "media/base/audio_decoder_config.h" #include "media/base/video_decoder_config.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -21,21 +23,53 @@ // NOTE: This struct IS copyable. struct StreamingInitializationInfo { struct AudioStreamInfo { + AudioStreamInfo(media::AudioDecoderConfig audio_config, + openscreen::cast::Receiver* cast_receiver); + AudioStreamInfo(media::AudioDecoderConfig audio_config, + openscreen::cast::Receiver* cast_receiver, + base::RepeatingClosure on_no_buffers_cb, + base::OnceClosure on_error_cb); + AudioStreamInfo(); + AudioStreamInfo(const AudioStreamInfo& other); + ~AudioStreamInfo(); + // The decoder config associated with this audio stream. media::AudioDecoderConfig config; // The Receiver for the audio stream. This pointer will remain valid for the // duration of the streaming session. openscreen::cast::Receiver* receiver; + + // Callback to be called when no buffers are available for reading. + base::RepeatingClosure on_no_buffers_callback; + + // Callback to be called when a non-recoverable error occurs. + base::OnceClosure on_error_callback; }; struct VideoStreamInfo { + VideoStreamInfo(media::VideoDecoderConfig video_config, + openscreen::cast::Receiver* cast_receiver); + VideoStreamInfo(media::VideoDecoderConfig video_config, + openscreen::cast::Receiver* cast_receiver, + base::RepeatingClosure on_no_buffers_cb, + base::OnceClosure on_error_cb); + VideoStreamInfo(); + VideoStreamInfo(const VideoStreamInfo& other); + ~VideoStreamInfo(); + // The decoder config associated with this video stream. media::VideoDecoderConfig config; // The Receiver for the video stream. This pointer will remain valid for the // duration of the streaming session. openscreen::cast::Receiver* receiver; + + // Callback to be called when no buffers are available for reading. + base::RepeatingClosure on_no_buffers_callback; + + // Callback to be called when a non-recoverable error occurs. + base::OnceClosure on_error_callback; }; StreamingInitializationInfo(
diff --git a/components/certificate_transparency/chrome_ct_policy_enforcer.cc b/components/certificate_transparency/chrome_ct_policy_enforcer.cc index 25417ff..884f44d 100644 --- a/components/certificate_transparency/chrome_ct_policy_enforcer.cc +++ b/components/certificate_transparency/chrome_ct_policy_enforcer.cc
@@ -159,6 +159,13 @@ disqualified_logs_ = std::move(disqualified_logs); operated_by_google_logs_ = std::move(operated_by_google_logs); log_operator_history_ = std::move(log_operator_history); + + if (valid_google_log_for_testing_.has_value()) { + valid_google_log_for_testing_ = absl::nullopt; + } + if (disqualified_log_for_testing_.has_value()) { + disqualified_log_for_testing_ = absl::nullopt; + } } bool ChromeCTPolicyEnforcer::IsLogDisqualified( @@ -166,6 +173,12 @@ base::Time* disqualification_date) const { CHECK_EQ(log_id.size(), crypto::kSHA256Length); + if (disqualified_log_for_testing_.has_value() && + log_id == disqualified_log_for_testing_.value().first) { + *disqualification_date = disqualified_log_for_testing_.value().second; + return *disqualification_date < base::Time::Now(); + } + auto p = std::lower_bound( std::begin(disqualified_logs_), std::end(disqualified_logs_), log_id, [](const auto& a, base::StringPiece b) { return a.first < b; }); @@ -181,6 +194,10 @@ bool ChromeCTPolicyEnforcer::IsLogOperatedByGoogle( base::StringPiece log_id) const { + if (valid_google_log_for_testing_.has_value() && + log_id == valid_google_log_for_testing_.value()) { + return true; + } return std::binary_search(std::begin(operated_by_google_logs_), std::end(operated_by_google_logs_), log_id); } @@ -418,6 +435,10 @@ std::string ChromeCTPolicyEnforcer::GetOperatorForLog( std::string log_id, base::Time timestamp) const { + if (valid_google_log_for_testing_.has_value() && + log_id == valid_google_log_for_testing_.value()) { + return "Google"; + } DCHECK(log_operator_history_.find(log_id) != log_operator_history_.end()); OperatorHistoryEntry log_history = log_operator_history_.at(log_id); for (auto operator_entry : log_history.previous_operators_) {
diff --git a/components/certificate_transparency/chrome_ct_policy_enforcer.h b/components/certificate_transparency/chrome_ct_policy_enforcer.h index df7544da..c167e4e 100644 --- a/components/certificate_transparency/chrome_ct_policy_enforcer.h +++ b/components/certificate_transparency/chrome_ct_policy_enforcer.h
@@ -16,6 +16,7 @@ #include "base/time/clock.h" #include "base/time/time.h" #include "net/cert/ct_policy_enforcer.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace certificate_transparency { @@ -95,6 +96,15 @@ log_operator_history_ = std::move(log_operator_history); } + void SetValidGoogleLogForTesting(const std::string& google_log) { + valid_google_log_for_testing_ = google_log; + } + + void SetDisqualifiedLogForTesting( + const std::pair<std::string, base::Time>& disqualified_log) { + disqualified_log_for_testing_ = disqualified_log; + } + private: FRIEND_TEST_ALL_PREFIXES(ChromeCTPolicyEnforcerTestBothPolicies, IsLogDisqualifiedTimestamp); @@ -134,6 +144,16 @@ // The time at which |disqualified_logs_| and |operated_by_google_logs_| were // generated. base::Time log_list_date_; + + // If set, this log ID will be considered a valid, Google operated log. + // Calling UpdateCTLogList clears this value if set. + absl::optional<std::string> valid_google_log_for_testing_; + + // If set, this log ID will be considered a disqualified log, effective at the + // specified time. + // Calling UpdateCTLogList clears this value if set. + absl::optional<std::pair<std::string, base::Time>> + disqualified_log_for_testing_; }; } // namespace certificate_transparency
diff --git a/components/certificate_transparency/chrome_ct_policy_enforcer_unittest.cc b/components/certificate_transparency/chrome_ct_policy_enforcer_unittest.cc index c2837c76..eded3675 100644 --- a/components/certificate_transparency/chrome_ct_policy_enforcer_unittest.cc +++ b/components/certificate_transparency/chrome_ct_policy_enforcer_unittest.cc
@@ -38,10 +38,11 @@ namespace { -const char kGoogleAviatorLogID[] = +// A log ID that for test purposes counts as a valid Google operated log. +const char kTestGoogleLogID[] = "\x68\xf6\x98\xf8\x1f\x64\x82\xbe\x3a\x8c\xee\xb9\x28\x1d\x4c\xfc\x71\x51" "\x5d\x67\x93\xd4\x44\xd1\x0a\x67\xac\xbb\x4f\x4f\xfb\xc4"; -static_assert(std::size(kGoogleAviatorLogID) - 1 == crypto::kSHA256Length, +static_assert(std::size(kTestGoogleLogID) - 1 == crypto::kSHA256Length, "Incorrect log ID length."); } // namespace @@ -59,7 +60,8 @@ chain_ = X509Certificate::CreateFromBytes( base::as_bytes(base::make_span(der_test_cert))); ASSERT_TRUE(chain_.get()); - google_log_id_ = std::string(kGoogleAviatorLogID, crypto::kSHA256Length); + google_log_id_ = std::string(kTestGoogleLogID, crypto::kSHA256Length); + policy_enforcer_->SetValidGoogleLogForTesting(google_log_id_); non_google_log_id_.assign(crypto::kSHA256Length, 1); clock_.SetNow(base::Time::Now()); } @@ -94,16 +96,21 @@ void AddDisqualifiedLogSCT(SignedCertificateTimestamp::Origin desired_origin, bool timestamp_after_disqualification_date, SCTList* verified_scts) { - static const char kCertlyLogID[] = + static const char kTestRetiredLogID[] = "\xcd\xb5\x17\x9b\x7f\xc1\xc0\x46\xfe\xea\x31\x13\x6a\x3f\x8f\x00\x2e" "\x61\x82\xfa\xf8\x89\x6f\xec\xc8\xb2\xf5\xb5\xab\x60\x49\x00"; - static_assert(std::size(kCertlyLogID) - 1 == crypto::kSHA256Length, + static_assert(std::size(kTestRetiredLogID) - 1 == crypto::kSHA256Length, "Incorrect log ID length."); + base::Time retirement_time; + ASSERT_TRUE(base::Time::FromUTCExploded({2016, 4, 0, 15, 0, 0, 0, 0}, + &retirement_time)); + policy_enforcer_->SetDisqualifiedLogForTesting( + std::make_pair(std::string(kTestRetiredLogID, 32), retirement_time)); scoped_refptr<SignedCertificateTimestamp> sct( new SignedCertificateTimestamp()); sct->origin = desired_origin; - sct->log_id = std::string(kCertlyLogID, crypto::kSHA256Length); + sct->log_id = std::string(kTestRetiredLogID, crypto::kSHA256Length); if (timestamp_after_disqualification_date) { EXPECT_TRUE(base::Time::FromUTCExploded({2016, 4, 0, 16, 0, 0, 0, 0}, &sct->timestamp)); @@ -608,6 +615,9 @@ // Update the list again, this time including all the known operated by Google // logs, and setting operators to different values. operated_by_google_logs = certificate_transparency::GetLogsOperatedByGoogle(); + operated_by_google_logs.emplace_back(kTestGoogleLogID); + std::sort(std::begin(operated_by_google_logs), + std::end(operated_by_google_logs)); FillOperatorHistoryWithDiverseOperators(scts, &operator_history); policy_enforcer_->UpdateCTLogList(base::Time::Now(), disqualified_logs, operated_by_google_logs, operator_history); @@ -666,13 +676,13 @@ base::Time future_disqualification = base::Time::Now() + base::Hours(1); disqualified_logs.emplace_back(kModifiedGoogleAviatorLogID, future_disqualification); - disqualified_logs.emplace_back(kGoogleAviatorLogID, past_disqualification); + disqualified_logs.emplace_back(kTestGoogleLogID, past_disqualification); policy_enforcer_->UpdateCTLogList(base::Time::Now(), disqualified_logs, operated_by_google_logs, log_operator_history); base::Time disqualification_time; - EXPECT_TRUE(policy_enforcer_->IsLogDisqualified(kGoogleAviatorLogID, + EXPECT_TRUE(policy_enforcer_->IsLogDisqualified(kTestGoogleLogID, &disqualification_time)); EXPECT_EQ(disqualification_time, past_disqualification); EXPECT_FALSE(policy_enforcer_->IsLogDisqualified(kModifiedGoogleAviatorLogID, @@ -699,8 +709,7 @@ base::Time unused; // IsLogDisqualified should return false for a log that is not in the // disqualified list. - EXPECT_FALSE( - policy_enforcer_->IsLogDisqualified(kGoogleAviatorLogID, &unused)); + EXPECT_FALSE(policy_enforcer_->IsLogDisqualified(kTestGoogleLogID, &unused)); } TEST_P(ChromeCTPolicyEnforcerTestBothPolicies,
diff --git a/components/client_hints/OWNERS b/components/client_hints/OWNERS index 789eadcc..1268c37 100644 --- a/components/client_hints/OWNERS +++ b/components/client_hints/OWNERS
@@ -1,4 +1,3 @@ -abeyad@chromium.org arichiv@chromium.org ryansturm@chromium.org victortan@chromium.org
diff --git a/components/crash/core/app/crashpad_linux.cc b/components/crash/core/app/crashpad_linux.cc index 32e2038..39fb479e 100644 --- a/components/crash/core/app/crashpad_linux.cc +++ b/components/crash/core/app/crashpad_linux.cc
@@ -117,7 +117,7 @@ // to ChromeOS's /sbin/crash_reporter which in turn passes the dump to // crash_sender which handles the upload. std::string url; -#if !(BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)) +#if !BUILDFLAG(IS_CHROMEOS) url = crash_reporter_client->GetUploadUrl(); #else url = std::string(); @@ -156,7 +156,7 @@ annotations["build_time_millis"] = base::NumberToString(build_time); #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) // Chromium OS: save board and builder path for 'tast symbolize'. annotations["chromeos-board"] = base::SysInfo::GetLsbReleaseBoard(); std::string builder_path; @@ -181,7 +181,7 @@ // contain these annotations. arguments.push_back("--monitor-self-annotation=ptype=crashpad-handler"); -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) arguments.push_back("--use-cros-crash-reporter"); if (crash_reporter_client->IsRunningUnattended()) {
diff --git a/components/desks_storage/core/desk_model.cc b/components/desks_storage/core/desk_model.cc index 3855c99..fdedbf0 100644 --- a/components/desks_storage/core/desk_model.cc +++ b/components/desks_storage/core/desk_model.cc
@@ -73,7 +73,8 @@ for (auto& desk_template : parsed_list.value->GetListDeprecated()) { std::unique_ptr<ash::DeskTemplate> dt = - desk_template_conversion::ParseDeskTemplateFromPolicy(desk_template); + desk_template_conversion::ParseDeskTemplateFromSource( + desk_template, ash::DeskTemplateSource::kPolicy); if (dt) { policy_entries_.push_back(std::move(dt)); } else {
diff --git a/components/desks_storage/core/desk_model.h b/components/desks_storage/core/desk_model.h index 29ce7f6..146cc1c6 100644 --- a/components/desks_storage/core/desk_model.h +++ b/components/desks_storage/core/desk_model.h
@@ -79,6 +79,8 @@ DeskModel& operator=(const DeskModel&) = delete; virtual ~DeskModel(); + // TODO(crbug.com/1320805): Once DeskSyncBridge is set to support saved desk, + // add methods to support operations on both types of templates. using GetAllEntriesCallback = base::OnceCallback<void( GetAllEntriesStatus status, const std::vector<const ash::DeskTemplate*>& entries)>;
diff --git a/components/desks_storage/core/desk_sync_bridge.cc b/components/desks_storage/core/desk_sync_bridge.cc index 68fdc9f..cbef223 100644 --- a/components/desks_storage/core/desk_sync_bridge.cc +++ b/components/desks_storage/core/desk_sync_bridge.cc
@@ -17,6 +17,7 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" +#include "build/chromeos_buildflags.h" #include "chromeos/ui/base/window_state_type.h" #include "components/account_id/account_id.h" #include "components/app_constants/constants.h" @@ -79,9 +80,7 @@ // chrome.storage.sync.QUOTA_BYTES_PER_ITEM. constexpr std::size_t kMaxTemplateSize = 8192u; -// Allocate a EntityData and copies |specifics| into it. -// -// TODO(crbug/1304465): Switch symbol identifiers to new standard. +// Allocate a EntityData and copies `specifics` into it. std::unique_ptr<syncer::EntityData> CopyToEntityData( const sync_pb::WorkspaceDeskSpecifics& specifics) { auto entity_data = std::make_unique<syncer::EntityData>(); @@ -92,7 +91,7 @@ return entity_data; } -// Parses the content of |record_list| into |*desk_templates|. +// Parses the content of `record_list` into `*desk_templates`. absl::optional<syncer::ModelError> ParseDeskTemplatesOnBackendSequence( std::map<base::GUID, std::unique_ptr<DeskTemplate>>* desk_templates, std::unique_ptr<ModelTypeStore::RecordList> record_list) { @@ -167,7 +166,7 @@ } } -// Convert App proto to |app_restore::AppLaunchInfo|. +// Convert App proto to `app_restore::AppLaunchInfo`. std::unique_ptr<app_restore::AppLaunchInfo> ConvertToAppLaunchInfo( const sync_pb::WorkspaceDeskSpecifics_App& app) { const int32_t window_id = app.window_id(); @@ -196,7 +195,7 @@ if (app.has_app_name()) app_launch_info->app_name = app.app_name(); - // This is a short-term fix as |event_flag| is required to launch ArcApp. + // This is a short-term fix as `event_flag` is required to launch ArcApp. // Currently we don't support persisting user action in template // so always default to 0 which is no action. // https://source.chromium.org/chromium/chromium/src/ @@ -207,8 +206,8 @@ switch (app.app().app_case()) { case sync_pb::WorkspaceDeskSpecifics_AppOneOf::AppCase::APP_NOT_SET: - // This should never happen. |APP_NOT_SET| corresponds to empty |app_id|. - // This method will early return when |app_id| is empty. + // This should never happen. `APP_NOT_SET` corresponds to empty `app_id`. + // This method will early return when `app_id` is empty. NOTREACHED(); break; case sync_pb::WorkspaceDeskSpecifics_AppOneOf::AppCase::kBrowserAppWindow: @@ -227,20 +226,20 @@ break; case sync_pb::WorkspaceDeskSpecifics_AppOneOf::AppCase::kChromeApp: - // |app_id| is enough to identify a Chrome app. + // `app_id` is enough to identify a Chrome app. break; case sync_pb::WorkspaceDeskSpecifics_AppOneOf::AppCase::kProgressWebApp: - // |app_id| is enough to identify a Progressive Web app. + // `app_id` is enough to identify a Progressive Web app. break; case sync_pb::WorkspaceDeskSpecifics_AppOneOf::AppCase::kArcApp: - // |app_id| is enough to identify an Arc app. + // `app_id` is enough to identify an Arc app. break; } return app_launch_info; } -// Convert Sync proto WindowState |state| to ui::WindowShowState used by +// Convert Sync proto WindowState `state` to ui::WindowShowState used by // the app_restore::WindowInfo struct. ui::WindowShowState ToUiWindowState(WindowState state) { switch (state) { @@ -261,7 +260,7 @@ } } -// Convert Sync proto WindowState |state| to chromeos::WindowStateType used by +// Convert Sync proto WindowState `state` to chromeos::WindowStateType used by // the app_restore::WindowInfo struct. chromeos::WindowStateType ToChromeOsWindowState(WindowState state) { switch (state) { @@ -390,8 +389,8 @@ if (window_info->app_title.has_value()) out_app->set_title(base::UTF16ToUTF8(window_info->app_title.value())); - // AppRestoreData.GetWindowInfo does not include |display_id| in the returned - // WindowInfo. Therefore, we are not filling |display_id| here. + // AppRestoreData.GetWindowInfo does not include `display_id` in the returned + // WindowInfo. Therefore, we are not filling `display_id` here. } // Fill `out_app` with the `display_id` from `app_restore_data`. @@ -603,7 +602,7 @@ } } -// Convert a desk template to |app_restore::RestoreData|. +// Convert a desk template to `app_restore::RestoreData`. std::unique_ptr<app_restore::RestoreData> ConvertToRestoreData( const sync_pb::WorkspaceDeskSpecifics& entry_proto) { auto restore_data = std::make_unique<app_restore::RestoreData>(); @@ -774,8 +773,8 @@ switch (change->type()) { case syncer::EntityChange::ACTION_DELETE: { - if (entries_.find(uuid) != entries_.end()) { - entries_.erase(uuid); + if (desk_template_entries_.find(uuid) != desk_template_entries_.end()) { + desk_template_entries_.erase(uuid); batch->DeleteData(uuid.AsLowercaseString()); removed.push_back(uuid.AsLowercaseString()); } @@ -797,7 +796,7 @@ std::string serialized_remote_entry = specifics.SerializeAsString(); // Add/update the remote_entry to the model. - entries_[uuid] = std::move(remote_entry); + desk_template_entries_[uuid] = std::move(remote_entry); added_or_updated.push_back(GetUserEntryByUUID(uuid)); // Write to the store. @@ -834,7 +833,7 @@ void DeskSyncBridge::GetAllDataForDebugging(DataCallback callback) { auto batch = std::make_unique<syncer::MutableDataBatch>(); - for (const auto& it : entries_) { + for (const auto& it : desk_template_entries_) { batch->Put(it.first.AsLowercaseString(), CopyToEntityData(ToSyncProto(it.second.get()))); } @@ -862,7 +861,7 @@ for (const auto& it : policy_entries_) entries.push_back(it.get()); - for (const auto& it : entries_) { + for (const auto& it : desk_template_entries_) { DCHECK_EQ(it.first, it.second->uuid()); entries.push_back(it.second.get()); } @@ -883,8 +882,8 @@ return; } - auto it = entries_.find(uuid); - if (it == entries_.end()) { + auto it = desk_template_entries_.find(uuid); + if (it == desk_template_entries_.end()) { std::unique_ptr<DeskTemplate> policy_entry = GetAdminDeskTemplateByUUID(uuid_str); @@ -915,7 +914,7 @@ return; } - // When a user creates a desk template locally, the desk template has |kUser| + // When a user creates a desk template locally, the desk template has `kUser` // as its source. Only user desk templates should be saved to Sync. DCHECK_EQ(DeskTemplateSource::kUser, new_entry->source()); @@ -948,7 +947,7 @@ batch->GetMetadataChangeList()); std::unique_ptr<DeskTemplate> persisted_entry = FromSyncProto(sync_proto); - entries_[uuid] = std::move(persisted_entry); + desk_template_entries_[uuid] = std::move(persisted_entry); const DeskTemplate* result = GetUserEntryByUUID(uuid); batch->WriteData(uuid.AsLowercaseString(), @@ -982,7 +981,7 @@ change_processor()->Delete(uuid.AsLowercaseString(), batch->GetMetadataChangeList()); - entries_.erase(uuid); + desk_template_entries_.erase(uuid); batch->DeleteData(uuid.AsLowercaseString()); @@ -1009,13 +1008,13 @@ batch->GetMetadataChangeList()); batch->DeleteData(uuid.AsLowercaseString()); } - entries_.clear(); + desk_template_entries_.clear(); std::move(callback).Run(DeleteEntryStatus::kOk); } std::size_t DeskSyncBridge::GetEntryCount() const { - return entries_.size() + policy_entries_.size(); + return desk_template_entries_.size() + policy_entries_.size(); } std::size_t DeskSyncBridge::GetMaxEntryCount() const { @@ -1028,7 +1027,7 @@ for (const auto& it : policy_entries_) keys.push_back(it.get()->uuid()); - for (const auto& it : entries_) { + for (const auto& it : desk_template_entries_) { DCHECK_EQ(it.first, it.second->uuid()); keys.emplace_back(it.first); } @@ -1074,8 +1073,8 @@ const DeskTemplate* DeskSyncBridge::GetUserEntryByUUID( const base::GUID& uuid) const { - auto it = entries_.find(uuid); - if (it == entries_.end()) + auto it = desk_template_entries_.find(uuid); + if (it == desk_template_entries_.end()) return nullptr; return it->second.get(); } @@ -1138,7 +1137,7 @@ return; } - entries_ = std::move(*stored_desk_templates); + desk_template_entries_ = std::move(*stored_desk_templates); store_->ReadAllMetadata(base::BindOnce(&DeskSyncBridge::OnReadAllMetadata, weak_ptr_factory_.GetWeakPtr())); @@ -1173,12 +1172,12 @@ syncer::MetadataChangeList* metadata_change_list, const syncer::EntityChangeList& entity_data) { std::set<base::GUID> local_keys_to_upload; - for (const auto& it : entries_) { + for (const auto& it : desk_template_entries_) { DCHECK_EQ(DeskTemplateSource::kUser, it.second->source()); local_keys_to_upload.insert(it.first); } - // Strip |local_keys_to_upload| of any key (UUID) that is already known to the + // Strip `local_keys_to_upload` of any key (UUID) that is already known to the // server. for (const std::unique_ptr<syncer::EntityChange>& change : entity_data) { local_keys_to_upload.erase( @@ -1187,19 +1186,20 @@ // Upload the local-only templates. for (const base::GUID& uuid : local_keys_to_upload) { - change_processor()->Put(uuid.AsLowercaseString(), - CopyToEntityData(ToSyncProto(entries_[uuid].get())), - metadata_change_list); + change_processor()->Put( + uuid.AsLowercaseString(), + CopyToEntityData(ToSyncProto(desk_template_entries_[uuid].get())), + metadata_change_list); } } bool DeskSyncBridge::HasUserTemplateWithName(const std::u16string& name) { return std::find_if( - entries_.begin(), entries_.end(), + desk_template_entries_.begin(), desk_template_entries_.end(), [&name](std::pair<const base::GUID, std::unique_ptr<ash::DeskTemplate>>& entry) { return entry.second->template_name() == name; - }) != entries_.end(); + }) != desk_template_entries_.end(); } } // namespace desks_storage
diff --git a/components/desks_storage/core/desk_sync_bridge.h b/components/desks_storage/core/desk_sync_bridge.h index 00ae0b39..0028ec8a 100644 --- a/components/desks_storage/core/desk_sync_bridge.h +++ b/components/desks_storage/core/desk_sync_bridge.h
@@ -94,12 +94,12 @@ // Notify all observers that the model is loaded; void NotifyDeskModelLoaded(); - // Notify all observers of any |new_entries| when they are added/updated via + // Notify all observers of any `new_entries` when they are added/updated via // sync. void NotifyRemoteDeskTemplateAddedOrUpdated( const std::vector<const ash::DeskTemplate*>& new_entries); - // Notify all observers when the entries with |uuids| have been removed via + // Notify all observers when the entries with `uuids` have been removed via // sync or disabling sync locally. void NotifyRemoteDeskTemplateDeleted(const std::vector<std::string>& uuids); @@ -122,8 +122,8 @@ // Returns true if `templates_` contains a desk template with `name`. bool HasUserTemplateWithName(const std::u16string& name); - // |entries_| is keyed by UUIDs. - DeskEntries entries_; + // `desk_template_entries_` is keyed by UUIDs. + DeskEntries desk_template_entries_; // Whether local data and metadata have finished loading and this sync bridge // is ready to be accessed. @@ -140,4 +140,4 @@ } // namespace desks_storage -#endif // COMPONENTS_DESKS_STORAGE_CORE_DESK_SYNC_BRIDGE_H_ \ No newline at end of file +#endif // COMPONENTS_DESKS_STORAGE_CORE_DESK_SYNC_BRIDGE_H_
diff --git a/components/desks_storage/core/desk_sync_bridge_unittest.cc b/components/desks_storage/core/desk_sync_bridge_unittest.cc index 1efdca6e..a59629d 100644 --- a/components/desks_storage/core/desk_sync_bridge_unittest.cc +++ b/components/desks_storage/core/desk_sync_bridge_unittest.cc
@@ -595,7 +595,8 @@ desk_template.get(), app_cache()); std::unique_ptr<ash::DeskTemplate> converted_desk_template = - desk_template_conversion::ParseDeskTemplateFromPolicy(template_value); + desk_template_conversion::ParseDeskTemplateFromSource( + template_value, ash::DeskTemplateSource::kPolicy); EXPECT_EQ(desk_template->desk_restore_data()->ConvertToValue(), converted_desk_template->desk_restore_data()->ConvertToValue());
diff --git a/components/desks_storage/core/desk_template_conversion.cc b/components/desks_storage/core/desk_template_conversion.cc index d4bb0ca..a76eb58 100644 --- a/components/desks_storage/core/desk_template_conversion.cc +++ b/components/desks_storage/core/desk_template_conversion.cc
@@ -4,7 +4,6 @@ #include "components/desks_storage/core/desk_template_conversion.h" -#include "ash/public/cpp/desk_template.h" #include "base/guid.h" #include "base/json/json_reader.h" #include "base/json/values_util.h" @@ -45,6 +44,7 @@ constexpr char kDeskTypeSaveAndRecall[] = "SAVE_AND_RECALL"; constexpr char kDisplayId[] = "display_id"; constexpr char kEventFlag[] = "event_flag"; +constexpr char kIsAppTypeBrowser[] = "is_app"; constexpr char kLaunchContainer[] = "launch_container"; constexpr char kLaunchContainerWindow[] = "LAUNCH_CONTAINER_WINDOW"; constexpr char kLaunchContainerUnspecified[] = "LAUNCH_CONTAINER_UNSPECIFIED"; @@ -153,6 +153,20 @@ return GetInt(&dict, key, out); } +bool GetBool(const base::Value* dict, const char* key, bool* out) { + const base::Value* value = + dict->FindKeyOfType(key, base::Value::Type::BOOLEAN); + if (!value) + return false; + + *out = value->GetBool(); + return true; +} + +bool GetBool(const base::Value& dict, const char* key, bool* out) { + return GetBool(&dict, key, out); +} + // Get App ID from App proto. std::string GetJsonAppId(const base::Value& app) { std::string app_type; @@ -293,6 +307,10 @@ // TODO(crbug.com/1311801): Add support for actual event_flag values. app_launch_info->event_flag = 0; + bool app_type_browser; + if (GetBool(app, kIsAppTypeBrowser, &app_type_browser)) + app_launch_info->app_type_browser = app_type_browser; + if (app_type == kAppTypeBrowser) { int active_tab_index; if (GetInt(app, kActiveTabIndex, &active_tab_index)) @@ -679,6 +697,11 @@ base::Value(app->active_tab_index.value())); } + if (app->app_type_browser.has_value()) { + app_data.SetKey(kIsAppTypeBrowser, + base::Value(app->app_type_browser.value())); + } + if (app_type != kAppTypeBrowser) app_data.SetKey(kAppId, base::Value(app_id)); @@ -774,8 +797,9 @@ return t.ToDeltaSinceWindowsEpoch().InMicroseconds(); } -std::unique_ptr<ash::DeskTemplate> ParseDeskTemplateFromPolicy( - const base::Value& policy_json) { +std::unique_ptr<ash::DeskTemplate> ParseDeskTemplateFromSource( + const base::Value& policy_json, + ash::DeskTemplateSource source) { if (!policy_json.is_dict()) return nullptr; @@ -812,7 +836,7 @@ std::unique_ptr<ash::DeskTemplate> desk_template = std::make_unique<ash::DeskTemplate>( - uuid, ash::DeskTemplateSource::kPolicy, name, created_time, + uuid, source, name, created_time, GetDeskTypeFromString(desk_type_string)); desk_template->set_updated_time(updated_time);
diff --git a/components/desks_storage/core/desk_template_conversion.h b/components/desks_storage/core/desk_template_conversion.h index 57d9676..741b493 100644 --- a/components/desks_storage/core/desk_template_conversion.h +++ b/components/desks_storage/core/desk_template_conversion.h
@@ -5,6 +5,7 @@ #ifndef COMPONENTS_DESKS_STORAGE_CORE_DESK_TEMPLATE_CONVERSION_H_ #define COMPONENTS_DESKS_STORAGE_CORE_DESK_TEMPLATE_CONVERSION_H_ +#include "ash/public/cpp/desk_template.h" #include "base/time/time.h" #include "base/values.h" #include "components/services/app_service/public/cpp/app_types.h" @@ -38,11 +39,11 @@ // (Microseconds since the Windows epoch). int64_t TimeToProtoTime(const base::Time& t); -// Converts a JSON desk template to an ash desk template. -// The returned desk template will have source set to -// |ash::DeskTemplateSource::kPolicy|. -std::unique_ptr<ash::DeskTemplate> ParseDeskTemplateFromPolicy( - const base::Value& policy_json); +// Converts a JSON desk template to an ash desk template. The returned desk +// template will have source set to `source`. +std::unique_ptr<ash::DeskTemplate> ParseDeskTemplateFromSource( + const base::Value& policy_json, + ash::DeskTemplateSource source); base::Value SerializeDeskTemplateAsPolicy( const ash::DeskTemplate* desk_template, @@ -76,4 +77,4 @@ } // namespace desks_storage -#endif // COMPONENTS_DESKS_STORAGE_CORE_DESK_TEMPLATE_CONVERSION_H_ \ No newline at end of file +#endif // COMPONENTS_DESKS_STORAGE_CORE_DESK_TEMPLATE_CONVERSION_H_
diff --git a/components/desks_storage/core/desk_template_conversion_unittests.cc b/components/desks_storage/core/desk_template_conversion_unittests.cc index 9e51969a..4a085f0 100644 --- a/components/desks_storage/core/desk_template_conversion_unittests.cc +++ b/components/desks_storage/core/desk_template_conversion_unittests.cc
@@ -112,8 +112,8 @@ EXPECT_TRUE(parsed_json.value->is_dict()); std::unique_ptr<ash::DeskTemplate> dt = - desk_template_conversion::ParseDeskTemplateFromPolicy( - parsed_json.value.value()); + desk_template_conversion::ParseDeskTemplateFromSource( + parsed_json.value.value(), ash::DeskTemplateSource::kPolicy); EXPECT_TRUE(dt != nullptr); EXPECT_EQ(dt->uuid(), base::GUID::ParseCaseInsensitive(kTestUuidBrowser)); @@ -170,8 +170,8 @@ EXPECT_TRUE(parsed_json.value->is_dict()); std::unique_ptr<ash::DeskTemplate> dt = - desk_template_conversion::ParseDeskTemplateFromPolicy( - parsed_json.value.value()); + desk_template_conversion::ParseDeskTemplateFromSource( + parsed_json.value.value(), ash::DeskTemplateSource::kPolicy); EXPECT_TRUE(dt != nullptr); EXPECT_EQ(dt->uuid(), @@ -257,8 +257,8 @@ EXPECT_TRUE(parsed_json.value->is_dict()); std::unique_ptr<ash::DeskTemplate> dt = - desk_template_conversion::ParseDeskTemplateFromPolicy( - parsed_json.value.value()); + desk_template_conversion::ParseDeskTemplateFromSource( + parsed_json.value.value(), ash::DeskTemplateSource::kPolicy); EXPECT_TRUE(dt == nullptr); } @@ -271,8 +271,8 @@ EXPECT_TRUE(parsed_json.value->is_dict()); std::unique_ptr<ash::DeskTemplate> dt = - desk_template_conversion::ParseDeskTemplateFromPolicy( - parsed_json.value.value()); + desk_template_conversion::ParseDeskTemplateFromSource( + parsed_json.value.value(), ash::DeskTemplateSource::kPolicy); EXPECT_TRUE(dt); EXPECT_EQ(ash::DeskTemplateType::kTemplate, dt->type()); } @@ -286,8 +286,8 @@ EXPECT_TRUE(parsed_json.value->is_dict()); std::unique_ptr<ash::DeskTemplate> desk_template = - desk_template_conversion::ParseDeskTemplateFromPolicy( - parsed_json.value.value()); + desk_template_conversion::ParseDeskTemplateFromSource( + parsed_json.value.value(), ash::DeskTemplateSource::kPolicy); apps::AppRegistryCache* app_cache = apps::AppRegistryCacheWrapper::Get().GetAppRegistryCache(account_id_); @@ -309,8 +309,8 @@ EXPECT_TRUE(parsed_json.value->is_dict()); std::unique_ptr<ash::DeskTemplate> desk_template = - desk_template_conversion::ParseDeskTemplateFromPolicy( - parsed_json.value.value()); + desk_template_conversion::ParseDeskTemplateFromSource( + parsed_json.value.value(), ash::DeskTemplateSource::kPolicy); apps::AppRegistryCache* app_cache = apps::AppRegistryCacheWrapper::Get().GetAppRegistryCache(account_id_);
diff --git a/components/desks_storage/core/desk_template_util.cc b/components/desks_storage/core/desk_template_util.cc index 14e9123..c486588 100644 --- a/components/desks_storage/core/desk_template_util.cc +++ b/components/desks_storage/core/desk_template_util.cc
@@ -90,6 +90,33 @@ apps::AppRegistryCacheWrapper::Get().AddAppRegistryCache(account_id, cache); } +void AddAppIdToAppRegistryCache(AccountId account_id, + apps::AppRegistryCache* cache, + const char* app_id) { + std::vector<apps::AppPtr> deltas; + + // We need to add the app as any type that's not a `apps::AppType::kChromeApp` + // since there's a default hard coded string for that type, which will merge + // all app_id to it. + deltas.push_back(MakeApp(app_id, "Arc app", apps::AppType::kArc)); + + if (base::FeatureList::IsEnabled(apps::kAppServiceOnAppUpdateWithoutMojom)) { + cache->OnApps(std::move(deltas), apps::AppType::kUnknown, + /*should_notify_initialized=*/false); + } else { + std::vector<apps::mojom::AppPtr> mojom_deltas; + for (const auto& delta : deltas) { + mojom_deltas.push_back(apps::ConvertAppToMojomApp(delta)); + } + cache->OnApps(std::move(mojom_deltas), apps::mojom::AppType::kUnknown, + /*should_notify_initialized=*/false); + } + + cache->SetAccountId(account_id); + + apps::AppRegistryCacheWrapper::Get().AddAppRegistryCache(account_id, cache); +} + } // namespace desk_template_util } // namespace desks_storage
diff --git a/components/desks_storage/core/desk_template_util.h b/components/desks_storage/core/desk_template_util.h index 48fae9a3..05e3d21f 100644 --- a/components/desks_storage/core/desk_template_util.h +++ b/components/desks_storage/core/desk_template_util.h
@@ -25,6 +25,10 @@ void PopulateAppRegistryCache(AccountId account_id, apps::AppRegistryCache* cache); +void AddAppIdToAppRegistryCache(AccountId account_id, + apps::AppRegistryCache* cache, + const char* app_id); + } // namespace desk_template_util } // namespace desks_storage
diff --git a/components/desks_storage/core/desk_template_util_unittests.cc b/components/desks_storage/core/desk_template_util_unittests.cc index 97f4044f5..3f18f29 100644 --- a/components/desks_storage/core/desk_template_util_unittests.cc +++ b/components/desks_storage/core/desk_template_util_unittests.cc
@@ -48,4 +48,13 @@ EXPECT_EQ(6ul, cache->GetAllApps().size()); } +TEST_F(DeskTemplateUtilTest, AddOneAppIdToRegistryCacheHasAppInfo) { + AccountId account_id = AccountId::FromUserEmail("test@gmail.com"); + auto cache = std::make_unique<apps::AppRegistryCache>(); + desk_template_util::PopulateAppRegistryCache(account_id, cache.get()); + desk_template_util::AddAppIdToAppRegistryCache(account_id, cache.get(), + "test"); + EXPECT_EQ(7ul, cache->GetAllApps().size()); +} + } // namespace desks_storage
diff --git a/components/desks_storage/core/local_desk_data_manager.cc b/components/desks_storage/core/local_desk_data_manager.cc index 11e84551..7db7914 100644 --- a/components/desks_storage/core/local_desk_data_manager.cc +++ b/components/desks_storage/core/local_desk_data_manager.cc
@@ -15,10 +15,13 @@ #include "base/task/thread_pool.h" #include "base/threading/scoped_blocking_call.h" #include "base/values.h" +#include "components/account_id/account_id.h" #include "components/app_restore/restore_data.h" #include "components/desks_storage/core/desk_model.h" #include "components/desks_storage/core/desk_template_conversion.h" #include "components/desks_storage/core/desk_template_util.h" +#include "components/services/app_service/public/cpp/app_registry_cache.h" +#include "components/services/app_service/public/cpp/app_registry_cache_wrapper.h" #include "components/sync/protocol/workspace_desk_specifics.pb.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/re2/src/re2/stringpiece.h" @@ -29,75 +32,31 @@ namespace { // Setting this to true allows us to add more than the maximum number of -// templates. Used only for testing. +// desk templates. Used only for testing. bool g_disable_max_template_limit = false; -// File extension for templates. -constexpr char kFileExtension[] = ".template"; -// Key used in base::Value generation for the template name field. -constexpr char kDeskTemplateNameKey[] = "template_name"; -// Key used in base::Value generation for the uuid field. -constexpr char kDeskTemplateUuidKey[] = "uuid"; -// Key used in base::Value generation for the time created field. -constexpr char kDeskTemplateTimeCreatedKey[] = "time_created"; -// Key used in base::Value generation for the restore data field. -constexpr char kDeskTemplateRestoreDataKey[] = "restore_data"; -constexpr std::size_t kMaxTemplateCount = 6u; +// Setting this to true allows us to exclude the max count of save and recall +// desk entries as part of `GetMaxEntryCount` since there are some tests +// treating save and recall desks behavior as regular desk templates (such as +// button enablement). Also, since save and recall desks and desk templates are +// currently being treated as desk templates, exclude save and recall desks +// limit until save and recall desks are enabled. +bool g_exclude_save_and_recall_desk_in_max_entry_count = true; -// Converts ash::DeskTemplates to base::Value for serialization. -base::Value ConvertDeskTemplateToValue(ash::DeskTemplate* desk_template) { - base::Value dict(base::Value::Type::DICTIONARY); - dict.SetKey(kDeskTemplateUuidKey, - base::Value(desk_template->uuid().AsLowercaseString())); - dict.SetKey(kDeskTemplateNameKey, - base::Value(desk_template->template_name())); - dict.SetKey(kDeskTemplateTimeCreatedKey, - base::TimeToValue(desk_template->created_time())); - DCHECK(desk_template->desk_restore_data() != nullptr); - dict.SetKey(kDeskTemplateRestoreDataKey, - desk_template->desk_restore_data()->ConvertToValue()); - return dict; -} +// File extension for saving template entries. +constexpr char kFileExtension[] = ".saveddesk"; +constexpr char kSavedDeskDirectoryName[] = "saveddesk"; +constexpr size_t kMaxDeskTemplateCount = 6u; +// Currently, the save for later button is dependent on the the max number of +// entries total. +constexpr size_t kMaxSaveAndRecallDeskCount = 6u; -// Converts base::Values deserialized from template files to -// |ash::DeskTemplate|. -std::unique_ptr<ash::DeskTemplate> ConvertValueToDeskTemplate( - base::Value& desk_template_value) { - absl::optional<base::Time> created_time(base::ValueToTime( - desk_template_value.FindKey(kDeskTemplateTimeCreatedKey))); - if (!created_time) - return nullptr; +// Set of valid desk types. +const std::set<ash::DeskTemplateType> kDeskTypes = { + ash::DeskTemplateType::kTemplate, ash::DeskTemplateType::kSaveAndRecall}; - std::string* uuid = desk_template_value.FindStringKey(kDeskTemplateUuidKey); - if (!uuid) - return nullptr; - - std::string* name = desk_template_value.FindStringKey(kDeskTemplateNameKey); - if (!name) - return nullptr; - - std::unique_ptr<ash::DeskTemplate> desk_template = - std::make_unique<ash::DeskTemplate>(*uuid, ash::DeskTemplateSource::kUser, - *name, created_time.value(), - ash::DeskTemplateType::kTemplate); - - // Full Restore will only take in std::unique_ptr as it's constructor - // parameter from base::Value. We're not allowed to use the explicit - // std::unique_ptr constructor so this is how we wrap the base::Value in a - // std::unique_ptr - std::unique_ptr<base::Value> restore_data_value_ptr = - base::Value::ToUniquePtrValue( - std::move(*desk_template_value.FindKey(kDeskTemplateRestoreDataKey))); - DCHECK(restore_data_value_ptr); - - desk_template->set_desk_restore_data( - std::make_unique<app_restore::RestoreData>( - std::move(restore_data_value_ptr))); - return desk_template; -} - -// Reads a template file at fully_qualified_path| into a -// std::unique_ptr<ash::DeskTemplate> This function returns a |nullptr| if the +// Reads a file at `fully_qualified_path` into a +// std::unique_ptr<ash::DeskTemplate> This function returns a `nullptr` if the // file does not exist or deserialization fails. std::unique_ptr<ash::DeskTemplate> ReadFileToTemplate( const base::FilePath& fully_qualified_path) { @@ -122,7 +81,8 @@ return nullptr; } - return ConvertValueToDeskTemplate(*desk_template_value); + return desk_template_conversion::ParseDeskTemplateFromSource( + *desk_template_value, ash::DeskTemplateSource::kUser); } bool EndsWith(const char* input, const char* suffix) { @@ -133,22 +93,24 @@ } return false; } - +// TODO(crbug.com/1320836): Make template creation for +// local_desk_data_manager_unittests cleaner. bool IsValidTemplateFileName(const char* name) { if (name == nullptr) return false; return EndsWith(name, kFileExtension); } -// Writes a DeskTemplate |entry| to a file at |path_to_template|. -// This function utilizes blocking calls and assumes that it is being called -// from a thread which can accept such calls, please don't call this function -// from the UI thread. +// Writes a DeskTemplate or SaveAndRecallDesk base::Value `json_value` to a file +// at `path_to_template`. This function utilizes blocking calls and assumes that +// it is being called from a thread which can accept such calls, please don't +// call this function from the UI thread. bool WriteTemplateFile(const base::FilePath& path_to_template, - ash::DeskTemplate* entry) { + base::Value json_value) { std::string json_string; JSONStringValueSerializer serializer(&json_string); - serializer.Serialize(ConvertDeskTemplateToValue(entry)); + + serializer.Serialize(json_value); base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); @@ -156,23 +118,39 @@ return base::WriteFile(path_to_template, json_string); } -// Generates the fully qualified path to a template file given the |file_path| -// to the desk template directory and the template's |uuid|. +// Generates the fully qualified path to a desk template or save and recall desk +// file given the `file_path` to the desk template or save and recall desk +// directory and the entry's `uuid`. base::FilePath GetFullyQualifiedPath(base::FilePath file_path, const std::string& uuid) { std::string filename(uuid); filename.append(kFileExtension); + return base::FilePath(file_path.Append(base::FilePath(filename))); } } // namespace -LocalDeskDataManager::LocalDeskDataManager(const base::FilePath& path) +LocalDeskDataManager::LocalDeskDataManager( + const base::FilePath& user_data_dir_path, + const AccountId& account_id) : task_runner_(base::ThreadPool::CreateSequencedTaskRunner( {base::MayBlock(), base::TaskPriority::BEST_EFFORT, base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})), - local_path_(path), - cache_status_(CacheStatus::kNotInitialized) {} + user_data_dir_path_(user_data_dir_path), + local_saved_desk_path_( + user_data_dir_path.AppendASCII(kSavedDeskDirectoryName)), + account_id_(account_id), + cache_status_(CacheStatus::kNotInitialized) { + // Load the cache. + task_runner_->PostTask( + FROM_HERE, base::BindOnce(&LocalDeskDataManager::EnsureCacheIsLoaded, + base::Unretained(this))); + // Populate `saved_desks_list_` with all the desk types. + for (const auto& desk_type : kDeskTypes) { + saved_desks_list_[desk_type]; + } +} LocalDeskDataManager::~LocalDeskDataManager() = default; @@ -197,7 +175,6 @@ DeskModel::GetEntryByUuidCallback callback) { auto status = std::make_unique<DeskModel::GetEntryByUuidStatus>(); auto entry_ptr = std::make_unique<ash::DeskTemplate*>(); - task_runner_->PostTaskAndReply( FROM_HERE, base::BindOnce(&LocalDeskDataManager::GetEntryByUuidTask, @@ -212,12 +189,59 @@ std::unique_ptr<ash::DeskTemplate> new_entry, DeskModel::AddOrUpdateEntryCallback callback) { auto status = std::make_unique<DeskModel::AddOrUpdateEntryStatus>(); + if (cache_status_ != CacheStatus::kOk) { + *status = DeskModel::AddOrUpdateEntryStatus::kFailure; + std::move(callback).Run(*status); + return; + } + + const ash::DeskTemplateType desk_type = new_entry->type(); + size_t template_type_max_size = desk_type == ash::DeskTemplateType::kTemplate + ? kMaxDeskTemplateCount + : kMaxSaveAndRecallDeskCount; + if (!g_disable_max_template_limit && + saved_desks_list_[desk_type].size() >= template_type_max_size) { + *status = DeskModel::AddOrUpdateEntryStatus::kHitMaximumLimit; + std::move(callback).Run(*status); + return; + } + + base::GUID uuid = new_entry->uuid(); + if (!uuid.is_valid()) { + *status = DeskModel::AddOrUpdateEntryStatus::kInvalidArgument; + std::move(callback).Run(*status); + return; + } + + // While we still find duplicate names iterate the duplicate number. i.e. + // if there are 4 duplicates of some template name then this iterates + // until the current template will be named 5. Perform the conversion to + // base::Value here so that AppRegistryCache doesn't run on the IO thread. + while (HasEntryWithName(new_entry->template_name(), new_entry->type())) { + new_entry->set_template_name( + desk_template_util::AppendDuplicateNumberToDuplicateName( + new_entry->template_name())); + } + + apps::AppRegistryCache* cache = + apps::AppRegistryCacheWrapper::Get().GetAppRegistryCache(account_id_); + DCHECK(cache); + base::Value template_base_value = + desk_template_conversion::SerializeDeskTemplateAsPolicy(new_entry.get(), + cache); + // Deserialize the `template_base_value` to a desk template to make sure that + // we can properly get the correct information now instead of during a future + // user operation. + std::unique_ptr<ash::DeskTemplate> deserialize_entry = + desk_template_conversion::ParseDeskTemplateFromSource( + template_base_value, new_entry->source()); + saved_desks_list_[desk_type][uuid] = std::move(deserialize_entry); task_runner_->PostTaskAndReply( FROM_HERE, base::BindOnce(&LocalDeskDataManager::AddOrUpdateEntryTask, - base::Unretained(this), std::move(new_entry), - status.get()), + base::Unretained(this), uuid, status.get(), + std::move(template_base_value)), base::BindOnce(&LocalDeskDataManager::OnAddOrUpdateEntry, weak_ptr_factory_.GetWeakPtr(), std::move(status), std::move(callback))); @@ -250,19 +274,44 @@ std::move(callback))); } -std::size_t LocalDeskDataManager::GetEntryCount() const { - return templates_.size() + policy_entries_.size(); +// TODO(crbug.com/1320805): Remove this function once both desk models support +// desk type counts. +size_t LocalDeskDataManager::GetEntryCount() const { + return GetSaveAndRecallDeskEntryCount() + GetDeskTemplateEntryCount(); } -std::size_t LocalDeskDataManager::GetMaxEntryCount() const { - return kMaxTemplateCount + policy_entries_.size(); +size_t LocalDeskDataManager::GetSaveAndRecallDeskEntryCount() const { + return saved_desks_list_.at(ash::DeskTemplateType::kSaveAndRecall).size(); +} + +size_t LocalDeskDataManager::GetDeskTemplateEntryCount() const { + return saved_desks_list_.at(ash::DeskTemplateType::kTemplate).size() + + policy_entries_.size(); +} + +size_t LocalDeskDataManager::GetMaxEntryCount() const { + return kMaxDeskTemplateCount + + (!g_exclude_save_and_recall_desk_in_max_entry_count + ? kMaxSaveAndRecallDeskCount + : 0u) + + policy_entries_.size(); +} + +size_t LocalDeskDataManager::GetMaxSaveAndRecallDeskEntryCount() const { + return kMaxSaveAndRecallDeskCount; +} + +size_t LocalDeskDataManager::GetMaxDeskTemplateEntryCount() const { + return kMaxDeskTemplateCount + policy_entries_.size(); } std::vector<base::GUID> LocalDeskDataManager::GetAllEntryUuids() const { std::vector<base::GUID> keys; - for (const auto& it : templates_) { - DCHECK_EQ(it.first, it.second->uuid()); - keys.emplace_back(it.first); + for (const auto& save_desks : saved_desks_list_) { + for (const auto& [uuid, template_entry] : save_desks.second) { + DCHECK_EQ(uuid, template_entry->uuid()); + keys.emplace_back(uuid); + } } return keys; } @@ -281,59 +330,51 @@ g_disable_max_template_limit = disabled; } -void LocalDeskDataManager::EnsureCacheIsLoaded() { - if (cache_status_ == CacheStatus::kOk) { - // Cache is already loaded. - return; - } +// static +void LocalDeskDataManager::SetExcludeSaveAndRecallDeskInMaxEntryCountForTesting( + bool exclude) { + g_exclude_save_and_recall_desk_in_max_entry_count = exclude; +} +void LocalDeskDataManager::EnsureCacheIsLoaded() { + // Cache is already loaded. Do nothing. + if (cache_status_ == CacheStatus::kOk) + return; + base::DirReaderPosix user_data_dir_reader( + user_data_dir_path_.AsUTF8Unsafe().c_str()); base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); - base::DirReaderPosix dir_reader(local_path_.AsUTF8Unsafe().c_str()); - if (!dir_reader.IsValid()) { - // Template directory path is invalid. This local storage cannot load any + if (!user_data_dir_reader.IsValid()) { + // User data directory path is invalid. This local storage cannot load any // templates from disk. cache_status_ = CacheStatus::kInvalidPath; return; } - while (dir_reader.Next()) { - if (!IsValidTemplateFileName(dir_reader.name())) { - continue; - } - - std::unique_ptr<ash::DeskTemplate> desk_template = - ReadFileToTemplate(local_path_.Append(dir_reader.name())); - if (desk_template) { - const base::GUID uuid = desk_template->uuid(); - templates_[uuid] = std::move(desk_template); - } - } - - cache_status_ = CacheStatus::kOk; + ReadFilesIntoCache(); } void LocalDeskDataManager::GetAllEntriesTask( - DeskModel::GetAllEntriesStatus* status_ptr, - std::vector<const ash::DeskTemplate*>* entries_ptr) { + DeskModel::GetAllEntriesStatus* out_status_ptr, + std::vector<const ash::DeskTemplate*>* out_entries_ptr) { EnsureCacheIsLoaded(); if (cache_status_ == CacheStatus::kInvalidPath) { - *status_ptr = DeskModel::GetAllEntriesStatus::kFailure; + *out_status_ptr = DeskModel::GetAllEntriesStatus::kFailure; return; } - for (const auto& it : policy_entries_) - entries_ptr->push_back(it.get()); + out_entries_ptr->push_back(it.get()); - for (auto& it : templates_) { - DCHECK_EQ(it.first, it.second->uuid()); - entries_ptr->push_back(it.second.get()); + for (auto& saved_desk : saved_desks_list_) { + for (auto& [uuid, template_entry] : saved_desk.second) { + DCHECK_EQ(uuid, template_entry->uuid()); + out_entries_ptr->push_back(template_entry.get()); + } } - if (cache_status_ == CacheStatus::kOk) { - *status_ptr = DeskModel::GetAllEntriesStatus::kOk; + *out_status_ptr = DeskModel::GetAllEntriesStatus::kOk; } else { - *status_ptr = DeskModel::GetAllEntriesStatus::kPartialFailure; + *out_status_ptr = DeskModel::GetAllEntriesStatus::kPartialFailure; } } @@ -346,28 +387,30 @@ void LocalDeskDataManager::GetEntryByUuidTask( const std::string& uuid_str, - DeskModel::GetEntryByUuidStatus* status_ptr, - ash::DeskTemplate** entry_ptr_ptr) { + DeskModel::GetEntryByUuidStatus* out_status_ptr, + ash::DeskTemplate** out_entry_ptr_ptr) { EnsureCacheIsLoaded(); - if (cache_status_ == CacheStatus::kInvalidPath) { - *status_ptr = DeskModel::GetEntryByUuidStatus::kFailure; + if (cache_status_ == LocalDeskDataManager::CacheStatus::kInvalidPath) { + *out_status_ptr = DeskModel::GetEntryByUuidStatus::kFailure; return; } const base::GUID uuid = base::GUID::ParseCaseInsensitive(uuid_str); if (!uuid.is_valid()) { - *status_ptr = DeskModel::GetEntryByUuidStatus::kInvalidUuid; + *out_status_ptr = DeskModel::GetEntryByUuidStatus::kInvalidUuid; return; } - const auto cache_entry = templates_.find(uuid); + const ash::DeskTemplateType desk_type = GetDeskTypeOfUuid(uuid); - if (cache_entry != templates_.end()) { - *status_ptr = DeskModel::GetEntryByUuidStatus::kOk; - *entry_ptr_ptr = cache_entry->second.get(); + const auto cache_entry = saved_desks_list_[desk_type].find(uuid); + + if (cache_entry != saved_desks_list_[desk_type].end()) { + *out_status_ptr = DeskModel::GetEntryByUuidStatus::kOk; + *out_entry_ptr_ptr = cache_entry->second.get(); } else { - *status_ptr = DeskModel::GetEntryByUuidStatus::kNotFound; + *out_status_ptr = DeskModel::GetEntryByUuidStatus::kNotFound; } } @@ -392,44 +435,16 @@ } void LocalDeskDataManager::AddOrUpdateEntryTask( - std::unique_ptr<ash::DeskTemplate> new_entry, - DeskModel::AddOrUpdateEntryStatus* status_ptr) { + const base::GUID uuid, + DeskModel::AddOrUpdateEntryStatus* out_status_ptr, + base::Value entry_base_value) { EnsureCacheIsLoaded(); - if (cache_status_ == CacheStatus::kInvalidPath) { - *status_ptr = DeskModel::AddOrUpdateEntryStatus::kFailure; - return; - } - - if (!g_disable_max_template_limit && templates_.size() >= kMaxTemplateCount) { - *status_ptr = DeskModel::AddOrUpdateEntryStatus::kHitMaximumLimit; - return; - } - - if (!new_entry->uuid().is_valid()) { - *status_ptr = DeskModel::AddOrUpdateEntryStatus::kInvalidArgument; - return; - } - - base::GUID uuid = new_entry->uuid(); - - // While we still find duplicate names iterate the duplicate number. i.e. - // if there are 4 duplicates of some template name then this iterates until - // the current template will be named 5. - while (HasTemplateWithName(new_entry->template_name())) { - new_entry->set_template_name( - desk_template_util::AppendDuplicateNumberToDuplicateName( - new_entry->template_name())); - } - - templates_[uuid] = std::move(new_entry); - const base::FilePath fully_qualified_path = - GetFullyQualifiedPath(local_path_, uuid.AsLowercaseString()); - - if (WriteTemplateFile(fully_qualified_path, templates_[uuid].get())) { - *status_ptr = DeskModel::AddOrUpdateEntryStatus::kOk; + GetFullyQualifiedPath(local_saved_desk_path_, uuid.AsLowercaseString()); + if (WriteTemplateFile(fully_qualified_path, std::move(entry_base_value))) { + *out_status_ptr = DeskModel::AddOrUpdateEntryStatus::kOk; } else { - *status_ptr = DeskModel::AddOrUpdateEntryStatus::kFailure; + *out_status_ptr = DeskModel::AddOrUpdateEntryStatus::kFailure; } } @@ -441,68 +456,68 @@ void LocalDeskDataManager::DeleteEntryTask( const std::string& uuid_str, - DeskModel::DeleteEntryStatus* status_ptr) { + DeskModel::DeleteEntryStatus* out_status_ptr) { EnsureCacheIsLoaded(); - if (cache_status_ == LocalDeskDataManager::CacheStatus::kInvalidPath) { - *status_ptr = DeskModel::DeleteEntryStatus::kFailure; + if (cache_status_ == CacheStatus::kInvalidPath) { + *out_status_ptr = DeskModel::DeleteEntryStatus::kFailure; return; } - const base::GUID uuid = base::GUID::ParseCaseInsensitive(uuid_str); if (!uuid.is_valid()) { - // There does not exist a desk template with invalid UUID. + // There does not exist an entry with invalid UUID. // Therefore the deletion request is vicariously successful. - *status_ptr = DeskModel::DeleteEntryStatus::kOk; + *out_status_ptr = DeskModel::DeleteEntryStatus::kOk; return; } - - templates_.erase(uuid); + const ash::DeskTemplateType desk_type = GetDeskTypeOfUuid(uuid); + saved_desks_list_[desk_type].erase(uuid); const base::FilePath fully_qualified_path = - GetFullyQualifiedPath(local_path_, uuid_str); + GetFullyQualifiedPath(local_saved_desk_path_, uuid_str); base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); if (base::DeleteFile(fully_qualified_path)) { - *status_ptr = DeskModel::DeleteEntryStatus::kOk; + *out_status_ptr = DeskModel::DeleteEntryStatus::kOk; } else { - *status_ptr = DeskModel::DeleteEntryStatus::kFailure; + *out_status_ptr = DeskModel::DeleteEntryStatus::kFailure; } } void LocalDeskDataManager::DeleteAllEntriesTask( - DeskModel::DeleteEntryStatus* status_ptr) { + DeskModel::DeleteEntryStatus* out_status_ptr) { EnsureCacheIsLoaded(); if (cache_status_ == CacheStatus::kInvalidPath) { - *status_ptr = DeskModel::DeleteEntryStatus::kFailure; + *out_status_ptr = DeskModel::DeleteEntryStatus::kFailure; return; } - - templates_.clear(); - - base::DirReaderPosix dir_reader(local_path_.AsUTF8Unsafe().c_str()); + // Deletes all desk templates and save and recall desks. + for (auto& saved_desk : saved_desks_list_) { + saved_desk.second.clear(); + } + base::DirReaderPosix dir_reader( + local_saved_desk_path_.AsUTF8Unsafe().c_str()); if (!dir_reader.IsValid()) { - *status_ptr = DeskModel::DeleteEntryStatus::kFailure; + *out_status_ptr = DeskModel::DeleteEntryStatus::kFailure; return; } DeskModel::DeleteEntryStatus overall_delete_successes = DeskModel::DeleteEntryStatus::kOk; - while (dir_reader.Next()) { - if (!IsValidTemplateFileName(dir_reader.name())) { - continue; - } - base::FilePath fully_qualified_path(local_path_.Append(dir_reader.name())); + while (dir_reader.Next()) { + if (!IsValidTemplateFileName(dir_reader.name())) + continue; + + base::FilePath fully_qualified_path( + local_saved_desk_path_.Append(dir_reader.name())); base::ScopedBlockingCall scoped_blocking_call( FROM_HERE, base::BlockingType::MAY_BLOCK); bool delete_success = base::DeleteFile(fully_qualified_path); - if ((overall_delete_successes == DeskModel::DeleteEntryStatus::kOk) && - !delete_success) + if (!delete_success) overall_delete_successes = DeskModel::DeleteEntryStatus::kFailure; } - - *status_ptr = overall_delete_successes; + *out_status_ptr = overall_delete_successes; } void LocalDeskDataManager::OnDeleteEntry( @@ -511,13 +526,66 @@ std::move(callback).Run(*status_ptr); } -bool LocalDeskDataManager::HasTemplateWithName(const std::u16string& name) { +bool LocalDeskDataManager::HasEntryWithName(const std::u16string& name, + ash::DeskTemplateType type) const { return std::find_if( - templates_.begin(), templates_.end(), - [&name](std::pair<const base::GUID, - std::unique_ptr<ash::DeskTemplate>>& entry) { + saved_desks_list_.at(type).begin(), + saved_desks_list_.at(type).end(), + [&name]( + const std::pair<const base::GUID, + std::unique_ptr<ash::DeskTemplate>>& entry) { return entry.second->template_name() == name; - }) != templates_.end(); + }) != saved_desks_list_.at(type).end(); +} + +ash::DeskTemplateType LocalDeskDataManager::GetDeskTypeOfUuid( + const base::GUID uuid) const { + for (const auto& [desk_type, saved_desk] : saved_desks_list_) { + bool found_uuid = + std::find_if( + saved_desk.begin(), saved_desk.end(), + [&uuid]( + const std::pair<const base::GUID, + std::unique_ptr<ash::DeskTemplate>>& entry) { + return entry.first == uuid; + }) != saved_desk.end(); + if (found_uuid) + return desk_type; + } + return ash::DeskTemplateType::kTemplate; +} + +void LocalDeskDataManager::ReadFilesIntoCache() { + // Set dir_reader to read from the `local_saved_desk_path_` directory. + // check to make sure there is a `local_saved_desk_path_` directory. If not + // create it. + base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, + base::BlockingType::MAY_BLOCK); + bool dir_create_success = base::CreateDirectory(local_saved_desk_path_); + base::DirReaderPosix dir_reader( + local_saved_desk_path_.AsUTF8Unsafe().c_str()); + + if (!dir_create_success || !dir_reader.IsValid()) { + // Failed to find or create the `local_saved_desk_path_` directory path. + // This local storage cannot load any entry of `type` from disk. + cache_status_ = CacheStatus::kInvalidPath; + return; + } + + while (dir_reader.Next()) { + if (!IsValidTemplateFileName(dir_reader.name())) { + continue; + } + + std::unique_ptr<ash::DeskTemplate> entry = + ReadFileToTemplate(local_saved_desk_path_.Append(dir_reader.name())); + if (entry) { + const base::GUID uuid = entry->uuid(); + saved_desks_list_[entry->type()][uuid] = std::move(entry); + } + } + + cache_status_ = CacheStatus::kOk; } } // namespace desks_storage
diff --git a/components/desks_storage/core/local_desk_data_manager.h b/components/desks_storage/core/local_desk_data_manager.h index 499a827..c1d06839 100644 --- a/components/desks_storage/core/local_desk_data_manager.h +++ b/components/desks_storage/core/local_desk_data_manager.h
@@ -8,22 +8,23 @@ #include <map> #include <memory> +#include "ash/public/cpp/desk_template.h" #include "base/files/file_path.h" #include "base/guid.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/task/sequenced_task_runner_helpers.h" +#include "components/account_id/account_id.h" #include "components/desks_storage/core/desk_model.h" namespace ash { -class DeskTemplate; class OverviewTestBase; } // namespace ash namespace desks_storage { // The LocalDeskDataManager is the local storage implementation of // the DeskModel interface and handles storage operations for local -// desk templates. +// desk templates and save and recall desks. // // TODO(crbug.com/1227215): add calls to DeskModelObserver class LocalDeskDataManager : public DeskModel { @@ -44,7 +45,8 @@ kInvalidPath, }; - explicit LocalDeskDataManager(const base::FilePath& path); + LocalDeskDataManager(const base::FilePath& user_data_dir_path, + const AccountId& account_id); LocalDeskDataManager(const LocalDeskDataManager&) = delete; LocalDeskDataManager& operator=(const LocalDeskDataManager&) = delete; @@ -65,16 +67,28 @@ bool IsReady() const override; bool IsSyncing() const override; + // TODO(crbug.com/1320805): Once DeskSyncBridge is set to support save and + // recall desk, add methods to support operations on both types of templates + // for a generic desk model. For now, these methods will only be for the local + // storage implementation of the desk model. + std::size_t GetSaveAndRecallDeskEntryCount() const; + std::size_t GetDeskTemplateEntryCount() const; + std::size_t GetMaxSaveAndRecallDeskEntryCount() const; + std::size_t GetMaxDeskTemplateEntryCount() const; + static void SetDisableMaxTemplateLimitForTesting(bool disabled); + static void SetExcludeSaveAndRecallDeskInMaxEntryCountForTesting( + bool disabled); private: friend class ash::OverviewTestBase; - // Loads desk templates from |local_path_| into cache if the cache is not + // Loads templates from `local_saved_desk_path_` into the + // `saved_desks_list_`, based on the template's desk type, if the cache is not // loaded yet. void EnsureCacheIsLoaded(); - // Gets all desk templates from user's local template directory. + // Gets all entries from user's `local_saved_desk_path_` void GetAllEntriesTask(DeskModel::GetAllEntriesStatus* status_ptr, std::vector<const ash::DeskTemplate*>* entries_ptr); @@ -84,7 +98,7 @@ std::unique_ptr<std::vector<const ash::DeskTemplate*>> entries_ptr, DeskModel::GetAllEntriesCallback callback); - // Get a specific desk template by |uuid_str|. + // Get a specific entry by `uuid_str`. void GetEntryByUuidTask(const std::string& uuid_str, DeskModel::GetEntryByUuidStatus* status_ptr, ash::DeskTemplate** entry_ptr_ptr); @@ -96,16 +110,17 @@ std::unique_ptr<ash::DeskTemplate*> entry_ptr_ptr, DeskModel::GetEntryByUuidCallback callback); - // Add or update a desk template by |new_entry|'s UUID. - void AddOrUpdateEntryTask(std::unique_ptr<ash::DeskTemplate> new_entry, - DeskModel::AddOrUpdateEntryStatus* status_ptr); + // Add or update an entry by `new_entry`'s UUID. + void AddOrUpdateEntryTask(const base::GUID uuid, + DeskModel::AddOrUpdateEntryStatus* status_ptr, + base::Value entry_base_value); // Wrapper method to call AddOrUpdateEntryCallback. void OnAddOrUpdateEntry( std::unique_ptr<DeskModel::AddOrUpdateEntryStatus> status_ptr, DeskModel::AddOrUpdateEntryCallback callback); - // Remove entry with |uuid_str|. If the entry with |uuid_str| does not + // Remove entry with `uuid_str`. If the entry with `uuid_str` does not // exist, then the deletion is considered a success. void DeleteEntryTask(const std::string& uuid_str, DeskModel::DeleteEntryStatus* status_ptr); @@ -117,24 +132,39 @@ void OnDeleteEntry(std::unique_ptr<DeskModel::DeleteEntryStatus> status_ptr, DeskModel::DeleteEntryCallback callback); - // Returns true if |templates_| contains a desk template with |name|. - bool HasTemplateWithName(const std::u16string& name); + // Returns true if the storage model has an entry of desk type `type` with the + // file name `name`. + bool HasEntryWithName(const std::u16string& name, + ash::DeskTemplateType type) const; + + // Returns the desk type of the `uuid`. + ash::DeskTemplateType GetDeskTypeOfUuid(const base::GUID uuid) const; + + // Read template files into their appropriate caches. + void ReadFilesIntoCache(); // Task runner used to schedule tasks on the IO thread. scoped_refptr<base::SequencedTaskRunner> task_runner_; - // File path to the template subdirection in user data directory's: - // e.g. "/path/to/user/data/dir/templates". - const base::FilePath local_path_; + // File path to the user data directory's: e.g. + // "/path/to/user/data/dir/". + const base::FilePath user_data_dir_path_; - // In-memory desk template cache that owns desk_templates so that these desk - // templates can be retrieved by GetAllEntries. - // |templates_| is keyed by UUIDs. - std::map<base::GUID, std::unique_ptr<ash::DeskTemplate>> templates_; + // File path to the saveddesks template subdirectory in user data directory's: + // e.g. "/path/to/user/data/dir/saveddesk". + const base::FilePath local_saved_desk_path_; - // Flag indicating the status of this in memory cache. + // Account ID of the user this class will cache app data for. + const AccountId account_id_; + + // Cache status of the templates cache for both desk types. CacheStatus cache_status_; + using SavedDesks = std::map<base::GUID, std::unique_ptr<ash::DeskTemplate>>; + + // In memory cache of saved desks based on their type. + std::map<ash::DeskTemplateType, SavedDesks> saved_desks_list_; + // Weak pointer factory for posting tasks to task runner. base::WeakPtrFactory<LocalDeskDataManager> weak_ptr_factory_{this}; };
diff --git a/components/desks_storage/core/local_desks_data_manager_unittests.cc b/components/desks_storage/core/local_desks_data_manager_unittests.cc index 4e70ea5..82be6b2 100644 --- a/components/desks_storage/core/local_desks_data_manager_unittests.cc +++ b/components/desks_storage/core/local_desks_data_manager_unittests.cc
@@ -19,6 +19,12 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "build/build_config.h" +#include "components/account_id/account_id.h" +#include "components/app_constants/constants.h" +#include "components/desks_storage/core/desk_template_util.h" +#include "components/services/app_service/public/cpp/app_registry_cache.h" +#include "components/services/app_service/public/cpp/app_registry_cache_wrapper.h" +#include "components/services/app_service/public/cpp/app_types.h" #include "testing/gtest/include/gtest/gtest.h" namespace desks_storage { @@ -28,6 +34,8 @@ constexpr char kJunkData[] = "This is not valid template data."; constexpr char kTemplateFileNameFormat[] = "%s.template"; constexpr char kUuidFormat[] = "1c186d5a-502e-49ce-9ee1-00000000000%d"; +constexpr char kSaveAndRecallDeskUuidFormat[] = + "1c186d5a-502e-49ce-9ee1-0000000000%d"; constexpr char kTemplateNameFormat[] = "desk_%d"; constexpr char kDeskOneTemplateDuplicateExpectedName[] = "desk_01 (1)"; constexpr char kDeskOneTemplateDuplicateTwoExpectedName[] = "desk_01 (2)"; @@ -46,6 +54,13 @@ const std::string kTestUuid7 = base::StringPrintf(kUuidFormat, 7); const std::string kTestUuid8 = base::StringPrintf(kUuidFormat, 8); const std::string kTestUuid9 = base::StringPrintf(kUuidFormat, 9); +const std::string kTestSaveAndRecallDeskUuid1 = + base::StringPrintf(kSaveAndRecallDeskUuidFormat, 10); +const std::string kTestSaveAndRecallDeskUuid2 = + base::StringPrintf(kSaveAndRecallDeskUuidFormat, 11); +const std::string kTestSaveAndRecallDeskUuid3 = + base::StringPrintf(kSaveAndRecallDeskUuidFormat, 12); + const base::Time kTestTime1 = base::Time(); const std::string kTestFileName1 = base::StringPrintf(kTemplateFileNameFormat, kTestUuid1.c_str()); @@ -110,104 +125,113 @@ EXPECT_TRUE(base::WriteFile(full_path, kJunkData)); } -// Make test desk template with ID containing the index. -std::unique_ptr<ash::DeskTemplate> MakeTestDeskTemplate(int index) { +// Make test template with ID containing the index. Defaults to desk template +// type if a type is not specified. +std::unique_ptr<ash::DeskTemplate> MakeTestDeskTemplate( + int index, + ash::DeskTemplateType type) { const std::string template_uuid = base::StringPrintf(kUuidFormat, index); const std::string template_name = base::StringPrintf(kTemplateNameFormat, index); std::unique_ptr<ash::DeskTemplate> desk_template = std::make_unique<ash::DeskTemplate>( template_uuid, ash::DeskTemplateSource::kUser, template_name, - base::Time::Now(), ash::DeskTemplateType::kTemplate); + base::Time::Now(), type); desk_template->set_desk_restore_data( std::make_unique<app_restore::RestoreData>()); return desk_template; } +// Make test template with default restore data. +std::unique_ptr<ash::DeskTemplate> MakeTestDeskTemplate( + const std::string& uuid, + ash::DeskTemplateSource source, + const std::string& name, + const base::Time created_time) { + auto entry = std::make_unique<ash::DeskTemplate>( + uuid, source, name, created_time, ash::DeskTemplateType::kTemplate); + entry->set_desk_restore_data(std::make_unique<app_restore::RestoreData>()); + return entry; +} + +// Make test save and recall desk with default restore data. +std::unique_ptr<ash::DeskTemplate> MakeTestSaveAndRecallDesk( + const std::string& uuid, + const std::string& name, + const base::Time created_time) { + auto entry = std::make_unique<ash::DeskTemplate>( + uuid, ash::DeskTemplateSource::kUser, name, created_time, + ash::DeskTemplateType::kSaveAndRecall); + entry->set_desk_restore_data(std::make_unique<app_restore::RestoreData>()); + return entry; +} } // namespace +// TODO(crbug:1320940): Clean up tests to move on from std::string. class LocalDeskDataManagerTest : public testing::Test { public: LocalDeskDataManagerTest() - : sample_desk_template_one_(std::make_unique<ash::DeskTemplate>( - kTestUuid1, - ash::DeskTemplateSource::kUser, - std::string("desk_01"), - kTestTime1, - ash::DeskTemplateType::kTemplate)), - sample_desk_template_one_duplicate_(std::make_unique<ash::DeskTemplate>( - kTestUuid5, - ash::DeskTemplateSource::kUser, - std::string("desk_01"), - base::Time::Now(), - ash::DeskTemplateType::kTemplate)), + : sample_desk_template_one_( + MakeTestDeskTemplate(kTestUuid1, + ash::DeskTemplateSource::kUser, + std::string("desk_01"), + kTestTime1)), + sample_desk_template_one_duplicate_( + MakeTestDeskTemplate(kTestUuid5, + ash::DeskTemplateSource::kUser, + std::string("desk_01"), + base::Time::Now())), sample_desk_template_one_duplicate_two_( - std::make_unique<ash::DeskTemplate>( - kTestUuid6, - ash::DeskTemplateSource::kUser, - std::string("desk_01"), - base::Time::Now(), - ash::DeskTemplateType::kTemplate)), + MakeTestDeskTemplate(kTestUuid6, + ash::DeskTemplateSource::kUser, + std::string("desk_01"), + base::Time::Now())), duplicate_pattern_matching_named_desk_( - std::make_unique<ash::DeskTemplate>( - kTestUuid7, - ash::DeskTemplateSource::kUser, - std::string("(1) desk_template"), - base::Time::Now(), - ash::DeskTemplateType::kTemplate)), + MakeTestDeskTemplate(kTestUuid7, + ash::DeskTemplateSource::kUser, + std::string("(1) desk_template"), + base::Time::Now())), duplicate_pattern_matching_named_desk_two_( - std::make_unique<ash::DeskTemplate>( - kTestUuid8, - ash::DeskTemplateSource::kUser, - std::string("(1) desk_template"), - base::Time::Now(), - ash::DeskTemplateType::kTemplate)), + MakeTestDeskTemplate(kTestUuid8, + ash::DeskTemplateSource::kUser, + std::string("(1) desk_template"), + base::Time::Now())), duplicate_pattern_matching_named_desk_three_( - std::make_unique<ash::DeskTemplate>( - kTestUuid9, - ash::DeskTemplateSource::kUser, - std::string("(1) desk_template"), - base::Time::Now(), - ash::DeskTemplateType::kTemplate)), - sample_desk_template_two_(std::make_unique<ash::DeskTemplate>( - kTestUuid2, - ash::DeskTemplateSource::kUser, - std::string("desk_02"), - base::Time::Now(), - ash::DeskTemplateType::kTemplate)), - sample_desk_template_three_(std::make_unique<ash::DeskTemplate>( - kTestUuid3, - ash::DeskTemplateSource::kUser, - std::string("desk_03"), - base::Time::Now(), - ash::DeskTemplateType::kTemplate)), - modified_sample_desk_template_one_(std::make_unique<ash::DeskTemplate>( - kTestUuid1, - ash::DeskTemplateSource::kUser, - std::string("desk_01_mod"), - kTestTime1, - ash::DeskTemplateType::kTemplate)), + MakeTestDeskTemplate(kTestUuid9, + ash::DeskTemplateSource::kUser, + std::string("(1) desk_template"), + base::Time::Now())), + sample_desk_template_two_( + MakeTestDeskTemplate(kTestUuid2, + ash::DeskTemplateSource::kUser, + std::string("desk_02"), + base::Time::Now())), + sample_desk_template_three_( + MakeTestDeskTemplate(kTestUuid3, + ash::DeskTemplateSource::kUser, + std::string("desk_03"), + base::Time::Now())), + sample_save_and_recall_desk_one_( + MakeTestSaveAndRecallDesk(kTestSaveAndRecallDeskUuid1, + "save_and_recall_desk_01", + kTestTime1)), + sample_save_and_recall_desk_two_( + MakeTestSaveAndRecallDesk(kTestSaveAndRecallDeskUuid2, + "save_and_recall_desk_02", + base::Time::Now())), + sample_save_and_recall_desk_three_( + MakeTestSaveAndRecallDesk(kTestSaveAndRecallDeskUuid3, + "save_and_recall_desk_03", + base::Time::Now())), + modified_sample_desk_template_one_( + MakeTestDeskTemplate(kTestUuid1, + ash::DeskTemplateSource::kUser, + std::string("desk_01_mod"), + kTestTime1)), task_environment_(base::test::TaskEnvironment::MainThreadType::IO), - data_manager_(std::unique_ptr<LocalDeskDataManager>()) { - sample_desk_template_one_->set_desk_restore_data( - std::make_unique<app_restore::RestoreData>()); - sample_desk_template_one_duplicate_->set_desk_restore_data( - std::make_unique<app_restore::RestoreData>()); - sample_desk_template_one_duplicate_two_->set_desk_restore_data( - std::make_unique<app_restore::RestoreData>()); - duplicate_pattern_matching_named_desk_->set_desk_restore_data( - std::make_unique<app_restore::RestoreData>()); - duplicate_pattern_matching_named_desk_two_->set_desk_restore_data( - std::make_unique<app_restore::RestoreData>()); - duplicate_pattern_matching_named_desk_three_->set_desk_restore_data( - std::make_unique<app_restore::RestoreData>()); - sample_desk_template_two_->set_desk_restore_data( - std::make_unique<app_restore::RestoreData>()); - sample_desk_template_three_->set_desk_restore_data( - std::make_unique<app_restore::RestoreData>()); - modified_sample_desk_template_one_->set_desk_restore_data( - std::make_unique<app_restore::RestoreData>()); - } + cache_(std::make_unique<apps::AppRegistryCache>()), + account_id_(AccountId::FromUserEmail("test@gmail.com")), + data_manager_(std::unique_ptr<LocalDeskDataManager>()) {} LocalDeskDataManagerTest(const LocalDeskDataManagerTest&) = delete; LocalDeskDataManagerTest& operator=(const LocalDeskDataManagerTest&) = delete; @@ -216,7 +240,11 @@ void SetUp() override { EXPECT_TRUE(temp_dir_.CreateUniqueTempDir()); - data_manager_ = std::make_unique<LocalDeskDataManager>(temp_dir_.GetPath()); + data_manager_ = std::make_unique<LocalDeskDataManager>(temp_dir_.GetPath(), + account_id_); + data_manager_->SetExcludeSaveAndRecallDeskInMaxEntryCountForTesting(false); + desk_template_util::PopulateAppRegistryCache(account_id_, cache_.get()); + task_environment_.RunUntilIdle(); testing::Test::SetUp(); } @@ -242,6 +270,43 @@ loop2.Run(); } + void AddTwoSaveAndRecallDeskTemplates() { + base::RunLoop loop1; + data_manager_->AddOrUpdateEntry( + std::move(sample_save_and_recall_desk_one_), + base::BindLambdaForTesting( + [&](DeskModel::AddOrUpdateEntryStatus status) { + EXPECT_EQ(DeskModel::AddOrUpdateEntryStatus::kOk, status); + loop1.Quit(); + })); + loop1.Run(); + + base::RunLoop loop2; + data_manager_->AddOrUpdateEntry( + std::move(sample_save_and_recall_desk_two_), + base::BindLambdaForTesting( + [&](DeskModel::AddOrUpdateEntryStatus status) { + EXPECT_EQ(DeskModel::AddOrUpdateEntryStatus::kOk, status); + loop2.Quit(); + })); + loop2.Run(); + } + + void VerifyAllEntries(size_t expected_size, const std::string& trace_string) { + SCOPED_TRACE(trace_string); + base::RunLoop loop; + + data_manager_->GetAllEntries(base::BindLambdaForTesting( + [&](DeskModel::GetAllEntriesStatus status, + const std::vector<const ash::DeskTemplate*>& entries) { + EXPECT_EQ(status, DeskModel::GetAllEntriesStatus::kOk); + EXPECT_EQ(entries.size(), expected_size); + loop.Quit(); + })); + + loop.Run(); + } + base::ScopedTempDir temp_dir_; std::unique_ptr<ash::DeskTemplate> sample_desk_template_one_; std::unique_ptr<ash::DeskTemplate> sample_desk_template_one_duplicate_; @@ -252,11 +317,17 @@ duplicate_pattern_matching_named_desk_three_; std::unique_ptr<ash::DeskTemplate> sample_desk_template_two_; std::unique_ptr<ash::DeskTemplate> sample_desk_template_three_; + std::unique_ptr<ash::DeskTemplate> sample_save_and_recall_desk_one_; + std::unique_ptr<ash::DeskTemplate> sample_save_and_recall_desk_two_; + std::unique_ptr<ash::DeskTemplate> sample_save_and_recall_desk_three_; std::unique_ptr<ash::DeskTemplate> modified_sample_desk_template_one_; base::test::TaskEnvironment task_environment_; + std::unique_ptr<apps::AppRegistryCache> cache_; + AccountId account_id_; std::unique_ptr<LocalDeskDataManager> data_manager_; }; +// TODO(crbug/1320949): Pass a callback to VerifyEntryAdded. TEST_F(LocalDeskDataManagerTest, CanAddEntry) { data_manager_->AddOrUpdateEntry(std::move(sample_desk_template_one_), base::BindOnce(&VerifyEntryAddedCorrectly)); @@ -265,14 +336,34 @@ } TEST_F(LocalDeskDataManagerTest, ReturnsErrorWhenAddingTooManyEntry) { - for (std::size_t index = 0u; index < data_manager_->GetMaxEntryCount(); - ++index) { - data_manager_->AddOrUpdateEntry(MakeTestDeskTemplate(index), - base::BindOnce(&VerifyEntryAddedCorrectly)); + for (std::size_t index = 0u; + index < data_manager_->GetMaxDeskTemplateEntryCount(); ++index) { + data_manager_->AddOrUpdateEntry( + MakeTestDeskTemplate(index, ash::DeskTemplateType::kTemplate), + base::BindOnce(&VerifyEntryAddedCorrectly)); } data_manager_->AddOrUpdateEntry( - MakeTestDeskTemplate(data_manager_->GetMaxEntryCount() + 1), + MakeTestDeskTemplate(data_manager_->GetMaxDeskTemplateEntryCount() + 1, + ash::DeskTemplateType::kTemplate), + base::BindOnce(&VerifyEntryAddedErrorHitMaximumLimit)); + + task_environment_.RunUntilIdle(); +} + +TEST_F(LocalDeskDataManagerTest, + ReturnsErrorWhenAddingTooManySaveAndRecallDeskEntry) { + for (std::size_t index = 0u; + index < data_manager_->GetMaxSaveAndRecallDeskEntryCount(); ++index) { + data_manager_->AddOrUpdateEntry( + MakeTestDeskTemplate(index, ash::DeskTemplateType::kSaveAndRecall), + base::BindOnce(&VerifyEntryAddedCorrectly)); + } + + data_manager_->AddOrUpdateEntry( + MakeTestDeskTemplate( + data_manager_->GetMaxSaveAndRecallDeskEntryCount() + 1, + ash::DeskTemplateType::kSaveAndRecall), base::BindOnce(&VerifyEntryAddedErrorHitMaximumLimit)); task_environment_.RunUntilIdle(); @@ -390,11 +481,9 @@ data_manager_->AddOrUpdateEntry( std::move(duplicate_pattern_matching_named_desk_two_), base::BindOnce(&VerifyEntryAddedCorrectly)); - data_manager_->AddOrUpdateEntry( std::move(duplicate_pattern_matching_named_desk_three_), base::BindOnce(&VerifyEntryAddedCorrectly)); - base::RunLoop loop; data_manager_->GetAllEntries(base::BindLambdaForTesting( [&](DeskModel::GetAllEntriesStatus status, @@ -494,7 +583,8 @@ TEST_F(LocalDeskDataManagerTest, GetEntryByUuidReturnsFailureIfDeskManagerHasInvalidPath) { - data_manager_ = std::make_unique<LocalDeskDataManager>(kInvalidFilePath); + data_manager_ = + std::make_unique<LocalDeskDataManager>(kInvalidFilePath, account_id_); base::RunLoop loop; data_manager_->GetEntryByUUID( @@ -607,4 +697,170 @@ EXPECT_EQ(max_entry_count + 1ul, data_manager_->GetMaxEntryCount()); } +TEST_F(LocalDeskDataManagerTest, AddDeskTemplatesAndSaveAndRecallDeskEntries) { + // Add two user templates. + AddTwoTemplates(); + + // Add two SaveAndRecall desks. + AddTwoSaveAndRecallDeskTemplates(); + + EXPECT_EQ(data_manager_->GetEntryCount(), 4ul); + EXPECT_EQ(data_manager_->GetDeskTemplateEntryCount(), 2ul); + EXPECT_EQ(data_manager_->GetSaveAndRecallDeskEntryCount(), 2ul); + + base::RunLoop loop; + data_manager_->GetAllEntries(base::BindLambdaForTesting( + [&](DeskModel::GetAllEntriesStatus status, + const std::vector<const ash::DeskTemplate*>& entries) { + EXPECT_EQ(status, DeskModel::GetAllEntriesStatus::kOk); + loop.Quit(); + })); + + loop.Run(); + VerifyAllEntries(4ul, + "Add two desks templates and two saved and recall desks"); +} + +TEST_F(LocalDeskDataManagerTest, AddSaveAndRecallDeskEntry) { + data_manager_->AddOrUpdateEntry( + MakeTestDeskTemplate(1u, ash::DeskTemplateType::kSaveAndRecall), + base::BindOnce(&VerifyEntryAddedCorrectly)); + + VerifyAllEntries(1ul, "Added one save and recall desk"); + base::RunLoop loop; + // Verify that it's not SaveAndRecall entry in the desk template cache. + data_manager_->GetAllEntries(base::BindLambdaForTesting( + [&](DeskModel::GetAllEntriesStatus status, + const std::vector<const ash::DeskTemplate*>& entries) { + EXPECT_EQ(status, DeskModel::GetAllEntriesStatus::kOk); + EXPECT_EQ(entries.size(), 1ul); + EXPECT_EQ(entries[0]->type(), ash::DeskTemplateType::kSaveAndRecall); + loop.Quit(); + })); + EXPECT_EQ(data_manager_->GetDeskTemplateEntryCount(), 0ul); + EXPECT_EQ(data_manager_->GetSaveAndRecallDeskEntryCount(), 1ul); + loop.Run(); +} + +TEST_F(LocalDeskDataManagerTest, CanGetSaveAndRecallDeskEntryByUuid) { + data_manager_->AddOrUpdateEntry(std::move(sample_save_and_recall_desk_one_), + base::BindOnce(&VerifyEntryAddedCorrectly)); + + data_manager_->GetEntryByUUID( + kTestSaveAndRecallDeskUuid1, + base::BindLambdaForTesting([&](DeskModel::GetEntryByUuidStatus status, + std::unique_ptr<ash::DeskTemplate> entry) { + EXPECT_EQ(DeskModel::GetEntryByUuidStatus::kOk, status); + + EXPECT_EQ(base::GUID::ParseCaseInsensitive(kTestSaveAndRecallDeskUuid1), + entry->uuid()); + EXPECT_EQ(u"save_and_recall_desk_01", entry->template_name()); + EXPECT_EQ(kTestTime1, entry->created_time()); + })); + + task_environment_.RunUntilIdle(); +} + +TEST_F(LocalDeskDataManagerTest, CanDeleteSaveAndRecallDeskEntry) { + data_manager_->AddOrUpdateEntry(std::move(sample_save_and_recall_desk_one_), + base::BindOnce(&VerifyEntryAddedCorrectly)); + + VerifyAllEntries(1ul, "Added one save and recall desk"); + EXPECT_EQ(data_manager_->GetSaveAndRecallDeskEntryCount(), 1ul); + data_manager_->DeleteEntry( + kTestSaveAndRecallDeskUuid1, + base::BindLambdaForTesting([&](DeskModel::DeleteEntryStatus status) { + EXPECT_EQ(status, DeskModel::DeleteEntryStatus::kOk); + })); + + VerifyAllEntries(0ul, "Deleted one save and recall desk"); +} + +TEST_F(LocalDeskDataManagerTest, CanAddMaxEntriesForBothTypes) { + for (std::size_t index = 0u; + index < data_manager_->GetMaxSaveAndRecallDeskEntryCount(); ++index) { + data_manager_->AddOrUpdateEntry( + MakeTestDeskTemplate(index, ash::DeskTemplateType::kSaveAndRecall), + base::BindOnce(&VerifyEntryAddedCorrectly)); + } + for (std::size_t index = 0u; + index < data_manager_->GetMaxDeskTemplateEntryCount(); ++index) { + data_manager_->AddOrUpdateEntry( + MakeTestDeskTemplate(index, ash::DeskTemplateType::kTemplate), + base::BindOnce(&VerifyEntryAddedCorrectly)); + } + + VerifyAllEntries( + 12ul, "Added max number of save and recall desks and desk templates"); + EXPECT_EQ(data_manager_->GetDeskTemplateEntryCount(), 6ul); + EXPECT_EQ(data_manager_->GetSaveAndRecallDeskEntryCount(), 6ul); +} + +TEST_F(LocalDeskDataManagerTest, CanDeleteAllEntriesOfBothTypes) { + data_manager_->AddOrUpdateEntry(std::move(sample_desk_template_one_), + base::BindOnce(&VerifyEntryAddedCorrectly)); + data_manager_->AddOrUpdateEntry(std::move(sample_desk_template_two_), + base::BindOnce(&VerifyEntryAddedCorrectly)); + data_manager_->AddOrUpdateEntry(std::move(sample_desk_template_three_), + base::BindOnce(&VerifyEntryAddedCorrectly)); + data_manager_->AddOrUpdateEntry(std::move(sample_save_and_recall_desk_one_), + base::BindOnce(&VerifyEntryAddedCorrectly)); + data_manager_->AddOrUpdateEntry(std::move(sample_save_and_recall_desk_two_), + base::BindOnce(&VerifyEntryAddedCorrectly)); + data_manager_->AddOrUpdateEntry(std::move(sample_save_and_recall_desk_three_), + base::BindOnce(&VerifyEntryAddedCorrectly)); + + VerifyAllEntries(6ul, + "Added a mix of save and recall desks and desk templates"); + + data_manager_->DeleteAllEntries( + base::BindLambdaForTesting([&](DeskModel::DeleteEntryStatus status) { + EXPECT_EQ(status, DeskModel::DeleteEntryStatus::kOk); + })); + + VerifyAllEntries(0ul, "Deleted all entries"); + EXPECT_EQ(0ul, data_manager_->GetEntryCount()); +} + +TEST_F(LocalDeskDataManagerTest, + CanAddMaxEntriesDeskTemplatesAndStillAddEntryForSaveAndRecallDesks) { + for (std::size_t index = 0u; + index < data_manager_->GetMaxDeskTemplateEntryCount(); ++index) { + data_manager_->AddOrUpdateEntry( + MakeTestDeskTemplate(index, ash::DeskTemplateType::kTemplate), + base::BindOnce(&VerifyEntryAddedCorrectly)); + } + data_manager_->AddOrUpdateEntry( + MakeTestDeskTemplate(1ul, ash::DeskTemplateType::kSaveAndRecall), + base::BindOnce(&VerifyEntryAddedCorrectly)); + + VerifyAllEntries(7ul, + "Added one save and recall desk after capping " + "desk template entries"); + + EXPECT_EQ(data_manager_->GetDeskTemplateEntryCount(), 6ul); + EXPECT_EQ(data_manager_->GetSaveAndRecallDeskEntryCount(), 1ul); +} + +TEST_F(LocalDeskDataManagerTest, + CanAddMaxEntriesForSaveAndRecallDeskAndStillAddEntryForDeskTemplate) { + for (std::size_t index = 0u; + index < data_manager_->GetMaxSaveAndRecallDeskEntryCount(); ++index) { + data_manager_->AddOrUpdateEntry( + MakeTestDeskTemplate(index, ash::DeskTemplateType::kSaveAndRecall), + base::BindOnce(&VerifyEntryAddedCorrectly)); + } + + data_manager_->AddOrUpdateEntry( + MakeTestDeskTemplate(1ul, ash::DeskTemplateType::kTemplate), + base::BindOnce(&VerifyEntryAddedCorrectly)); + + VerifyAllEntries(7ul, + "Added one desk template after capping " + "save and recall desk entries"); + + EXPECT_EQ(data_manager_->GetDeskTemplateEntryCount(), 1ul); + EXPECT_EQ(data_manager_->GetSaveAndRecallDeskEntryCount(), 6ul); +} + } // namespace desks_storage
diff --git a/components/embedder_support/OWNERS b/components/embedder_support/OWNERS index eb0dee8..839d6b7 100644 --- a/components/embedder_support/OWNERS +++ b/components/embedder_support/OWNERS
@@ -1,3 +1,2 @@ -abeyad@chromium.org miketaylr@chromium.org victortan@chromium.org
diff --git a/components/history_clusters/core/features.cc b/components/history_clusters/core/features.cc index ef5e6c2..3a9a3c5 100644 --- a/components/history_clusters/core/features.cc +++ b/components/history_clusters/core/features.cc
@@ -30,7 +30,7 @@ const base::Feature kJourneys{"Journeys", enabled_by_default_desktop_only}; const base::Feature kJourneysLabels{"JourneysLabel", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kOmniboxAction{"JourneysOmniboxAction", enabled_by_default_desktop_only};
diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc index 0c6d36fd..b294e07 100644 --- a/components/metrics/metrics_service.cc +++ b/components/metrics/metrics_service.cc
@@ -564,7 +564,7 @@ } #endif // BUILDFLAG(IS_CHROMEOS_ASH) -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) void MetricsService::ResetClientId() { // Pref must be cleared in order for ForceClientIdCreation to generate a new // client ID. @@ -572,7 +572,7 @@ state_manager_->ForceClientIdCreation(); client_->SetMetricsClientId(state_manager_->client_id()); } -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) variations::SyntheticTrialRegistry* MetricsService::GetSyntheticTrialRegistry() {
diff --git a/components/metrics/metrics_service.h b/components/metrics/metrics_service.h index 35fb59cc..6a264da 100644 --- a/components/metrics/metrics_service.h +++ b/components/metrics/metrics_service.h
@@ -232,14 +232,14 @@ void UpdateCurrentUserMetricsConsent(bool user_metrics_consent); #endif // BUILDFLAG(IS_CHROMEOS_ASH) -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) // Forces the client ID to be reset and generates a new client ID. This will // be called when a user re-consents to metrics collection and the user had // consented in the past. // // This is to preserve the pseudo-anonymous identifier <client_id, user_id>. void ResetClientId(); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) variations::SyntheticTrialRegistry* GetSyntheticTrialRegistry();
diff --git a/components/metrics/system_memory_stats_recorder_linux.cc b/components/metrics/system_memory_stats_recorder_linux.cc index b15a05e..9e32773 100644 --- a/components/metrics/system_memory_stats_recorder_linux.cc +++ b/components/metrics/system_memory_stats_recorder_linux.cc
@@ -7,7 +7,6 @@ #include "base/metrics/histogram_macros.h" #include "base/process/process_metrics.h" #include "build/build_config.h" -#include "build/chromeos_buildflags.h" namespace metrics { @@ -31,7 +30,7 @@ UMA_HISTOGRAM_LINEAR(name, sample, 2500, 50) void RecordMemoryStats(RecordMemoryStatsType type) { -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) // Record graphics GEM object size in a histogram with 50 MB buckets. int mem_gpu_mb = 0; bool mem_gpu_result = false; @@ -58,8 +57,7 @@ // On Intel, graphics objects are in anonymous pages, but on ARM they are // not. For a total "allocated count" add in graphics pages on ARM. int mem_allocated_mb = (memory.active_anon + memory.inactive_anon) / 1024; -#if (BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)) && \ - defined(ARCH_CPU_ARM_FAMILY) +#if BUILDFLAG(IS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) mem_allocated_mb += mem_gpu_mb; #endif @@ -83,7 +81,7 @@ } } -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) // Record shared memory (used by renderer/GPU buffers). int mem_shmem_mb = memory.shmem / 1024; switch (type) {
diff --git a/components/ntp_snippets/category_rankers/click_based_category_ranker.cc b/components/ntp_snippets/category_rankers/click_based_category_ranker.cc index 5961545..015986e 100644 --- a/components/ntp_snippets/category_rankers/click_based_category_ranker.cc +++ b/components/ntp_snippets/category_rankers/click_based_category_ranker.cc
@@ -381,17 +381,18 @@ void ClickBasedCategoryRanker::StoreOrderToPrefs( const std::vector<RankedCategory>& ordered_categories) { - base::ListValue list; + base::Value::List list; for (const RankedCategory& category : ordered_categories) { - auto dictionary = std::make_unique<base::DictionaryValue>(); - dictionary->SetIntKey(kCategoryIdKey, category.category.id()); - dictionary->SetIntKey(kClicksKey, category.clicks); - dictionary->SetStringKey( + base::Value::Dict dictionary; + dictionary.Set(kCategoryIdKey, category.category.id()); + dictionary.Set(kClicksKey, category.clicks); + dictionary.Set( kLastDismissedKey, base::NumberToString(SerializeTime(category.last_dismissed))); list.Append(std::move(dictionary)); } - pref_service_->Set(prefs::kClickBasedCategoryRankerOrderWithClicks, list); + pref_service_->Set(prefs::kClickBasedCategoryRankerOrderWithClicks, + base::Value(std::move(list))); } std::vector<ClickBasedCategoryRanker::RankedCategory>::iterator
diff --git a/components/ntp_snippets/remote/json_request.cc b/components/ntp_snippets/remote/json_request.cc index ccc40b7..6b5ca90 100644 --- a/components/ntp_snippets/remote/json_request.cc +++ b/components/ntp_snippets/remote/json_request.cc
@@ -98,11 +98,11 @@ return language; } -void AppendLanguageInfoToList(base::ListValue* list, +void AppendLanguageInfoToList(base::Value::List* list, const UrlLanguageHistogram::LanguageInfo& info) { - auto lang = std::make_unique<base::DictionaryValue>(); - lang->SetStringKey("language", info.language_code); - lang->SetDoubleKey("frequency", info.frequency); + base::Value::Dict lang; + lang.Set("language", info.language_code); + lang.Set("frequency", info.frequency); list->Append(std::move(lang)); } @@ -306,60 +306,58 @@ } std::string JsonRequest::Builder::BuildBody() const { - auto request = std::make_unique<base::DictionaryValue>(); + base::Value::Dict request; std::string user_locale = PosixLocaleFromBCP47Language(params_.language_code); if (!user_locale.empty()) { - request->SetStringKey("uiLanguage", user_locale); + request.Set("uiLanguage", user_locale); } - request->SetStringKey("priority", params_.interactive_request - ? "USER_ACTION" - : "BACKGROUND_PREFETCH"); + request.Set("priority", params_.interactive_request ? "USER_ACTION" + : "BACKGROUND_PREFETCH"); - auto excluded = std::make_unique<base::ListValue>(); + base::Value::List excluded; for (const auto& id : params_.excluded_ids) { - excluded->Append(id); + excluded.Append(id); } - request->Set("excludedSuggestionIds", std::move(excluded)); + request.Set("excludedSuggestionIds", std::move(excluded)); if (!user_class_.empty()) { - request->SetStringKey("userActivenessClass", user_class_); + request.Set("userActivenessClass", user_class_); } if (!display_capability_.empty()) { - request->SetStringKey("displayCapability", display_capability_); + request.Set("displayCapability", display_capability_); } language::UrlLanguageHistogram::LanguageInfo ui_language; language::UrlLanguageHistogram::LanguageInfo other_top_language; PrepareLanguages(&ui_language, &other_top_language); if (ui_language.frequency != 0 || other_top_language.frequency != 0) { - auto language_list = std::make_unique<base::ListValue>(); + base::Value::List language_list; if (ui_language.frequency > 0) { - AppendLanguageInfoToList(language_list.get(), ui_language); + AppendLanguageInfoToList(&language_list, ui_language); } if (other_top_language.frequency > 0) { - AppendLanguageInfoToList(language_list.get(), other_top_language); + AppendLanguageInfoToList(&language_list, other_top_language); } - request->Set("topLanguages", std::move(language_list)); + request.Set("topLanguages", std::move(language_list)); } // TODO(vitaliii): Support count_to_fetch without requiring // |exclusive_category|. if (params_.exclusive_category.has_value()) { - base::DictionaryValue exclusive_category_parameters; - exclusive_category_parameters.SetIntKey( - "id", params_.exclusive_category->remote_id()); - exclusive_category_parameters.SetIntKey("numSuggestions", - params_.count_to_fetch); - base::ListValue category_parameters; + base::Value::Dict exclusive_category_parameters; + exclusive_category_parameters.Set("id", + params_.exclusive_category->remote_id()); + exclusive_category_parameters.Set("numSuggestions", params_.count_to_fetch); + base::Value::List category_parameters; category_parameters.Append(std::move(exclusive_category_parameters)); - request->SetKey("categoryParameters", std::move(category_parameters)); + request.Set("categoryParameters", std::move(category_parameters)); } std::string request_json; bool success = base::JSONWriter::WriteWithOptions( - *request, base::JSONWriter::OPTIONS_PRETTY_PRINT, &request_json); + request, base::JSONWriter::OPTIONS_PRETTY_PRINT, &request_json); DCHECK(success); return request_json; }
diff --git a/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc b/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc index 76eba1e..4e1e82e 100644 --- a/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc +++ b/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc
@@ -1619,23 +1619,24 @@ return category_ranker_->Compare(left.first, right.first); }); // Convert the relevant info into a base::ListValue for storage. - base::ListValue list; + base::Value::List list; for (const auto& entry : to_store) { const Category& category = entry.first; const CategoryContent& content = *entry.second; - auto dict = std::make_unique<base::DictionaryValue>(); - dict->SetIntKey(kCategoryContentId, category.id()); + base::Value::Dict dict; + dict.Set(kCategoryContentId, category.id()); // TODO(tschumann): Persist other properties of the CategoryInfo. - dict->SetStringKey(kCategoryContentTitle, content.info.title()); - dict->SetBoolKey(kCategoryContentProvidedByServer, - content.included_in_last_server_response); + dict.Set(kCategoryContentTitle, content.info.title()); + dict.Set(kCategoryContentProvidedByServer, + content.included_in_last_server_response); bool has_fetch_action = content.info.additional_action() == ContentSuggestionsAdditionalAction::FETCH; - dict->SetBoolKey(kCategoryContentAllowFetchingMore, has_fetch_action); + dict.Set(kCategoryContentAllowFetchingMore, has_fetch_action); list.Append(std::move(dict)); } // Finally, store the result in the pref service. - pref_service_->Set(prefs::kRemoteSuggestionCategories, list); + pref_service_->Set(prefs::kRemoteSuggestionCategories, + base::Value(std::move(list))); } RemoteSuggestionsProviderImpl::CategoryContent::CategoryContent(
diff --git a/components/policy/core/common/cloud/encrypted_reporting_job_configuration.cc b/components/policy/core/common/cloud/encrypted_reporting_job_configuration.cc index 45d55356..57481fe3 100644 --- a/components/policy/core/common/cloud/encrypted_reporting_job_configuration.cc +++ b/components/policy/core/common/cloud/encrypted_reporting_job_configuration.cc
@@ -67,6 +67,14 @@ context_ = std::move(context); } +DeviceManagementService::Job::RetryMethod +EncryptedReportingJobConfiguration::ShouldRetry( + int response_code, + const std::string& response_body) { + // Do not retry on the Job level - ERP has its own retry mechanism. + return DeviceManagementService::Job::NO_RETRY; +} + std::string EncryptedReportingJobConfiguration::GetUmaString() const { return "Enterprise.EncryptedReportingSuccess"; }
diff --git a/components/policy/core/common/cloud/encrypted_reporting_job_configuration.h b/components/policy/core/common/cloud/encrypted_reporting_job_configuration.h index be6efc5..73c9b99 100644 --- a/components/policy/core/common/cloud/encrypted_reporting_job_configuration.h +++ b/components/policy/core/common/cloud/encrypted_reporting_job_configuration.h
@@ -96,6 +96,11 @@ protected: void UpdatePayloadBeforeGetInternal() override; + // DeviceManagementService::JobConfiguration + DeviceManagementService::Job::RetryMethod ShouldRetry( + int response_code, + const std::string& response_body) override; + std::string GetUmaString() const override; private:
diff --git a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h index a9e8916..ffdbc3e 100644 --- a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h +++ b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h
@@ -124,19 +124,6 @@ // Called internally by the NSWindowDelegate when the window is closing. void OnWindowWillClose(); - // Called by the NSWindowDelegate when a fullscreen operation begins. If - // |target_fullscreen_state| is true, the target state is fullscreen. - // Otherwise, a transition has begun to come out of fullscreen. - void OnFullscreenTransitionStart(bool target_fullscreen_state); - - // Called when a fullscreen transition completes. If target_fullscreen_state() - // does not match |actual_fullscreen_state|, a new transition will begin. - void OnFullscreenTransitionComplete(bool actual_fullscreen_state); - - // Transition the window into or out of fullscreen. This will immediately - // invert the value of target_fullscreen_state(). - void ToggleDesiredFullscreenState(bool async = false); - // Called by the NSWindowDelegate when the size of the window changes. void OnSizeChanged(); @@ -181,20 +168,16 @@ return child_windows_; } - NativeWidgetNSWindowFullscreenController* fullscreen_controller() { - return fullscreen_controller_.get(); + NativeWidgetNSWindowFullscreenController& fullscreen_controller() { + return fullscreen_controller_; } bool target_fullscreen_state() const { - if (fullscreen_controller_) - return fullscreen_controller_->GetTargetFullscreenState(); - return target_fullscreen_state_; + return fullscreen_controller_.GetTargetFullscreenState(); } bool window_visible() const; bool wants_to_be_visible() const { return wants_to_be_visible_; } bool in_fullscreen_transition() const { - if (fullscreen_controller_) - return fullscreen_controller_->IsInFullscreenTransition(); - return in_fullscreen_transition_; + return fullscreen_controller_.IsInFullscreenTransition(); } // Whether to run a custom animation for the provided |transition|. @@ -229,7 +212,6 @@ base::TimeDelta PreCommitTimeout() override; // remote_cocoa::mojom::NativeWidgetNSWindow: - void CreateFullscreenController() override; void CreateWindow(mojom::CreateWindowParamsPtr params) override; void SetParent(uint64_t parent_id) override; void CreateSelectFileDialog( @@ -258,7 +240,6 @@ void SetTransitionsToAnimate( remote_cocoa::mojom::VisibilityTransition transitions) override; void SetVisibleOnAllSpaces(bool always_visible) override; - void SetFullscreen(bool fullscreen) override; void EnterFullscreen(int64_t target_display_id) override; void ExitFullscreen() override; void SetCanAppearInExistingFullscreenSpaces( @@ -393,26 +374,8 @@ remote_cocoa::mojom::VisibilityTransition transitions_to_animate_ = remote_cocoa::mojom::VisibilityTransition::kBoth; - // Whether this window wants to be fullscreen. If a fullscreen animation is in - // progress then it might not be actually fullscreen. - bool target_fullscreen_state_ = false; - - // Whether this window is in a fullscreen transition, and the fullscreen state - // can not currently be changed. - bool in_fullscreen_transition_ = false; - - // Trying to close an NSWindow during a fullscreen transition will cause the - // window to lock up. Use this to track if CloseWindow was called during a - // fullscreen transition, to defer the -[NSWindow close] call until the - // transition is complete. - // https://crbug.com/945237 - bool has_deferred_window_close_ = false; - - // Manager of fullscreen state transitions. If this is non-nullptr, then it - // replaces `target_fullscreen_state_`, `in_fullscreen_transition_`, and - // `has_deferred_window_close_`. - std::unique_ptr<NativeWidgetNSWindowFullscreenController> - fullscreen_controller_; + // Manager of fullscreen state transitions. + NativeWidgetNSWindowFullscreenController fullscreen_controller_{this}; // Stores the value last read from -[NSWindow isVisible], to detect visibility // changes.
diff --git a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm index 26a2fa4..eb9598dd 100644 --- a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm +++ b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm
@@ -429,12 +429,6 @@ ui::ShowEmojiPanel(); } -void NativeWidgetNSWindowBridge::CreateFullscreenController() { - DCHECK(!fullscreen_controller_); - fullscreen_controller_ = - std::make_unique<NativeWidgetNSWindowFullscreenController>(this); -} - void NativeWidgetNSWindowBridge::CreateWindow( mojom::CreateWindowParamsPtr params) { SetWindow(CreateNSWindow(params.get())); @@ -608,13 +602,8 @@ } void NativeWidgetNSWindowBridge::CloseWindow() { - if (fullscreen_controller_) { - if (fullscreen_controller_->HasDeferredWindowClose()) - return; - } else { - if (has_deferred_window_close_) - return; - } + if (fullscreen_controller_.HasDeferredWindowClose()) + return; // Keep |window| on the stack so that the ObjectiveC block below can capture // it and properly increment the reference count bound to the posted task. @@ -657,16 +646,9 @@ [window orderOut:nil]; // Defer closing windows until after fullscreen transitions complete. - if (fullscreen_controller_) { - fullscreen_controller_->OnWindowWantsToClose(); - if (fullscreen_controller_->HasDeferredWindowClose()) - return; - } else { - if (in_fullscreen_transition_) { - has_deferred_window_close_ = true; - return; - } - } + fullscreen_controller_.OnWindowWantsToClose(); + if (fullscreen_controller_.HasDeferredWindowClose()) + return; // Many tests assume that base::RunLoop().RunUntilIdle() is always sufficient // to execute a close. However, in rare cases, -performSelector:..afterDelay:0 @@ -930,17 +912,7 @@ } void NativeWidgetNSWindowBridge::OnWindowWillClose() { - if (fullscreen_controller_) { - fullscreen_controller_->OnWindowWillClose(); - } else { - // If a window closes while in a fullscreen transition, then the window will - // hang in a zombie-like state. - // https://crbug.com/945237 - if (in_fullscreen_transition_) { - DLOG(ERROR) << "-[NSWindow close] while in fullscreen transition will " - "trigger zombie windows."; - } - } + fullscreen_controller_.OnWindowWillClose(); [window_ setCommandHandler:nil]; [window_ setCommandDispatcherDelegate:nil]; @@ -979,92 +951,6 @@ // Note: |this| and its host will be deleted here. } -void NativeWidgetNSWindowBridge::OnFullscreenTransitionStart( - bool target_fullscreen_state) { - DCHECK(!fullscreen_controller_); - DCHECK_NE(target_fullscreen_state, target_fullscreen_state_); - target_fullscreen_state_ = target_fullscreen_state; - in_fullscreen_transition_ = true; - - host_->OnWindowFullscreenTransitionStart(target_fullscreen_state); -} - -void NativeWidgetNSWindowBridge::OnFullscreenTransitionComplete( - bool actual_fullscreen_state) { - DCHECK(!fullscreen_controller_); - in_fullscreen_transition_ = false; - - // Add any children that were skipped during the fullscreen transition. - OrderChildren(); - - if (has_deferred_window_close_) { - [ns_window() close]; - return; - } - - if (target_fullscreen_state_ == actual_fullscreen_state) { - host_->OnWindowFullscreenTransitionComplete(actual_fullscreen_state); - return; - } - - // The transition completed, but into the wrong state. This can happen when - // there are calls to change the fullscreen state whilst mid-transition. - // First update to reflect reality so that OnTargetFullscreenStateChanged() - // expects the change. - target_fullscreen_state_ = actual_fullscreen_state; - ToggleDesiredFullscreenState(true /* async */); -} - -void NativeWidgetNSWindowBridge::ToggleDesiredFullscreenState(bool async) { - DCHECK(!fullscreen_controller_); - // If there is currently an animation into or out of fullscreen, then AppKit - // emits the string "not in fullscreen state" to stdio and does nothing. For - // this case, schedule a transition back into the desired state when the - // animation completes. - if (in_fullscreen_transition_) { - target_fullscreen_state_ = !target_fullscreen_state_; - return; - } - - // Going fullscreen implicitly makes the window visible. AppKit does this. - // That is, -[NSWindow isVisible] is always true after a call to -[NSWindow - // toggleFullScreen:]. Unfortunately, this change happens after AppKit calls - // -[NSWindowDelegate windowWillEnterFullScreen:], and AppKit doesn't send an - // orderWindow message. So intercepting the implicit change is hard. - // Luckily, to trigger externally, the window typically needs to be visible in - // the first place. So we can just ensure the window is visible here instead - // of relying on AppKit to do it, and not worry that OnVisibilityChanged() - // won't be called for externally triggered fullscreen requests. - if (!window_visible_) - SetVisibilityState(WindowVisibilityState::kShowInactive); - - // Enable fullscreen collection behavior because: - // 1: -[NSWindow toggleFullscreen:] would otherwise be ignored, - // 2: the fullscreen button must be enabled so the user can leave fullscreen. - // This will be reset when a transition out of fullscreen completes. - gfx::SetNSWindowCanFullscreen(window_, true); - - // Until 10.13, AppKit would obey a call to -toggleFullScreen: made inside - // OnFullscreenTransitionComplete(). Starting in 10.13, it behaves as though - // the transition is still in progress and just emits "not in a fullscreen - // state" when trying to exit fullscreen in the same runloop that entered it. - // To handle this case, invoke -toggleFullScreen: asynchronously. - if (async) { - [window_ performSelector:@selector(toggleFullScreen:) - withObject:nil - afterDelay:0]; - } else { - // Suppress synchronous CA transactions during AppKit fullscreen transition - // since there is no need for updates during such transition. - // Re-layout and re-paint will be done after the transtion. See - // https://crbug.com/875707 for potiential problems if we don't suppress. - // |ca_transaction_sync_suppressed_| will be reset to false when the next - // frame comes in. - ca_transaction_sync_suppressed_ = true; - [window_ toggleFullScreen:nil]; - } -} - void NativeWidgetNSWindowBridge::OnSizeChanged() { UpdateWindowGeometry(); } @@ -1135,16 +1021,10 @@ const gfx::Size& max_size, bool is_resizable, bool is_maximizable) { - if (fullscreen_controller_) { - if (!fullscreen_controller_->CanResize()) - return; - } else { - // Don't modify the size constraints or fullscreen collection behavior while - // in fullscreen or during a transition. OnFullscreenTransitionComplete will - // reset these after leaving fullscreen. - if (target_fullscreen_state_ || in_fullscreen_transition_) - return; - } + // Don't modify the size constraints or fullscreen collection behavior while + // in fullscreen or during a transition. + if (!fullscreen_controller_.CanResize()) + return; bool shows_resize_controls = is_resizable && (min_size.IsEmpty() || min_size != max_size); @@ -1324,7 +1204,7 @@ void NativeWidgetNSWindowBridge::FullscreenControllerTransitionComplete( bool is_fullscreen) { - DCHECK(!fullscreen_controller_->IsInFullscreenTransition()); + DCHECK(!fullscreen_controller_.IsInFullscreenTransition()); UpdateWindowGeometry(); UpdateWindowDisplay(); @@ -1381,14 +1261,12 @@ return false; if (!bridged_view_) return false; - if (fullscreen_controller_) { - // Suppress synchronous CA transactions during AppKit fullscreen transition - // since there is no need for updates during such transition. - // Re-layout and re-paint will be done after the transition. See - // https://crbug.com/875707 for potiential problems if we don't suppress. - if (fullscreen_controller_->IsInFullscreenTransition()) - return false; - } + // Suppress synchronous CA transactions during AppKit fullscreen transition + // since there is no need for updates during such transition. + // Re-layout and re-paint will be done after the transition. See + // https://crbug.com/875707 for potiential problems if we don't suppress. + if (fullscreen_controller_.IsInFullscreenTransition()) + return false; return content_dip_size_ != compositor_frame_dip_size_; } @@ -1420,15 +1298,7 @@ gfx::SetNSWindowVisibleOnAllWorkspaces(window_, always_visible); } -void NativeWidgetNSWindowBridge::SetFullscreen(bool fullscreen) { - DCHECK(!fullscreen_controller_); - if (fullscreen == target_fullscreen_state_) - return; - ToggleDesiredFullscreenState(); -} - void NativeWidgetNSWindowBridge::EnterFullscreen(int64_t target_display_id) { - DCHECK(fullscreen_controller_); // Going fullscreen implicitly makes the window visible. AppKit does this. // That is, -[NSWindow isVisible] is always true after a call to -[NSWindow // toggleFullScreen:]. Unfortunately, this change happens after AppKit calls @@ -1449,12 +1319,11 @@ // completes. gfx::SetNSWindowCanFullscreen(window_, true); - fullscreen_controller_->EnterFullscreen(target_display_id); + fullscreen_controller_.EnterFullscreen(target_display_id); } void NativeWidgetNSWindowBridge::ExitFullscreen() { - DCHECK(fullscreen_controller_); - fullscreen_controller_->ExitFullscreen(); + fullscreen_controller_.ExitFullscreen(); } void NativeWidgetNSWindowBridge::SetCanAppearInExistingFullscreenSpaces( @@ -1694,8 +1563,7 @@ } void NativeWidgetNSWindowBridge::UpdateWindowDisplay() { - if (fullscreen_controller_ && - fullscreen_controller_->IsInFullscreenTransition()) + if (fullscreen_controller_.IsInFullscreenTransition()) return; host_->OnWindowDisplayChanged(GetDisplayForWindow(window_.get()));
diff --git a/components/remote_cocoa/app_shim/views_nswindow_delegate.mm b/components/remote_cocoa/app_shim/views_nswindow_delegate.mm index ede47ec..2578994 100644 --- a/components/remote_cocoa/app_shim/views_nswindow_delegate.mm +++ b/components/remote_cocoa/app_shim/views_nswindow_delegate.mm
@@ -205,24 +205,15 @@ } - (void)windowWillEnterFullScreen:(NSNotification*)notification { - if (_parent->fullscreen_controller()) - _parent->fullscreen_controller()->OnWindowWillEnterFullscreen(); - else - _parent->OnFullscreenTransitionStart(true); + _parent->fullscreen_controller().OnWindowWillEnterFullscreen(); } - (void)windowDidEnterFullScreen:(NSNotification*)notification { - if (_parent->fullscreen_controller()) - _parent->fullscreen_controller()->OnWindowDidEnterFullscreen(); - else - _parent->OnFullscreenTransitionComplete(true); + _parent->fullscreen_controller().OnWindowDidEnterFullscreen(); } - (void)windowWillExitFullScreen:(NSNotification*)notification { - if (_parent->fullscreen_controller()) - _parent->fullscreen_controller()->OnWindowWillExitFullscreen(); - else - _parent->OnFullscreenTransitionStart(false); + _parent->fullscreen_controller().OnWindowWillExitFullscreen(); } - (void)windowDidExitFullScreen:(NSNotification*)notification { @@ -237,10 +228,7 @@ afterDelay:0]; } - if (_parent->fullscreen_controller()) - _parent->fullscreen_controller()->OnWindowDidExitFullscreen(); - else - _parent->OnFullscreenTransitionComplete(false); + _parent->fullscreen_controller().OnWindowDidExitFullscreen(); } // Allow non-resizable windows (without NSResizableWindowMask) to fill the
diff --git a/components/remote_cocoa/common/native_widget_ns_window.mojom b/components/remote_cocoa/common/native_widget_ns_window.mojom index 9414d53..8bd33f48 100644 --- a/components/remote_cocoa/common/native_widget_ns_window.mojom +++ b/components/remote_cocoa/common/native_widget_ns_window.mojom
@@ -90,14 +90,6 @@ // The interface through which a NativeWidgetMac may interact with an NSWindow // (possibly in a process separate from the browser process). interface NativeWidgetNSWindow { - // Enable fullscreen control through NativeWidgetNSWindowFullscreenController. - // This is done via a method instead of using a base::Feature because the app - // shim process does not synchronize its base::Features with the browser - // process. - // TODO(https://crbug.com/1302857): Remove this once FullscreenControllerMac - // is on by default. - CreateFullscreenController(); - // Create and set the NSWindow for the bridge. CreateWindow(CreateWindowParams params); @@ -179,12 +171,6 @@ // on all spaces. SetVisibleOnAllSpaces(bool always_visible); - // Called by NativeWidgetMac to initiate a transition to the specified target - // fullscreen state. - // TODO(https://crbug.com/1302857): Remove this once FullscreenControllerMac - // is on by default. - SetFullscreen(bool fullscreen); - // Initiate a transition to fullscreen on the specified display. If // `target_display_id` is invalid, then fullscreen should be entered on the // current display.
diff --git a/components/reporting/storage_selector/storage_selector.cc b/components/reporting/storage_selector/storage_selector.cc index 98867c6..1920560 100644 --- a/components/reporting/storage_selector/storage_selector.cc +++ b/components/reporting/storage_selector/storage_selector.cc
@@ -23,20 +23,20 @@ #include "components/reporting/util/status_macros.h" #include "components/reporting/util/statusor.h" -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) #include "chromeos/dbus/missive/missive_client.h" #include "components/reporting/storage/missive_storage_module.h" #include "components/reporting/storage/missive_storage_module_delegate_impl.h" using ::chromeos::MissiveClient; -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) namespace reporting { namespace { -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) // Features settings for storage and uploader. // Use `missived` by all browsers. const base::Feature kUseMissiveDaemonFeature{StorageSelector::kUseMissiveDaemon, @@ -51,36 +51,36 @@ base::FEATURE_DISABLED_BY_DEFAULT #endif // BUILDFLAG(IS_CHROMEOS_ASH) }; -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) } // namespace -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) // static const char StorageSelector::kUseMissiveDaemon[] = "ConnectMissiveDaemon"; // static const char StorageSelector::kProvideUploader[] = "ProvideUploader"; -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) // static bool StorageSelector::is_uploader_required() { -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) return base::FeatureList::IsEnabled(kProvideUploaderFeature); #else // Not ChromeOS return true; // Local storage must have an uploader. -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) } // static bool StorageSelector::is_use_missive() { -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) return base::FeatureList::IsEnabled(kUseMissiveDaemonFeature); #else // Not ChromeOS return false; // Use Local storage. -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) } -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) // static void StorageSelector::CreateMissiveStorageModule( base::OnceCallback<void(StatusOr<scoped_refptr<StorageModuleInterface>>)> @@ -113,5 +113,5 @@ std::move(cb).Run(missive_storage_module); return; } -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) } // namespace reporting
diff --git a/components/reporting/storage_selector/storage_selector.h b/components/reporting/storage_selector/storage_selector.h index e858a2f..e65cd28 100644 --- a/components/reporting/storage_selector/storage_selector.h +++ b/components/reporting/storage_selector/storage_selector.h
@@ -8,7 +8,6 @@ #include "base/files/file_path.h" #include "base/memory/scoped_refptr.h" #include "build/build_config.h" -#include "build/chromeos_buildflags.h" #include "components/reporting/storage/storage_module_interface.h" #include "components/reporting/storage/storage_uploader_interface.h" #include "components/reporting/util/status.h" @@ -24,22 +23,22 @@ // that case it always connects to Missive Daemon. class StorageSelector { public: -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) // Features to select specific backends. // By default storage is local (as opposed to missive daemon use) // and upload is enabled. static const char kUseMissiveDaemon[]; static const char kProvideUploader[]; -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) static bool is_use_missive(); static bool is_uploader_required(); -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) static void CreateMissiveStorageModule( base::OnceCallback<void(StatusOr<scoped_refptr<StorageModuleInterface>>)> cb); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) }; } // namespace reporting
diff --git a/components/reporting/util/BUILD.gn b/components/reporting/util/BUILD.gn index 4f7c61c..2e7f8ba2 100644 --- a/components/reporting/util/BUILD.gn +++ b/components/reporting/util/BUILD.gn
@@ -20,7 +20,10 @@ "file.cc", "file.h", ] - deps = [ "//base" ] + deps = [ + ":status", + "//base", + ] } source_set("shared_vector") {
diff --git a/components/reporting/util/file.cc b/components/reporting/util/file.cc index 3243c28..e598fd0 100644 --- a/components/reporting/util/file.cc +++ b/components/reporting/util/file.cc
@@ -11,6 +11,7 @@ #include "base/files/file_enumerator.h" #include "base/files/file_util.h" #include "base/logging.h" +#include "base/strings/strcat.h" namespace reporting { @@ -40,4 +41,102 @@ } return success; } + +StatusOr<std::string> MaybeReadFile(const base::FilePath& file_path, + int64_t offset) { + base::File file(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ); + if (!file.IsValid()) { + return Status(error::NOT_FOUND, + base::StrCat({"Could not open health data file ", + file_path.MaybeAsASCII()})); + } + + base::File::Info file_info; + if (!file.GetInfo(&file_info) || file_info.size - offset < 0) { + return Status(error::DATA_LOSS, + base::StrCat({"Failed to read data file info ", + file_path.MaybeAsASCII()})); + } + + std::string result; + result.resize(file_info.size - offset); + const int read_result = + file.Read(offset, result.data(), file_info.size - offset); + if (read_result != file_info.size - offset) { + return Status(error::DATA_LOSS, base::StrCat({"Failed to read data file ", + file_path.MaybeAsASCII()})); + } + + return result; +} + +Status AppendLine(const base::FilePath& file_path, + const base::StringPiece& data) { + base::File file(file_path, + base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_APPEND); + if (!file.IsValid()) { + return Status(error::NOT_FOUND, + base::StrCat({"Could not open health data file ", + file_path.MaybeAsASCII()})); + } + + const std::string line = base::StrCat({data, "\n"}); + const int write_count = file.Write(0, line.data(), line.size()); + if (write_count < 0 || static_cast<size_t>(write_count) < line.size()) { + return Status(error::DATA_LOSS, + base::StrCat({"Failed to write health data file ", + file_path.MaybeAsASCII(), + " write count=", std::to_string(write_count)})); + } + return Status::StatusOK(); +} + +StatusOr<uint32_t> RemoveAndTruncateLine(const base::FilePath& file_path, + uint32_t pos) { + StatusOr<std::string> status_or = MaybeReadFile(file_path, pos); + if (!status_or.ok()) { + return status_or.status(); + } + std::string content = status_or.ValueOrDie(); + uint32_t offset = 0; + // Search for next new line after pos. + while (offset < content.length()) { + if (content.at(offset++) == '\n') { + break; + } + } + + // Check if the last line was removed. + if (offset >= content.length()) { + content = ""; + } else { + content = content.substr(offset); + } + + Status status = MaybeWriteFile(file_path, content); + if (!status.ok()) { + return status; + } + return pos + offset; +} + +Status MaybeWriteFile(const base::FilePath& file_path, + const base::StringPiece& data) { + base::File file(file_path, + base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); + if (!file.IsValid()) { + return Status(error::NOT_FOUND, base::StrCat({"Could not open data file ", + file_path.MaybeAsASCII()})); + } + + const int write_count = file.Write(0, data.data(), data.size()); + if (write_count < 0 || static_cast<size_t>(write_count) < data.size()) { + return Status( + error::DATA_LOSS, + base::StrCat({"Failed to write data file ", file_path.MaybeAsASCII(), + " write count=", std::to_string(write_count)})); + } + + return Status::StatusOK(); +} } // namespace reporting
diff --git a/components/reporting/util/file.h b/components/reporting/util/file.h index 02c213e..b4d8a292 100644 --- a/components/reporting/util/file.h +++ b/components/reporting/util/file.h
@@ -10,6 +10,9 @@ #include "base/callback.h" #include "base/files/file_enumerator.h" #include "base/files/file_util.h" +#include "base/strings/strcat.h" +#include "components/reporting/util/status.h" +#include "components/reporting/util/statusor.h" namespace reporting { @@ -29,6 +32,23 @@ base::RepeatingCallback<bool(const base::FilePath&)> pred = base::BindRepeating([](const base::FilePath&) { return true; })); +// Attempt to read entire file given from |file_path| starting from offset. +// Returns a string of the data read, or an error if one was encountered. +StatusOr<std::string> MaybeReadFile(const base::FilePath& file_path, + int64_t offset); + +// Appends |data| with a new line to |file_path|. +Status AppendLine(const base::FilePath& file_path, + const base::StringPiece& data); + +// Overwrites or creates a new file at |file_path| with the contents |data|. +Status MaybeWriteFile(const base::FilePath& file_path, + const base::StringPiece& data); + +// Removes the first |pos| bytes from a file at |file_path| and also removes +// the rest of the line which the byte at position |pos| was on. +StatusOr<uint32_t> RemoveAndTruncateLine(const base::FilePath& file_path, + uint32_t pos); } // namespace reporting #endif // COMPONENTS_REPORTING_UTIL_FILE_H_
diff --git a/components/reporting/util/file_unittest.cc b/components/reporting/util/file_unittest.cc index b896967a..d62f469 100644 --- a/components/reporting/util/file_unittest.cc +++ b/components/reporting/util/file_unittest.cc
@@ -7,12 +7,35 @@ #include "base/files/file.h" #include "base/files/scoped_temp_dir.h" #include "base/test/test_file_util.h" - +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +using ::testing::StrEq; + namespace reporting { namespace { +constexpr char kNewFile[] = "to_create.txt"; +constexpr char kWriteDataOne[] = "hello world!"; +constexpr char kWriteDataTwo[] = "bye world!"; +constexpr char kMultiLineData[] = "12\n34\n56\n78\n"; +constexpr size_t kMultiLineDataLineLength = 3; +constexpr size_t kMultiLineDataLines = 4; +constexpr size_t kOverFlowPos = 256; + +void RemoveAndTruncateTest(const base::FilePath& file_path, + uint32_t pos, + int expected_lines_removed) { + const auto remove_status = RemoveAndTruncateLine(file_path, 0); + ASSERT_OK(remove_status) << remove_status.status(); + const auto read_status = MaybeReadFile(file_path, 0); + ASSERT_OK(read_status) << read_status.status(); + ASSERT_THAT( + read_status.ValueOrDie(), + StrEq( + &kMultiLineData[expected_lines_removed * kMultiLineDataLineLength])); +} + TEST(FileTest, DeleteFileWarnIfFailed) { // This test briefly tests DeleteFileWarnIfFailed, as it mostly calls // DeleteFile(), which should be more extensively tested in base. @@ -84,5 +107,93 @@ << " still exists."; } +TEST(FileTest, ReadWriteFile) { + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + const auto dir_path = temp_dir.GetPath(); + ASSERT_TRUE(base::DirectoryExists(dir_path)); + + base::FilePath file_path; + ASSERT_TRUE(base::CreateTemporaryFileInDir(dir_path, &file_path)); + + auto write_status = MaybeWriteFile(file_path, kWriteDataOne); + ASSERT_OK(write_status) << write_status; + + auto read_status = MaybeReadFile(file_path, /*offset=*/0); + ASSERT_OK(read_status) << read_status.status(); + EXPECT_EQ(read_status.ValueOrDie(), kWriteDataOne); + + // Overwrite file. + write_status = MaybeWriteFile(file_path, kWriteDataTwo); + ASSERT_OK(write_status) << write_status; + + read_status = MaybeReadFile(file_path, /*offset=*/0); + ASSERT_OK(read_status) << read_status.status(); + EXPECT_EQ(read_status.ValueOrDie(), kWriteDataTwo); + + // Read file at an out of bounds index + read_status = MaybeReadFile(file_path, kOverFlowPos); + ASSERT_FALSE(read_status.ok()); + EXPECT_EQ(read_status.status().error_code(), error::DATA_LOSS); +} + +TEST(FileTest, AppendLine) { + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + const auto dir_path = temp_dir.GetPath(); + ASSERT_TRUE(base::DirectoryExists(dir_path)); + + base::FilePath file_path; + ASSERT_TRUE(base::CreateTemporaryFileInDir(dir_path, &file_path)); + + // Create files. + auto status = AppendLine(dir_path.AppendASCII(kNewFile), kWriteDataOne); + ASSERT_OK(status) << status; + + status = AppendLine(file_path, kWriteDataOne); + auto read_status = MaybeReadFile(file_path, /*offset=*/0); + ASSERT_OK(read_status) << read_status.status(); + ASSERT_EQ(read_status.ValueOrDie(), base::StrCat({kWriteDataOne, "\n"})); + + status = AppendLine(file_path, kWriteDataTwo); + read_status = MaybeReadFile(file_path, /*offset=*/0); + ASSERT_OK(read_status) << read_status.status(); + ASSERT_EQ(read_status.ValueOrDie(), + base::StrCat({kWriteDataOne, "\n", kWriteDataTwo, "\n"})); +} + +TEST(FileTest, RemoveAndTruncateLine) { + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + const auto dir_path = temp_dir.GetPath(); + ASSERT_TRUE(base::DirectoryExists(dir_path)); + + base::FilePath file_path; + ASSERT_TRUE(base::CreateTemporaryFileInDir(dir_path, &file_path)); + + const auto write_status = MaybeWriteFile(file_path, kMultiLineData); + ASSERT_OK(write_status) << write_status; + + // Load test data into string for substr method. + const std::string multi_line_ref(kMultiLineData); + int expected_lines_removed = 1; + + // Remove at beginning of line + RemoveAndTruncateTest(file_path, 0, expected_lines_removed++); + + // Remove at middle of line + RemoveAndTruncateTest(file_path, kMultiLineDataLineLength / 2, + expected_lines_removed++); + + // Remove at end of line + RemoveAndTruncateTest(file_path, kMultiLineDataLineLength - 1, + expected_lines_removed++); + + // Remove at end of file + const auto lines_left = kMultiLineDataLines - expected_lines_removed; + RemoveAndTruncateTest(file_path, kMultiLineDataLineLength * lines_left - 1, + expected_lines_removed); +} + } // namespace } // namespace reporting
diff --git a/components/resources/default_100_percent/autofill/virtual_card_enroll.png b/components/resources/default_100_percent/autofill/virtual_card_enroll.png index 660bb83..993fbae1 100644 --- a/components/resources/default_100_percent/autofill/virtual_card_enroll.png +++ b/components/resources/default_100_percent/autofill/virtual_card_enroll.png Binary files differ
diff --git a/components/resources/default_100_percent/autofill/virtual_card_enroll_dark.png b/components/resources/default_100_percent/autofill/virtual_card_enroll_dark.png index ad82791..25562bda 100644 --- a/components/resources/default_100_percent/autofill/virtual_card_enroll_dark.png +++ b/components/resources/default_100_percent/autofill/virtual_card_enroll_dark.png Binary files differ
diff --git a/components/resources/default_200_percent/autofill/virtual_card_enroll.png b/components/resources/default_200_percent/autofill/virtual_card_enroll.png index b4132491..f7d2499 100644 --- a/components/resources/default_200_percent/autofill/virtual_card_enroll.png +++ b/components/resources/default_200_percent/autofill/virtual_card_enroll.png Binary files differ
diff --git a/components/resources/default_200_percent/autofill/virtual_card_enroll_dark.png b/components/resources/default_200_percent/autofill/virtual_card_enroll_dark.png index aa6fdb7..00972335 100644 --- a/components/resources/default_200_percent/autofill/virtual_card_enroll_dark.png +++ b/components/resources/default_200_percent/autofill/virtual_card_enroll_dark.png Binary files differ
diff --git a/components/resources/default_300_percent/autofill/virtual_card_enroll.png b/components/resources/default_300_percent/autofill/virtual_card_enroll.png index 1a18b1e..a9efe38b 100644 --- a/components/resources/default_300_percent/autofill/virtual_card_enroll.png +++ b/components/resources/default_300_percent/autofill/virtual_card_enroll.png Binary files differ
diff --git a/components/resources/default_300_percent/autofill/virtual_card_enroll_dark.png b/components/resources/default_300_percent/autofill/virtual_card_enroll_dark.png index d393ec1d..e062bfd 100644 --- a/components/resources/default_300_percent/autofill/virtual_card_enroll_dark.png +++ b/components/resources/default_300_percent/autofill/virtual_card_enroll_dark.png Binary files differ
diff --git a/components/segmentation_platform/internal/BUILD.gn b/components/segmentation_platform/internal/BUILD.gn index 4229dcf..3a565001 100644 --- a/components/segmentation_platform/internal/BUILD.gn +++ b/components/segmentation_platform/internal/BUILD.gn
@@ -18,8 +18,6 @@ sources = [ "constants.cc", "constants.h", - "data_collection/data_collection_scheduler.cc", - "data_collection/data_collection_scheduler.h", "data_collection/dummy_training_data_collector.cc", "data_collection/dummy_training_data_collector.h", "data_collection/training_data_collector.cc", @@ -189,7 +187,6 @@ # IMPORTANT NOTE: When adding new tests, also remember to update the list of # tests in //components/segmentation_platform/components_unittests.filter sources = [ - "data_collection/data_collection_scheduler_unittest.cc", "data_collection/training_data_collector_impl_unittest.cc", "database/database_maintenance_impl_unittest.cc", "database/metadata_utils_unittest.cc",
diff --git a/components/segmentation_platform/internal/data_collection/data_collection_scheduler.cc b/components/segmentation_platform/internal/data_collection/data_collection_scheduler.cc deleted file mode 100644 index abd5db4..0000000 --- a/components/segmentation_platform/internal/data_collection/data_collection_scheduler.cc +++ /dev/null
@@ -1,66 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/segmentation_platform/internal/data_collection/data_collection_scheduler.h" -#include "base/threading/thread_task_runner_handle.h" -#include "base/time/clock.h" -#include "components/prefs/pref_service.h" -#include "components/segmentation_platform/internal/constants.h" -#include "components/segmentation_platform/internal/data_collection/training_data_collector.h" - -namespace segmentation_platform { - -namespace { -// Minimum intervals between collection. -// TODO(qinmin): make this configurable through finch. -static int kMinimumReportingIntervalInHours = 12; - -// Given the last report time, calculate the next report time. -base::Time GetNextReportTime(base::Time last_report_time) { - // The next report time is determined by the next day after the last - // report or the |kMinimumReportingIntervalInHours| hours after last report, - // whichever arrived later. - base::Time next_day = - base::Time() + - base::Days(1 + (last_report_time - base::Time()).InDaysFloored()); - base::Time next_allowed_report_time = - last_report_time + base::Hours(kMinimumReportingIntervalInHours); - - return next_day > next_allowed_report_time ? next_day - : next_allowed_report_time; -} - -} // namespace - -DataCollectionScheduler::DataCollectionScheduler( - TrainingDataCollector* training_data_collector, - PrefService* prefs, - base::Clock* clock) - : training_data_collector_(training_data_collector), - prefs_(prefs), - clock_(clock) {} - -DataCollectionScheduler::~DataCollectionScheduler() = default; - -void DataCollectionScheduler::ReportTrainingDataIfApplicable() { - base::Time last_collection_time = - prefs_->GetTime(kSegmentationLastCollectionTimePref); - base::Time now = clock_->Now(); - - base::Time next_collection_time = GetNextReportTime(last_collection_time); - base::TimeDelta delay_to_next_collection = next_collection_time - now; - if (now >= next_collection_time) { - training_data_collector_->ReportCollectedContinuousTrainingData(); - delay_to_next_collection = GetNextReportTime(now) - now; - } - - // Schedule a task for the next report. - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, - base::BindOnce(&DataCollectionScheduler::ReportTrainingDataIfApplicable, - weak_ptr_factory_.GetWeakPtr()), - delay_to_next_collection); -} - -} // namespace segmentation_platform \ No newline at end of file
diff --git a/components/segmentation_platform/internal/data_collection/data_collection_scheduler.h b/components/segmentation_platform/internal/data_collection/data_collection_scheduler.h deleted file mode 100644 index dfe1b412..0000000 --- a/components/segmentation_platform/internal/data_collection/data_collection_scheduler.h +++ /dev/null
@@ -1,46 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_DATA_COLLECTION_DATA_COLLECTION_SCHEDULER_H_ -#define COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_DATA_COLLECTION_DATA_COLLECTION_SCHEDULER_H_ - -#include "base/memory/raw_ptr.h" -#include "base/memory/weak_ptr.h" - -class PrefService; - -namespace base { -class Clock; -} // namespace base - -namespace segmentation_platform { -class TrainingDataCollector; - -// Class for determining when to upload structured metrics for continuously -// observed features. -class DataCollectionScheduler { - public: - DataCollectionScheduler(TrainingDataCollector* training_data_collector, - PrefService* prefs, - base::Clock* clock); - ~DataCollectionScheduler(); - - // Disallow copy/assign. - DataCollectionScheduler(const DataCollectionScheduler&) = delete; - DataCollectionScheduler& operator=(const DataCollectionScheduler&) = delete; - - // Report training data through UKM messages if applicable. - void ReportTrainingDataIfApplicable(); - - private: - raw_ptr<TrainingDataCollector> training_data_collector_; - PrefService* prefs_; - base::Clock* clock_; - - base::WeakPtrFactory<DataCollectionScheduler> weak_ptr_factory_{this}; -}; - -} // namespace segmentation_platform - -#endif // COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_DATA_COLLECTION_DATA_COLLECTION_SCHEDULER_H_
diff --git a/components/segmentation_platform/internal/data_collection/data_collection_scheduler_unittest.cc b/components/segmentation_platform/internal/data_collection/data_collection_scheduler_unittest.cc deleted file mode 100644 index 3298da8c..0000000 --- a/components/segmentation_platform/internal/data_collection/data_collection_scheduler_unittest.cc +++ /dev/null
@@ -1,99 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/segmentation_platform/internal/data_collection/data_collection_scheduler.h" - -#include "base/run_loop.h" -#include "base/test/simple_test_clock.h" -#include "base/test/task_environment.h" -#include "components/prefs/testing_pref_service.h" -#include "components/segmentation_platform/internal/constants.h" -#include "components/segmentation_platform/internal/data_collection/training_data_collector.h" -#include "components/segmentation_platform/public/segmentation_platform_service.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace segmentation_platform { - -class TestTrainingDataCollector : public TrainingDataCollector { - public: - TestTrainingDataCollector() = default; - ~TestTrainingDataCollector() override = default; - - // TrainingDataCollector implementation. - void OnModelMetadataUpdated() override{}; - void OnServiceInitialized() override{}; - void ReportCollectedContinuousTrainingData() override { - training_data_reported_ = true; - } - - bool training_data_reported() const { return training_data_reported_; } - - private: - bool training_data_reported_ = false; - base::OnceClosure quit_closure_; -}; - -class DataCollectionSchedulerTest : public ::testing::Test { - public: - DataCollectionSchedulerTest() = default; - ~DataCollectionSchedulerTest() override = default; - - void SetUp() override { - SegmentationPlatformService::RegisterLocalStatePrefs(prefs_.registry()); - data_collection_scheduler_ = std::make_unique<DataCollectionScheduler>( - &training_data_collector_, &prefs_, &clock_); - } - - void AdvanceTime(base::TimeDelta time_delta) { - clock_.Advance(time_delta); - task_environment_.FastForwardBy(time_delta); - } - - protected: - base::test::TaskEnvironment task_environment_{ - base::test::TaskEnvironment::TimeSource::MOCK_TIME}; - std::unique_ptr<DataCollectionScheduler> data_collection_scheduler_; - TestTrainingDataCollector training_data_collector_; - TestingPrefServiceSimple prefs_; - base::SimpleTestClock clock_; -}; - -// If there are no prior report, report will happen immediately if -// the current time is larger than base::Time() + base::Hourse(24). -TEST_F(DataCollectionSchedulerTest, NoPriorReport) { - data_collection_scheduler_->ReportTrainingDataIfApplicable(); - EXPECT_FALSE(training_data_collector_.training_data_reported()); - - AdvanceTime(base::Hours(10)); - EXPECT_FALSE(training_data_collector_.training_data_reported()); - - AdvanceTime(base::Hours(20)); - - // training_data_collector_.ExpectTrainingDataReported(); - EXPECT_TRUE(training_data_collector_.training_data_reported()); -} - -// Tests that after reporting, newly collected data will be correctly reported -// on next day. -TEST_F(DataCollectionSchedulerTest, ReportOnNextDay) { - base::Time last_collection; - EXPECT_TRUE(base::Time::FromString("Thu, 15 Oct 2021 20:45:00 GMT", - &last_collection)); - prefs_.SetTime(kSegmentationLastCollectionTimePref, last_collection); - clock_.SetNow(last_collection); - data_collection_scheduler_->ReportTrainingDataIfApplicable(); - - // Within the same day, no report will happen. - AdvanceTime(base::Hours(3)); - EXPECT_FALSE(training_data_collector_.training_data_reported()); - - // No reporting if last reporting is within time limit. - AdvanceTime(base::Hours(5)); - EXPECT_FALSE(training_data_collector_.training_data_reported()); - - AdvanceTime(base::Hours(5)); - EXPECT_TRUE(training_data_collector_.training_data_reported()); -} - -} // namespace segmentation_platform \ No newline at end of file
diff --git a/components/segmentation_platform/internal/data_collection/training_data_collector.cc b/components/segmentation_platform/internal/data_collection/training_data_collector.cc index 46bde2d..9223fc2 100644 --- a/components/segmentation_platform/internal/data_collection/training_data_collector.cc +++ b/components/segmentation_platform/internal/data_collection/training_data_collector.cc
@@ -19,12 +19,14 @@ processing::FeatureListQueryProcessor* processor, HistogramSignalHandler* histogram_signal_handler, SignalStorageConfig* signal_storage_config, + std::vector<std::unique_ptr<Config>>* configs, + PrefService* profile_prefs, base::Clock* clock) { if (base::FeatureList::IsEnabled( features::kSegmentationStructuredMetricsFeature)) { return std::make_unique<TrainingDataCollectorImpl>( segment_info_database, processor, histogram_signal_handler, - signal_storage_config, clock); + signal_storage_config, configs, profile_prefs, clock); } return std::make_unique<DummyTrainingDataCollector>();
diff --git a/components/segmentation_platform/internal/data_collection/training_data_collector.h b/components/segmentation_platform/internal/data_collection/training_data_collector.h index 0fb7418cf..f996955f 100644 --- a/components/segmentation_platform/internal/data_collection/training_data_collector.h +++ b/components/segmentation_platform/internal/data_collection/training_data_collector.h
@@ -9,6 +9,8 @@ #include "components/segmentation_platform/internal/signals/histogram_signal_handler.h" +class PrefService; + namespace base { class Clock; } // namespace base @@ -18,6 +20,8 @@ namespace processing { class FeatureListQueryProcessor; } + +struct Config; class HistogramSignalHandler; class SegmentInfoDatabase; class SignalStorageConfig; @@ -32,6 +36,8 @@ processing::FeatureListQueryProcessor* processor, HistogramSignalHandler* histogram_signal_handler, SignalStorageConfig* signal_storage_config, + std::vector<std::unique_ptr<Config>>* configs, + PrefService* profile_prefs, base::Clock* clock); // Called when model metadata is updated. May result in training data
diff --git a/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc b/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc index 81e0d40..ef1b6c6 100644 --- a/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc +++ b/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc
@@ -8,18 +8,32 @@ #include "base/metrics/metrics_hashes.h" #include "base/notreached.h" #include "base/time/clock.h" +#include "components/segmentation_platform/internal/constants.h" #include "components/segmentation_platform/internal/database/metadata_utils.h" #include "components/segmentation_platform/internal/database/signal_storage_config.h" #include "components/segmentation_platform/internal/execution/processing/feature_list_query_processor.h" #include "components/segmentation_platform/internal/proto/model_metadata.pb.h" #include "components/segmentation_platform/internal/segmentation_ukm_helper.h" +#include "components/segmentation_platform/internal/selection/segmentation_result_prefs.h" #include "components/segmentation_platform/internal/stats.h" +#include "components/segmentation_platform/public/config.h" #include "components/segmentation_platform/public/local_state_helper.h" namespace segmentation_platform { namespace { using processing::FeatureListQueryProcessor; +// Minimum intervals between collection. +// TODO(qinmin): make this configurable through finch. +static int kMinimumReportingIntervalInHours = 24; + +// Given the last report time, calculate the next report time. +base::Time GetNextReportTime(base::Time last_report_time) { + // The next report time is determined by |kMinimumReportingIntervalInHours| + // hours after last report. + return last_report_time + base::Hours(kMinimumReportingIntervalInHours); +} + // Parse outputs into a map of metric hash of the uma output and its index in // the output list. std::map<uint64_t, int> ParseUmaOutputs( @@ -39,6 +53,21 @@ return hash_index_map; } +// Find the segmentation key from the configs that contains the segment ID. +std::string GetSegmentationKey(std::vector<std::unique_ptr<Config>>* configs, + OptimizationTarget segment_id) { + if (!configs) + return std::string(); + + for (const auto& config : *configs) { + if (std::find(config->segment_ids.begin(), config->segment_ids.end(), + segment_id) != config->segment_ids.end()) { + return config->segmentation_key; + } + } + return std::string(); +} + } // namespace TrainingDataCollectorImpl::TrainingDataCollectorImpl( @@ -46,12 +75,16 @@ processing::FeatureListQueryProcessor* processor, HistogramSignalHandler* histogram_signal_handler, SignalStorageConfig* signal_storage_config, + std::vector<std::unique_ptr<Config>>* configs, + PrefService* profile_prefs, base::Clock* clock) : segment_info_database_(segment_info_database), feature_list_query_processor_(processor), histogram_signal_handler_(histogram_signal_handler), signal_storage_config_(signal_storage_config), - clock_(clock) {} + configs_(configs), + clock_(clock), + result_prefs_(std::make_unique<SegmentationResultPrefs>(profile_prefs)) {} TrainingDataCollectorImpl::~TrainingDataCollectorImpl() { histogram_signal_handler_->RemoveObserver(this); @@ -62,9 +95,11 @@ } void TrainingDataCollectorImpl::OnServiceInitialized() { - segment_info_database_->GetAllSegmentInfo( - base::BindOnce(&TrainingDataCollectorImpl::OnGetSegmentsInfoList, - weak_ptr_factory_.GetWeakPtr())); + if (!SegmentationUkmHelper::GetInstance()->allowed_segment_ids().empty()) { + segment_info_database_->GetAllSegmentInfo( + base::BindOnce(&TrainingDataCollectorImpl::OnGetSegmentsInfoList, + weak_ptr_factory_.GetWeakPtr())); + } } void TrainingDataCollectorImpl::OnGetSegmentsInfoList( @@ -109,6 +144,8 @@ immediate_collection_histograms_[hash_index.first].emplace(segment.first); } } + + ReportCollectedContinuousTrainingData(); } void TrainingDataCollectorImpl::OnHistogramSignalUpdated( @@ -198,7 +235,8 @@ base::TimeDelta signal_storage_length = model_metadata.signal_storage_length() * metadata_utils::GetTimeUnit(model_metadata); - if (LocalStateHelper::GetInstance().GetUkmMostRecentAllowedTime() + + if (LocalStateHelper::GetInstance().GetPrefTime( + kSegmentationUkmMostRecentAllowedTimeKey) + signal_storage_length >= clock_->Now()) { RecordTrainingDataCollectionEvent( @@ -249,9 +287,23 @@ return; } + // TODO(qinmin): update SegmentationUkmHelper::RecordTrainingData() + // and ukm file for description of the prediction result as it is + // the segment selection result, rather than model result. + std::string segmentation_key = + GetSegmentationKey(configs_, segment_info.segment_id()); absl::optional<proto::PredictionResult> result; - if (segment_info.has_prediction_result()) { - result = segment_info.prediction_result(); + auto selected_segment = + result_prefs_->ReadSegmentationResultFromPref(segmentation_key); + if (selected_segment.has_value()) { + DCHECK(!segmentation_key.empty()); + proto::PredictionResult prediction_result; + prediction_result.set_result( + static_cast<int>(selected_segment->segment_id)); + prediction_result.set_timestamp_us( + selected_segment->selection_time.ToDeltaSinceWindowsEpoch() + .InMicroseconds()); + result = prediction_result; } std::vector<int> output_indexes; @@ -274,21 +326,34 @@ RecordTrainingDataCollectionEvent( segment_info.segment_id(), stats::TrainingDataCollectionEvent::kUkmReportingFailed); - } else { - RecordTrainingDataCollectionEvent( - segment_info.segment_id(), - param.has_value() - ? stats::TrainingDataCollectionEvent::kImmediateCollectionSuccess - : stats::TrainingDataCollectionEvent::kContinousCollectionSuccess); + return; + } + + RecordTrainingDataCollectionEvent( + segment_info.segment_id(), + param.has_value() + ? stats::TrainingDataCollectionEvent::kImmediateCollectionSuccess + : stats::TrainingDataCollectionEvent::kContinousCollectionSuccess); + if (!param.has_value()) { + LocalStateHelper::GetInstance().SetPrefTime( + kSegmentationLastCollectionTimePref, clock_->Now()); } } void TrainingDataCollectorImpl::ReportCollectedContinuousTrainingData() { - segment_info_database_->GetSegmentInfoForSegments( - std::vector<OptimizationTarget>(continuous_collection_segments_.begin(), - continuous_collection_segments_.end()), - base::BindOnce(&TrainingDataCollectorImpl::ReportForSegmentsInfoList, - weak_ptr_factory_.GetWeakPtr(), absl::nullopt)); + if (continuous_collection_segments_.empty()) + return; + + base::Time last_collection_time = LocalStateHelper::GetInstance().GetPrefTime( + kSegmentationLastCollectionTimePref); + base::Time next_collection_time = GetNextReportTime(last_collection_time); + if (clock_->Now() >= next_collection_time) { + segment_info_database_->GetSegmentInfoForSegments( + std::vector<OptimizationTarget>(continuous_collection_segments_.begin(), + continuous_collection_segments_.end()), + base::BindOnce(&TrainingDataCollectorImpl::ReportForSegmentsInfoList, + weak_ptr_factory_.GetWeakPtr(), absl::nullopt)); + } } } // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/data_collection/training_data_collector_impl.h b/components/segmentation_platform/internal/data_collection/training_data_collector_impl.h index 228c4290..b1bfc95 100644 --- a/components/segmentation_platform/internal/data_collection/training_data_collector_impl.h +++ b/components/segmentation_platform/internal/data_collection/training_data_collector_impl.h
@@ -23,6 +23,8 @@ using optimization_guide::proto::OptimizationTarget; namespace segmentation_platform { +struct Config; +class SegmentationResultPrefs; // Implementation of TrainingDataCollector. class TrainingDataCollectorImpl : public TrainingDataCollector, @@ -32,6 +34,8 @@ processing::FeatureListQueryProcessor* processor, HistogramSignalHandler* histogram_signal_handler, SignalStorageConfig* signal_storage_config, + std::vector<std::unique_ptr<Config>>* configs, + PrefService* profile_prefs, base::Clock* clock); ~TrainingDataCollectorImpl() override; @@ -75,8 +79,12 @@ raw_ptr<processing::FeatureListQueryProcessor> feature_list_query_processor_; raw_ptr<HistogramSignalHandler> histogram_signal_handler_; raw_ptr<SignalStorageConfig> signal_storage_config_; + raw_ptr<std::vector<std::unique_ptr<Config>>> configs_; raw_ptr<base::Clock> clock_; + // Helper class to read/write results to the prefs. + std::unique_ptr<SegmentationResultPrefs> result_prefs_; + // Hash of histograms for immediate training data collection. When any // histogram hash contained in the map is recorded, a UKM message is reported // right away.
diff --git a/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc b/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc index 7746162..0bcbd5e8 100644 --- a/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc +++ b/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc
@@ -12,6 +12,7 @@ #include "base/test/simple_test_clock.h" #include "base/test/task_environment.h" #include "components/prefs/testing_pref_service.h" +#include "components/segmentation_platform/internal/constants.h" #include "components/segmentation_platform/internal/database/metadata_utils.h" #include "components/segmentation_platform/internal/database/mock_signal_storage_config.h" #include "components/segmentation_platform/internal/database/test_segment_info_database.h" @@ -19,6 +20,7 @@ #include "components/segmentation_platform/internal/proto/model_metadata.pb.h" #include "components/segmentation_platform/internal/proto/model_prediction.pb.h" #include "components/segmentation_platform/internal/segmentation_ukm_helper.h" +#include "components/segmentation_platform/internal/selection/segmentation_result_prefs.h" #include "components/segmentation_platform/internal/signals/mock_histogram_signal_handler.h" #include "components/segmentation_platform/public/config.h" #include "components/segmentation_platform/public/features.h" @@ -41,6 +43,7 @@ OptimizationTarget::OPTIMIZATION_TARGET_SEGMENTATION_SHARE; constexpr char kHistogramName0[] = "histogram0"; constexpr char kHistogramName1[] = "histogram1"; +constexpr char kSegmentationKey[] = "test_key"; constexpr int64_t kModelVersion = 123; constexpr int kSample = 1; @@ -54,7 +57,10 @@ void SetUp() override { SegmentationPlatformService::RegisterLocalStatePrefs(prefs_.registry()); + SegmentationPlatformService::RegisterProfilePrefs(prefs_.registry()); LocalStateHelper::GetInstance().Initialize(&prefs_); + LocalStateHelper::GetInstance().SetPrefTime( + kSegmentationLastCollectionTimePref, base::Time::Now()); clock_.SetNow(base::Time::Now()); test_recorder_.Purge(); @@ -72,9 +78,24 @@ .WillByDefault(Return(true)); test_segment_info_db_ = std::make_unique<test::TestSegmentInfoDatabase>(); + + configs_.emplace_back(std::make_unique<Config>()); + configs_[0]->segmentation_key = kSegmentationKey; + configs_[0]->segment_ids.push_back( + OptimizationTarget::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB); + configs_[0]->segment_ids.push_back( + OptimizationTarget::OPTIMIZATION_TARGET_SEGMENTATION_SHARE); + + SegmentationResultPrefs result_prefs(&prefs_); + SelectedSegment selected_segment( + OptimizationTarget::OPTIMIZATION_TARGET_SEGMENTATION_SHARE); + selected_segment.selection_time = base::Time::Now() - base::Days(1); + result_prefs.SaveSegmentationResultToPref(kSegmentationKey, + selected_segment); collector_ = std::make_unique<TrainingDataCollectorImpl>( test_segment_info_db_.get(), &feature_list_processor_, - &histogram_signal_handler_, &signal_storage_config_, &clock_); + &histogram_signal_handler_, &signal_storage_config_, &configs_, &prefs_, + &clock_); } protected: @@ -169,6 +190,8 @@ run_loop.Run(); } + ukm::TestAutoSetUkmRecorder* test_recorder() { return &test_recorder_; } + private: base::SimpleTestClock clock_; base::test::TaskEnvironment task_environment_; @@ -180,6 +203,7 @@ std::unique_ptr<test::TestSegmentInfoDatabase> test_segment_info_db_; std::unique_ptr<TrainingDataCollectorImpl> collector_; TestingPrefServiceSimple prefs_; + std::vector<std::unique_ptr<Config>> configs_; }; // No segment info in database. Do nothing. @@ -263,7 +287,8 @@ // No report if UKM is enabled recently. TEST_F(TrainingDataCollectorImplTest, PartialOutputNotAllowed) { // Simulate that UKM is allowed 300 seconds ago. - LocalStateHelper::GetInstance().SetUkmMostRecentAllowedTime( + LocalStateHelper::GetInstance().SetPrefTime( + kSegmentationUkmMostRecentAllowedTimeKey, clock()->Now() - base::Seconds(300)); CreateSegmentInfo(); Init(); @@ -272,13 +297,15 @@ ExpectUkmCount(0u); } -TEST_F(TrainingDataCollectorImplTest, WaitForContinousCollection) { +// Tests that continuous collection happens on startup. +TEST_F(TrainingDataCollectorImplTest, ContinousCollectionOnStartup) { ON_CALL(*feature_list_processor(), ProcessFeatureList(_, _, _, _, _)) .WillByDefault(RunOnceCallback<4>(true, std::vector<float>{1.f}, std::vector<float>{2.f, 3.f})); CreateSegmentInfo(); + clock()->Advance(base::Hours(24)); Init(); - WaitForContinousCollection(); + task_environment()->RunUntilIdle(); ExpectUkm({Segmentation_ModelExecution::kOptimizationTargetName, Segmentation_ModelExecution::kModelVersionName, Segmentation_ModelExecution::kInput0Name, @@ -290,5 +317,55 @@ SegmentationUkmHelper::FloatToInt64(3.f)}); } +// Tests that ReportCollectedContinuousTrainingData() works well later if +// no data is reported on start up. +TEST_F(TrainingDataCollectorImplTest, ReportCollectedContinuousTrainingData) { + ON_CALL(*feature_list_processor(), ProcessFeatureList(_, _, _, _, _)) + .WillByDefault(RunOnceCallback<4>(true, std::vector<float>{1.f}, + std::vector<float>{2.f, 3.f})); + CreateSegmentInfo(); + Init(); + clock()->Advance(base::Hours(24)); + WaitForContinousCollection(); + ExpectUkm( + {Segmentation_ModelExecution::kOptimizationTargetName, + Segmentation_ModelExecution::kModelVersionName, + Segmentation_ModelExecution::kInput0Name, + Segmentation_ModelExecution::kPredictionResultName, + Segmentation_ModelExecution::kOutputDelaySecName, + Segmentation_ModelExecution::kActualResultName, + Segmentation_ModelExecution::kActualResult2Name}, + {kTestOptimizationTarget0, kModelVersion, + SegmentationUkmHelper::FloatToInt64(1.f), + SegmentationUkmHelper::FloatToInt64(5.f), base::Days(1).InSeconds(), + SegmentationUkmHelper::FloatToInt64(2.f), + SegmentationUkmHelper::FloatToInt64(3.f)}); +} + +// Tests that after a data collection, another data collection won't happen +// immediately afterwards. +TEST_F(TrainingDataCollectorImplTest, + NoImmediateDataCollectionAfterLastCollection) { + ON_CALL(*feature_list_processor(), ProcessFeatureList(_, _, _, _, _)) + .WillByDefault(RunOnceCallback<4>(true, std::vector<float>{1.f}, + std::vector<float>{2.f, 3.f})); + CreateSegmentInfo(); + Init(); + clock()->Advance(base::Hours(24)); + WaitForContinousCollection(); + test_recorder()->Purge(); + ExpectUkmCount(0u); + + // Nothing should be collected if collection just happen. + collector()->ReportCollectedContinuousTrainingData(); + task_environment()->RunUntilIdle(); + ExpectUkmCount(0u); + + // Collect again after 24 hours and it should work. + clock()->Advance(base::Hours(24)); + WaitForContinousCollection(); + ExpectUkmCount(1u); +} + } // namespace } // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/local_state_helper_impl.cc b/components/segmentation_platform/internal/local_state_helper_impl.cc index 1d56c9d..3e582e2 100644 --- a/components/segmentation_platform/internal/local_state_helper_impl.cc +++ b/components/segmentation_platform/internal/local_state_helper_impl.cc
@@ -5,7 +5,6 @@ #include "components/segmentation_platform/internal/local_state_helper_impl.h" #include "components/prefs/pref_service.h" -#include "components/segmentation_platform/internal/constants.h" namespace segmentation_platform { @@ -23,16 +22,14 @@ local_state_ = local_state; } -void LocalStateHelperImpl::SetUkmMostRecentAllowedTime(base::Time time) { +void LocalStateHelperImpl::SetPrefTime(const char* pref_name, base::Time time) { if (local_state_) { - local_state_->SetTime(kSegmentationUkmMostRecentAllowedTimeKey, time); + local_state_->SetTime(pref_name, time); } } -base::Time LocalStateHelperImpl::GetUkmMostRecentAllowedTime() const { - return local_state_ - ? local_state_->GetTime(kSegmentationUkmMostRecentAllowedTimeKey) - : base::Time::Max(); +base::Time LocalStateHelperImpl::GetPrefTime(const char* pref_name) const { + return local_state_ ? local_state_->GetTime(pref_name) : base::Time::Max(); } } // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/local_state_helper_impl.h b/components/segmentation_platform/internal/local_state_helper_impl.h index 22cd034d..0646fecf 100644 --- a/components/segmentation_platform/internal/local_state_helper_impl.h +++ b/components/segmentation_platform/internal/local_state_helper_impl.h
@@ -22,8 +22,8 @@ // LocalStateHelper implementation. void Initialize(PrefService* local_state) override; - void SetUkmMostRecentAllowedTime(base::Time time) override; - base::Time GetUkmMostRecentAllowedTime() const override; + void SetPrefTime(const char* pref_name, base::Time time) override; + base::Time GetPrefTime(const char* pref_name) const override; private: friend base::NoDestructor<LocalStateHelperImpl>;
diff --git a/components/segmentation_platform/internal/scheduler/execution_service.cc b/components/segmentation_platform/internal/scheduler/execution_service.cc index 7c198ee..7087ea1 100644 --- a/components/segmentation_platform/internal/scheduler/execution_service.cc +++ b/components/segmentation_platform/internal/scheduler/execution_service.cc
@@ -6,13 +6,13 @@ #include "base/metrics/field_trial_params.h" #include "components/prefs/pref_service.h" -#include "components/segmentation_platform/internal/data_collection/data_collection_scheduler.h" #include "components/segmentation_platform/internal/data_collection/training_data_collector.h" #include "components/segmentation_platform/internal/database/storage_service.h" #include "components/segmentation_platform/internal/execution/model_executor_impl.h" #include "components/segmentation_platform/internal/execution/processing/feature_aggregator_impl.h" #include "components/segmentation_platform/internal/execution/processing/feature_list_query_processor.h" #include "components/segmentation_platform/internal/scheduler/model_execution_scheduler_impl.h" +#include "components/segmentation_platform/internal/segmentation_ukm_helper.h" #include "components/segmentation_platform/internal/signals/signal_handler.h" #include "components/segmentation_platform/public/config.h" #include "components/segmentation_platform/public/features.h" @@ -44,7 +44,8 @@ ModelProviderFactory* model_provider_factory, std::vector<ModelExecutionScheduler::Observer*>&& observers, const PlatformOptions& platform_options, - PrefService* local_state) { + std::vector<std::unique_ptr<Config>>* configs, + PrefService* profile_prefs) { feature_list_query_processor_ = std::make_unique<processing::FeatureListQueryProcessor>( storage_service, @@ -54,8 +55,7 @@ storage_service->segment_info_database(), feature_list_query_processor_.get(), signal_handler->deprecated_histogram_signal_handler(), - storage_service->signal_storage_config(), clock); - training_data_collector_->OnServiceInitialized(); + storage_service->signal_storage_config(), configs, profile_prefs, clock); model_executor_ = std::make_unique<ModelExecutorImpl>( clock, feature_list_query_processor_.get()); @@ -64,17 +64,6 @@ all_segment_ids, model_provider_factory, clock, storage_service->segment_info_database(), callback); - // TODO(qinmin): Store the allowed Id list in a SegmentationUkmHelper. - if (!base::GetFieldTrialParamValueByFeature( - features::kSegmentationStructuredMetricsFeature, - kSegmentIdsAllowedForReportingKey) - .empty()) { - data_collection_scheduler_ = std::make_unique<DataCollectionScheduler>( - training_data_collector_.get(), local_state, clock); - // TODO(qinmin): post a delayed task to run - // DataCollectionScheduler::ReportTrainingDataIfApplicable(). - } - model_execution_scheduler_ = std::make_unique<ModelExecutionSchedulerImpl>( std::move(observers), storage_service->segment_info_database(), storage_service->signal_storage_config(), model_execution_manager_.get(), @@ -120,4 +109,15 @@ /*expired_only=*/true); } +void ExecutionService::RunDailyTasks(bool is_startup) { + RefreshModelResults(); + + if (is_startup) { + // This will trigger data collection after initialization finishes. + training_data_collector_->OnServiceInitialized(); + } else { + training_data_collector_->ReportCollectedContinuousTrainingData(); + } +} + } // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/scheduler/execution_service.h b/components/segmentation_platform/internal/scheduler/execution_service.h index dbe2ebc..49e8028 100644 --- a/components/segmentation_platform/internal/scheduler/execution_service.h +++ b/components/segmentation_platform/internal/scheduler/execution_service.h
@@ -22,8 +22,8 @@ class FeatureListQueryProcessor; } +struct Config; struct PlatformOptions; -class DataCollectionScheduler; class ModelExecutor; class ModelProviderFactory; class SignalHandler; @@ -54,7 +54,8 @@ ModelProviderFactory* model_provider_factory, std::vector<ModelExecutionScheduler::Observer*>&& observers, const PlatformOptions& platform_options, - PrefService* local_state); + std::vector<std::unique_ptr<Config>>* configs, + PrefService* profile_prefs); // Called whenever a new or updated model is available. Must be a valid // SegmentInfo with valid metadata and features. @@ -90,6 +91,9 @@ // Refreshes model results for all eligible models. void RefreshModelResults(); + // Executes daily maintenance and collection tasks. + void RunDailyTasks(bool is_startup); + private: // Training/inference input data generation. std::unique_ptr<processing::FeatureListQueryProcessor> @@ -101,9 +105,6 @@ // Utility to execute model and return result. std::unique_ptr<ModelExecutor> model_executor_; - // Scheduler to launch tasks to report training data to the server. - std::unique_ptr<DataCollectionScheduler> data_collection_scheduler_; - // Model execution. std::unique_ptr<ModelExecutionManagerImpl> model_execution_manager_;
diff --git a/components/segmentation_platform/internal/segmentation_platform_service_impl.cc b/components/segmentation_platform/internal/segmentation_platform_service_impl.cc index 62d3115..c0152b9 100644 --- a/components/segmentation_platform/internal/segmentation_platform_service_impl.cc +++ b/components/segmentation_platform/internal/segmentation_platform_service_impl.cc
@@ -58,7 +58,7 @@ platform_options_(PlatformOptions::CreateDefault()), configs_(std::move(init_params->configs)), all_segment_ids_(GetAllSegmentIds(configs_)), - local_state_(init_params->local_state), + profile_prefs_(init_params->profile_prefs), creation_time_(clock_->Now()) { base::UmaHistogramMediumTimes( "SegmentationPlatform.Init.ProcessCreationToServiceCreationLatency", @@ -172,7 +172,7 @@ &SegmentationPlatformServiceImpl::OnSegmentationModelUpdated, weak_ptr_factory_.GetWeakPtr()), task_runner_, all_segment_ids_, model_provider_factory_.get(), - std::move(observers), platform_options_, local_state_); + std::move(observers), platform_options_, &configs_, profile_prefs_); proxy_->SetExecutionService(&execution_service_); @@ -214,7 +214,7 @@ } void SegmentationPlatformServiceImpl::RunDailyTasks(bool is_startup) { - execution_service_.RefreshModelResults(); + execution_service_.RunDailyTasks(is_startup); storage_service_->ExecuteDatabaseMaintenanceTasks(is_startup); base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
diff --git a/components/segmentation_platform/internal/segmentation_platform_service_impl.h b/components/segmentation_platform/internal/segmentation_platform_service_impl.h index ce16726..d409394 100644 --- a/components/segmentation_platform/internal/segmentation_platform_service_impl.h +++ b/components/segmentation_platform/internal/segmentation_platform_service_impl.h
@@ -144,8 +144,8 @@ std::unique_ptr<ServiceProxyImpl> proxy_; - // PrefService from browser's local state, not profile specific. - raw_ptr<PrefService> local_state_; + // PrefService from profile. + raw_ptr<PrefService> profile_prefs_; // For metrics only: const base::Time creation_time_;
diff --git a/components/segmentation_platform/internal/signals/ukm_observer.cc b/components/segmentation_platform/internal/signals/ukm_observer.cc index becb9f5..7e7f2707d 100644 --- a/components/segmentation_platform/internal/signals/ukm_observer.cc +++ b/components/segmentation_platform/internal/signals/ukm_observer.cc
@@ -6,6 +6,7 @@ #include <cstdint> +#include "components/segmentation_platform/internal/constants.h" #include "components/segmentation_platform/internal/signals/ukm_config.h" #include "components/segmentation_platform/internal/ukm_data_manager_impl.h" #include "components/segmentation_platform/public/local_state_helper.h" @@ -82,20 +83,20 @@ } void UkmObserver::OnUkmAllowedStateChanged(bool allowed) { - base::Time most_recent_allowed = - LocalStateHelper::GetInstance().GetUkmMostRecentAllowedTime(); + base::Time most_recent_allowed = LocalStateHelper::GetInstance().GetPrefTime( + kSegmentationUkmMostRecentAllowedTimeKey); if (!allowed) { if (most_recent_allowed != base::Time::Max()) { - LocalStateHelper::GetInstance().SetUkmMostRecentAllowedTime( - base::Time::Max()); + LocalStateHelper::GetInstance().SetPrefTime( + kSegmentationUkmMostRecentAllowedTimeKey, base::Time::Max()); } return; } // Update the most recent allowed time if needed. if (most_recent_allowed.is_null() || most_recent_allowed == base::Time::Max()) { - LocalStateHelper::GetInstance().SetUkmMostRecentAllowedTime( - base::Time::Now()); + LocalStateHelper::GetInstance().SetPrefTime( + kSegmentationUkmMostRecentAllowedTimeKey, base::Time::Now()); } }
diff --git a/components/segmentation_platform/internal/signals/ukm_observer_unittest.cc b/components/segmentation_platform/internal/signals/ukm_observer_unittest.cc index 046dfa726..70934b0a 100644 --- a/components/segmentation_platform/internal/signals/ukm_observer_unittest.cc +++ b/components/segmentation_platform/internal/signals/ukm_observer_unittest.cc
@@ -8,6 +8,7 @@ #include "base/test/task_environment.h" #include "components/prefs/testing_pref_service.h" +#include "components/segmentation_platform/internal/constants.h" #include "components/segmentation_platform/internal/database/mock_ukm_database.h" #include "components/segmentation_platform/internal/signals/ukm_config.h" #include "components/segmentation_platform/internal/signals/url_signal_handler.h" @@ -253,31 +254,35 @@ LocalStateHelper& local_state_helper = LocalStateHelper::GetInstance(); // Without pref entry, the |is_ukm_allowed| param passed to UkmObserver ctor // will determine the value to be returned. - EXPECT_LE(local_state_helper.GetUkmMostRecentAllowedTime(), - base::Time::Now()); + EXPECT_LE( + local_state_helper.GetPrefTime(kSegmentationUkmMostRecentAllowedTimeKey), + base::Time::Now()); InitializeUkmObserver(false /*is_ukm_allowed*/); - EXPECT_EQ(base::Time::Max(), - local_state_helper.GetUkmMostRecentAllowedTime()); + EXPECT_EQ(base::Time::Max(), local_state_helper.GetPrefTime( + kSegmentationUkmMostRecentAllowedTimeKey)); ukm_observer().OnUkmAllowedStateChanged(true); - EXPECT_LE(local_state_helper.GetUkmMostRecentAllowedTime(), - base::Time::Now()); + EXPECT_LE( + local_state_helper.GetPrefTime(kSegmentationUkmMostRecentAllowedTimeKey), + base::Time::Now()); // Change the allowed state to false, the start time should now be set to // Time::Max(). ukm_recorder().OnUkmAllowedStateChanged(false); base::RunLoop().RunUntilIdle(); - EXPECT_EQ(base::Time::Max(), - local_state_helper.GetUkmMostRecentAllowedTime()); + EXPECT_EQ(base::Time::Max(), local_state_helper.GetPrefTime( + kSegmentationUkmMostRecentAllowedTimeKey)); // Change the allowed state to true, the new start time should be close to // now. base::Time now = base::Time::Now(); ukm_recorder().OnUkmAllowedStateChanged(true); base::RunLoop().RunUntilIdle(); - EXPECT_LE(now, local_state_helper.GetUkmMostRecentAllowedTime()); - EXPECT_LE(local_state_helper.GetUkmMostRecentAllowedTime(), - base::Time::Now()); + EXPECT_LE(now, local_state_helper.GetPrefTime( + kSegmentationUkmMostRecentAllowedTimeKey)); + EXPECT_LE( + local_state_helper.GetPrefTime(kSegmentationUkmMostRecentAllowedTimeKey), + base::Time::Now()); } } // namespace segmentation_platform
diff --git a/components/segmentation_platform/public/local_state_helper.h b/components/segmentation_platform/public/local_state_helper.h index d7e3180f..14d8e060 100644 --- a/components/segmentation_platform/public/local_state_helper.h +++ b/components/segmentation_platform/public/local_state_helper.h
@@ -22,9 +22,9 @@ // methods. virtual void Initialize(PrefService* local_state) = 0; - // Sets and gets the most recent time when UKM is allowed. - virtual void SetUkmMostRecentAllowedTime(base::Time time) = 0; - virtual base::Time GetUkmMostRecentAllowedTime() const = 0; + // Sets and gets time in local state for the given pref name. + virtual void SetPrefTime(const char* pref_name, base::Time time) = 0; + virtual base::Time GetPrefTime(const char* pref_name) const = 0; virtual ~LocalStateHelper() = default; };
diff --git a/components/signin/core/browser/chrome_connected_header_helper.cc b/components/signin/core/browser/chrome_connected_header_helper.cc index 78876a1..c79af94 100644 --- a/components/signin/core/browser/chrome_connected_header_helper.cc +++ b/components/signin/core/browser/chrome_connected_header_helper.cc
@@ -207,7 +207,7 @@ // Sessions and Active Directory logins. Guest Sessions have already been // filtered upstream and we want to enforce account consistency in Public // Sessions and Active Directory logins. -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) force_account_consistency = true; #endif
diff --git a/components/signin/core/browser/signin_header_helper_unittest.cc b/components/signin/core/browser/signin_header_helper_unittest.cc index 3884e49..0953cdc 100644 --- a/components/signin/core/browser/signin_header_helper_unittest.cc +++ b/components/signin/core/browser/signin_header_helper_unittest.cc
@@ -182,7 +182,7 @@ scoped_refptr<content_settings::CookieSettings> cookie_settings_; }; -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) // Tests that Mirror request is returned on Chrome OS for Public Sessions (no // account id). TEST_F(SigninHeaderHelperTest, TestMirrorRequestNoAccountIdChromeOS) { @@ -198,7 +198,7 @@ "consistency_enabled_by_default=" + consistency_enabled_by_default_value()); } -#else // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#else // BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(IS_ANDROID) // Tests that eligible_for_consistency request is returned on Android // when reaching to Gaia origin and there's no primary account.
diff --git a/components/signin/internal/identity_manager/profile_oauth2_token_service_builder.cc b/components/signin/internal/identity_manager/profile_oauth2_token_service_builder.cc index 9d9220a..de96128 100644 --- a/components/signin/internal/identity_manager/profile_oauth2_token_service_builder.cc +++ b/components/signin/internal/identity_manager/profile_oauth2_token_service_builder.cc
@@ -25,7 +25,7 @@ #include "components/signin/public/webdata/token_web_data.h" #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) #include "components/signin/internal/identity_manager/profile_oauth2_token_service_delegate_chromeos.h" #endif @@ -53,7 +53,7 @@ signin_client, std::move(device_accounts_provider), account_tracker_service); } -#elif BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#elif BUILDFLAG(IS_CHROMEOS) std::unique_ptr<ProfileOAuth2TokenServiceDelegate> CreateCrOsOAuthDelegate( SigninClient* signin_client, AccountTrackerService* account_tracker_service, @@ -101,10 +101,10 @@ AccountTrackerService* account_tracker_service, signin::AccountConsistencyMethod account_consistency, SigninClient* signin_client, -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) account_manager::AccountManagerFacade* account_manager_facade, bool is_regular_profile, -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(ENABLE_DICE_SUPPORT) bool delete_signin_cookies_on_exit, scoped_refptr<TokenWebData> token_web_data, @@ -123,7 +123,7 @@ return CreateIOSOAuthDelegate(signin_client, std::move(device_accounts_provider), account_tracker_service); -#elif BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#elif BUILDFLAG(IS_CHROMEOS) return CreateCrOsOAuthDelegate(signin_client, account_tracker_service, network_connection_tracker, account_manager_facade, is_regular_profile); @@ -150,10 +150,10 @@ AccountTrackerService* account_tracker_service, network::NetworkConnectionTracker* network_connection_tracker, signin::AccountConsistencyMethod account_consistency, -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) account_manager::AccountManagerFacade* account_manager_facade, bool is_regular_profile, -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(ENABLE_DICE_SUPPORT) bool delete_signin_cookies_on_exit, scoped_refptr<TokenWebData> token_web_data, @@ -179,9 +179,9 @@ pref_service, CreateOAuth2TokenServiceDelegate( account_tracker_service, account_consistency, signin_client, -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) account_manager_facade, is_regular_profile, -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(ENABLE_DICE_SUPPORT) delete_signin_cookies_on_exit, token_web_data, #endif
diff --git a/components/signin/internal/identity_manager/profile_oauth2_token_service_builder.h b/components/signin/internal/identity_manager/profile_oauth2_token_service_builder.h index ffbb90f8..0031a7c 100644 --- a/components/signin/internal/identity_manager/profile_oauth2_token_service_builder.h +++ b/components/signin/internal/identity_manager/profile_oauth2_token_service_builder.h
@@ -9,7 +9,6 @@ #include "build/build_config.h" #include "build/buildflag.h" -#include "build/chromeos_buildflags.h" #include "components/signin/public/base/signin_buildflags.h" #if !BUILDFLAG(IS_ANDROID) @@ -41,21 +40,21 @@ class TokenWebData; #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) namespace account_manager { class AccountManagerFacade; } -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) std::unique_ptr<ProfileOAuth2TokenService> BuildProfileOAuth2TokenService( PrefService* pref_service, AccountTrackerService* account_tracker_service, network::NetworkConnectionTracker* network_connection_tracker, signin::AccountConsistencyMethod account_consistency, -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) account_manager::AccountManagerFacade* account_manager_facade, bool is_regular_profile, -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(ENABLE_DICE_SUPPORT) bool delete_signin_cookies_on_exit, scoped_refptr<TokenWebData> token_web_data,
diff --git a/components/signin/public/identity_manager/identity_manager.cc b/components/signin/public/identity_manager/identity_manager.cc index 2d8d85c..4fbf6f23 100644 --- a/components/signin/public/identity_manager/identity_manager.cc +++ b/components/signin/public/identity_manager/identity_manager.cc
@@ -121,7 +121,7 @@ #if BUILDFLAG(IS_CHROMEOS_LACROS) signin_client_(parameters.signin_client), #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) account_manager_facade_(parameters.account_manager_facade), #endif identity_mutator_(std::move(parameters.primary_account_mutator), @@ -559,7 +559,7 @@ return gaia_cookie_manager_service_.get(); } -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) account_manager::AccountManagerFacade* IdentityManager::GetAccountManagerFacade() const { return account_manager_facade_;
diff --git a/components/signin/public/identity_manager/identity_manager.h b/components/signin/public/identity_manager/identity_manager.h index 4cce79d..03aac66 100644 --- a/components/signin/public/identity_manager/identity_manager.h +++ b/components/signin/public/identity_manager/identity_manager.h
@@ -33,7 +33,7 @@ #include "base/time/time.h" #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) namespace account_manager { class AccountManagerFacade; } @@ -371,7 +371,7 @@ #if BUILDFLAG(IS_CHROMEOS_LACROS) SigninClient* signin_client = nullptr; #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) account_manager::AccountManagerFacade* account_manager_facade = nullptr; #endif @@ -550,7 +550,7 @@ const std::string& locale, const std::string& picture_url); -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) friend account_manager::AccountManagerFacade* GetAccountManagerFacade( IdentityManager* identity_manager); #endif // BUILDFLAG(IS_CHROMEOS_ASH) @@ -626,7 +626,7 @@ AccountTrackerService* GetAccountTrackerService() const; AccountFetcherService* GetAccountFetcherService() const; GaiaCookieManagerService* GetGaiaCookieManagerService() const; -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) account_manager::AccountManagerFacade* GetAccountManagerFacade() const; #endif @@ -686,7 +686,7 @@ #if BUILDFLAG(IS_CHROMEOS_LACROS) SigninClient* const signin_client_; #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) account_manager::AccountManagerFacade* const account_manager_facade_; #endif
diff --git a/components/signin/public/identity_manager/identity_manager_builder.cc b/components/signin/public/identity_manager/identity_manager_builder.cc index 904912c..ccf4942 100644 --- a/components/signin/public/identity_manager/identity_manager_builder.cc +++ b/components/signin/public/identity_manager/identity_manager_builder.cc
@@ -112,9 +112,9 @@ BuildProfileOAuth2TokenService( params->pref_service, account_tracker_service.get(), params->network_connection_tracker, params->account_consistency, -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) params->account_manager_facade, params->is_regular_profile, -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(ENABLE_DICE_SUPPORT) params->delete_signin_cookies_on_exit, params->token_web_data, #endif @@ -185,7 +185,7 @@ #if BUILDFLAG(IS_CHROMEOS_LACROS) init_params.signin_client = params->signin_client; #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) init_params.account_manager_facade = params->account_manager_facade; #endif
diff --git a/components/signin/public/identity_manager/identity_manager_builder.h b/components/signin/public/identity_manager/identity_manager_builder.h index 3f761116..ab28b316 100644 --- a/components/signin/public/identity_manager/identity_manager_builder.h +++ b/components/signin/public/identity_manager/identity_manager_builder.h
@@ -10,7 +10,6 @@ #include "base/files/file_path.h" #include "base/memory/raw_ptr.h" #include "build/build_config.h" -#include "build/chromeos_buildflags.h" #include "components/signin/public/base/signin_buildflags.h" #include "components/signin/public/identity_manager/identity_manager.h" @@ -41,7 +40,7 @@ class NetworkConnectionTracker; } -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) namespace account_manager { class AccountManagerFacade; } @@ -68,7 +67,7 @@ scoped_refptr<TokenWebData> token_web_data; #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) account_manager::AccountManagerFacade* account_manager_facade = nullptr; bool is_regular_profile = false; #endif
diff --git a/components/signin/public/identity_manager/identity_manager_builder_unittest.cc b/components/signin/public/identity_manager/identity_manager_builder_unittest.cc index 2d8ae35..bf5b607c 100644 --- a/components/signin/public/identity_manager/identity_manager_builder_unittest.cc +++ b/components/signin/public/identity_manager/identity_manager_builder_unittest.cc
@@ -9,7 +9,6 @@ #include "base/files/scoped_temp_dir.h" #include "base/test/task_environment.h" #include "build/build_config.h" -#include "build/chromeos_buildflags.h" #include "components/image_fetcher/core/fake_image_decoder.h" #include "components/signin/internal/identity_manager/account_fetcher_service.h" #include "components/signin/public/base/test_signin_client.h" @@ -23,7 +22,7 @@ #include "components/signin/public/identity_manager/identity_test_utils.h" #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) #include "components/account_manager_core/mock_account_manager_facade.h" #endif @@ -86,7 +85,7 @@ std::make_unique<FakeDeviceAccountsProvider>(); #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) auto account_manager_facade = std::make_unique<account_manager::MockAccountManagerFacade>(); params.account_manager_facade = account_manager_facade.get();
diff --git a/components/signin/public/identity_manager/identity_test_utils.cc b/components/signin/public/identity_manager/identity_test_utils.cc index 509a037..fdaddfb 100644 --- a/components/signin/public/identity_manager/identity_test_utils.cc +++ b/components/signin/public/identity_manager/identity_test_utils.cc
@@ -9,6 +9,7 @@ #include "base/guid.h" #include "base/run_loop.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "components/signin/internal/identity_manager/account_fetcher_service.h" #include "components/signin/internal/identity_manager/account_tracker_service.h" #include "components/signin/internal/identity_manager/gaia_cookie_manager_service.h" @@ -22,7 +23,7 @@ #include "google_apis/gaia/gaia_auth_util.h" #include "google_apis/gaia/gaia_constants.h" -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) #include "components/account_manager_core/account.h" #include "components/account_manager_core/account_manager_facade.h" #endif @@ -83,7 +84,7 @@ run_loop.QuitClosure()); // TODO(crbug.com/1226041): simplify this when all Lacros Profiles use Mirror. -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) if (ShouldUseAccountManagerFacade(identity_manager)) { const AccountInfo& account_info = account_tracker_service->GetAccountInfo(account_id); @@ -94,7 +95,7 @@ GetAccountManagerFacade(identity_manager) ->UpsertAccountForTesting(account, new_token); } else -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) { token_service->UpdateCredentials(account_id, new_token); } @@ -377,7 +378,7 @@ run_loop.QuitClosure()); // TODO(crbug.com/1226041): simplify this when all Lacros Profiles use Mirror. -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) if (ShouldUseAccountManagerFacade(identity_manager)) { const AccountInfo& account_info = identity_manager->GetAccountTrackerService()->GetAccountInfo( @@ -386,7 +387,7 @@ ->RemoveAccountForTesting(account_manager::AccountKey{ account_info.gaia, account_manager::AccountType::kGaia}); } else -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // BUILDFLAG(IS_CHROMEOS) { identity_manager->GetTokenService()->RevokeCredentials(account_id); } @@ -533,7 +534,7 @@ account_tracker_service->SetAccountInfoFromUserInfo(account_id, &user_info); } -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) account_manager::AccountManagerFacade* GetAccountManagerFacade( IdentityManager* identity_manager) { return identity_manager->GetAccountManagerFacade();
diff --git a/components/signin/public/identity_manager/identity_test_utils.h b/components/signin/public/identity_manager/identity_test_utils.h index a2ab617f..fb972ec3 100644 --- a/components/signin/public/identity_manager/identity_test_utils.h +++ b/components/signin/public/identity_manager/identity_test_utils.h
@@ -9,7 +9,6 @@ #include "base/bind.h" #include "build/build_config.h" -#include "build/chromeos_buildflags.h" #include "components/signin/public/base/consent_level.h" #include "components/signin/public/identity_manager/account_info.h" @@ -17,7 +16,7 @@ class TestURLLoaderFactory; } -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) namespace account_manager { class AccountManagerFacade; } @@ -216,7 +215,7 @@ const std::string& locale, const std::string& picture_url); -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) account_manager::AccountManagerFacade* GetAccountManagerFacade( IdentityManager* identity_manager); #endif
diff --git a/components/sync/driver/sync_service_crypto.cc b/components/sync/driver/sync_service_crypto.cc index e61dbd6..9144f5b 100644 --- a/components/sync/driver/sync_service_crypto.cc +++ b/components/sync/driver/sync_service_crypto.cc
@@ -343,6 +343,8 @@ bool SyncServiceCrypto::SetDecryptionPassphrase(const std::string& passphrase) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // This should only be called when the engine has been initialized. + DCHECK(state_.engine); // We should never be called with an empty passphrase. DCHECK(!passphrase.empty()); @@ -390,7 +392,12 @@ delegate_->SetEncryptionBootstrapToken( SerializeNigoriAsBootstrapToken(*nigori)); - SetDecryptionKeyWithoutUpdatingBootstrapToken(std::move(nigori)); + if (state_.engine) { + // Engine being initialized isn't a precondition of this method. In case + // it's not initialized, decryption passphrase will be set later, upon + // initialization. + SetDecryptionKeyWithoutUpdatingBootstrapToken(std::move(nigori)); + } } std::unique_ptr<Nigori> SyncServiceCrypto::GetDecryptionNigoriKey() const {
diff --git a/components/sync/driver/sync_service_crypto_unittest.cc b/components/sync/driver/sync_service_crypto_unittest.cc index a08238e8..7ae8f15 100644 --- a/components/sync/driver/sync_service_crypto_unittest.cc +++ b/components/sync/driver/sync_service_crypto_unittest.cc
@@ -42,6 +42,7 @@ using testing::Not; using testing::NotNull; using testing::Return; +using testing::SaveArg; sync_pb::EncryptedData MakeEncryptedData( const std::string& passphrase, @@ -675,6 +676,47 @@ EXPECT_FALSE(crypto_.IsPassphraseRequired()); } +// Regression test for crbug.com/1322687: engine initialization may happen after +// SetDecryptionNigoriKey() call, verify it doesn't crash and that decryption +// key populated to the engine later, upon initialization. +TEST_F(SyncServiceCryptoTest, + ShouldDeferDecryptionWithNigoriKeyUntilEngineInitialization) { + const std::string kTestPassphrase = "somepassphrase"; + + ASSERT_FALSE(crypto_.IsPassphraseRequired()); + + // Mimic the engine determining that a passphrase is required. + EXPECT_CALL(delegate_, ReconfigureDataTypesDueToCrypto()); + crypto_.OnPassphraseRequired( + KeyDerivationParams::CreateForPbkdf2(), + MakeEncryptedData(kTestPassphrase, + KeyDerivationParams::CreateForPbkdf2())); + ASSERT_TRUE(crypto_.IsPassphraseRequired()); + VerifyAndClearExpectations(); + + // Pass decryption nigori key, it should be stored in the bootstrap token, but + // shouldn't cause other changes, since engine isn't initialized. + std::string bootstrap_token; + ON_CALL(delegate_, SetEncryptionBootstrapToken(_)) + .WillByDefault(SaveArg<0>(&bootstrap_token)); + ON_CALL(delegate_, GetEncryptionBootstrapToken()) + .WillByDefault([&bootstrap_token]() { return bootstrap_token; }); + crypto_.SetDecryptionNigoriKey(Nigori::CreateByDerivation( + KeyDerivationParams::CreateForPbkdf2(), kTestPassphrase)); + EXPECT_TRUE(crypto_.IsPassphraseRequired()); + + // Decryption key should be passed to the engine once it's initialized. + EXPECT_CALL(engine_, SetExplicitPassphraseDecryptionKey(NotNull())) + .WillOnce( + [&](std::unique_ptr<Nigori>) { crypto_.OnPassphraseAccepted(); }); + // The current implementation issues two reconfigurations: one immediately + // after checking the passphrase in the UI thread and a second time later when + // the engine confirms with OnPassphraseAccepted(). + EXPECT_CALL(delegate_, ReconfigureDataTypesDueToCrypto()).Times(2); + crypto_.SetSyncEngine(kSyncingAccount, &engine_); + EXPECT_FALSE(crypto_.IsPassphraseRequired()); +} + TEST_F(SyncServiceCryptoTest, ShouldGetDecryptionKeyFromBootstrapToken) { const std::string kTestPassphrase = "somepassphrase";
diff --git a/components/sync/driver/sync_service_impl.cc b/components/sync/driver/sync_service_impl.cc index 0fb92be..63a8e39b 100644 --- a/components/sync/driver/sync_service_impl.cc +++ b/components/sync/driver/sync_service_impl.cc
@@ -20,7 +20,6 @@ #include "base/observer_list.h" #include "base/time/time.h" #include "build/build_config.h" -#include "build/chromeos_buildflags.h" #include "components/invalidation/public/invalidation_service.h" #include "components/signin/public/base/signin_metrics.h" #include "components/signin/public/identity_manager/account_info.h" @@ -828,7 +827,7 @@ // Sync-the-feature remains off. StopAndClear(); -#if !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_CHROMEOS_LACROS) +#if !BUILDFLAG(IS_CHROMEOS) // TODO(https://crbug.com/1233933): Update this when Lacros profiles // support signed-in-but-not-consented-to-sync state.
diff --git a/components/sync/driver/sync_service_impl_unittest.cc b/components/sync/driver/sync_service_impl_unittest.cc index 83a5104..201b6eba 100644 --- a/components/sync/driver/sync_service_impl_unittest.cc +++ b/components/sync/driver/sync_service_impl_unittest.cc
@@ -1010,7 +1010,7 @@ client_cmd.action = DISABLE_SYNC_ON_CLIENT; service()->OnActionableError(client_cmd); -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if BUILDFLAG(IS_CHROMEOS) // ChromeOS does not support signout. // TODO(https://crbug.com/1233933): Update this when Lacros profiles support // signed-in-but-not-consented-to-sync state.
diff --git a/components/update_client/update_query_params.cc b/components/update_client/update_query_params.cc index 8579a102..a707c0e 100644 --- a/components/update_client/update_query_params.cc +++ b/components/update_client/update_query_params.cc
@@ -32,7 +32,7 @@ "win"; #elif BUILDFLAG(IS_ANDROID) "android"; -#elif BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +#elif BUILDFLAG(IS_CHROMEOS) "cros"; #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) "linux";
diff --git a/components/viz/common/quads/shared_quad_state.cc b/components/viz/common/quads/shared_quad_state.cc index a96dcaf..b2d8949 100644 --- a/components/viz/common/quads/shared_quad_state.cc +++ b/components/viz/common/quads/shared_quad_state.cc
@@ -48,9 +48,15 @@ visible_quad_layer_rect, value); cc::MathUtil::AddToTracedValue("mask_filter_bounds", mask_filter_info.bounds(), value); - cc::MathUtil::AddCornerRadiiToTracedValue( - "mask_filter_rounded_corners_radii", - mask_filter_info.rounded_corner_bounds(), value); + if (mask_filter_info.HasRoundedCorners()) { + cc::MathUtil::AddCornerRadiiToTracedValue( + "mask_filter_rounded_corners_radii", + mask_filter_info.rounded_corner_bounds(), value); + } + if (mask_filter_info.HasGradientMask()) { + cc::MathUtil::AddToTracedValue("mask_filter_gradient_mask", + mask_filter_info.gradient_mask(), value); + } if (clip_rect) { cc::MathUtil::AddToTracedValue("clip_rect", *clip_rect, value);
diff --git a/components/viz/common/surfaces/local_surface_id_unittest.cc b/components/viz/common/surfaces/local_surface_id_unittest.cc index 4a07df6..943d469 100644 --- a/components/viz/common/surfaces/local_surface_id_unittest.cc +++ b/components/viz/common/surfaces/local_surface_id_unittest.cc
@@ -38,6 +38,7 @@ int previous_log_lvl = logging::GetMinLogLevel(); +#if BUILDFLAG(USE_RUNTIME_VLOG) // When |g_min_log_level| is set to LOG_VERBOSE we expect verbose versions // of local_surface_id::ToString(). logging::SetMinLogLevel(logging::LOG_VERBOSE); @@ -45,6 +46,7 @@ EXPECT_EQ(verbose_expected, local_surface_id.ToString()); EXPECT_EQ(big_verbose_expected, big_local_surface_id.ToString()); EXPECT_EQ(small_verbose_expected, small_local_surface_id.ToString()); +#endif // BUILDFLAG(USE_RUNTIME_VLOG) // When |g_min_log_level| is set to LOG_INFO we expect less verbose versions // of local_surface_id::ToString().
diff --git a/components/viz/service/display/skia_output_surface.h b/components/viz/service/display/skia_output_surface.h index 635a9e0..7b8bec2 100644 --- a/components/viz/service/display/skia_output_surface.h +++ b/components/viz/service/display/skia_output_surface.h
@@ -29,10 +29,6 @@ class SkCanvas; class SkImage; -#if BUILDFLAG(IS_APPLE) -class SkDeferredDisplayList; -#endif - namespace gfx { class ColorSpace; } // namespace gfx @@ -121,6 +117,7 @@ ResourceFormat format, bool mipmap, sk_sp<SkColorSpace> color_space, + bool is_overlay, const gpu::Mailbox& mailbox) = 0; // Finish painting the current frame or current render pass, depends on which @@ -162,8 +159,7 @@ // the GPU has finished processing all submitted commands. The callback may be // called on a different thread. virtual void ScheduleOverlays(OverlayList overlays, - std::vector<gpu::SyncToken> sync_tokens, - base::OnceClosure on_finished) = 0; + std::vector<gpu::SyncToken> sync_tokens) = 0; // Add context lost observer. virtual void AddContextLostObserver(ContextLostObserver* observer) = 0; @@ -194,15 +190,6 @@ // 0 < n <= capabilities_.number_of_buffers. // Return true if new buffers are allocated. virtual bool EnsureMinNumberOfBuffers(int n) = 0; - -#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) - virtual SkCanvas* BeginPaintRenderPassOverlay( - const gfx::Size& size, - ResourceFormat format, - bool mipmap, - sk_sp<SkColorSpace> color_space) = 0; - virtual sk_sp<SkDeferredDisplayList> EndPaintRenderPassOverlay() = 0; -#endif }; } // namespace viz
diff --git a/components/viz/service/display/skia_renderer.cc b/components/viz/service/display/skia_renderer.cc index 023e594f..a86aafc7 100644 --- a/components/viz/service/display/skia_renderer.cc +++ b/components/viz/service/display/skia_renderer.cc
@@ -808,6 +808,16 @@ swap_buffer_rect_ = gfx::Rect(); FlushOutputSurface(); + +#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) + // Delete render pass overlay backings from the previous frame that will not + // be used again. + for (auto& backing : available_render_pass_overlay_backings_) { + skia_output_surface_->GetSharedImageInterface()->DestroySharedImage( + gpu::SyncToken(), backing.mailbox); + } + available_render_pass_overlay_backings_.clear(); +#endif // BUILDFLAG(IS_APPLE) || defined(USE_OZONE) } void SkiaRenderer::SwapBuffersSkipped() { @@ -828,13 +838,13 @@ auto read_fence_lock_iter = committed_overlay_locks_.end(); if (!release_fence.is_null()) { - // Set release fences for returning for last frame overlay resources. + // Set release fences to return overlay resources for last frame. for (auto& lock : committed_overlay_locks_) { lock.SetReleaseFence(release_fence.Clone()); } - // Find all locks that have a read-lock fence associated with them. - // If we have a release fence, it's not safe to release them here. - // Release them later in BuffersPresented. + // Find all locks that have a read-lock fence associated with them and move + // them to the back of locks. If we have a release fence, it's not safe to + // release them here. Release them later in BuffersPresented(). read_fence_lock_iter = std::partition( committed_overlay_locks_.begin(), committed_overlay_locks_.end(), [](auto& lock) { return !lock.HasReadLockFence(); }); @@ -846,7 +856,7 @@ // Right now, only macOS and Ozone need to return mailboxes of released // overlays, so we should not release |committed_overlay_locks_| here. The - // resources in it will be released by DidReceiveReleasedOverlays() later. + // resources in it will be released in DidReceiveReleasedOverlays() later. #if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) for (auto lock_iter = committed_overlay_locks_.begin(); lock_iter != read_fence_lock_iter; ++lock_iter) { @@ -854,6 +864,8 @@ } #endif // BUILDFLAG(IS_APPLE) || defined(USE_OZONE) + // Current pending locks should have been committed by the next time + // SwapBuffers() is completed. committed_overlay_locks_.clear(); std::swap(committed_overlay_locks_, pending_overlay_locks_.front()); pending_overlay_locks_.pop_front(); @@ -869,19 +881,38 @@ // This method is only called on macOS and Ozone right now. #if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) for (const auto& mailbox : released_overlays) { - auto it = awaiting_release_overlay_locks_.find(mailbox); - if (it == awaiting_release_overlay_locks_.end()) { - // TODO(crbug.com/1299794): Re-enable this DCHECK on Ozone. + // If this mailbox is for render pass overlay, mark the released render pass + // overlay backing as available to be re-used. + auto backing_iter = + std::find_if(in_flight_render_pass_overlay_backings_.begin(), + in_flight_render_pass_overlay_backings_.end(), + [&mailbox](const RenderPassBacking& backing) { + return backing.mailbox == mailbox; + }); + if (backing_iter != in_flight_render_pass_overlay_backings_.end()) { + available_render_pass_overlay_backings_.push_back( + std::move(*backing_iter)); + in_flight_render_pass_overlay_backings_.erase(backing_iter); + } + + auto iter = std::find_if(awaiting_release_overlay_locks_.begin(), + awaiting_release_overlay_locks_.end(), + [&mailbox](const OverlayLock& lock) { + return lock.mailbox() == mailbox; + }); + if (iter == awaiting_release_overlay_locks_.end()) { +// TODO(crbug.com/1299794): Re-enable this DCHECK on Ozone. #if !defined(USE_OZONE) + // The released overlay should always be found as awaiting to be released. DLOG(FATAL) << "Got an unexpected mailbox"; #endif // !defined(USE_OZONE) continue; } - awaiting_release_overlay_locks_.erase(it); + awaiting_release_overlay_locks_.erase(iter); } #else NOTREACHED(); -#endif // !(BUILDFLAG(IS_APPLE) || defined (USE_OZONE)) +#endif // BUILDFLAG(IS_APPLE) || defined(USE_OZONE) } bool SkiaRenderer::FlippedFramebuffer() const { @@ -915,7 +946,8 @@ RenderPassBacking& backing = iter->second; current_canvas_ = skia_output_surface_->BeginPaintRenderPass( render_pass_id, backing.size, backing.format, backing.generate_mipmap, - backing.color_space.ToSkColorSpace(), backing.mailbox); + backing.color_space.ToSkColorSpace(), /*is_overlay=*/false, + backing.mailbox); } void SkiaRenderer::SetScissorTestRect(const gfx::Rect& scissor_rect) { @@ -2386,7 +2418,11 @@ void SkiaRenderer::ScheduleOverlays() { DCHECK(!current_frame_resource_fence_->WasSet()); + // Always add an empty set of locks to be used in either SwapBuffersSkipped() + // or SwapBuffersComplete(). pending_overlay_locks_.emplace_back(); + [[maybe_unused]] auto& locks = pending_overlay_locks_.back(); + if (current_frame()->overlay_list.empty()) return; @@ -2401,7 +2437,6 @@ // switched over to OverlayProcessor. // TODO(weiliangc): Remove this when CrOS and Android SurfaceControl switch // to OverlayProcessor as well. - auto& locks = pending_overlay_locks_.back(); for (auto& overlay : current_frame()->overlay_list) { // Resources will be unlocked after the next SwapBuffers() is completed. locks.emplace_back(resource_provider(), overlay.resource_id); @@ -2416,7 +2451,6 @@ DCHECK(!overlay.mailbox.IsZero()); } #elif BUILDFLAG(IS_WIN) - auto& locks = pending_overlay_locks_.back(); for (auto& dc_layer_overlay : current_frame()->overlay_list) { for (size_t i = 0; i < DCLayerOverlay::kNumResources; ++i) { ResourceId resource_id = dc_layer_overlay.resources[i]; @@ -2437,10 +2471,10 @@ DCHECK(!dc_layer_overlay.mailbox[0].IsZero()); } #elif BUILDFLAG(IS_APPLE) - auto& locks = pending_overlay_locks_.back(); for (CALayerOverlay& ca_layer_overlay : current_frame()->overlay_list) { if (ca_layer_overlay.rpdq) { PrepareRenderPassOverlay(&ca_layer_overlay); + locks.emplace_back(ca_layer_overlay.mailbox); continue; } // Some overlays are for solid-color layers. @@ -2465,11 +2499,10 @@ } #elif defined(USE_OZONE) // Only Wayland uses this code path. - auto& locks = pending_overlay_locks_.back(); for (auto& overlay : current_frame()->overlay_list) { if (overlay.rpdq) { PrepareRenderPassOverlay(&overlay); - // The output will be attached via mailbox when overlays are scheduled. + locks.emplace_back(overlay.mailbox); continue; } // Solid Color quads do not have associated resource buffers. @@ -2495,17 +2528,10 @@ NOTREACHED(); #endif // BUILDFLAG(IS_ANDROID) - base::OnceClosure on_finished_callback; - if (current_frame_resource_fence_->WasSet()) { - on_finished_callback = base::BindOnce( - &FrameResourceFence::Signal, std::move(current_frame_resource_fence_)); - current_frame_resource_fence_ = base::MakeRefCounted<FrameResourceFence>(); - resource_provider()->SetReadLockFence(current_frame_resource_fence_.get()); - } + DCHECK(!current_frame_resource_fence_->WasSet()); skia_output_surface_->ScheduleOverlays( - std::move(current_frame()->overlay_list), std::move(sync_tokens), - std::move(on_finished_callback)); + std::move(current_frame()->overlay_list), std::move(sync_tokens)); } sk_sp<SkColorFilter> SkiaRenderer::GetColorSpaceConversionFilter( @@ -3090,16 +3116,46 @@ // TODO(petermcneeley) : Support buffer rounding by dynamically changing // texture uvs. constexpr int kBufferMultiple = 1; -#endif +#endif // BUILDFLAG(IS_APPLE) gfx::Size buffer_size( cc::MathUtil::CheckedRoundUp(filter_bounds.width(), kBufferMultiple), cc::MathUtil::CheckedRoundUp(filter_bounds.height(), kBufferMultiple)); - current_canvas_ = skia_output_surface_->BeginPaintRenderPassOverlay( - buffer_size, buffer_format, /*mipmap=*/false, - color_space.ToSkColorSpace()); + auto it = std::find_if(available_render_pass_overlay_backings_.begin(), + available_render_pass_overlay_backings_.end(), + [&buffer_format, &buffer_size, + &color_space](const RenderPassBacking& backing) { + return backing.format == buffer_format && + backing.size == buffer_size && + backing.color_space == color_space; + }); + + if (it == available_render_pass_overlay_backings_.end()) { + // Allocate the image for render pass overlay if there is no existing + // available one. + constexpr auto kOverlayUsage = gpu::SHARED_IMAGE_USAGE_SCANOUT | + gpu::SHARED_IMAGE_USAGE_DISPLAY | + gpu::SHARED_IMAGE_USAGE_RASTER; + auto mailbox = + skia_output_surface_->GetSharedImageInterface()->CreateSharedImage( + buffer_format, buffer_size, color_space, kTopLeft_GrSurfaceOrigin, + kPremul_SkAlphaType, kOverlayUsage, gpu::kNullSurfaceHandle); + in_flight_render_pass_overlay_backings_.push_back( + RenderPassBacking{buffer_size, /*generate_mipmap=*/false, color_space, + buffer_format, mailbox}); + overlay->mailbox = std::move(mailbox); + } else { + overlay->mailbox = std::move(it->mailbox); + in_flight_render_pass_overlay_backings_.push_back(std::move(*it)); + available_render_pass_overlay_backings_.erase(it); + } + + current_canvas_ = skia_output_surface_->BeginPaintRenderPass( + quad->render_pass_id, buffer_size, buffer_format, /*mipmap=*/false, + color_space.ToSkColorSpace(), /*is_overlay=*/true, overlay->mailbox); if (!current_canvas_) { - DLOG(ERROR) << "BeginPaintRenderPassOverlay() failed."; + DLOG(ERROR) + << "BeginPaintRenderPass() in PrepareRenderPassOverlay() failed."; return; } @@ -3132,9 +3188,9 @@ backing->generate_mipmap, backing->color_space.ToSkColorSpace(), backing->mailbox); if (!content_image) { - DLOG(ERROR) - << "MakePromiseSkImageFromRenderPass() failed for render pass"; - skia_output_surface_->EndPaintRenderPassOverlay(); + DLOG(ERROR) << "MakePromiseSkImageFromRenderPass() in " + "PrepareRenderPassOverlay() failed."; + skia_output_surface_->EndPaint(base::NullCallback()); return; } @@ -3153,19 +3209,21 @@ } current_canvas_ = nullptr; - auto ddl = skia_output_surface_->EndPaintRenderPassOverlay(); - DCHECK(ddl); - // Put overlay related information in CALayerOverlay, - // so SkiaOutputSurfaceImplOnGpu can use the DDL to create overlay buffer and - // play the DDL back to it accordingly. - overlay->ddl = std::move(ddl); + base::OnceClosure on_finished_callback; + if (current_frame_resource_fence_->WasSet()) { + on_finished_callback = base::BindOnce( + &FrameResourceFence::Signal, std::move(current_frame_resource_fence_)); + current_frame_resource_fence_ = base::MakeRefCounted<FrameResourceFence>(); + resource_provider()->SetReadLockFence(current_frame_resource_fence_.get()); + } + skia_output_surface_->EndPaint(std::move(on_finished_callback)); // Adjust |bounds_rect| to contain the whole buffer and at the right location. overlay->bounds_rect.set_origin(gfx::PointF(filter_bounds.origin())); overlay->bounds_rect.set_size(gfx::SizeF(buffer_size)); } -#endif +#endif // BUILDFLAG(IS_APPLE) || defined(USE_OZONE) bool SkiaRenderer::IsRenderPassResourceAllocated( const AggregatedRenderPassId& render_pass_id) const { @@ -3223,24 +3281,43 @@ return delegated_ink_handler_ && delegated_ink_handler_->GetInkRenderer(); } +SkiaRenderer::OverlayLock::OverlayLock( + DisplayResourceProvider* resource_provider, + ResourceId resource_id) { + resource_lock.emplace(resource_provider, resource_id); +} + +SkiaRenderer::OverlayLock::~OverlayLock() = default; + +SkiaRenderer::OverlayLock::OverlayLock(SkiaRenderer::OverlayLock&& other) { + resource_lock = std::move(other.resource_lock); + #if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) -bool SkiaRenderer::ScopedReadLockComparator::operator()( - const DisplayResourceProviderSkia::ScopedReadLockSharedImage& lhs, - const DisplayResourceProviderSkia::ScopedReadLockSharedImage& rhs) const { + render_pass_lock = std::move(other.render_pass_lock); +#endif // BUILDFLAG(IS_APPLE) || defined(USE_OZONE) +} + +SkiaRenderer::OverlayLock& SkiaRenderer::OverlayLock::OverlayLock::operator=( + SkiaRenderer::OverlayLock&& other) { + resource_lock = std::move(other.resource_lock); + +#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) + render_pass_lock = std::move(other.render_pass_lock); +#endif // BUILDFLAG(IS_APPLE) || defined(USE_OZONE) + + return *this; +} + +#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) +SkiaRenderer::OverlayLock::OverlayLock(gpu::Mailbox mailbox) { + render_pass_lock.emplace(mailbox); +} + +bool SkiaRenderer::OverlayLockComparator::operator()( + const OverlayLock& lhs, + const OverlayLock& rhs) const { return lhs.mailbox() < rhs.mailbox(); } - -bool SkiaRenderer::ScopedReadLockComparator::operator()( - const DisplayResourceProviderSkia::ScopedReadLockSharedImage& lhs, - const gpu::Mailbox& rhs) const { - return lhs.mailbox() < rhs; -} - -bool SkiaRenderer::ScopedReadLockComparator::operator()( - const gpu::Mailbox& lhs, - const DisplayResourceProviderSkia::ScopedReadLockSharedImage& rhs) const { - return lhs < rhs.mailbox(); -} #endif // BUILDFLAG(IS_APPLE) || defined(USE_OZONE) } // namespace viz
diff --git a/components/viz/service/display/skia_renderer.h b/components/viz/service/display/skia_renderer.h index d8912a6..81aeb727 100644 --- a/components/viz/service/display/skia_renderer.h +++ b/components/viz/service/display/skia_renderer.h
@@ -7,6 +7,7 @@ #include <memory> #include <tuple> +#include <utility> #include <vector> #include "base/containers/flat_map.h" @@ -326,42 +327,88 @@ absl::optional<DisplayResourceProviderSkia::LockSetForExternalUse> lock_set_for_external_use_; - // Locks for overlays are pending for swapbuffers. - base::circular_deque< - std::vector<DisplayResourceProviderSkia::ScopedReadLockSharedImage>> - pending_overlay_locks_; + struct OverlayLock { + OverlayLock(DisplayResourceProvider* resource_provider, + ResourceId resource_id); - // Locks for overlays have been committed. |pending_overlay_locks_| will - // be moved to |committed_overlay_locks_| after SwapBuffers() completed. - std::vector<DisplayResourceProviderSkia::ScopedReadLockSharedImage> - committed_overlay_locks_; +#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) + explicit OverlayLock(gpu::Mailbox mailbox); +#endif // BUILDFLAG(IS_APPLE) || defined(USE_OZONE) + + ~OverlayLock(); + + OverlayLock(OverlayLock&& other); + OverlayLock& operator=(OverlayLock&& other); + + OverlayLock(const OverlayLock&) = delete; + OverlayLock& operator=(const OverlayLock&) = delete; + + const gpu::Mailbox& mailbox() const { +#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) + if (render_pass_lock.has_value()) { + return *render_pass_lock; + } +#endif // BUILDFLAG(IS_APPLE) || defined(USE_OZONE) + + DCHECK(resource_lock.has_value()); + return resource_lock->mailbox(); + } + + const gpu::SyncToken& sync_token() const { + DCHECK(resource_lock.has_value()); + return resource_lock->sync_token(); + } + + void SetReleaseFence(gfx::GpuFenceHandle release_fence) { + if (resource_lock.has_value()) { + resource_lock->SetReleaseFence(std::move(release_fence)); + } + } + + bool HasReadLockFence() { + if (resource_lock.has_value()) { + return resource_lock->HasReadLockFence(); + } + return false; + } + + // Either resource_lock is set for non render pass overlays (i.e. videos), + // or render_pass_lock is set for render pass overlays. + absl::optional<DisplayResourceProviderSkia::ScopedReadLockSharedImage> + resource_lock; + +#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) + absl::optional<gpu::Mailbox> render_pass_lock; +#endif // BUILDFLAG(IS_APPLE) || defined(USE_OZONE) + }; + + // Locks for overlays that are pending for SwapBuffers(). + base::circular_deque<std::vector<OverlayLock>> pending_overlay_locks_; + + // Locks for overlays that have been committed. |pending_overlay_locks_| will + // be moved to |committed_overlay_locks_| after SwapBuffers() is completed. + std::vector<OverlayLock> committed_overlay_locks_; // Locks for overlays that have release fences and read lock fences. - base::circular_deque< - std::vector<DisplayResourceProviderSkia::ScopedReadLockSharedImage>> + base::circular_deque<std::vector<OverlayLock>> read_lock_release_fence_overlay_locks_; #if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) - class ScopedReadLockComparator { + class OverlayLockComparator { public: using is_transparent = void; - bool operator()( - const DisplayResourceProviderSkia::ScopedReadLockSharedImage& lhs, - const DisplayResourceProviderSkia::ScopedReadLockSharedImage& rhs) - const; - bool operator()( - const DisplayResourceProviderSkia::ScopedReadLockSharedImage& lhs, - const gpu::Mailbox& rhs) const; - bool operator()( - const gpu::Mailbox& lhs, - const DisplayResourceProviderSkia::ScopedReadLockSharedImage& rhs) - const; + bool operator()(const OverlayLock& lhs, const OverlayLock& rhs) const; }; - // a set for locks of overlays which are waiting for releasing. - // The set is using lock.mailbox() as the unique key. - base::flat_set<DisplayResourceProviderSkia::ScopedReadLockSharedImage, - ScopedReadLockComparator> + + // A set for locks of overlays which are waiting to be released, using + // mailbox() as the unique key. + base::flat_set<OverlayLock, OverlayLockComparator> awaiting_release_overlay_locks_; + + // Tracks render pass overlay backings that are currently in use and available + // for re-using via mailboxes. RenderPassBacking.generate_mipmap is not used. + std::vector<RenderPassBacking> in_flight_render_pass_overlay_backings_; + std::vector<RenderPassBacking> available_render_pass_overlay_backings_; #endif // BUILDFLAG(IS_APPLE) || defined(USE_OZONE) gfx::ColorConversionSkFilterCache color_filter_cache_;
diff --git a/components/viz/service/display_embedder/output_presenter_gl.cc b/components/viz/service/display_embedder/output_presenter_gl.cc index a95560f..5c16309b 100644 --- a/components/viz/service/display_embedder/output_presenter_gl.cc +++ b/components/viz/service/display_embedder/output_presenter_gl.cc
@@ -224,7 +224,8 @@ return nullptr; // TODO(https://crbug.com/1012401): don't depend on GL. auto gl_surface = base::MakeRefCounted<gl::GLSurfaceEGLSurfaceControl>( - window, base::ThreadTaskRunnerHandle::Get()); + gl::GLSurfaceEGL::GetGLDisplayEGL(), window, + base::ThreadTaskRunnerHandle::Get()); if (!gl_surface->Initialize(gl::GLSurfaceFormat())) { LOG(ERROR) << "Failed to initialize GLSurfaceEGLSurfaceControl."; return nullptr;
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.cc b/components/viz/service/display_embedder/skia_output_surface_impl.cc index 5ada46cf..5e9afaa7 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl.cc
@@ -82,18 +82,16 @@ SkiaOutputSurfaceImpl::ScopedPaint::ScopedPaint( SkDeferredDisplayListRecorder* root_recorder) - : recorder_(root_recorder), render_pass_id_(0) {} + : recorder_(root_recorder) {} SkiaOutputSurfaceImpl::ScopedPaint::ScopedPaint( SkSurfaceCharacterization characterization) - : ScopedPaint(characterization, AggregatedRenderPassId(0), gpu::Mailbox()) { -} + : ScopedPaint(characterization, gpu::Mailbox()) {} SkiaOutputSurfaceImpl::ScopedPaint::ScopedPaint( SkSurfaceCharacterization characterization, - AggregatedRenderPassId render_pass_id, gpu::Mailbox mailbox) - : render_pass_id_(render_pass_id), mailbox_(mailbox) { + : mailbox_(mailbox) { recorder_storage_.emplace(characterization); recorder_ = &recorder_storage_.value(); } @@ -600,6 +598,7 @@ ResourceFormat format, bool mipmap, sk_sp<SkColorSpace> color_space, + bool is_overlay, const gpu::Mailbox& mailbox) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); // Make sure there is no unsubmitted PaintFrame or PaintRenderPass. @@ -607,78 +606,37 @@ DCHECK(resource_sync_tokens_.empty()); SkColorType color_type = - ResourceFormatToClosestSkColorType(true /* gpu_compositing */, format); + ResourceFormatToClosestSkColorType(/*gpu_compositing=*/true, format); SkSurfaceCharacterization characterization = CreateSkSurfaceCharacterization( surface_size, color_type, mipmap, std::move(color_space), - /*is_root_render_pass=*/false, /*is_overlay=*/false); + /*is_root_render_pass=*/false, /*is_overlay=*/is_overlay); if (!characterization.isValid()) return nullptr; - current_paint_.emplace(characterization, id, mailbox); + // We are going to overwrite the render pass when it is not for overlay, so we + // need to reset the image_context and a new promise image will be created + // when MakePromiseSkImageFromRenderPass() is called. + if (!is_overlay) { + auto it = render_pass_image_cache_.find(id); + if (it != render_pass_image_cache_.end()) { + it->second->clear_image(); + } + } + + current_paint_.emplace(characterization, mailbox); return current_paint_->recorder()->getCanvas(); } -#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) -SkCanvas* SkiaOutputSurfaceImpl::BeginPaintRenderPassOverlay( - const gfx::Size& size, - ResourceFormat format, - bool mipmap, - sk_sp<SkColorSpace> color_space) { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - // Make sure there is no unsubmitted PaintFrame or PaintRenderPass. - DCHECK(!current_paint_); - SkColorType color_type = - ResourceFormatToClosestSkColorType(true /* gpu_compositing */, format); - SkSurfaceCharacterization characterization = CreateSkSurfaceCharacterization( - size, color_type, mipmap, std::move(color_space), - /*is_root_render_pass=*/false, /*is_overlay=*/true); - if (!characterization.isValid()) - return nullptr; - - current_paint_.emplace(characterization); - return current_paint_->recorder()->getCanvas(); -} - -sk_sp<SkDeferredDisplayList> -SkiaOutputSurfaceImpl::EndPaintRenderPassOverlay() { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(current_paint_); - - auto ddl = current_paint_->recorder()->detach(); - current_paint_.reset(); - return ddl; -} -#endif // BUILDFLAG(IS_APPLE) || defined(USE_OZONE) - void SkiaOutputSurfaceImpl::EndPaint(base::OnceClosure on_finished) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(current_paint_); - // If current_render_pass_id_ is not null, we are painting a render pass. - // Otherwise we are painting a frame. - - bool painting_render_pass = !current_paint_->render_pass_id().is_null(); - auto ddl = current_paint_->recorder()->detach(); - // impl_on_gpu_ is released on the GPU thread by a posted task from - // SkiaOutputSurfaceImpl::dtor. So it is safe to use base::Unretained. - if (painting_render_pass) { - auto it = render_pass_image_cache_.find(current_paint_->render_pass_id()); - if (it != render_pass_image_cache_.end()) { - // We are going to overwrite the render pass, so we need reset the - // image_context, so a new promise image will be created when the - // MakePromiseSkImageFromRenderPass() is called. - it->second->clear_image(); - } - - auto task = base::BindOnce( - &SkiaOutputSurfaceImplOnGpu::FinishPaintRenderPass, - base::Unretained(impl_on_gpu_.get()), current_paint_->mailbox(), - std::move(ddl), std::move(images_in_current_paint_), - resource_sync_tokens_, std::move(on_finished)); - EnqueueGpuTask(std::move(task), std::move(resource_sync_tokens_), - /*make_current=*/true, /*need_framebuffer=*/false); - } else { + // If the current paint mailbox is empty, we are painting a frame, otherwise + // we are painting a render pass. impl_on_gpu_ is released on the GPU thread + // by a posted task from SkiaOutputSurfaceImpl::dtor, so it is safe to use + // base::Unretained. + if (current_paint_->mailbox().IsZero()) { // Draw on the root render pass. current_buffer_modified_ = true; sk_sp<SkDeferredDisplayList> overdraw_ddl; @@ -698,6 +656,14 @@ EnqueueGpuTask(std::move(task), std::move(resource_sync_tokens_), /*make_current=*/true, /*need_framebuffer=*/true); draw_rectangle_.reset(); + } else { + auto task = base::BindOnce( + &SkiaOutputSurfaceImplOnGpu::FinishPaintRenderPass, + base::Unretained(impl_on_gpu_.get()), current_paint_->mailbox(), + std::move(ddl), std::move(images_in_current_paint_), + resource_sync_tokens_, std::move(on_finished)); + EnqueueGpuTask(std::move(task), std::move(resource_sync_tokens_), + /*make_current=*/true, /*need_framebuffer=*/false); } images_in_current_paint_.clear(); current_paint_.reset(); @@ -798,30 +764,12 @@ void SkiaOutputSurfaceImpl::ScheduleOverlays( OverlayList overlays, - std::vector<gpu::SyncToken> sync_tokens, - base::OnceClosure on_finished) { -#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) - // If there are render pass overlays, then a gl context is needed for drawing - // the overlay render passes to a backing for being scanned out. - bool make_current = - std::find_if(overlays.begin(), overlays.end(), [](const auto& overlay) { - return !!overlay.ddl; - }) != overlays.end(); - // Append |resource_sync_tokens_| which are depended by drawing render passes - // to overlay backings. - std::move(resource_sync_tokens_.begin(), resource_sync_tokens_.end(), - std::back_inserter(sync_tokens)); - resource_sync_tokens_.clear(); -#else - bool make_current = false; -#endif - auto task = base::BindOnce( - &SkiaOutputSurfaceImplOnGpu::ScheduleOverlays, - base::Unretained(impl_on_gpu_.get()), std::move(overlays), - std::move(images_in_current_paint_), std::move(on_finished)); - EnqueueGpuTask(std::move(task), std::move(sync_tokens), make_current, - /*need_framebuffer=*/false); - images_in_current_paint_.clear(); + std::vector<gpu::SyncToken> sync_tokens) { + auto task = + base::BindOnce(&SkiaOutputSurfaceImplOnGpu::ScheduleOverlays, + base::Unretained(impl_on_gpu_.get()), std::move(overlays)); + EnqueueGpuTask(std::move(task), std::move(sync_tokens), + /*make_current=*/false, /*need_framebuffer=*/false); } void SkiaOutputSurfaceImpl::SetFrameRate(float frame_rate) {
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.h b/components/viz/service/display_embedder/skia_output_surface_impl.h index 22032ba6..cf65c04b 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl.h +++ b/components/viz/service/display_embedder/skia_output_surface_impl.h
@@ -120,6 +120,7 @@ ResourceFormat format, bool mipmap, sk_sp<SkColorSpace> color_space, + bool is_overlay, const gpu::Mailbox& mailbox) override; void EndPaint(base::OnceClosure on_finished) override; void MakePromiseSkImage(ImageContext* image_context) override; @@ -134,8 +135,7 @@ void RemoveRenderPassResource( std::vector<AggregatedRenderPassId> ids) override; void ScheduleOverlays(OverlayList overlays, - std::vector<gpu::SyncToken> sync_tokens, - base::OnceClosure on_finished) override; + std::vector<gpu::SyncToken> sync_tokens) override; void CopyOutput(AggregatedRenderPassId id, const copy_output::RenderPassGeometry& geometry, @@ -149,15 +149,6 @@ gpu::SyncToken Flush() override; bool EnsureMinNumberOfBuffers(int n) override; -#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) - SkCanvas* BeginPaintRenderPassOverlay( - const gfx::Size& size, - ResourceFormat format, - bool mipmap, - sk_sp<SkColorSpace> color_space) override; - sk_sp<SkDeferredDisplayList> EndPaintRenderPassOverlay() override; -#endif - // ExternalUseClient implementation: gpu::SyncToken ReleaseImageContexts( std::vector<std::unique_ptr<ImageContext>> image_contexts) override; @@ -251,21 +242,18 @@ explicit ScopedPaint(SkDeferredDisplayListRecorder* root_recorder); explicit ScopedPaint(SkSurfaceCharacterization characterization); ScopedPaint(SkSurfaceCharacterization characterization, - AggregatedRenderPassId render_pass_id, gpu::Mailbox mailbox); ~ScopedPaint(); SkDeferredDisplayListRecorder* recorder() { return recorder_; } - AggregatedRenderPassId render_pass_id() { return render_pass_id_; } gpu::Mailbox mailbox() { return mailbox_; } private: // This is recorder being used for current paint SkDeferredDisplayListRecorder* recorder_; - // If we need new recorder for this Paint (i.e it's not root render pass), + // If we need new recorder for this Paint (i.e. it's not root render pass), // it's stored here absl::optional<SkDeferredDisplayListRecorder> recorder_storage_; - const AggregatedRenderPassId render_pass_id_; const gpu::Mailbox mailbox_; };
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc index 49631ee..65d7af0 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
@@ -1393,82 +1393,21 @@ } void SkiaOutputSurfaceImplOnGpu::ScheduleOverlays( - SkiaOutputSurface::OverlayList overlays, - std::vector<ImageContextImpl*> image_contexts, - base::OnceClosure on_finished) { + SkiaOutputSurface::OverlayList overlays) { TRACE_EVENT1("viz", "SkiaOutputSurfaceImplOnGpu::ScheduleOverlays", "num_overlays", overlays.size()); -#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) - if (context_is_lost_) - return; - - bool have_image_contexts = !image_contexts.empty(); - if (have_image_contexts) { - DCHECK(context_state_->GrContextIsGL()); - - // GL doesn't use semaphores. - promise_image_access_helper_.BeginAccess(std::move(image_contexts), - /*begin_semaphores=*/nullptr, - /*end_semaphores=*/nullptr); - } - - using ScopedWriteAccess = - std::unique_ptr<gpu::SharedImageRepresentationSkia::ScopedWriteAccess>; - std::vector<ScopedWriteAccess> scoped_write_accesses; - for (auto& overlay : overlays) { - if (!overlay.ddl) - continue; - const auto& characterization = overlay.ddl->characterization(); - auto backing = GetOrCreateRenderPassOverlayBacking(characterization); - if (!backing) - break; - DCHECK(overlay.mailbox.IsZero()); - overlay.mailbox = backing->mailbox(); - auto scoped_access = backing->BeginScopedWriteAccess( - characterization.sampleCount(), characterization.surfaceProps(), - /*begin_semaphores=*/nullptr, - /*end_semaphores=*/nullptr, - gpu::SharedImageRepresentation::AllowUnclearedAccess::kYes); - bool result = scoped_access->surface()->draw(overlay.ddl); - DCHECK(result); - scoped_write_accesses.push_back(std::move(scoped_access)); - backing->SetCleared(); - in_flight_render_pass_overlay_backings_.insert(std::move(backing)); - } - - if (!scoped_write_accesses.empty()) { - absl::optional<gpu::raster::GrShaderCache::ScopedCacheUse> cache_use; - if (dependency_->GetGrShaderCache()) { - cache_use.emplace(dependency_->GetGrShaderCache(), - gpu::kDisplayCompositorClientId); - } - - GrFlushInfo flush_info = {}; - if (on_finished) - gpu::AddCleanupTaskForSkiaFlush(std::move(on_finished), &flush_info); - context_state_->gr_context()->flush(flush_info); - context_state_->gr_context()->submit(); - scoped_write_accesses.clear(); - } - - if (have_image_contexts) - promise_image_access_helper_.EndAccess(); - constexpr base::TimeDelta kHistogramMinTime = base::Microseconds(5); constexpr base::TimeDelta kHistogramMaxTime = base::Milliseconds(16); constexpr int kHistogramTimeBuckets = 50; base::TimeTicks start_time = base::TimeTicks::Now(); output_device_->ScheduleOverlays(std::move(overlays)); + UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES( "Gpu.OutputSurface.ScheduleOverlaysUs", base::TimeTicks::Now() - start_time, kHistogramMinTime, kHistogramMaxTime, kHistogramTimeBuckets); -#else - DCHECK(image_contexts.empty()); - output_device_->ScheduleOverlays(std::move(overlays)); -#endif } void SkiaOutputSurfaceImplOnGpu::SetEnableDCLayers(bool enable) { @@ -1789,17 +1728,6 @@ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(output_device_); -#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) - // Release any backings which are not reused by the current frame, probably - // because the properties of render passes are changed or render passes are - // removed - if (context_is_lost_) { - for (auto& image : available_render_pass_overlay_backings_) - image->OnContextLost(); - } - available_render_pass_overlay_backings_.clear(); -#endif - if (context_is_lost_) return; @@ -1955,36 +1883,6 @@ waiting_for_full_damage_ = true; } -#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) - // |available_render_pass_overlay_backings_| are used or released in - // SwapBuffers() for every frames. For Ozone-Wayland - // |available_render_pass_overlay_backings_| is not always empty because the - // buffer management in 'GbmSurfacelessWayland::SwapBuffersAsync' will cause - // an accumulation of unsubmitted frames in |unsubmitted_frames_|. These are - // submitted in 'GbmSurfacelessWayland::MaybeSubmitFrames'. Later - // 'GbmSurfacelessWayland::OnSubmission' will then call the callback of these - // |submitted_frames| more than once. This means that this function - // 'DidSwapBuffersCompleteInternal' will get executed again before the - // corresponding 'SkiaOutputSurfaceImplOnGpu::SwapBuffersInternal' has cleared - // 'available_render_pass_overlay_backings_'. -#if !defined(USE_OZONE) - DCHECK(available_render_pass_overlay_backings_.empty()); -#endif - // Erase mailboxes of render pass overlays from |params.released_overlays| and - // move released backings for those render pass overlays from - // |in_flight_render_pass_overlay_backings_| to - // |available_render_pass_overlay_backings_| for reusing. - base::EraseIf(params.released_overlays, [this](const gpu::Mailbox& mailbox) { - auto it = in_flight_render_pass_overlay_backings_.find(mailbox); - if (it == in_flight_render_pass_overlay_backings_.end()) - return false; - available_render_pass_overlay_backings_.push_back(std::move(*it)); - in_flight_render_pass_overlay_backings_.erase(it); - return true; - }); - -#endif - PostTaskToClientThread(base::BindOnce(did_swap_buffer_complete_callback_, params, pixel_size, std::move(release_fence))); @@ -2044,76 +1942,6 @@ gl_surface_->PreserveChildSurfaceControls(); } -#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) -std::unique_ptr<gpu::SharedImageRepresentationSkia> -SkiaOutputSurfaceImplOnGpu::GetOrCreateRenderPassOverlayBacking( - const SkSurfaceCharacterization& characterization) { - ResourceFormat resource_format; - switch (characterization.colorType()) { - case kRGBA_8888_SkColorType: - resource_format = ResourceFormat::RGBA_8888; - break; - case kBGRA_8888_SkColorType: - resource_format = ResourceFormat::BGRA_8888; - break; - case kRGBA_F16_SkColorType: - resource_format = ResourceFormat::RGBA_F16; - break; - default: - resource_format = ResourceFormat::RGBA_8888; - NOTREACHED(); - } - - gfx::Size size(characterization.width(), characterization.height()); - gfx::ColorSpace color_space; - if (characterization.colorSpace()) - color_space = gfx::ColorSpace(*characterization.colorSpace()); - auto it = std::find_if( - available_render_pass_overlay_backings_.begin(), - available_render_pass_overlay_backings_.end(), - [&characterization, &resource_format, &size, &color_space]( - const std::unique_ptr<gpu::SharedImageRepresentationSkia>& backing) { - return backing->format() == resource_format && - backing->size() == size && - backing->color_space() == color_space && - backing->surface_origin() == characterization.origin() && - backing->alpha_type() == - characterization.imageInfo().alphaType(); - }); - - if (it != available_render_pass_overlay_backings_.end()) { - auto backing = std::move(*it); - available_render_pass_overlay_backings_.erase(it); - return backing; - } - - auto mailbox = gpu::Mailbox::GenerateForSharedImage(); - constexpr auto kOverlayUsage = gpu::SHARED_IMAGE_USAGE_SCANOUT | - gpu::SHARED_IMAGE_USAGE_DISPLAY | - gpu::SHARED_IMAGE_USAGE_RASTER; - - bool result = shared_image_factory_->CreateSharedImage( - mailbox, resource_format, size, color_space, characterization.origin(), - characterization.imageInfo().alphaType(), gpu::kNullSurfaceHandle, - kOverlayUsage); - if (!result) { - LOG(ERROR) << "CreateSharedImage() failed."; - MarkContextLost(CONTEXT_LOST_OUT_OF_MEMORY); - return nullptr; - } - - auto backing = shared_image_representation_factory_->ProduceSkia( - mailbox, context_state_.get()); - DCHECK(backing); - - // The |backing| will keep a ref on the shared image, so the image will not be - // released until |backing| is released. - shared_image_factory_->DestroySharedImage(mailbox); - - return backing; -} -#endif // BUILDFLAG(IS_APPLE) || defined(USE_OZONE) - void SkiaOutputSurfaceImplOnGpu::InitDelegatedInkPointRendererReceiver( mojo::PendingReceiver<gfx::mojom::DelegatedInkPointRenderer> pending_receiver) {
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h index 34746cfd..958480c 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h +++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
@@ -184,9 +184,7 @@ void ReleaseImageContexts( std::vector<std::unique_ptr<ExternalUseClient::ImageContext>> image_contexts); - void ScheduleOverlays(SkiaOutputSurface::OverlayList overlays, - std::vector<ImageContextImpl*> image_contexts, - base::OnceClosure on_finished); + void ScheduleOverlays(SkiaOutputSurface::OverlayList overlays); void SetEnableDCLayers(bool enable); void SetGpuVSyncEnabled(bool enabled); @@ -382,12 +380,6 @@ void ReleaseAsyncReadResultHelpers(); -#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) - std::unique_ptr<gpu::SharedImageRepresentationSkia> - GetOrCreateRenderPassOverlayBacking( - const SkSurfaceCharacterization& characterization); -#endif - class ReleaseCurrent { public: ReleaseCurrent(scoped_refptr<gl::GLSurface> gl_surface, @@ -490,34 +482,6 @@ // Tracking for ongoing AsyncReadResults. base::flat_set<AsyncReadResultHelper*> async_read_result_helpers_; -#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) - using UniqueBackingPtr = std::unique_ptr<gpu::SharedImageRepresentationSkia>; - class BackingComparator { - public: - using is_transparent = void; - bool operator()(const UniqueBackingPtr& lhs, - const UniqueBackingPtr& rhs) const { - return lhs->mailbox() < rhs->mailbox(); - } - bool operator()(const UniqueBackingPtr& lhs, - const gpu::Mailbox& rhs) const { - return lhs->mailbox() < rhs; - } - bool operator()(const gpu::Mailbox& lhs, - const UniqueBackingPtr& rhs) const { - return lhs < rhs->mailbox(); - } - }; - // Render pass overlay backings are in flight. - // The base::flat_set uses backing->mailbox() as the unique key. - base::flat_set<UniqueBackingPtr, BackingComparator> - in_flight_render_pass_overlay_backings_; - - // Render pass overlay backings are available for reusing. - std::vector<std::unique_ptr<gpu::SharedImageRepresentationSkia>> - available_render_pass_overlay_backings_; -#endif - THREAD_CHECKER(thread_checker_); base::WeakPtr<SkiaOutputSurfaceImplOnGpu> weak_ptr_;
diff --git a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc index 87a00f3..7be1f12 100644 --- a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc +++ b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc
@@ -791,10 +791,14 @@ metadata.top_controls_visible_height = last_top_controls_visible_height_; oracle_->RecordCapture(utilization); - TRACE_EVENT_NESTABLE_ASYNC_BEGIN2("gpu.capture", "Capture", - oracle_frame_number, "frame_number", - capture_frame_number, "trigger", - VideoCaptureOracle::EventAsString(event)); + // Note: The following is used by + // chrome/browser/media/cast_mirroring_performance_browsertest.cc, in + // addition to the usual runtime tracing + // TODO(https://crbug.com/1322573): change to _NESTABLE_ variant of the macro + // once the bug is fixed. + TRACE_EVENT_ASYNC_BEGIN2("gpu.capture", "Capture", oracle_frame_number, + "frame_number", capture_frame_number, "trigger", + VideoCaptureOracle::EventAsString(event)); const gfx::Size& source_size = oracle_->source_size(); DCHECK(!source_size.IsEmpty()); @@ -1220,11 +1224,13 @@ // original source content. base::TimeTicks media_ticks; if (!oracle_->CompleteCapture(oracle_frame_number, !!frame, &media_ticks)) { - // The following is used by + // Note: The following is used by // chrome/browser/media/cast_mirroring_performance_browsertest.cc, in - // addition to the usual runtime tracing. - TRACE_EVENT_NESTABLE_ASYNC_END1("gpu.capture", "Capture", - oracle_frame_number, "success", false); + // addition to the usual runtime tracing + // TODO(https://crbug.com/1322573): change to _NESTABLE_ variant of the + // macro once the bug is fixed. + TRACE_EVENT_ASYNC_END1("gpu.capture", "Capture", oracle_frame_number, + "success", false); MaybeScheduleRefreshFrame(); return; @@ -1236,12 +1242,14 @@ } frame->set_timestamp(media_ticks - *first_frame_media_ticks_); - // The following is used by + // Note: The following is used by // chrome/browser/media/cast_mirroring_performance_browsertest.cc, in - // addition to the usual runtime tracing. - TRACE_EVENT_NESTABLE_ASYNC_END2("gpu.capture", "Capture", oracle_frame_number, - "success", true, "time_delta", - frame->timestamp().InMicroseconds()); + // addition to the usual runtime tracing + // TODO(https://crbug.com/1322573): change to _NESTABLE_ variant of the macro + // once the bug is fixed. + TRACE_EVENT_ASYNC_END2("gpu.capture", "Capture", oracle_frame_number, + "success", true, "time_delta", + frame->timestamp().InMicroseconds()); // Clone a handle to the shared memory backing the populated video frame, to // send to the consumer.
diff --git a/components/viz/test/fake_skia_output_surface.cc b/components/viz/test/fake_skia_output_surface.cc index f17839f..cc58c10 100644 --- a/components/viz/test/fake_skia_output_surface.cc +++ b/components/viz/test/fake_skia_output_surface.cc
@@ -195,6 +195,7 @@ ResourceFormat format, bool mipmap, sk_sp<SkColorSpace> color_space, + bool is_overlay, const gpu::Mailbox& mailbox) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); // Make sure there is no unsubmitted PaintFrame or PaintRenderPass. @@ -335,23 +336,6 @@ return false; } -#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) -SkCanvas* FakeSkiaOutputSurface::BeginPaintRenderPassOverlay( - const gfx::Size& size, - ResourceFormat format, - bool mipmap, - sk_sp<SkColorSpace> color_space) { - NOTIMPLEMENTED(); - return nullptr; -} - -sk_sp<SkDeferredDisplayList> -FakeSkiaOutputSurface::EndPaintRenderPassOverlay() { - NOTIMPLEMENTED(); - return nullptr; -} -#endif - void FakeSkiaOutputSurface::SetOutOfOrderCallbacks( bool out_of_order_callbacks) { TestContextSupport* support =
diff --git a/components/viz/test/fake_skia_output_surface.h b/components/viz/test/fake_skia_output_surface.h index 4f435e1..140a81e 100644 --- a/components/viz/test/fake_skia_output_surface.h +++ b/components/viz/test/fake_skia_output_surface.h
@@ -19,7 +19,6 @@ #include "components/viz/service/display/skia_output_surface.h" #include "components/viz/test/test_context_provider.h" #include "gpu/command_buffer/common/sync_token.h" -#include "third_party/skia/include/core/SkDeferredDisplayList.h" namespace viz { @@ -79,6 +78,7 @@ ResourceFormat format, bool mipmap, sk_sp<SkColorSpace> color_space, + bool is_overlay, const gpu::Mailbox& mailbox) override; void EndPaint(base::OnceClosure on_finished) override; void MakePromiseSkImage(ImageContext* image_context) override; @@ -92,8 +92,7 @@ void RemoveRenderPassResource( std::vector<AggregatedRenderPassId> ids) override; void ScheduleOverlays(OverlayList overlays, - std::vector<gpu::SyncToken> sync_tokens, - base::OnceClosure on_finished) override {} + std::vector<gpu::SyncToken> sync_tokens) override {} #if BUILDFLAG(IS_WIN) void SetEnableDCLayers(bool enable) override {} #endif @@ -107,15 +106,6 @@ gpu::SharedImageInterface* GetSharedImageInterface() override; gpu::SyncToken Flush() override; bool EnsureMinNumberOfBuffers(int n) override; -#if BUILDFLAG(IS_APPLE) || defined(USE_OZONE) - SkCanvas* BeginPaintRenderPassOverlay( - const gfx::Size& size, - ResourceFormat format, - bool mipmap, - sk_sp<SkColorSpace> color_space) override; - sk_sp<SkDeferredDisplayList> EndPaintRenderPassOverlay() override; -#endif - void PreserveChildSurfaceControls() override {} // ExternalUseClient implementation:
diff --git a/components/webrtc_logging/logging_unittest.cc b/components/webrtc_logging/logging_unittest.cc index 77847c2..2085eae9 100644 --- a/components/webrtc_logging/logging_unittest.cc +++ b/components/webrtc_logging/logging_unittest.cc
@@ -68,7 +68,14 @@ if (!logging::InitLogging(settings)) { return false; } + +#if BUILDFLAG(USE_RUNTIME_VLOG) EXPECT_TRUE(VLOG_IS_ON(verbosity_level)); +#else + // VLOGs default to off when not using runtime vlog. + EXPECT_FALSE(VLOG_IS_ON(verbosity_level)); +#endif // BUILDFLAG(USE_RUNTIME_VLOG) + EXPECT_FALSE(VLOG_IS_ON(verbosity_level + 1)); return true; } @@ -147,9 +154,12 @@ // Make sure string contains the expected values. EXPECT_TRUE(ContainsString(contents_of_file, AsString(rtc::LS_ERROR))); EXPECT_TRUE(ContainsString(contents_of_file, AsString(rtc::LS_WARNING))); + +#if BUILDFLAG(USE_RUNTIME_VLOG) EXPECT_TRUE(ContainsString(contents_of_file, AsString(rtc::LS_INFO))); // RTC_LOG_E EXPECT_TRUE(ContainsString(contents_of_file, strerror(kFakeError))); EXPECT_TRUE(ContainsString(contents_of_file, AsString(rtc::LS_VERBOSE))); EXPECT_TRUE(ContainsString(contents_of_file, AsString(rtc::LS_SENSITIVE))); +#endif // BUILDFLAG(USE_RUNTIME_VLOG) }
diff --git a/content/browser/aggregation_service/aggregatable_report_unittest.cc b/content/browser/aggregation_service/aggregatable_report_unittest.cc index 12f78e31..8ff2ab14 100644 --- a/content/browser/aggregation_service/aggregatable_report_unittest.cc +++ b/content/browser/aggregation_service/aggregatable_report_unittest.cc
@@ -30,50 +30,6 @@ namespace content { -std::vector<uint8_t> DecryptPayloadWithHpke( - const std::vector<uint8_t>& payload, - const EVP_HPKE_KEY& key, - const std::string& expected_serialized_shared_info) { - base::span<const uint8_t> enc = - base::make_span(payload).subspan(0, X25519_PUBLIC_VALUE_LEN); - - std::vector<uint8_t> authenticated_info( - AggregatableReport::kDomainSeparationPrefix, - AggregatableReport::kDomainSeparationPrefix + - sizeof(AggregatableReport::kDomainSeparationPrefix)); - authenticated_info.insert(authenticated_info.end(), - expected_serialized_shared_info.begin(), - expected_serialized_shared_info.end()); - - bssl::ScopedEVP_HPKE_CTX recipient_context; - if (!EVP_HPKE_CTX_setup_recipient( - /*ctx=*/recipient_context.get(), /*key=*/&key, - /*kdf=*/EVP_hpke_hkdf_sha256(), - /*aead=*/EVP_hpke_chacha20_poly1305(), - /*enc=*/enc.data(), /*enc_len=*/enc.size(), - /*info=*/authenticated_info.data(), - /*info_len=*/authenticated_info.size())) { - return {}; - } - - base::span<const uint8_t> ciphertext = - base::make_span(payload).subspan(X25519_PUBLIC_VALUE_LEN); - std::vector<uint8_t> plaintext(ciphertext.size()); - size_t plaintext_len; - - if (!EVP_HPKE_CTX_open( - /*ctx=*/recipient_context.get(), /*out=*/plaintext.data(), - /*out_len*/ &plaintext_len, /*max_out_len=*/plaintext.size(), - /*in=*/ciphertext.data(), /*in_len=*/ciphertext.size(), - /*ad=*/nullptr, - /*ad_len=*/0)) { - return {}; - } - - plaintext.resize(plaintext_len); - return plaintext; -} - testing::AssertionResult CborMapContainsKeyAndType( const cbor::Value::MapValue& map, const std::string& key, @@ -115,9 +71,10 @@ for (size_t i = 0; i < expected_num_processing_urls; ++i) { EXPECT_EQ(payloads[i].key_id, encryption_keys[i].public_key.id); - std::vector<uint8_t> decrypted_payload = DecryptPayloadWithHpke( - payloads[i].payload, encryption_keys[i].full_hpke_key, - expected_serialized_shared_info); + std::vector<uint8_t> decrypted_payload = + aggregation_service::DecryptPayloadWithHpke( + payloads[i].payload, encryption_keys[i].full_hpke_key, + expected_serialized_shared_info); ASSERT_FALSE(decrypted_payload.empty()); if (expected_shared_info.debug_mode ==
diff --git a/content/browser/aggregation_service/aggregation_service_test_utils.cc b/content/browser/aggregation_service/aggregation_service_test_utils.cc index b714106..ed634e4 100644 --- a/content/browser/aggregation_service/aggregation_service_test_utils.cc +++ b/content/browser/aggregation_service/aggregation_service_test_utils.cc
@@ -14,6 +14,7 @@ #include "base/base64.h" #include "base/containers/contains.h" +#include "base/containers/span.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/guid.h" @@ -283,6 +284,50 @@ /*expiry_time=*/base::Time::Max()); } +std::vector<uint8_t> DecryptPayloadWithHpke( + const std::vector<uint8_t>& payload, + const EVP_HPKE_KEY& key, + const std::string& expected_serialized_shared_info) { + base::span<const uint8_t> enc = + base::make_span(payload).subspan(0, X25519_PUBLIC_VALUE_LEN); + + std::vector<uint8_t> authenticated_info( + AggregatableReport::kDomainSeparationPrefix, + AggregatableReport::kDomainSeparationPrefix + + sizeof(AggregatableReport::kDomainSeparationPrefix)); + authenticated_info.insert(authenticated_info.end(), + expected_serialized_shared_info.begin(), + expected_serialized_shared_info.end()); + + bssl::ScopedEVP_HPKE_CTX recipient_context; + if (!EVP_HPKE_CTX_setup_recipient( + /*ctx=*/recipient_context.get(), /*key=*/&key, + /*kdf=*/EVP_hpke_hkdf_sha256(), + /*aead=*/EVP_hpke_chacha20_poly1305(), + /*enc=*/enc.data(), /*enc_len=*/enc.size(), + /*info=*/authenticated_info.data(), + /*info_len=*/authenticated_info.size())) { + return {}; + } + + base::span<const uint8_t> ciphertext = + base::make_span(payload).subspan(X25519_PUBLIC_VALUE_LEN); + std::vector<uint8_t> plaintext(ciphertext.size()); + size_t plaintext_len; + + if (!EVP_HPKE_CTX_open( + /*ctx=*/recipient_context.get(), /*out=*/plaintext.data(), + /*out_len*/ &plaintext_len, /*max_out_len=*/plaintext.size(), + /*in=*/ciphertext.data(), /*in_len=*/ciphertext.size(), + /*ad=*/nullptr, + /*ad_len=*/0)) { + return {}; + } + + plaintext.resize(plaintext_len); + return plaintext; +} + } // namespace aggregation_service TestAggregationServiceStorageContext::TestAggregationServiceStorageContext(
diff --git a/content/browser/aggregation_service/aggregation_service_test_utils.h b/content/browser/aggregation_service/aggregation_service_test_utils.h index 2204034e..ccb03f9 100644 --- a/content/browser/aggregation_service/aggregation_service_test_utils.h +++ b/content/browser/aggregation_service/aggregation_service_test_utils.h
@@ -74,6 +74,12 @@ base::Time now, std::string* error_msg = nullptr); +// Returns empty vector in the case of an error. +std::vector<uint8_t> DecryptPayloadWithHpke( + const std::vector<uint8_t>& payload, + const EVP_HPKE_KEY& key, + const std::string& expected_serialized_shared_info); + } // namespace aggregation_service // The strings "ABCD1234" and "EFGH5678", Base64-decoded to bytes. Note that
diff --git a/content/browser/attribution_reporting/aggregatable_attribution_utils.h b/content/browser/attribution_reporting/aggregatable_attribution_utils.h index aa2fb114..85eaeb0 100644 --- a/content/browser/attribution_reporting/aggregatable_attribution_utils.h +++ b/content/browser/attribution_reporting/aggregatable_attribution_utils.h
@@ -44,8 +44,8 @@ kMaxValue = kAssembleReportFailed, }; -absl::optional<AggregatableReportRequest> CreateAggregatableReportRequest( - const AttributionReport& report); +CONTENT_EXPORT absl::optional<AggregatableReportRequest> +CreateAggregatableReportRequest(const AttributionReport& report); } // namespace content
diff --git a/content/browser/attribution_reporting/attribution_aggregatable_report_golden_unittest.cc b/content/browser/attribution_reporting/attribution_aggregatable_report_golden_unittest.cc new file mode 100644 index 0000000..6fd79216 --- /dev/null +++ b/content/browser/attribution_reporting/attribution_aggregatable_report_golden_unittest.cc
@@ -0,0 +1,303 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <stdint.h> + +#include <string> +#include <utility> +#include <vector> + +#include "base/base64.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/path_service.h" +#include "base/run_loop.h" +#include "base/strings/string_piece.h" +#include "base/strings/string_util.h" +#include "base/test/bind.h" +#include "base/test/values_test_util.h" +#include "base/time/time.h" +#include "content/browser/aggregation_service/aggregation_service.h" +#include "content/browser/aggregation_service/aggregation_service_features.h" +#include "content/browser/aggregation_service/aggregation_service_impl.h" +#include "content/browser/aggregation_service/aggregation_service_test_utils.h" +#include "content/browser/aggregation_service/public_key.h" +#include "content/browser/attribution_reporting/aggregatable_attribution_utils.h" +#include "content/browser/attribution_reporting/attribution_test_utils.h" +#include "content/browser/attribution_reporting/attribution_utils.h" +#include "content/browser/storage_partition_impl.h" +#include "content/public/common/content_paths.h" +#include "content/public/test/browser_task_environment.h" +#include "content/public/test/test_browser_context.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/abseil-cpp/absl/types/variant.h" +#include "third_party/boringssl/src/include/openssl/hpke.h" +#include "url/gurl.h" + +namespace content { +namespace { + +constexpr char kKeyAggregationServicePayloads[] = + "aggregation_service_payloads"; + +std::string ReadStringFromFile(const base::FilePath& file, bool trim = false) { + std::string str; + EXPECT_TRUE(base::ReadFileToString(file, &str)); + if (trim) { + str = std::string(base::TrimString(str, base::kWhitespaceASCII, + base::TrimPositions::TRIM_ALL)); + } + return str; +} + +// See +// //content/test/data/attribution_reporting/aggregatable_report_goldens/README.md. +class AttributionAggregatableReportGoldenTest : public testing::Test { + public: + void SetUp() override { + base::PathService::Get(content::DIR_TEST_DATA, &input_dir_); + input_dir_ = input_dir_.AppendASCII( + "attribution_reporting/aggregatable_report_goldens/latest"); + + absl::optional<PublicKeyset> keyset = + aggregation_service::ReadAndParsePublicKeys( + input_dir_.AppendASCII("public_key.json"), base::Time::Now()); + ASSERT_TRUE(keyset); + ASSERT_EQ(keyset->keys.size(), 1u); + + aggregation_service().SetPublicKeysForTesting( + GURL(kPrivacySandboxAggregationServiceTrustedServerUrlParam.Get()), + std::move(*keyset)); + + absl::optional<std::vector<uint8_t>> private_key = + base::Base64Decode(ReadStringFromFile( + input_dir_.AppendASCII("private_key.txt"), /*trim=*/true)); + ASSERT_TRUE(private_key); + ASSERT_EQ(static_cast<int>(private_key->size()), X25519_PRIVATE_KEY_LEN); + + ASSERT_TRUE(EVP_HPKE_KEY_init(full_hpke_key_.get(), + EVP_hpke_x25519_hkdf_sha256(), + private_key->data(), private_key->size())); + } + + protected: + void AssembleAndVerifyReport(AttributionReport report, + base::StringPiece report_file) { + base::Value expected_report = base::test::ParseJson( + ReadStringFromFile(input_dir_.AppendASCII(report_file))); + ASSERT_TRUE(expected_report.is_dict()); + + absl::optional<AggregatableReportRequest> request = + CreateAggregatableReportRequest(report); + ASSERT_TRUE(request); + + base::RunLoop run_loop; + + aggregation_service().AssembleReport( + std::move(*request), + base::BindLambdaForTesting( + [&](absl::optional<AggregatableReport> assembled_report, + AggregationService::AssemblyStatus status) { + EXPECT_EQ(status, AggregationService::AssemblyStatus::kOk); + ASSERT_TRUE(assembled_report); + auto* data = + absl::get_if<AttributionReport::AggregatableAttributionData>( + &report.data()); + ASSERT_TRUE(data); + data->assembled_report = std::move(*assembled_report); + EXPECT_TRUE(VerifyReport(report.ReportBody(), + std::move(expected_report.GetDict()))) + << "There was an error, actual output for " << report_file + << " is:\n" + << SerializeAttributionJson(report.ReportBody(), + /*pretty_print=*/true); + run_loop.Quit(); + })); + + run_loop.Run(); + } + + private: + AggregationServiceImpl& aggregation_service() { + return *(static_cast<StoragePartitionImpl*>( + browser_context_.GetDefaultStoragePartition()) + ->GetAggregationService()); + } + + testing::AssertionResult VerifyReport(base::Value::Dict actual_report, + base::Value::Dict expected_report) { + absl::optional<base::Value> actual_payloads = + actual_report.Extract(kKeyAggregationServicePayloads); + if (!actual_payloads) { + return testing::AssertionFailure() << kKeyAggregationServicePayloads + << " not present in the actual report"; + } + + absl::optional<base::Value> expected_payloads = + expected_report.Extract(kKeyAggregationServicePayloads); + if (!expected_payloads) { + return testing::AssertionFailure() + << kKeyAggregationServicePayloads + << " not present in the expected report"; + } + + // All other fields are deterministic. + if (actual_report != expected_report) { + return testing::AssertionFailure() + << "The actual report and expected reports do not match, ignoring " + "the aggregation service payloads"; + } + + static constexpr char kKeySharedInfo[] = "shared_info"; + const std::string* shared_info = expected_report.FindString(kKeySharedInfo); + if (!shared_info) { + return testing::AssertionFailure() + << kKeySharedInfo << " not present in the report"; + } + + if (!actual_payloads->is_list()) { + return testing::AssertionFailure() << kKeyAggregationServicePayloads + << " not a list in the actual report"; + } + + if (!expected_payloads->is_list()) { + return testing::AssertionFailure() + << kKeyAggregationServicePayloads + << " not a list in the expected report"; + } + + return VerifyAggregationServicePayloads( + std::move(actual_payloads->GetList()), + std::move(expected_payloads->GetList()), *shared_info); + } + + testing::AssertionResult VerifyAggregationServicePayloads( + base::Value::List actual_payloads, + base::Value::List expected_payloads, + const std::string& shared_info) { + if (actual_payloads.size() != 1u) { + return testing::AssertionFailure() + << kKeyAggregationServicePayloads + << " not a list of size 1 in the actual report"; + } + + base::Value::Dict* actual_payload = actual_payloads.front().GetIfDict(); + if (!actual_payload) { + return testing::AssertionFailure() + << kKeyAggregationServicePayloads + << "[0] not a dictionary in the actual report"; + } + + if (expected_payloads.size() != 1u) { + return testing::AssertionFailure() + << kKeyAggregationServicePayloads + << " not a list of size 1 in the expected report"; + } + + base::Value::Dict* expected_payload = expected_payloads.front().GetIfDict(); + if (!expected_payload) { + return testing::AssertionFailure() + << kKeyAggregationServicePayloads + << "[0] not a dictionary in the expected report"; + } + + static constexpr char kKeyPayload[] = "payload"; + + absl::optional<base::Value> actual_encrypted_payload = + actual_payload->Extract(kKeyPayload); + if (!actual_encrypted_payload) { + return testing::AssertionFailure() + << kKeyPayload << " not present in the actual report"; + } + + absl::optional<base::Value> expected_encrypted_payload = + expected_payload->Extract(kKeyPayload); + if (!expected_encrypted_payload) { + return testing::AssertionFailure() + << kKeyPayload << " not present in the expected report"; + } + + // All other fields are deterministic. + if (*actual_payload != *expected_payload) { + return testing::AssertionFailure() + << "The actual and expected aggregation service payloads do not " + "match, ignoring the encrypted payloads"; + } + + std::vector<uint8_t> actual_decrypted_payload = + DecryptPayload(actual_encrypted_payload->GetString(), shared_info); + if (actual_decrypted_payload.empty()) { + return testing::AssertionFailure() + << "Failed to decrypt payload in the actual report"; + } + + std::vector<uint8_t> expected_decrypted_payload = + DecryptPayload(expected_encrypted_payload->GetString(), shared_info); + if (expected_decrypted_payload.empty()) { + return testing::AssertionFailure() + << "Failed to decrypt payload in the expected payload"; + } + + if (actual_decrypted_payload != expected_decrypted_payload) { + return testing::AssertionFailure() + << "The actual and expected decrypted payloads do not match"; + } + + return testing::AssertionSuccess(); + } + + // Returns empty vector in case of an error. + std::vector<uint8_t> DecryptPayload( + const std::string& base64_encoded_encrypted_payload, + const std::string& shared_info) { + absl::optional<std::vector<uint8_t>> encrypted_payload = + base::Base64Decode(base64_encoded_encrypted_payload); + if (!encrypted_payload) + return {}; + + return aggregation_service::DecryptPayloadWithHpke( + *encrypted_payload, *full_hpke_key_.get(), shared_info); + } + + BrowserTaskEnvironment task_environment_; + TestBrowserContext browser_context_; + base::FilePath input_dir_; + bssl::ScopedEVP_HPKE_KEY full_hpke_key_; +}; + +TEST_F(AttributionAggregatableReportGoldenTest, VerifyGoldenReport) { + struct { + AttributionReport report; + base::StringPiece report_file; + } kTestCases[] = { + {.report = + ReportBuilder( + AttributionInfoBuilder( + SourceBuilder(base::Time::FromJavaTime(1234483200000)) + .SetDebugKey(123) + .BuildStored()) + .SetDebugKey(456) + .Build()) + .SetAggregatableHistogramContributions( + {AggregatableHistogramContribution(/*key=*/1, /*value=*/2)}) + .SetReportTime(base::Time::FromJavaTime(1234486400000)) + .BuildAggregatableAttribution(), + .report_file = "report_1.json"}, + }; + + // TODO(crbug.com/1320712): Considering adding cleartext payloads for each + // gold file and verify. + + for (auto& test_case : kTestCases) { + AssembleAndVerifyReport(std::move(test_case.report), test_case.report_file); + } +} + +// TODO(crbug.com/1320712): Consider adding tests which old versions are +// properly labeled/stored, for example ensuring the directory name matches the +// report version. + +} // namespace +} // namespace content
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc b/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc index ad2afa0e..a0e62197 100644 --- a/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc +++ b/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc
@@ -149,7 +149,8 @@ case AttributionDelayMode::kDefault: switch (noise_mode_) { case AttributionNoiseMode::kDefault: - return trigger_time + rng_->RandDouble() * base::Hours(1); + return trigger_time + base::Minutes(10) + + rng_->RandDouble() * base::Minutes(50); case AttributionNoiseMode::kNone: return trigger_time + base::Hours(1); }
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc b/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc index 3a35fb6..06260cb 100644 --- a/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc
@@ -217,7 +217,8 @@ base::Time trigger_time = base::Time::Now(); EXPECT_THAT( AttributionStorageDelegateImpl().GetAggregatableReportTime(trigger_time), - AllOf(Ge(trigger_time), Lt(trigger_time + base::Hours(1)))); + AllOf(Ge(trigger_time + base::Minutes(10)), + Lt(trigger_time + base::Hours(1)))); } TEST(AttributionStorageDelegateImplTest, NewReportID_IsValidGUID) {
diff --git a/content/browser/attribution_reporting/attribution_utils.h b/content/browser/attribution_reporting/attribution_utils.h index 4a1d422..a93a87e 100644 --- a/content/browser/attribution_reporting/attribution_utils.h +++ b/content/browser/attribution_reporting/attribution_utils.h
@@ -31,8 +31,8 @@ // Calculates the report time for a given source and window index. base::Time ReportTimeAtWindow(const CommonSourceInfo& source, int window_index); -std::string SerializeAttributionJson(base::ValueView body, - bool pretty_print = false); +CONTENT_EXPORT std::string SerializeAttributionJson(base::ValueView body, + bool pretty_print = false); // Checks whether filters keys within `source` and `trigger` match. // `negated` indicates that no filter data keys should have a match
diff --git a/content/browser/devtools/protocol/devtools_protocol_test_support.cc b/content/browser/devtools/protocol/devtools_protocol_test_support.cc index a0e13d65..872eb8312 100644 --- a/content/browser/devtools/protocol/devtools_protocol_test_support.cc +++ b/content/browser/devtools/protocol/devtools_protocol_test_support.cc
@@ -6,41 +6,30 @@ #include <memory> -#include "base/json/json_reader.h" -#include "base/json/json_writer.h" -#include "base/memory/ptr_util.h" -#include "base/run_loop.h" -#include "base/strings/utf_string_conversions.h" #include "content/public/common/content_switches.h" #include "content/public/test/test_utils.h" #include "content/shell/browser/shell.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" -#include "third_party/blink/public/mojom/loader/mixed_content.mojom.h" namespace content { -namespace { - -const char kIdParam[] = "id"; -const char kSessionIdParam[] = "sessionId"; -const char kMethodParam[] = "method"; -const char kParamsParam[] = "params"; - -} // namespace - -DevToolsProtocolTest::DevToolsProtocolTest() - : last_sent_id_(0), - waiting_for_command_result_id_(0), - in_dispatch_(false), - agent_host_can_close_(false) {} - +DevToolsProtocolTest::DevToolsProtocolTest() = default; DevToolsProtocolTest::~DevToolsProtocolTest() = default; +void DevToolsProtocolTest::Attach() { + AttachToWebContents(shell()->web_contents()); + shell()->web_contents()->SetDelegate(this); +} + void DevToolsProtocolTest::SetUpOnMainThread() { host_resolver()->AddRule("*", "127.0.0.1"); } +void DevToolsProtocolTest::TearDownOnMainThread() { + DetachProtocolClient(); +} + bool DevToolsProtocolTest::DidAddMessageToConsole( WebContents* source, blink::mojom::ConsoleMessageLevel log_level, @@ -51,247 +40,4 @@ return true; } -base::DictionaryValue* DevToolsProtocolTest::SendSessionCommand( - const std::string& method, - std::unique_ptr<base::Value> params, - const std::string& session_id, - bool wait) { - in_dispatch_ = true; - base::DictionaryValue command; - command.SetInteger(kIdParam, ++last_sent_id_); - command.SetString(kMethodParam, method); - if (params) - command.SetKey(kParamsParam, - base::Value::FromUniquePtrValue(std::move(params))); - if (!session_id.empty()) - command.SetString(kSessionIdParam, session_id); - - std::string json_command; - base::JSONWriter::Write(command, &json_command); - agent_host_->DispatchProtocolMessage( - this, base::as_bytes(base::make_span(json_command))); - // Some messages are dispatched synchronously. - // Only run loop if we are not finished yet. - if (in_dispatch_ && wait) { - WaitForResponse(); - in_dispatch_ = false; - return result_.get(); - } - in_dispatch_ = false; - return result_.get(); -} - -void DevToolsProtocolTest::WaitForResponse() { - waiting_for_command_result_id_ = last_sent_id_; - RunLoopUpdatingQuitClosure(); -} - -bool DevToolsProtocolTest::HasValue(const std::string& path) { - base::Value* value = nullptr; - return result_->Get(path, &value); -} - -bool DevToolsProtocolTest::HasListItem(const std::string& path_to_list, - const std::string& name, - const std::string& value) { - base::ListValue* list; - if (!result_->GetList(path_to_list, &list)) - return false; - - for (const base::Value& item_value : list->GetListDeprecated()) { - if (!item_value.is_dict()) - return false; - const base::DictionaryValue& item = - base::Value::AsDictionaryValue(item_value); - std::string id; - if (!item.GetString(name, &id)) - return false; - if (id == value) - return true; - } - return false; -} - -void DevToolsProtocolTest::Attach() { - agent_host_ = DevToolsAgentHost::GetOrCreateFor(shell()->web_contents()); - agent_host_->AttachClient(this); - shell()->web_contents()->SetDelegate(this); -} - -void DevToolsProtocolTest::AttachToBrowserTarget() { - // Tethering domain is not used in tests. - agent_host_ = DevToolsAgentHost::CreateForBrowser( - nullptr, DevToolsAgentHost::CreateServerSocketCallback()); - agent_host_->AttachClient(this); - shell()->web_contents()->SetDelegate(this); -} - -void DevToolsProtocolTest::TearDownOnMainThread() { - Detach(); -} - -bool DevToolsProtocolTest::HasExistingNotification( - const std::string& search) const { - for (const std::string& notification : notifications_) { - if (notification == search) - return true; - } - return false; -} - -std::unique_ptr<base::DictionaryValue> -DevToolsProtocolTest::WaitForNotification(const std::string& notification, - bool allow_existing) { - if (allow_existing) { - for (size_t i = 0; i < notifications_.size(); i++) { - if (notifications_[i] == notification) { - std::unique_ptr<base::DictionaryValue> result = - std::move(notification_params_[i]); - notifications_.erase(notifications_.begin() + i); - notification_params_.erase(notification_params_.begin() + i); - return result; - } - } - } - - waiting_for_notification_ = notification; - RunLoopUpdatingQuitClosure(); - return std::move(waiting_for_notification_params_); -} - -std::unique_ptr<base::DictionaryValue> -DevToolsProtocolTest::WaitForMatchingNotification( - const std::string& notification, - const NotificationMatcher& matcher) { - for (size_t i = 0; i < notifications_.size(); i++) { - if (notifications_[i] == notification && - matcher.Run(notification_params_[i].get())) { - std::unique_ptr<base::DictionaryValue> result = - std::move(notification_params_[i]); - notifications_.erase(notifications_.begin() + i); - notification_params_.erase(notification_params_.begin() + i); - return result; - } - } - - waiting_for_notification_ = notification; - waiting_for_notification_matcher_ = matcher; - RunLoopUpdatingQuitClosure(); - return std::move(waiting_for_notification_params_); -} - -void DevToolsProtocolTest::ProcessNavigationsAnyOrder( - std::vector<ExpectedNavigation> expected_navigations) { - while (!expected_navigations.empty()) { - std::unique_ptr<base::DictionaryValue> params = - WaitForNotification("Network.requestIntercepted"); - - const std::string* interception_id = - params->FindStringKey("interceptionId"); - ASSERT_TRUE(interception_id); - bool is_redirect = params->FindKey("redirectUrl"); - absl::optional<bool> is_navigation = - params->FindBoolKey("isNavigationRequest"); - ASSERT_TRUE(is_navigation); - const std::string* resource_type = params->FindStringKey("resourceType"); - ASSERT_TRUE(resource_type); - - const std::string* url_in = params->FindStringPath("request.url"); - ASSERT_TRUE(url_in); - if (is_redirect) { - url_in = params->FindStringKey("redirectUrl"); - ASSERT_TRUE(url_in); - } - // The url will typically have a random port which we want to remove. - const std::string url = RemovePort(GURL(*url_in)); - - if (*is_navigation) { - params = std::make_unique<base::DictionaryValue>(); - params->SetStringKey("interceptionId", *interception_id); - SendCommand("Network.continueInterceptedRequest", std::move(params), - false); - continue; - } - - bool navigation_was_expected = false; - for (auto it = expected_navigations.begin(); - it != expected_navigations.end(); it++) { - if (url != it->url || is_redirect != it->is_redirect) - continue; - - params = std::make_unique<base::DictionaryValue>(); - params->SetStringKey("interceptionId", *interception_id); - if (it->abort) - params->SetStringKey("errorReason", "Aborted"); - SendCommand("Network.continueInterceptedRequest", std::move(params), - false); - - navigation_was_expected = true; - expected_navigations.erase(it); - break; - } - EXPECT_TRUE(navigation_was_expected) - << "url = " << url << "is_redirect = " << is_redirect; - } -} - -void DevToolsProtocolTest::RunLoopUpdatingQuitClosure() { - base::RunLoop run_loop; - run_loop_quit_closure_ = run_loop.QuitClosure(); - run_loop.Run(); -} - -void DevToolsProtocolTest::DispatchProtocolMessage( - DevToolsAgentHost* agent_host, - base::span<const uint8_t> message) { - base::StringPiece message_str(reinterpret_cast<const char*>(message.data()), - message.size()); - auto root = base::DictionaryValue::From( - base::JSONReader::ReadDeprecated(message_str)); - absl::optional<int> id = root->FindIntKey("id"); - if (id) { - result_ids_.push_back(*id); - base::DictionaryValue* result; - bool have_result = root->GetDictionary("result", &result); - result_.reset(have_result ? result->DeepCopy() : nullptr); - base::Value* error = root->FindDictKey("error"); - error_ = error ? error->Clone() : base::Value(); - in_dispatch_ = false; - if (*id && *id == waiting_for_command_result_id_) { - waiting_for_command_result_id_ = 0; - std::move(run_loop_quit_closure_).Run(); - } - } else { - std::string notification; - EXPECT_TRUE(root->GetString("method", ¬ification)); - notifications_.push_back(notification); - base::DictionaryValue* params; - if (root->GetDictionary("params", ¶ms)) { - notification_params_.push_back(params->CreateDeepCopy()); - } else { - notification_params_.push_back( - base::WrapUnique(new base::DictionaryValue())); - } - if (waiting_for_notification_ == notification && - (waiting_for_notification_matcher_.is_null() || - waiting_for_notification_matcher_.Run( - notification_params_[notification_params_.size() - 1].get()))) { - waiting_for_notification_ = std::string(); - waiting_for_notification_matcher_ = NotificationMatcher(); - waiting_for_notification_params_ = base::WrapUnique( - notification_params_[notification_params_.size() - 1]->DeepCopy()); - std::move(run_loop_quit_closure_).Run(); - } - } -} - -void DevToolsProtocolTest::AgentHostClosed(DevToolsAgentHost* agent_host) { - if (!agent_host_can_close_) - NOTREACHED(); -} - -bool DevToolsProtocolTest::AllowUnsafeOperations() { - return allow_unsafe_operations_; -} - } // namespace content
diff --git a/content/browser/devtools/protocol/devtools_protocol_test_support.h b/content/browser/devtools/protocol/devtools_protocol_test_support.h index 14b5f625..bdebd367 100644 --- a/content/browser/devtools/protocol/devtools_protocol_test_support.h +++ b/content/browser/devtools/protocol/devtools_protocol_test_support.h
@@ -5,150 +5,38 @@ #ifndef CONTENT_BROWSER_DEVTOOLS_PROTOCOL_DEVTOOLS_PROTOCOL_TEST_SUPPORT_H_ #define CONTENT_BROWSER_DEVTOOLS_PROTOCOL_DEVTOOLS_PROTOCOL_TEST_SUPPORT_H_ -#include <memory> #include <string> -#include "base/callback.h" -#include "base/values.h" -#include "content/public/browser/devtools_agent_host.h" +#include <vector> + #include "content/public/browser/web_contents_delegate.h" #include "content/public/test/content_browser_test.h" -#include "net/test/cert_test_util.h" +#include "content/public/test/test_devtools_protocol_client.h" namespace content { class DevToolsProtocolTest : virtual public ContentBrowserTest, - public DevToolsAgentHostClient, - public WebContentsDelegate { + public WebContentsDelegate, + public TestDevToolsProtocolClient { public: - typedef base::RepeatingCallback<bool(base::DictionaryValue*)> - NotificationMatcher; - DevToolsProtocolTest(); ~DevToolsProtocolTest() override; - void SetUpOnMainThread() override; - protected: - // WebContentsDelegate methods: + void Detach() { DetachProtocolClient(); } + void Attach(); + + // WebContentsDelegate overrides. bool DidAddMessageToConsole(WebContents* source, blink::mojom::ConsoleMessageLevel log_level, const std::u16string& message, int32_t line_no, const std::u16string& source_id) override; - base::DictionaryValue* SendCommand(const std::string& method, - std::unique_ptr<base::Value> params) { - return SendCommand(method, std::move(params), true); - } - - base::DictionaryValue* SendCommand(const std::string& method, - std::unique_ptr<base::Value> params, - bool wait) { - return SendSessionCommand(method, std::move(params), std::string(), wait); - } - - base::DictionaryValue* SendSessionCommand(const std::string& method, - std::unique_ptr<base::Value> params, - const std::string& session_id) { - return SendSessionCommand(method, std::move(params), session_id, true); - } - - base::DictionaryValue* SendSessionCommand(const std::string& method, - std::unique_ptr<base::Value> params, - const std::string& session_id, - bool wait); - - void WaitForResponse(); - - bool HasValue(const std::string& path); - - bool HasListItem(const std::string& path_to_list, - const std::string& name, - const std::string& value); - - void Attach(); - - void AttachToBrowserTarget(); - - void Detach() { - if (agent_host_) { - agent_host_->DetachClient(this); - agent_host_ = nullptr; - } - } - + // ContentBrowserTest overrides. + void SetUpOnMainThread() override; void TearDownOnMainThread() override; - bool HasExistingNotification(const std::string& notification) const; - std::unique_ptr<base::DictionaryValue> WaitForNotification( - const std::string& notification) { - return WaitForNotification(notification, false); - } - - std::unique_ptr<base::DictionaryValue> WaitForNotification( - const std::string& notification, - bool allow_existing); - - // Waits for a notification whose params, when passed to |matcher|, returns - // true. Existing notifications are allowed. - std::unique_ptr<base::DictionaryValue> WaitForMatchingNotification( - const std::string& notification, - const NotificationMatcher& matcher); - - void ClearNotifications() { - notifications_.clear(); - notification_params_.clear(); - } - - struct ExpectedNavigation { - std::string url; - bool is_redirect; - bool abort; - }; - - std::string RemovePort(const GURL& url) { - GURL::Replacements remove_port; - remove_port.ClearPort(); - return url.ReplaceComponents(remove_port).spec(); - } - - // Waits for the expected navigations to occur in any order. If an expected - // navigation occurs, Network.continueInterceptedRequest is called with the - // specified navigation_response to either allow it to proceed or to cancel - // it. - void ProcessNavigationsAnyOrder( - std::vector<ExpectedNavigation> expected_navigations); - - void set_agent_host_can_close() { agent_host_can_close_ = true; } - - void SetAllowUnsafeOperations(bool allow) { - allow_unsafe_operations_ = allow; - } - - std::unique_ptr<base::DictionaryValue> result_; - base::Value error_; - scoped_refptr<DevToolsAgentHost> agent_host_; - int last_sent_id_; - std::vector<int> result_ids_; - std::vector<std::string> notifications_; std::vector<std::string> console_messages_; - std::vector<std::unique_ptr<base::DictionaryValue>> notification_params_; - - private: - void RunLoopUpdatingQuitClosure(); - void DispatchProtocolMessage(DevToolsAgentHost* agent_host, - base::span<const uint8_t> message) override; - void AgentHostClosed(DevToolsAgentHost* agent_host) override; - bool AllowUnsafeOperations() override; - - std::string waiting_for_notification_; - NotificationMatcher waiting_for_notification_matcher_; - std::unique_ptr<base::DictionaryValue> waiting_for_notification_params_; - int waiting_for_command_result_id_; - bool in_dispatch_; - bool agent_host_can_close_; - base::OnceClosure run_loop_quit_closure_; - bool allow_unsafe_operations_ = true; }; } // namespace content
diff --git a/content/browser/webid/fedcm_metrics.h b/content/browser/webid/fedcm_metrics.h index 441e0af..421b494 100644 --- a/content/browser/webid/fedcm_metrics.h +++ b/content/browser/webid/fedcm_metrics.h
@@ -45,8 +45,9 @@ kManifestListInvalidResponse, kManifestNotInManifestList, kManifestListTooBig, + kDisabledEmbargo, - kMaxValue = kManifestListTooBig + kMaxValue = kDisabledEmbargo }; // This enum describes the status of a revocation call to the FedCM API. @@ -70,8 +71,9 @@ kManifestListInvalidResponse, kManifestNotInManifestList, kManifestListTooBig, + kThirdPartyCookiesBlocked, - kMaxValue = kManifestListTooBig + kMaxValue = kThirdPartyCookiesBlocked }; // Records the time from when a call to the API was made to when the accounts
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc index 286fd8c..3db2b99 100644 --- a/content/browser/webid/federated_auth_request_impl.cc +++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -35,10 +35,12 @@ using blink::mojom::LogoutStatus; using blink::mojom::RequestIdTokenStatus; using blink::mojom::RevokeStatus; -using LoginState = content::IdentityRequestAccount::LoginState; -using SignInMode = content::IdentityRequestAccount::SignInMode; +using FederatedApiPermissionStatus = + content::FederatedIdentityApiPermissionContextDelegate::PermissionStatus; using IdTokenStatus = content::FedCmRequestIdTokenStatus; +using LoginState = content::IdentityRequestAccount::LoginState; using RevokeStatusForMetrics = content::FedCmRevokeStatus; +using SignInMode = content::IdentityRequestAccount::SignInMode; namespace content { @@ -274,25 +276,12 @@ start_time_ = base::TimeTicks::Now(); delay_timer_.Reset(); - if (!IsFedCmEnabled()) { - RecordRequestIdTokenStatus(IdTokenStatus::kDisabledInFlags, - render_frame_host_->GetPageUkmSourceId()); + if (!GetApiPermissionContext()) { CompleteRequest(FederatedAuthRequestResult::kError, "", - /*should_call_callback=*/false); + /*should_call_callback=*/true); return; } - // TODO(npm): FedCM is currently restricted to contexts where third party - // cookies are not blocked. Once the privacy improvements for the API are - // implemented, remove this restriction. See https://crbug.com/1304396. - if (GetApiPermissionContext() && - GetApiPermissionContext()->AreThirdPartyCookiesBlocked()) { - RecordRequestIdTokenStatus(IdTokenStatus::kThirdPartyCookiesBlocked, - render_frame_host_->GetPageUkmSourceId()); - CompleteRequest(FederatedAuthRequestResult::kError, "", - /*should_call_callback=*/false); - return; - } network_manager_ = CreateNetworkManager(provider); if (!network_manager_) { RecordRequestIdTokenStatus(IdTokenStatus::kNoNetworkManager, @@ -304,12 +293,40 @@ return; } - if (GetApiPermissionContext() && - !GetApiPermissionContext()->HasApiPermission(origin_)) { - RecordRequestIdTokenStatus(IdTokenStatus::kDisabledInSettings, + FederatedApiPermissionStatus permission_status = + GetApiPermissionContext()->GetApiPermissionStatus(origin_); + + absl::optional<IdTokenStatus> error_id_token_status; + FederatedAuthRequestResult request_result = + FederatedAuthRequestResult::kError; + + switch (permission_status) { + case FederatedApiPermissionStatus::BLOCKED_VARIATIONS: + error_id_token_status = IdTokenStatus::kDisabledInFlags; + break; + case FederatedApiPermissionStatus::BLOCKED_THIRD_PARTY_COOKIES_BLOCKED: + error_id_token_status = IdTokenStatus::kThirdPartyCookiesBlocked; + break; + case FederatedApiPermissionStatus::BLOCKED_SETTINGS: + error_id_token_status = IdTokenStatus::kDisabledInSettings; + request_result = FederatedAuthRequestResult::kErrorDisabledInSettings; + break; + case FederatedApiPermissionStatus::BLOCKED_EMBARGO: + error_id_token_status = IdTokenStatus::kDisabledEmbargo; + request_result = FederatedAuthRequestResult::kErrorDisabledInSettings; + break; + case FederatedApiPermissionStatus::GRANTED: + // Intentional fall-through. + break; + default: + NOTREACHED(); + break; + } + + if (error_id_token_status) { + RecordRequestIdTokenStatus(*error_id_token_status, render_frame_host_->GetPageUkmSourceId()); - CompleteRequest(FederatedAuthRequestResult::kErrorDisabledInSettings, "", - /*should_call_callback=*/false); + CompleteRequest(request_result, "", /*should_call_callback=*/false); return; } @@ -348,9 +365,7 @@ delay_timer_.Reset(); revoke_callback_ = std::move(callback); - if (!IsFedCmEnabled()) { - RecordRevokeStatus(RevokeStatusForMetrics::kDisabledInFlags, - render_frame_host_->GetPageUkmSourceId()); + if (!GetApiPermissionContext()) { CompleteRevokeRequest(RevokeStatus::kError, /*should_call_callback=*/false); return; @@ -365,9 +380,31 @@ return; } - if (GetApiPermissionContext() && - !GetApiPermissionContext()->HasApiPermission(origin_)) { - RecordRevokeStatus(RevokeStatusForMetrics::kDisabledInSettings, + FederatedApiPermissionStatus permission_status = + GetApiPermissionContext()->GetApiPermissionStatus(origin_); + + absl::optional<RevokeStatusForMetrics> error_revoke_status; + switch (permission_status) { + case FederatedApiPermissionStatus::BLOCKED_VARIATIONS: + error_revoke_status = RevokeStatusForMetrics::kDisabledInFlags; + break; + case FederatedApiPermissionStatus::BLOCKED_THIRD_PARTY_COOKIES_BLOCKED: + error_revoke_status = RevokeStatusForMetrics::kThirdPartyCookiesBlocked; + break; + case FederatedApiPermissionStatus::BLOCKED_SETTINGS: + case FederatedApiPermissionStatus::BLOCKED_EMBARGO: + error_revoke_status = RevokeStatusForMetrics::kDisabledInSettings; + break; + case FederatedApiPermissionStatus::GRANTED: + // Intentional fall-through. + break; + default: + NOTREACHED(); + break; + } + + if (error_revoke_status) { + RecordRevokeStatus(*error_revoke_status, render_frame_host_->GetPageUkmSourceId()); CompleteRevokeRequest(RevokeStatus::kError, /*should_call_callback=*/false); return; @@ -392,11 +429,18 @@ blink::mojom::FederatedAuthRequest::LogoutCallback callback) { url::Origin idp_origin(url::Origin::Create(provider)); auto* context = GetActiveSessionPermissionContext(); - if (!context || !context->HasActiveSession(origin_, idp_origin, account_id) || - !IsFedCmEnabled()) { + if (!context || !context->HasActiveSession(origin_, idp_origin, account_id)) { std::move(callback).Run(LogoutStatus::kNotLoggedIn); return; } + + if (!GetApiPermissionContext() || + GetApiPermissionContext()->GetApiPermissionStatus(origin_) != + FederatedApiPermissionStatus::GRANTED) { + std::move(callback).Run(LogoutStatus::kNotLoggedIn); + return; + } + context->RevokeActiveSession(origin_, idp_origin, account_id); std::move(callback).Run(LogoutStatus::kSuccess); } @@ -410,16 +454,6 @@ void FederatedAuthRequestImpl::LogoutRps( std::vector<blink::mojom::LogoutRpsRequestPtr> logout_requests, blink::mojom::FederatedAuthRequest::LogoutRpsCallback callback) { - if (!IsFedCmEnabled()) { - std::move(callback).Run(LogoutRpsStatus::kError); - return; - } - - if (!IsFedCmIdpSignoutEnabled()) { - std::move(callback).Run(LogoutRpsStatus::kError); - return; - } - if (HasPendingRequest()) { std::move(callback).Run(LogoutRpsStatus::kErrorTooManyRequests); return; @@ -429,12 +463,6 @@ logout_callback_ = std::move(callback); - if (GetApiPermissionContext() && - !GetApiPermissionContext()->HasApiPermission(origin_)) { - CompleteLogoutRequest(LogoutRpsStatus::kError); - return; - } - if (logout_requests.empty()) { CompleteLogoutRequest(LogoutRpsStatus::kError); return; @@ -454,7 +482,18 @@ } network_manager_ = CreateNetworkManager(origin_.GetURL()); - if (!network_manager_) { + if (!network_manager_ || !GetApiPermissionContext()) { + CompleteLogoutRequest(LogoutRpsStatus::kError); + return; + } + + if (!IsFedCmIdpSignoutEnabled()) { + CompleteLogoutRequest(LogoutRpsStatus::kError); + return; + } + + if (GetApiPermissionContext()->GetApiPermissionStatus(origin_) != + FederatedApiPermissionStatus::GRANTED) { CompleteLogoutRequest(LogoutRpsStatus::kError); return; }
diff --git a/content/browser/webid/federated_auth_request_impl_unittest.cc b/content/browser/webid/federated_auth_request_impl_unittest.cc index b2db25fb..f387003 100644 --- a/content/browser/webid/federated_auth_request_impl_unittest.cc +++ b/content/browser/webid/federated_auth_request_impl_unittest.cc
@@ -46,16 +46,18 @@ using blink::mojom::LogoutRpsStatus; using blink::mojom::RequestIdTokenStatus; using blink::mojom::RevokeStatus; +using AccountList = content::IdpNetworkRequestManager::AccountList; +using ApiPermissionStatus = + content::FederatedIdentityApiPermissionContextDelegate::PermissionStatus; using Entry = ukm::builders::Blink_FedCm; using FetchStatus = content::IdpNetworkRequestManager::FetchStatus; +using IdTokenStatus = content::FedCmRequestIdTokenStatus; +using LoginState = content::IdentityRequestAccount::LoginState; using LogoutResponse = content::IdpNetworkRequestManager::LogoutResponse; using RevokeResponse = content::IdpNetworkRequestManager::RevokeResponse; -using UserApproval = content::IdentityRequestDialogController::UserApproval; -using AccountList = content::IdpNetworkRequestManager::AccountList; -using LoginState = content::IdentityRequestAccount::LoginState; -using SignInMode = content::IdentityRequestAccount::SignInMode; -using IdTokenStatus = content::FedCmRequestIdTokenStatus; using RevokeStatusForMetrics = content::FedCmRevokeStatus; +using SignInMode = content::IdentityRequestAccount::SignInMode; +using UserApproval = content::IdentityRequestDialogController::UserApproval; using ::testing::_; using ::testing::Invoke; using ::testing::NiceMock; @@ -523,16 +525,18 @@ class TestApiPermissionDelegate : public MockApiPermissionDelegate { public: - url::Origin blocked_origin_; + std::pair<url::Origin, ApiPermissionStatus> permission_override_ = + std::make_pair(url::Origin(), ApiPermissionStatus::GRANTED); std::set<url::Origin> embargoed_origins_; - bool third_party_cookies_blocked_{false}; - bool HasApiPermission(const url::Origin& origin) override { - return !embargoed_origins_.count(origin) && origin != blocked_origin_; - } + ApiPermissionStatus GetApiPermissionStatus( + const url::Origin& origin) override { + if (embargoed_origins_.count(origin)) + return ApiPermissionStatus::BLOCKED_EMBARGO; - bool AreThirdPartyCookiesBlocked() override { - return third_party_cookies_blocked_; + return (origin == permission_override_.first) + ? permission_override_.second + : ApiPermissionStatus::GRANTED; } void RecordDismissAndEmbargo(const url::Origin& origin) override { @@ -1630,7 +1634,9 @@ TEST_F(BasicFederatedAuthRequestImplTest, DisabledWhenThirdPartyCookiesBlocked) { - test_api_permission_delegate_->third_party_cookies_blocked_ = true; + test_api_permission_delegate_->permission_override_ = + std::make_pair(main_test_rfh()->GetLastCommittedOrigin(), + ApiPermissionStatus::BLOCKED_THIRD_PARTY_COOKIES_BLOCKED); RequestExpectations expectations = {RequestIdTokenStatus::kError, FederatedAuthRequestResult::kError, @@ -1644,8 +1650,9 @@ } TEST_F(BasicFederatedAuthRequestImplTest, MetricsForFeatureIsDisabled) { - base::test::ScopedFeatureList list; - list.InitAndDisableFeature(features::kFedCm); + test_api_permission_delegate_->permission_override_ = + std::make_pair(main_test_rfh()->GetLastCommittedOrigin(), + ApiPermissionStatus::BLOCKED_VARIATIONS); RequestExpectations expectations = {RequestIdTokenStatus::kError, FederatedAuthRequestResult::kError, @@ -1698,8 +1705,9 @@ // Test that token request fails if FEDERATED_IDENTITY_API content setting is // disabled for the RP origin. TEST_F(BasicFederatedAuthRequestImplTest, ApiBlockedForOrigin) { - test_api_permission_delegate_->blocked_origin_ = - main_test_rfh()->GetLastCommittedOrigin(); + test_api_permission_delegate_->permission_override_ = + std::make_pair(main_test_rfh()->GetLastCommittedOrigin(), + ApiPermissionStatus::BLOCKED_SETTINGS); RequestExpectations expectations = { RequestIdTokenStatus::kError, FederatedAuthRequestResult::kErrorDisabledInSettings, @@ -1713,7 +1721,8 @@ const url::Origin kUnrelatedOrigin = url::Origin::Create(GURL("https://rp2.example/")); - test_api_permission_delegate_->blocked_origin_ = kUnrelatedOrigin; + test_api_permission_delegate_->permission_override_ = + std::make_pair(kUnrelatedOrigin, ApiPermissionStatus::BLOCKED_SETTINGS); ASSERT_NE(main_test_rfh()->GetLastCommittedOrigin(), kUnrelatedOrigin); RunAuthTest(kDefaultRequestParameters, kExpectationSuccess, kConfigurationValid); @@ -1733,9 +1742,11 @@ TEST_P(FederatedAuthRequestImplTestCancelConsistency, AccountNotSelected) { const bool fedcm_disabled = GetParam(); - base::test::ScopedFeatureList list; - if (fedcm_disabled) - list.InitAndDisableFeature(features::kFedCm); + if (fedcm_disabled) { + test_api_permission_delegate_->permission_override_ = + std::make_pair(main_test_rfh()->GetLastCommittedOrigin(), + ApiPermissionStatus::BLOCKED_VARIATIONS); + } MockConfiguration configuration = kConfigurationValid; configuration.customized_dialog = true;
diff --git a/content/browser/webid/flags.cc b/content/browser/webid/flags.cc index fdbc9a7..326b962 100644 --- a/content/browser/webid/flags.cc +++ b/content/browser/webid/flags.cc
@@ -11,10 +11,6 @@ namespace content { -bool IsFedCmEnabled() { - return base::FeatureList::IsEnabled(features::kFedCm); -} - bool IsFedCmAutoSigninEnabled() { return GetFieldTrialParamByFeatureAsBool( features::kFedCm, features::kFedCmAutoSigninFieldTrialParamName, false);
diff --git a/content/browser/webid/flags.h b/content/browser/webid/flags.h index fea1d9e..eb21ee40 100644 --- a/content/browser/webid/flags.h +++ b/content/browser/webid/flags.h
@@ -9,9 +9,6 @@ namespace content { -// Whether the FedCM JavaScript API is enabled. -bool IsFedCmEnabled(); - // Whether FedCM auto sign-in is enabled. bool IsFedCmAutoSigninEnabled();
diff --git a/content/browser/webid/test/mock_api_permission_delegate.h b/content/browser/webid/test/mock_api_permission_delegate.h index 4d6f05f6..d8a9a40 100644 --- a/content/browser/webid/test/mock_api_permission_delegate.h +++ b/content/browser/webid/test/mock_api_permission_delegate.h
@@ -25,8 +25,9 @@ MockApiPermissionDelegate& operator=(const MockApiPermissionDelegate&) = delete; - MOCK_METHOD1(HasApiPermission, bool(const url::Origin&)); - MOCK_METHOD0(AreThirdPartyCookiesBlocked, bool()); + MOCK_METHOD1(GetApiPermissionStatus, + FederatedIdentityApiPermissionContextDelegate::PermissionStatus( + const url::Origin&)); MOCK_METHOD1(RecordDismissAndEmbargo, void(const url::Origin&)); MOCK_METHOD1(RemoveEmbargoAndResetCounts, void(const url::Origin&)); };
diff --git a/content/public/browser/federated_identity_api_permission_context_delegate.h b/content/public/browser/federated_identity_api_permission_context_delegate.h index c791044e..24c3df4a 100644 --- a/content/public/browser/federated_identity_api_permission_context_delegate.h +++ b/content/public/browser/federated_identity_api_permission_context_delegate.h
@@ -15,15 +15,20 @@ // API is enabled in Site Settings. class FederatedIdentityApiPermissionContextDelegate { public: + enum class PermissionStatus { + GRANTED, + BLOCKED_VARIATIONS, + BLOCKED_THIRD_PARTY_COOKIES_BLOCKED, + BLOCKED_SETTINGS, + BLOCKED_EMBARGO, + }; + FederatedIdentityApiPermissionContextDelegate() = default; virtual ~FederatedIdentityApiPermissionContextDelegate() = default; - // Returns whether the FedCM API is enabled in site settings for the passed-in - // |rp_origin|. - virtual bool HasApiPermission(const url::Origin& rp_origin) = 0; - - // Returns whether third party cookies are blocked. - virtual bool AreThirdPartyCookiesBlocked() = 0; + // Returns the status of the FedCM API for the passed-in |rp_origin|. + virtual PermissionStatus GetApiPermissionStatus( + const url::Origin& rp_origin) = 0; // Records that the FedCM prompt was explicitly dismissed and places the // permission under embargo for the passed-in |rp_origin|.
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index bb09c3f..71cdf34 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -590,13 +590,6 @@ #endif }; -// If enabled the io thread in the network service runs at display priority. If -// not enabled, the io thread in the network services runs at the default -// priority. -const base::Feature kNetworkServiceUsesDisplayThreadPriority{ - "NetworkServiceUsesDisplayThreadPriority", - base::FEATURE_DISABLED_BY_DEFAULT}; - const base::Feature kNeverSlowMode{"NeverSlowMode", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index c0f2f49..0ee54e9 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -152,8 +152,6 @@ CONTENT_EXPORT extern const base::Feature kNavigationThreadingOptimizations; CONTENT_EXPORT extern const base::Feature kNetworkQualityEstimatorWebHoldback; CONTENT_EXPORT extern const base::Feature kNetworkServiceInProcess; -CONTENT_EXPORT extern const base::Feature - kNetworkServiceUsesDisplayThreadPriority; CONTENT_EXPORT extern const base::Feature kNeverSlowMode; CONTENT_EXPORT extern const base::Feature kNotificationContentImage; CONTENT_EXPORT extern const base::Feature kNotificationTriggers;
diff --git a/content/public/test/OWNERS b/content/public/test/OWNERS index fbc3619..2011059 100644 --- a/content/public/test/OWNERS +++ b/content/public/test/OWNERS
@@ -19,6 +19,9 @@ # Network Service per-file network_service_test_helper.*=file://services/network/OWNERS +# DevTools-specific changes +per-file *devtools*=file://content/browser/devtools/OWNERS + # For security presubmit checks, though test mojom really don't need review. per-file *.mojom=set noparent per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/content/public/test/test_devtools_protocol_client.cc b/content/public/test/test_devtools_protocol_client.cc new file mode 100644 index 0000000..97e119d --- /dev/null +++ b/content/public/test/test_devtools_protocol_client.cc
@@ -0,0 +1,188 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/public/test/test_devtools_protocol_client.h" + +#include <memory> + +#include "base/json/json_reader.h" +#include "base/json/json_writer.h" +#include "base/run_loop.h" +#include "base/strings/utf_string_conversions.h" +#include "content/public/test/test_utils.h" +#include "net/dns/mock_host_resolver.h" +#include "third_party/blink/public/mojom/loader/mixed_content.mojom.h" + +namespace content { + +namespace { + +const char kIdParam[] = "id"; +const char kSessionIdParam[] = "sessionId"; +const char kMethodParam[] = "method"; +const char kParamsParam[] = "params"; + +} // namespace + +TestDevToolsProtocolClient::TestDevToolsProtocolClient() = default; +TestDevToolsProtocolClient::~TestDevToolsProtocolClient() = default; + +base::DictionaryValue* TestDevToolsProtocolClient::SendSessionCommand( + const std::string& method, + std::unique_ptr<base::Value> params, + const std::string& session_id, + bool wait) { + in_dispatch_ = true; + base::DictionaryValue command; + command.SetInteger(kIdParam, ++last_sent_id_); + command.SetString(kMethodParam, method); + if (params) + command.SetKey(kParamsParam, + base::Value::FromUniquePtrValue(std::move(params))); + if (!session_id.empty()) + command.SetString(kSessionIdParam, session_id); + + std::string json_command; + base::JSONWriter::Write(command, &json_command); + agent_host_->DispatchProtocolMessage( + this, base::as_bytes(base::make_span(json_command))); + // Some messages are dispatched synchronously. + // Only run loop if we are not finished yet. + if (in_dispatch_ && wait) { + WaitForResponse(); + in_dispatch_ = false; + return result_.get(); + } + in_dispatch_ = false; + return result_.get(); +} + +void TestDevToolsProtocolClient::WaitForResponse() { + waiting_for_command_result_id_ = last_sent_id_; + RunLoopUpdatingQuitClosure(); +} + +void TestDevToolsProtocolClient::AttachToWebContents(WebContents* wc) { + agent_host_ = DevToolsAgentHost::GetOrCreateFor(wc); + agent_host_->AttachClient(this); +} + +void TestDevToolsProtocolClient::AttachToBrowserTarget() { + // Tethering domain is not used in tests. + agent_host_ = DevToolsAgentHost::CreateForBrowser( + nullptr, DevToolsAgentHost::CreateServerSocketCallback()); + agent_host_->AttachClient(this); +} + +bool TestDevToolsProtocolClient::HasExistingNotification( + const std::string& search) const { + for (const std::string& notification : notifications_) { + if (notification == search) + return true; + } + return false; +} + +std::unique_ptr<base::DictionaryValue> +TestDevToolsProtocolClient::WaitForNotification(const std::string& notification, + bool allow_existing) { + if (allow_existing) { + for (size_t i = 0; i < notifications_.size(); i++) { + if (notifications_[i] == notification) { + std::unique_ptr<base::DictionaryValue> result = + std::move(notification_params_[i]); + notifications_.erase(notifications_.begin() + i); + notification_params_.erase(notification_params_.begin() + i); + return result; + } + } + } + + waiting_for_notification_ = notification; + RunLoopUpdatingQuitClosure(); + return std::move(waiting_for_notification_params_); +} + +std::unique_ptr<base::DictionaryValue> +TestDevToolsProtocolClient::WaitForMatchingNotification( + const std::string& notification, + const NotificationMatcher& matcher) { + for (size_t i = 0; i < notifications_.size(); i++) { + if (notifications_[i] == notification && + matcher.Run(notification_params_[i].get())) { + std::unique_ptr<base::DictionaryValue> result = + std::move(notification_params_[i]); + notifications_.erase(notifications_.begin() + i); + notification_params_.erase(notification_params_.begin() + i); + return result; + } + } + + waiting_for_notification_ = notification; + waiting_for_notification_matcher_ = matcher; + RunLoopUpdatingQuitClosure(); + return std::move(waiting_for_notification_params_); +} + +void TestDevToolsProtocolClient::RunLoopUpdatingQuitClosure() { + base::RunLoop run_loop; + run_loop_quit_closure_ = run_loop.QuitClosure(); + run_loop.Run(); +} + +void TestDevToolsProtocolClient::DispatchProtocolMessage( + DevToolsAgentHost* agent_host, + base::span<const uint8_t> message) { + base::StringPiece message_str(reinterpret_cast<const char*>(message.data()), + message.size()); + auto root = base::DictionaryValue::From( + base::JSONReader::ReadDeprecated(message_str)); + absl::optional<int> id = root->FindIntKey("id"); + if (id) { + result_ids_.push_back(*id); + base::DictionaryValue* result; + bool have_result = root->GetDictionary("result", &result); + result_.reset(have_result ? result->DeepCopy() : nullptr); + base::Value* error = root->FindDictKey("error"); + error_ = error ? error->Clone() : base::Value(); + in_dispatch_ = false; + if (*id && *id == waiting_for_command_result_id_) { + waiting_for_command_result_id_ = 0; + std::move(run_loop_quit_closure_).Run(); + } + } else { + std::string notification; + CHECK(root->GetString("method", ¬ification)); + notifications_.push_back(notification); + base::DictionaryValue* params; + if (root->GetDictionary("params", ¶ms)) { + notification_params_.push_back(params->CreateDeepCopy()); + } else { + notification_params_.push_back( + base::WrapUnique(new base::DictionaryValue())); + } + if (waiting_for_notification_ == notification && + (waiting_for_notification_matcher_.is_null() || + waiting_for_notification_matcher_.Run( + notification_params_[notification_params_.size() - 1].get()))) { + waiting_for_notification_ = std::string(); + waiting_for_notification_matcher_ = NotificationMatcher(); + waiting_for_notification_params_ = base::WrapUnique( + notification_params_[notification_params_.size() - 1]->DeepCopy()); + std::move(run_loop_quit_closure_).Run(); + } + } +} + +void TestDevToolsProtocolClient::AgentHostClosed( + DevToolsAgentHost* agent_host) { + if (!agent_host_can_close_) + NOTREACHED(); +} + +bool TestDevToolsProtocolClient::AllowUnsafeOperations() { + return allow_unsafe_operations_; +} + +} // namespace content
diff --git a/content/public/test/test_devtools_protocol_client.h b/content/public/test/test_devtools_protocol_client.h new file mode 100644 index 0000000..cd7ffd08 --- /dev/null +++ b/content/public/test/test_devtools_protocol_client.h
@@ -0,0 +1,122 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_PUBLIC_TEST_TEST_DEVTOOLS_PROTOCOL_CLIENT_H_ +#define CONTENT_PUBLIC_TEST_TEST_DEVTOOLS_PROTOCOL_CLIENT_H_ + +#include <memory> +#include <string> +#include <utility> +#include <vector> +#include "base/callback.h" +#include "base/values.h" +#include "content/public/browser/devtools_agent_host.h" +#include "content/public/browser/web_contents_delegate.h" + +namespace content { + +class TestDevToolsProtocolClient : public DevToolsAgentHostClient { + public: + typedef base::RepeatingCallback<bool(base::DictionaryValue*)> + NotificationMatcher; + + TestDevToolsProtocolClient(); + ~TestDevToolsProtocolClient() override; + + protected: + base::DictionaryValue* SendCommand(const std::string& method, + std::unique_ptr<base::Value> params) { + return SendCommand(method, std::move(params), true); + } + + base::DictionaryValue* SendCommand(const std::string& method, + std::unique_ptr<base::Value> params, + bool wait) { + return SendSessionCommand(method, std::move(params), std::string(), wait); + } + + base::DictionaryValue* SendSessionCommand(const std::string& method, + std::unique_ptr<base::Value> params, + const std::string& session_id) { + return SendSessionCommand(method, std::move(params), session_id, true); + } + + base::DictionaryValue* SendSessionCommand(const std::string& method, + std::unique_ptr<base::Value> params, + const std::string& session_id, + bool wait); + + void WaitForResponse(); + + void AttachToWebContents(WebContents* web_contents); + void AttachToBrowserTarget(); + + void DetachProtocolClient() { + if (agent_host_) { + agent_host_->DetachClient(this); + agent_host_ = nullptr; + } + } + + bool HasExistingNotification(const std::string& notification) const; + std::unique_ptr<base::DictionaryValue> WaitForNotification( + const std::string& notification) { + return WaitForNotification(notification, false); + } + + std::unique_ptr<base::DictionaryValue> WaitForNotification( + const std::string& notification, + bool allow_existing); + + // Waits for a notification whose params, when passed to |matcher|, returns + // true. Existing notifications are allowed. + std::unique_ptr<base::DictionaryValue> WaitForMatchingNotification( + const std::string& notification, + const NotificationMatcher& matcher); + + void ClearNotifications() { + notifications_.clear(); + notification_params_.clear(); + } + + std::string RemovePort(const GURL& url) { + GURL::Replacements remove_port; + remove_port.ClearPort(); + return url.ReplaceComponents(remove_port).spec(); + } + + void set_agent_host_can_close() { agent_host_can_close_ = true; } + + void SetAllowUnsafeOperations(bool allow) { + allow_unsafe_operations_ = allow; + } + + std::unique_ptr<base::DictionaryValue> result_; + base::Value error_; + scoped_refptr<DevToolsAgentHost> agent_host_; + int last_sent_id_ = 0; + std::vector<int> result_ids_; + std::vector<std::string> notifications_; + std::vector<std::unique_ptr<base::DictionaryValue>> notification_params_; + + private: + void RunLoopUpdatingQuitClosure(); + void DispatchProtocolMessage(DevToolsAgentHost* agent_host, + base::span<const uint8_t> message) override; + void AgentHostClosed(DevToolsAgentHost* agent_host) override; + bool AllowUnsafeOperations() override; + + std::string waiting_for_notification_; + NotificationMatcher waiting_for_notification_matcher_; + std::unique_ptr<base::DictionaryValue> waiting_for_notification_params_; + int waiting_for_command_result_id_ = 0; + bool in_dispatch_ = false; + bool agent_host_can_close_ = false; + base::OnceClosure run_loop_quit_closure_; + bool allow_unsafe_operations_ = true; +}; + +} // namespace content + +#endif // CONTENT_PUBLIC_TEST_TEST_DEVTOOLS_PROTOCOL_CLIENT_H_
diff --git a/content/renderer/accessibility/ax_tree_distiller.cc b/content/renderer/accessibility/ax_tree_distiller.cc index 85785f5..a72a2ad 100644 --- a/content/renderer/accessibility/ax_tree_distiller.cc +++ b/content/renderer/accessibility/ax_tree_distiller.cc
@@ -6,6 +6,7 @@ #include <memory> #include <queue> +#include <utility> #include <vector> #include "base/containers/contains.h" @@ -116,15 +117,10 @@ AXTreeDistiller::~AXTreeDistiller() = default; -void AXTreeDistiller::Distill() { +void AXTreeDistiller::Distill(SnapshotAndDistillAXTreeCallback callback) { + callback_ = std::move(callback); SnapshotAXTree(); DistillAXTree(); - - // TODO(https://crbug.com/1278249): Move the call to a proper place. -#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE) - if (features::IsReadAnythingWithScreen2xEnabled()) - ScheduleScreen2xRun(); -#endif } void AXTreeDistiller::SnapshotAXTree() { @@ -145,10 +141,21 @@ void AXTreeDistiller::DistillAXTree() { // If content_node_ids_ is already cached, do nothing. if (content_node_ids_) - return; + OnAXTreeDistilled(); content_node_ids_ = std::make_unique<std::vector<ui::AXNodeID>>(); DCHECK(snapshot_); + + // If Read Anything with Screen 2x is enabled, kick off Screen 2x run, which + // distills the AXTree in the utility process using ML. +#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE) + if (features::IsReadAnythingWithScreen2xEnabled()) { + ScheduleScreen2xRun(); + return; + } +#endif + + // Otherwise, distill the AXTree in process using the rules-based algorithm. ui::AXTree tree; bool success = tree.Unserialize(*snapshot_); if (!success) @@ -163,6 +170,11 @@ } AddContentNodesToVector(article_node, content_node_ids_.get()); + OnAXTreeDistilled(); +} + +void AXTreeDistiller::OnAXTreeDistilled() { + std::move(callback_).Run(*snapshot_.get(), *content_node_ids_.get()); } #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE) @@ -175,9 +187,10 @@ void AXTreeDistiller::ProcessScreen2xResult( const std::vector<ui::AXNodeID>& content_node_ids) { - // TODO(https://crbug.com/1278249): Use |content_node_ids|. + *content_node_ids_ = content_node_ids; + // TODO: Set |is_distillable_|. + OnAXTreeDistilled(); } - #endif } // namespace content
diff --git a/content/renderer/accessibility/ax_tree_distiller.h b/content/renderer/accessibility/ax_tree_distiller.h index 99fab111..2a5fe812 100644 --- a/content/renderer/accessibility/ax_tree_distiller.h +++ b/content/renderer/accessibility/ax_tree_distiller.h
@@ -8,6 +8,7 @@ #include <memory> #include <vector> +#include "base/callback.h" #include "components/services/screen_ai/buildflags/buildflags.h" #include "content/common/content_export.h" #include "ui/accessibility/ax_node_id_forward.h" @@ -23,6 +24,11 @@ class RenderFrameImpl; +// From content/common/frame.mojom: +using SnapshotAndDistillAXTreeCallback = + base::OnceCallback<void(const ui::AXTreeUpdate&, + const std::vector<int32_t>&)>; + /////////////////////////////////////////////////////////////////////////////// // AXTreeDistiller // @@ -36,13 +42,7 @@ AXTreeDistiller(const AXTreeDistiller&) = delete; AXTreeDistiller& operator=(const AXTreeDistiller&) = delete; - void Distill(); - - ui::AXTreeUpdate* GetSnapshot() { return snapshot_.get(); } - std::vector<ui::AXNodeID>* GetContentNodeIDs() { - return content_node_ids_.get(); - } - bool IsDistillable() { return is_distillable_; } + void Distill(SnapshotAndDistillAXTreeCallback callback); private: // Takes a snapshot of an accessibility tree and caches it as |snapshot_|. @@ -52,13 +52,24 @@ // IDs as |content_node_ids_|. void DistillAXTree(); + // Called when the AXTree is distilled. Called asynchronously if Screen2x is + // running in another process. Runs |callback_| which sends |snapshot_| and + // |content_node_ids_| across the render frame. + void OnAXTreeDistilled(); + RenderFrameImpl* render_frame_; std::unique_ptr<ui::AXTreeUpdate> snapshot_; std::unique_ptr<std::vector<ui::AXNodeID>> content_node_ids_; + SnapshotAndDistillAXTreeCallback callback_; bool is_distillable_ = true; #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE) + // Passes |snapshot_| to the Screen2x ML model, which identifes the main + // content nodes and calls |ProcessScreen2xResult()| on completion. void ScheduleScreen2xRun(); + + // Called by the Screen2x service from the utility process. Caches + // |content_node_ids| as |content_node_ids_|. void ProcessScreen2xResult(const std::vector<ui::AXNodeID>& content_node_ids); mojo::Remote<screen_ai::mojom::Screen2xMainContentExtractor>
diff --git a/content/renderer/accessibility/ax_tree_distiller_browsertest.cc b/content/renderer/accessibility/ax_tree_distiller_browsertest.cc index 43ceae4..109bd3f2 100644 --- a/content/renderer/accessibility/ax_tree_distiller_browsertest.cc +++ b/content/renderer/accessibility/ax_tree_distiller_browsertest.cc
@@ -6,7 +6,9 @@ #include <memory> #include <string> +#include <vector> +#include "base/bind.h" #include "content/public/test/render_view_test.h" #include "content/renderer/render_frame_impl.h" #include "ui/accessibility/ax_node.h" @@ -21,42 +23,46 @@ AXTreeDistillerTestBase& operator=(const AXTreeDistillerTestBase&) = delete; ~AXTreeDistillerTestBase() override = default; - void DistillPage(const char* html) { + void DistillPage(const char* html, + const std::vector<std::string>& expected_node_contents) { + expected_node_contents_ = expected_node_contents; LoadHTML(html); RenderFrameImpl* render_frame_impl = RenderFrameImpl::FromWebFrame(GetMainFrame()); distiller_ = std::make_unique<AXTreeDistiller>(render_frame_impl); - distiller_->Distill(); + distiller_->Distill(base::BindOnce( + &AXTreeDistillerTestBase::OnAXTreeDistilled, base::Unretained(this))); } - void CheckNodeContents(const std::vector<std::string>& node_contents) { - // AXTree snapshot from distiller should unserialize successfully. + void OnAXTreeDistilled(const ui::AXTreeUpdate& snapshot, + const std::vector<int32_t>& content_node_ids) { + // AXTree snapshot should unserialize successfully. ui::AXTree tree; - EXPECT_TRUE(tree.Unserialize(*(distiller_->GetSnapshot()))); + EXPECT_TRUE(tree.Unserialize(snapshot)); - // Content node IDs list from distiller should be the same length as - // |node_contents| passed in. - auto* content_node_ids = distiller_->GetContentNodeIDs(); - EXPECT_EQ(content_node_ids->size(), node_contents.size()); + // Content node IDs list should be the same length as + // |expected_node_contents_|. + EXPECT_EQ(content_node_ids.size(), expected_node_contents_.size()); // Iterate through each content node ID from distiller and check that the - // text value equals the passed-in string from |node_contents|. - for (size_t i = 0; i < content_node_ids->size(); i++) { - ui::AXNode* node = tree.GetFromId(content_node_ids->at(i)); + // text value equals the passed-in string from |expected_node_contents_|. + for (size_t i = 0; i < content_node_ids.size(); i++) { + ui::AXNode* node = tree.GetFromId(content_node_ids[i]); EXPECT_TRUE(node); EXPECT_TRUE(node->GetTextContentLengthUTF8()); - EXPECT_EQ(node->GetTextContentUTF8(), node_contents[i]); + EXPECT_EQ(node->GetTextContentUTF8(), expected_node_contents_[i]); } } private: std::unique_ptr<AXTreeDistiller> distiller_; + std::vector<std::string> expected_node_contents_; }; struct TestCase { const char* test_name; const char* html; - std::vector<std::string> node_contents; + std::vector<std::string> expected_node_contents; }; class AXTreeDistillerTest : public AXTreeDistillerTestBase, @@ -163,8 +169,7 @@ TEST_P(AXTreeDistillerTest, DistillsWebPage) { TestCase param = GetParam(); - DistillPage(param.html); - CheckNodeContents(param.node_contents); + DistillPage(param.html, param.expected_node_contents); } INSTANTIATE_TEST_SUITE_P(/* prefix */,
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index abcd95a..ac9786e 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -2302,9 +2302,7 @@ SnapshotAndDistillAXTreeCallback callback) { if (!ax_tree_distiller_) ax_tree_distiller_ = std::make_unique<AXTreeDistiller>(this); - ax_tree_distiller_->Distill(); - std::move(callback).Run(*ax_tree_distiller_->GetSnapshot(), - *ax_tree_distiller_->GetContentNodeIDs()); + ax_tree_distiller_->Distill(std::move(callback)); } void RenderFrameImpl::GetSerializedHtmlWithLocalLinks(
diff --git a/content/shell/browser/shell_browser_context.cc b/content/shell/browser/shell_browser_context.cc index 8c871faa..1ddd8c9 100644 --- a/content/shell/browser/shell_browser_context.cc +++ b/content/shell/browser/shell_browser_context.cc
@@ -192,6 +192,14 @@ return content_index_provider_.get(); } +FederatedIdentityApiPermissionContextDelegate* +ShellBrowserContext::GetFederatedIdentityApiPermissionContext() { + if (!federated_permission_context_) + federated_permission_context_ = + std::make_unique<ShellFederatedPermissionContext>(); + return federated_permission_context_.get(); +} + FederatedIdentitySharingPermissionContextDelegate* ShellBrowserContext::GetFederatedIdentitySharingPermissionContext() { if (!federated_permission_context_)
diff --git a/content/shell/browser/shell_browser_context.h b/content/shell/browser/shell_browser_context.h index e6e44fec..19552e2 100644 --- a/content/shell/browser/shell_browser_context.h +++ b/content/shell/browser/shell_browser_context.h
@@ -63,6 +63,8 @@ BrowsingDataRemoverDelegate* GetBrowsingDataRemoverDelegate() override; ContentIndexProvider* GetContentIndexProvider() override; ClientHintsControllerDelegate* GetClientHintsControllerDelegate() override; + FederatedIdentityApiPermissionContextDelegate* + GetFederatedIdentityApiPermissionContext() override; FederatedIdentitySharingPermissionContextDelegate* GetFederatedIdentitySharingPermissionContext() override; FederatedIdentityActiveSessionPermissionContextDelegate*
diff --git a/content/shell/browser/shell_federated_permission_context.cc b/content/shell/browser/shell_federated_permission_context.cc index e0763e5e..28fd2171 100644 --- a/content/shell/browser/shell_federated_permission_context.cc +++ b/content/shell/browser/shell_federated_permission_context.cc
@@ -4,12 +4,29 @@ #include "content/shell/browser/shell_federated_permission_context.h" +#include "base/feature_list.h" +#include "content/public/common/content_features.h" + namespace content { ShellFederatedPermissionContext::ShellFederatedPermissionContext() = default; ShellFederatedPermissionContext::~ShellFederatedPermissionContext() = default; +content::FederatedIdentityApiPermissionContextDelegate::PermissionStatus +ShellFederatedPermissionContext::GetApiPermissionStatus( + const url::Origin& rp_origin) { + return base::FeatureList::IsEnabled(features::kFedCm) + ? PermissionStatus::GRANTED + : PermissionStatus::BLOCKED_VARIATIONS; +} + +void ShellFederatedPermissionContext::RecordDismissAndEmbargo( + const url::Origin& rp_origin) {} + +void ShellFederatedPermissionContext::RemoveEmbargoAndResetCounts( + const url::Origin& rp_origin) {} + bool ShellFederatedPermissionContext::HasSharingPermissionForAnyAccount( const url::Origin& relying_party, const url::Origin& identity_provider) {
diff --git a/content/shell/browser/shell_federated_permission_context.h b/content/shell/browser/shell_federated_permission_context.h index fe53cf863..cef37a89 100644 --- a/content/shell/browser/shell_federated_permission_context.h +++ b/content/shell/browser/shell_federated_permission_context.h
@@ -10,6 +10,7 @@ #include <tuple> #include "content/public/browser/federated_identity_active_session_permission_context_delegate.h" +#include "content/public/browser/federated_identity_api_permission_context_delegate.h" #include "content/public/browser/federated_identity_sharing_permission_context_delegate.h" namespace content { @@ -18,12 +19,19 @@ // It is used to store permission and login state in memory, so that we // can run wpt tests against it. class ShellFederatedPermissionContext - : public FederatedIdentityActiveSessionPermissionContextDelegate, + : public FederatedIdentityApiPermissionContextDelegate, + public FederatedIdentityActiveSessionPermissionContextDelegate, public FederatedIdentitySharingPermissionContextDelegate { public: ShellFederatedPermissionContext(); ~ShellFederatedPermissionContext() override; + // FederatedIdentityApiPermissionContextDelegate + content::FederatedIdentityApiPermissionContextDelegate::PermissionStatus + GetApiPermissionStatus(const url::Origin& rp_origin) override; + void RecordDismissAndEmbargo(const url::Origin& rp_origin) override; + void RemoveEmbargoAndResetCounts(const url::Origin& rp_origin) override; + // FederatedIdentitySharingPermissionContextDelegate bool HasSharingPermissionForAnyAccount( const url::Origin& relying_party,
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 1407e71e..9a78e0c7 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -249,6 +249,8 @@ "../public/test/test_browser_context.h", "../public/test/test_content_client_initializer.cc", "../public/test/test_content_client_initializer.h", + "../public/test/test_devtools_protocol_client.cc", + "../public/test/test_devtools_protocol_client.h", "../public/test/test_download_http_response.cc", "../public/test/test_download_http_response.h", "../public/test/test_file_error_injector.cc", @@ -1978,6 +1980,7 @@ "../browser/aggregation_service/aggregation_service_storage_sql_unittest.cc", "../browser/aggregation_service/public_key_parsing_utils_unittest.cc", "../browser/attribution_reporting/aggregatable_attribution_utils_unittest.cc", + "../browser/attribution_reporting/attribution_aggregatable_report_golden_unittest.cc", "../browser/attribution_reporting/attribution_cookie_checker_impl_unittest.cc", "../browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc", "../browser/attribution_reporting/attribution_filter_data_unittest.cc",
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/README.md b/content/test/data/attribution_reporting/aggregatable_report_goldens/README.md new file mode 100644 index 0000000..54ea7aa --- /dev/null +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/README.md
@@ -0,0 +1,21 @@ +# Attribution Reporting Aggregatable Report Goldens + +This directory contains a set of golden files that are valid attribution +aggregatable reports generated by the Chrome client for server interoperability +testing. + +The subdirectory latest/ contains files matching the current implementation, +and files matching old versions' implementations will be archived in +version_{x}/ where {x} represents a specific version string. + +Each subdirectory includes a private/public key pair which are base64-encoded +and can be used to encrypt/decrypt the data. See +//third_party/boringssl/src/include/openssl/hpke.h for Hybrid Public Key +Encryption (HPKE). + +# Keep files up to date + +//content/browser/attribution_reporting/attribution_aggregatable_report_golden_unittest.cc +contains tests that run on the files for latest/ to ensure that the golden +report format matches the format produced by the current implementation +(ignoring randomness like the exact encrypted string).
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/private_key.txt b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/private_key.txt new file mode 100644 index 0000000..1357e20f --- /dev/null +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/private_key.txt
@@ -0,0 +1 @@ +z5KhjZ8Q71lHD5L7LDDLeOcBgNLX0DXv0RqUT4m/+Jw= \ No newline at end of file
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/public_key.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/public_key.json new file mode 100644 index 0000000..4a9578f --- /dev/null +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/public_key.json
@@ -0,0 +1,6 @@ +{ + "keys": [{ + "id": "example_id", + "key": "two07NuSOLRSgJSE4mz3kMrmZ/jqLVYKZ2SW/8LDS3Y=" + }] +}
diff --git a/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_1.json b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_1.json new file mode 100644 index 0000000..e63e9fe --- /dev/null +++ b/content/test/data/attribution_reporting/aggregatable_report_goldens/latest/report_1.json
@@ -0,0 +1,13 @@ +{ + "aggregation_service_payloads": [ { + "debug_cleartext_payload": "omRkYXRhgaJldmFsdWVEAAAAAmZidWNrZXRQAAAAAAAAAAAAAAAAAAAAAWlvcGVyYXRpb25paGlzdG9ncmFt", + "key_id": "example_id", + "payload": "cVrsURY6QvrT1fsdPxWOXb3bjlzB6ih3APjLpydjyRoAJ6FTyZf9AUj1l5VlDweb3fssxCaMkz5jr5oHPlehnBVjrKLiSvtX3mTJ3CJD9DEp3uiiKV5Fsjv4G4RJcdwZERnJN/8s1OWJ6syEqKnJ" + } ], + "attribution_destination": "https://conversion.test", + "shared_info": "{\"debug_mode\":\"enabled\",\"privacy_budget_key\":\"aOEbtVxG8dYzAR2K/xuW/OppNaQikp5RdjAXshOQ9w8=\",\"report_id\":\"21abd97f-73e8-4b88-9389-a9fee6abda5e\",\"reporting_origin\":\"https://report.test\",\"scheduled_report_time\":\"1234486400\",\"version\":\"\"}", + "source_debug_key": "123", + "source_registration_time": "1234483200", + "source_site": "https://impression.test", + "trigger_debug_key": "456" +} \ No newline at end of file
diff --git a/content/utility/utility_main.cc b/content/utility/utility_main.cc index fa9c718..22a3ab63 100644 --- a/content/utility/utility_main.cc +++ b/content/utility/utility_main.cc
@@ -18,7 +18,6 @@ #include "content/common/content_switches_internal.h" #include "content/common/partition_alloc_support.h" #include "content/public/common/content_client.h" -#include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #include "content/public/common/main_function_params.h" #include "content/public/utility/content_utility_client.h" @@ -27,7 +26,6 @@ #include "sandbox/policy/mojom/sandbox.mojom.h" #include "sandbox/policy/sandbox.h" #include "sandbox/policy/sandbox_type.h" -#include "services/network/public/mojom/network_service.mojom.h" #include "services/tracing/public/cpp/trace_startup.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/icu/source/common/unicode/unistr.h" @@ -79,17 +77,6 @@ #endif namespace content { -namespace { - -base::ThreadPriority GetIOThreadPriority(const std::string& utility_sub_type) { - return (base::FeatureList::IsEnabled( - features::kNetworkServiceUsesDisplayThreadPriority) && - utility_sub_type == network::mojom::NetworkService::Name_) - ? base::ThreadPriority::DISPLAY - : base::ThreadPriority::NORMAL; -} - -} // namespace // Mainline routine for running as the utility process. int UtilityMain(MainFunctionParams parameters) { @@ -132,10 +119,9 @@ base::SingleThreadTaskExecutor main_thread_task_executor(message_pump_type); base::PlatformThread::SetName("CrUtilityMain"); - const std::string utility_sub_type = - parameters.command_line->GetSwitchValueASCII(switches::kUtilitySubType); - if (parameters.command_line->HasSwitch(switches::kUtilityStartupDialog)) { + const std::string utility_sub_type = + parameters.command_line->GetSwitchValueASCII(switches::kUtilitySubType); auto dialog_match = parameters.command_line->GetSwitchValueASCII( switches::kUtilityStartupDialog); if (dialog_match.empty() || dialog_match == utility_sub_type) { @@ -214,7 +200,7 @@ g_utility_target_services = parameters.sandbox_info->target_services; #endif - ChildProcess utility_process(GetIOThreadPriority(utility_sub_type)); + ChildProcess utility_process(base::ThreadPriority::NORMAL); GetContentClient()->utility()->PostIOThreadCreated( utility_process.io_task_runner()); base::RunLoop run_loop;
diff --git a/device/bluetooth/floss/floss_adapter_client.h b/device/bluetooth/floss/floss_adapter_client.h index e64b502..f83af06 100644 --- a/device/bluetooth/floss/floss_adapter_client.h +++ b/device/bluetooth/floss/floss_adapter_client.h
@@ -40,10 +40,10 @@ }; enum class BluetoothDeviceType { - kBredr = 0, - kBle = 1, - kDual = 2, - kUnknown = 3, + kUnknown = 0, + kBredr = 1, + kBle = 2, + kDual = 3, }; enum class BluetoothSspVariant {
diff --git a/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc b/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc index 93f5905..9ccebfe 100644 --- a/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc +++ b/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc
@@ -526,6 +526,15 @@ text_changed_node_ids_.clear(); } +void AutomationAXTreeWrapper::OnIgnoredChanged(ui::AXTree* tree, + ui::AXNode* node, + bool is_ignored_new_value) { + owner_->SendTreeChangeEvent( + is_ignored_new_value ? api::automation::TREE_CHANGE_TYPE_NODEREMOVED + : api::automation::TREE_CHANGE_TYPE_NODECREATED, + tree, node); +} + bool AutomationAXTreeWrapper::IsTreeIgnored() { // Check the hosting nodes within the parenting trees for ignored host nodes. AutomationAXTreeWrapper* tree = this;
diff --git a/extensions/renderer/api/automation/automation_ax_tree_wrapper.h b/extensions/renderer/api/automation/automation_ax_tree_wrapper.h index afb92e4..a3a3ae95 100644 --- a/extensions/renderer/api/automation/automation_ax_tree_wrapper.h +++ b/extensions/renderer/api/automation/automation_ax_tree_wrapper.h
@@ -132,6 +132,9 @@ void OnAtomicUpdateFinished(ui::AXTree* tree, bool root_changed, const std::vector<Change>& changes) override; + void OnIgnoredChanged(ui::AXTree* tree, + ui::AXNode* node, + bool is_ignored_new_value) override; ui::AXTreeID tree_id_; ui::AXTree tree_;
diff --git a/fuchsia/runners/cast/cast_platform_bindings_ids.h b/fuchsia/runners/cast/cast_platform_bindings_ids.h deleted file mode 100644 index 24c13b8b..0000000 --- a/fuchsia/runners/cast/cast_platform_bindings_ids.h +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef FUCHSIA_RUNNERS_CAST_CAST_PLATFORM_BINDINGS_IDS_H_ -#define FUCHSIA_RUNNERS_CAST_CAST_PLATFORM_BINDINGS_IDS_H_ - -#include <cstdint> - -// Managed the space of unique identifiers for injected scripts, to prevent ID -// conflicts inside Cast Runner. -enum class CastPlatformBindingsId : uint64_t { - NAMED_MESSAGE_PORT_CONNECTOR, - CAST_CHANNEL, - QUERYABLE_DATA, - QUERYABLE_DATA_VALUES, - NOT_IMPLEMENTED_API, - TOUCH_INPUT, -}; - -#endif // FUCHSIA_RUNNERS_CAST_CAST_PLATFORM_BINDINGS_IDS_H_
diff --git a/gpu/command_buffer/service/image_reader_gl_owner_unittest.cc b/gpu/command_buffer/service/image_reader_gl_owner_unittest.cc index 70d88de..72445a8 100644 --- a/gpu/command_buffer/service/image_reader_gl_owner_unittest.cc +++ b/gpu/command_buffer/service/image_reader_gl_owner_unittest.cc
@@ -44,7 +44,8 @@ /*init_extensions=*/true, /*system_device_id=*/0); - surface_ = new gl::PbufferGLSurfaceEGL(gfx::Size(320, 240)); + surface_ = new gl::PbufferGLSurfaceEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), + gfx::Size(320, 240)); surface_->Initialize(); share_group_ = new gl::GLShareGroup(); @@ -140,8 +141,8 @@ if (!IsImageReaderSupported()) return; - scoped_refptr<gl::GLSurface> new_surface( - new gl::PbufferGLSurfaceEGL(gfx::Size(320, 240))); + scoped_refptr<gl::GLSurface> new_surface(new gl::PbufferGLSurfaceEGL( + gl::GLSurfaceEGL::GetGLDisplayEGL(), gfx::Size(320, 240))); new_surface->Initialize(); scoped_refptr<gl::GLShareGroup> new_share_group(new gl::GLShareGroup());
diff --git a/gpu/command_buffer/service/surface_texture_gl_owner_unittest.cc b/gpu/command_buffer/service/surface_texture_gl_owner_unittest.cc index aed99cc..fa97fd0 100644 --- a/gpu/command_buffer/service/surface_texture_gl_owner_unittest.cc +++ b/gpu/command_buffer/service/surface_texture_gl_owner_unittest.cc
@@ -45,7 +45,8 @@ /*init_extensions=*/true, /*system_device_id=*/0); - surface_ = new gl::PbufferGLSurfaceEGL(gfx::Size(320, 240)); + surface_ = new gl::PbufferGLSurfaceEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), + gfx::Size(320, 240)); surface_->Initialize(); share_group_ = new gl::GLShareGroup(); @@ -123,8 +124,8 @@ // Verify that destruction works even if some other context is current. TEST_F(SurfaceTextureGLOwnerTest, DestructionWorksWithWrongContext) { - scoped_refptr<gl::GLSurface> new_surface( - new gl::PbufferGLSurfaceEGL(gfx::Size(320, 240))); + scoped_refptr<gl::GLSurface> new_surface(new gl::PbufferGLSurfaceEGL( + gl::GLSurfaceEGL::GetGLDisplayEGL(), gfx::Size(320, 240))); new_surface->Initialize(); scoped_refptr<gl::GLShareGroup> new_share_group(new gl::GLShareGroup());
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc index dfccd7aa..f88dec59 100644 --- a/gpu/command_buffer/service/webgpu_decoder_impl.cc +++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -1041,7 +1041,8 @@ } if (use_webgpu_adapter_ == WebGPUAdapterName::kCompat) { - gl_surface_ = new gl::SurfacelessEGL(gfx::Size(1, 1)); + gl_surface_ = new gl::SurfacelessEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), + gfx::Size(1, 1)); gl::GLContextAttribs attribs; attribs.client_major_es_version = 3; attribs.client_minor_es_version = 1;
diff --git a/gpu/ipc/service/gpu_init.cc b/gpu/ipc/service/gpu_init.cc index 76f0d0cb..4774547 100644 --- a/gpu/ipc/service/gpu_init.cc +++ b/gpu/ipc/service/gpu_init.cc
@@ -499,6 +499,7 @@ if (!gl_disabled) { if (!gl_use_swiftshader_) { if (!CollectGraphicsInfo(&gpu_info_)) { + VLOG(1) << "gpu::CollectGraphicsInfo failed"; return false; } @@ -533,8 +534,10 @@ // Collect GPU info, so we can use blocklist to disable vulkan if it // is needed. GPUInfo gpu_info; - if (!CollectGraphicsInfo(&gpu_info)) + if (!CollectGraphicsInfo(&gpu_info)) { + VLOG(1) << "gpu::CollectGraphicsInfo failed"; return false; + } auto gpu_feature_info = ComputeGpuFeatureInfo( gpu_info, gpu_preferences_, command_line, nullptr); gpu_feature_info_.status_values[GPU_FEATURE_TYPE_VULKAN] = @@ -609,8 +612,10 @@ // Collect GPU process info if (!gl_disabled) { - if (!CollectGpuExtraInfo(&gpu_extra_info_, gpu_preferences)) + if (!CollectGpuExtraInfo(&gpu_extra_info_, gpu_preferences)) { + VLOG(1) << "gpu::CollectGpuExtraInfo failed"; return false; + } } if (!gl_disabled) {
diff --git a/gpu/ipc/service/image_transport_surface_android.cc b/gpu/ipc/service/image_transport_surface_android.cc index 22ffeb90..e49b821 100644 --- a/gpu/ipc/service/image_transport_surface_android.cc +++ b/gpu/ipc/service/image_transport_surface_android.cc
@@ -42,9 +42,11 @@ delegate->GetFeatureInfo()->feature_flags().android_surface_control && can_be_used_with_surface_control) { surface = new gl::GLSurfaceEGLSurfaceControl( - window, base::ThreadTaskRunnerHandle::Get()); + gl::GLSurfaceEGL::GetGLDisplayEGL(), window, + base::ThreadTaskRunnerHandle::Get()); } else { - surface = new gl::NativeViewGLSurfaceEGL(window, nullptr); + surface = new gl::NativeViewGLSurfaceEGL( + gl::GLSurfaceEGL::GetGLDisplayEGL(), window, nullptr); } bool initialize_success = surface->Initialize(format);
diff --git a/gpu/ipc/service/image_transport_surface_mac.mm b/gpu/ipc/service/image_transport_surface_mac.mm index ff2e62d..959677e 100644 --- a/gpu/ipc/service/image_transport_surface_mac.mm +++ b/gpu/ipc/service/image_transport_surface_mac.mm
@@ -30,7 +30,8 @@ case gl::kGLImplementationEGLGLES2: case gl::kGLImplementationEGLANGLE: return base::WrapRefCounted<gl::GLSurface>( - new ImageTransportSurfaceOverlayMacEGL(delegate)); + new ImageTransportSurfaceOverlayMacEGL( + gl::GLSurfaceEGL::GetGLDisplayEGL(), delegate)); #endif case gl::kGLImplementationMockGL: case gl::kGLImplementationStubGL:
diff --git a/gpu/ipc/service/image_transport_surface_overlay_mac.h b/gpu/ipc/service/image_transport_surface_overlay_mac.h index 1b84c9d..7fc76ecb 100644 --- a/gpu/ipc/service/image_transport_surface_overlay_mac.h +++ b/gpu/ipc/service/image_transport_surface_overlay_mac.h
@@ -35,17 +35,16 @@ namespace gpu { -// Template ImageTransportSurfaceOverlayMac based on its base class so that it -// can be used by both the validating and passthrough command decoders by -// inheriting from GLSurface and GLSurfaceEGL respectively. Once the validating -// command decoder is removed, the template can be removed and -// ImageTransportSurfaceOverlayMac can always inherit from GLSurfaceEGL. +// ImageTransportSurfaceOverlayMac is used by the validating command decoder +// and ImageTransportSurfaceOverlayMacEGL is used by the passthrough command +// decoder. +// Once the validating command decoder is removed, +// ImageTransportSurfaceOverlayMac can be removed. -template <typename BaseClass> -class ImageTransportSurfaceOverlayMacBase : public BaseClass, - public ui::GpuSwitchingObserver { +class ImageTransportSurfaceOverlayMac : public gl::GLSurface, + public ui::GpuSwitchingObserver { public: - explicit ImageTransportSurfaceOverlayMacBase( + explicit ImageTransportSurfaceOverlayMac( base::WeakPtr<ImageTransportSurfaceDelegate> delegate); // GLSurface implementation @@ -104,7 +103,7 @@ void SetCALayerErrorCode(gfx::CALayerResult ca_layer_error_code) override; private: - ~ImageTransportSurfaceOverlayMacBase() override; + ~ImageTransportSurfaceOverlayMac() override; gfx::SwapResult SwapBuffersInternal( gl::GLSurface::SwapCompletionCallback completion_callback, @@ -132,17 +131,104 @@ // The renderer ID that all contexts made current to this surface should be // targeting. GLint gl_renderer_id_; - base::WeakPtrFactory<ImageTransportSurfaceOverlayMacBase<BaseClass>> - weak_ptr_factory_; + base::WeakPtrFactory<ImageTransportSurfaceOverlayMac> weak_ptr_factory_; }; -using ImageTransportSurfaceOverlayMac = - ImageTransportSurfaceOverlayMacBase<gl::GLSurface>; - #if defined(USE_EGL) -using ImageTransportSurfaceOverlayMacEGL = - ImageTransportSurfaceOverlayMacBase<gl::GLSurfaceEGL>; -#endif +class ImageTransportSurfaceOverlayMacEGL : public gl::GLSurfaceEGL, + public ui::GpuSwitchingObserver { + public: + ImageTransportSurfaceOverlayMacEGL( + gl::GLDisplayEGL* display, + base::WeakPtr<ImageTransportSurfaceDelegate> delegate); + + // GLSurface implementation + bool Initialize(gl::GLSurfaceFormat format) override; + void Destroy() override; + void PrepareToDestroy(bool have_context) override; + bool Resize(const gfx::Size& size, + float scale_factor, + const gfx::ColorSpace& color_space, + bool has_alpha) override; + bool IsOffscreen() override; + gfx::SwapResult SwapBuffers( + gl::GLSurface::PresentationCallback callback) override; + void SwapBuffersAsync( + gl::GLSurface::SwapCompletionCallback completion_callback, + gl::GLSurface::PresentationCallback presentation_callback) override; + gfx::SwapResult PostSubBuffer( + int x, + int y, + int width, + int height, + gl::GLSurface::PresentationCallback callback) override; + void PostSubBufferAsync( + int x, + int y, + int width, + int height, + gl::GLSurface::SwapCompletionCallback completion_callback, + gl::GLSurface::PresentationCallback presentation_callback) override; + gfx::SwapResult CommitOverlayPlanes( + gl::GLSurface::PresentationCallback callback) override; + void CommitOverlayPlanesAsync( + gl::GLSurface::SwapCompletionCallback completion_callback, + gl::GLSurface::PresentationCallback presentation_callback) override; + + bool SupportsPostSubBuffer() override; + bool SupportsCommitOverlayPlanes() override; + bool SupportsAsyncSwap() override; + gfx::Size GetSize() override; + void* GetHandle() override; + gl::GLSurfaceFormat GetFormat() override; + bool OnMakeCurrent(gl::GLContext* context) override; + bool ScheduleOverlayPlane( + gl::GLImage* image, + std::unique_ptr<gfx::GpuFence> gpu_fence, + const gfx::OverlayPlaneData& overlay_plane_data) override; + bool ScheduleCALayer(const ui::CARendererLayerParams& params) override; + void ScheduleCALayerInUseQuery( + std::vector<gl::GLSurface::CALayerInUseQuery> queries) override; + bool IsSurfaceless() const override; + gfx::SurfaceOrigin GetOrigin() const override; + + // ui::GpuSwitchingObserver implementation. + void OnGpuSwitched(gl::GpuPreference active_gpu_heuristic) override; + + void SetCALayerErrorCode(gfx::CALayerResult ca_layer_error_code) override; + + private: + ~ImageTransportSurfaceOverlayMacEGL() override; + + gfx::SwapResult SwapBuffersInternal( + gl::GLSurface::SwapCompletionCallback completion_callback, + gl::GLSurface::PresentationCallback presentation_callback); + void ApplyBackpressure(); + void BufferPresented(gl::GLSurface::PresentationCallback callback, + const gfx::PresentationFeedback& feedback); + + base::WeakPtr<ImageTransportSurfaceDelegate> delegate_; + + bool use_remote_layer_api_; + base::scoped_nsobject<CAContext> ca_context_; + std::unique_ptr<ui::CALayerTreeCoordinator> ca_layer_tree_coordinator_; + + gfx::Size pixel_size_; + float scale_factor_; + gfx::CALayerResult ca_layer_error_code_ = gfx::kCALayerSuccess; + + std::vector<gl::GLSurface::CALayerInUseQuery> ca_layer_in_use_queries_; + + // A GLFence marking the end of the previous frame, used for applying + // backpressure. + uint64_t previous_frame_fence_ = 0; + + // The renderer ID that all contexts made current to this surface should be + // targeting. + GLint gl_renderer_id_; + base::WeakPtrFactory<ImageTransportSurfaceOverlayMacEGL> weak_ptr_factory_; +}; +#endif // USE_EGL } // namespace gpu
diff --git a/gpu/ipc/service/image_transport_surface_overlay_mac.mm b/gpu/ipc/service/image_transport_surface_overlay_mac.mm index 547a5c42..43be379 100644 --- a/gpu/ipc/service/image_transport_surface_overlay_mac.mm +++ b/gpu/ipc/service/image_transport_surface_overlay_mac.mm
@@ -38,10 +38,8 @@ base::FEATURE_ENABLED_BY_DEFAULT}; } // namespace -template <typename BaseClass> -ImageTransportSurfaceOverlayMacBase<BaseClass>:: - ImageTransportSurfaceOverlayMacBase( - base::WeakPtr<ImageTransportSurfaceDelegate> delegate) +ImageTransportSurfaceOverlayMac::ImageTransportSurfaceOverlayMac( + base::WeakPtr<ImageTransportSurfaceDelegate> delegate) : delegate_(delegate), use_remote_layer_api_(ui::RemoteLayerAPISupported()), scale_factor_(1), @@ -71,35 +69,26 @@ } } -template <typename BaseClass> -ImageTransportSurfaceOverlayMacBase< - BaseClass>::~ImageTransportSurfaceOverlayMacBase() { +ImageTransportSurfaceOverlayMac::~ImageTransportSurfaceOverlayMac() { ui::GpuSwitchingManager::GetInstance()->RemoveObserver(this); Destroy(); } -template <typename BaseClass> -bool ImageTransportSurfaceOverlayMacBase<BaseClass>::Initialize( - gl::GLSurfaceFormat format) { +bool ImageTransportSurfaceOverlayMac::Initialize(gl::GLSurfaceFormat format) { return true; } -template <typename BaseClass> -void ImageTransportSurfaceOverlayMacBase<BaseClass>::PrepareToDestroy( - bool have_context) {} +void ImageTransportSurfaceOverlayMac::PrepareToDestroy(bool have_context) {} -template <typename BaseClass> -void ImageTransportSurfaceOverlayMacBase<BaseClass>::Destroy() { +void ImageTransportSurfaceOverlayMac::Destroy() { ca_layer_tree_coordinator_.reset(); } -template <typename BaseClass> -bool ImageTransportSurfaceOverlayMacBase<BaseClass>::IsOffscreen() { +bool ImageTransportSurfaceOverlayMac::IsOffscreen() { return false; } -template <typename BaseClass> -void ImageTransportSurfaceOverlayMacBase<BaseClass>::ApplyBackpressure() { +void ImageTransportSurfaceOverlayMac::ApplyBackpressure() { TRACE_EVENT0("gpu", "ImageTransportSurfaceOverlayMac::ApplyBackpressure"); // Create the fence for the current frame before waiting on the previous // frame's fence (to maximize CPU and GPU execution overlap). @@ -109,8 +98,7 @@ previous_frame_fence_ = this_frame_fence; } -template <typename BaseClass> -void ImageTransportSurfaceOverlayMacBase<BaseClass>::BufferPresented( +void ImageTransportSurfaceOverlayMac::BufferPresented( gl::GLSurface::PresentationCallback callback, const gfx::PresentationFeedback& feedback) { DCHECK(!callback.is_null()); @@ -119,9 +107,7 @@ delegate_->BufferPresented(feedback); } -template <typename BaseClass> -gfx::SwapResult -ImageTransportSurfaceOverlayMacBase<BaseClass>::SwapBuffersInternal( +gfx::SwapResult ImageTransportSurfaceOverlayMac::SwapBuffersInternal( gl::GLSurface::SwapCompletionCallback completion_callback, gl::GLSurface::PresentationCallback presentation_callback) { TRACE_EVENT0("gpu", "ImageTransportSurfaceOverlayMac::SwapBuffersInternal"); @@ -212,29 +198,25 @@ base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, - base::BindOnce( - &ImageTransportSurfaceOverlayMacBase<BaseClass>::BufferPresented, - weak_ptr_factory_.GetWeakPtr(), std::move(presentation_callback), - feedback)); + base::BindOnce(&ImageTransportSurfaceOverlayMac::BufferPresented, + weak_ptr_factory_.GetWeakPtr(), + std::move(presentation_callback), feedback)); return gfx::SwapResult::SWAP_ACK; } -template <typename BaseClass> -gfx::SwapResult ImageTransportSurfaceOverlayMacBase<BaseClass>::SwapBuffers( +gfx::SwapResult ImageTransportSurfaceOverlayMac::SwapBuffers( gl::GLSurface::PresentationCallback callback) { return SwapBuffersInternal(base::DoNothing(), std::move(callback)); } -template <typename BaseClass> -void ImageTransportSurfaceOverlayMacBase<BaseClass>::SwapBuffersAsync( +void ImageTransportSurfaceOverlayMac::SwapBuffersAsync( gl::GLSurface::SwapCompletionCallback completion_callback, gl::GLSurface::PresentationCallback presentation_callback) { SwapBuffersInternal(std::move(completion_callback), std::move(presentation_callback)); } -template <typename BaseClass> -gfx::SwapResult ImageTransportSurfaceOverlayMacBase<BaseClass>::PostSubBuffer( +gfx::SwapResult ImageTransportSurfaceOverlayMac::PostSubBuffer( int x, int y, int width, @@ -243,8 +225,7 @@ return SwapBuffersInternal(base::DoNothing(), std::move(callback)); } -template <typename BaseClass> -void ImageTransportSurfaceOverlayMacBase<BaseClass>::PostSubBufferAsync( +void ImageTransportSurfaceOverlayMac::PostSubBufferAsync( int x, int y, int width, @@ -255,56 +236,43 @@ std::move(presentation_callback)); } -template <typename BaseClass> -gfx::SwapResult -ImageTransportSurfaceOverlayMacBase<BaseClass>::CommitOverlayPlanes( +gfx::SwapResult ImageTransportSurfaceOverlayMac::CommitOverlayPlanes( gl::GLSurface::PresentationCallback callback) { return SwapBuffersInternal(base::DoNothing(), std::move(callback)); } -template <typename BaseClass> -void ImageTransportSurfaceOverlayMacBase<BaseClass>::CommitOverlayPlanesAsync( +void ImageTransportSurfaceOverlayMac::CommitOverlayPlanesAsync( gl::GLSurface::SwapCompletionCallback completion_callback, gl::GLSurface::PresentationCallback presentation_callback) { SwapBuffersInternal(std::move(completion_callback), std::move(presentation_callback)); } -template <typename BaseClass> -bool ImageTransportSurfaceOverlayMacBase<BaseClass>::SupportsPostSubBuffer() { +bool ImageTransportSurfaceOverlayMac::SupportsPostSubBuffer() { return true; } -template <typename BaseClass> -bool ImageTransportSurfaceOverlayMacBase< - BaseClass>::SupportsCommitOverlayPlanes() { +bool ImageTransportSurfaceOverlayMac::SupportsCommitOverlayPlanes() { return true; } -template <typename BaseClass> -bool ImageTransportSurfaceOverlayMacBase<BaseClass>::SupportsAsyncSwap() { +bool ImageTransportSurfaceOverlayMac::SupportsAsyncSwap() { return true; } -template <typename BaseClass> -gfx::Size ImageTransportSurfaceOverlayMacBase<BaseClass>::GetSize() { +gfx::Size ImageTransportSurfaceOverlayMac::GetSize() { return gfx::Size(); } -template <typename BaseClass> -void* ImageTransportSurfaceOverlayMacBase<BaseClass>::GetHandle() { +void* ImageTransportSurfaceOverlayMac::GetHandle() { return nullptr; } -template <typename BaseClass> -gl::GLSurfaceFormat -ImageTransportSurfaceOverlayMacBase<BaseClass>::GetFormat() { +gl::GLSurfaceFormat ImageTransportSurfaceOverlayMac::GetFormat() { return gl::GLSurfaceFormat(); } -template <typename BaseClass> -bool ImageTransportSurfaceOverlayMacBase<BaseClass>::OnMakeCurrent( - gl::GLContext* context) { +bool ImageTransportSurfaceOverlayMac::OnMakeCurrent(gl::GLContext* context) { // Ensure that the context is on the appropriate GL renderer. The GL renderer // will generally only change when the GPU changes. if (gl_renderer_id_ && context) @@ -312,8 +280,7 @@ return true; } -template <typename BaseClass> -bool ImageTransportSurfaceOverlayMacBase<BaseClass>::ScheduleOverlayPlane( +bool ImageTransportSurfaceOverlayMac::ScheduleOverlayPlane( gl::GLImage* image, std::unique_ptr<gfx::GpuFence> gpu_fence, const gfx::OverlayPlaneData& overlay_plane_data) { @@ -351,8 +318,7 @@ ->ScheduleCALayer(overlay_as_calayer_params); } -template <typename BaseClass> -bool ImageTransportSurfaceOverlayMacBase<BaseClass>::ScheduleCALayer( +bool ImageTransportSurfaceOverlayMac::ScheduleCALayer( const ui::CARendererLayerParams& params) { if (params.image) { gl::GLImageIOSurface* io_surface_image = @@ -366,37 +332,30 @@ ->ScheduleCALayer(params); } -template <typename BaseClass> -void ImageTransportSurfaceOverlayMacBase<BaseClass>::ScheduleCALayerInUseQuery( +void ImageTransportSurfaceOverlayMac::ScheduleCALayerInUseQuery( std::vector<gl::GLSurface::CALayerInUseQuery> queries) { ca_layer_in_use_queries_.swap(queries); } -template <typename BaseClass> -bool ImageTransportSurfaceOverlayMacBase<BaseClass>::IsSurfaceless() const { +bool ImageTransportSurfaceOverlayMac::IsSurfaceless() const { return true; } -template <typename BaseClass> -gfx::SurfaceOrigin ImageTransportSurfaceOverlayMacBase<BaseClass>::GetOrigin() - const { +gfx::SurfaceOrigin ImageTransportSurfaceOverlayMac::GetOrigin() const { return gfx::SurfaceOrigin::kTopLeft; } -template <typename BaseClass> -bool ImageTransportSurfaceOverlayMacBase<BaseClass>::Resize( - const gfx::Size& pixel_size, - float scale_factor, - const gfx::ColorSpace& color_space, - bool has_alpha) { +bool ImageTransportSurfaceOverlayMac::Resize(const gfx::Size& pixel_size, + float scale_factor, + const gfx::ColorSpace& color_space, + bool has_alpha) { pixel_size_ = pixel_size; scale_factor_ = scale_factor; ca_layer_tree_coordinator_->Resize(pixel_size, scale_factor); return true; } -template <typename BaseClass> -void ImageTransportSurfaceOverlayMacBase<BaseClass>::OnGpuSwitched( +void ImageTransportSurfaceOverlayMac::OnGpuSwitched( gl::GpuPreference active_gpu_heuristic) { // Create a new context, and use the GL renderer ID that the new context gets. scoped_refptr<ui::IOSurfaceContext> context_on_new_gpu = @@ -419,16 +378,362 @@ FROM_HERE, std::move(context_on_new_gpu)); } -template <typename BaseClass> -void ImageTransportSurfaceOverlayMacBase<BaseClass>::SetCALayerErrorCode( +void ImageTransportSurfaceOverlayMac::SetCALayerErrorCode( gfx::CALayerResult ca_layer_error_code) { ca_layer_error_code_ = ca_layer_error_code; } -// Template instantiation -template class ImageTransportSurfaceOverlayMacBase<gl::GLSurface>; #if defined(USE_EGL) -template class ImageTransportSurfaceOverlayMacBase<gl::GLSurfaceEGL>; -#endif + +ImageTransportSurfaceOverlayMacEGL::ImageTransportSurfaceOverlayMacEGL( + gl::GLDisplayEGL* display, + base::WeakPtr<ImageTransportSurfaceDelegate> delegate) + : gl::GLSurfaceEGL(display), + delegate_(delegate), + use_remote_layer_api_(ui::RemoteLayerAPISupported()), + scale_factor_(1), + gl_renderer_id_(0), + weak_ptr_factory_(this) { + ui::GpuSwitchingManager::GetInstance()->AddObserver(this); + + static bool av_disabled_at_command_line = + !base::FeatureList::IsEnabled(kAVFoundationOverlays); + + bool allow_av_sample_buffer_display_layer = + !av_disabled_at_command_line && + !delegate_->GetFeatureInfo() + ->workarounds() + .disable_av_sample_buffer_display_layer; + + ca_layer_tree_coordinator_ = std::make_unique<ui::CALayerTreeCoordinator>( + use_remote_layer_api_, allow_av_sample_buffer_display_layer); + + // Create the CAContext to send this to the GPU process, and the layer for + // the context. + if (use_remote_layer_api_) { + CGSConnectionID connection_id = CGSMainConnectionID(); + ca_context_.reset([[CAContext contextWithCGSConnection:connection_id + options:@{}] retain]); + [ca_context_ setLayer:ca_layer_tree_coordinator_->GetCALayerForDisplay()]; + } +} + +ImageTransportSurfaceOverlayMacEGL::~ImageTransportSurfaceOverlayMacEGL() { + ui::GpuSwitchingManager::GetInstance()->RemoveObserver(this); + Destroy(); +} + +bool ImageTransportSurfaceOverlayMacEGL::Initialize( + gl::GLSurfaceFormat format) { + return true; +} + +void ImageTransportSurfaceOverlayMacEGL::PrepareToDestroy(bool have_context) {} + +void ImageTransportSurfaceOverlayMacEGL::Destroy() { + ca_layer_tree_coordinator_.reset(); +} + +bool ImageTransportSurfaceOverlayMacEGL::IsOffscreen() { + return false; +} + +void ImageTransportSurfaceOverlayMacEGL::ApplyBackpressure() { + TRACE_EVENT0("gpu", "ImageTransportSurfaceOverlayMac::ApplyBackpressure"); + // Create the fence for the current frame before waiting on the previous + // frame's fence (to maximize CPU and GPU execution overlap). + gl::GLContext* current_context = gl::GLContext::GetCurrent(); + uint64_t this_frame_fence = current_context->BackpressureFenceCreate(); + current_context->BackpressureFenceWait(previous_frame_fence_); + previous_frame_fence_ = this_frame_fence; +} + +void ImageTransportSurfaceOverlayMacEGL::BufferPresented( + gl::GLSurface::PresentationCallback callback, + const gfx::PresentationFeedback& feedback) { + DCHECK(!callback.is_null()); + std::move(callback).Run(feedback); + if (delegate_) + delegate_->BufferPresented(feedback); +} + +gfx::SwapResult ImageTransportSurfaceOverlayMacEGL::SwapBuffersInternal( + gl::GLSurface::SwapCompletionCallback completion_callback, + gl::GLSurface::PresentationCallback presentation_callback) { + TRACE_EVENT0("gpu", "ImageTransportSurfaceOverlayMac::SwapBuffersInternal"); + + constexpr base::TimeDelta kHistogramMinTime = base::Microseconds(5); + constexpr base::TimeDelta kHistogramMaxTime = base::Milliseconds(16); + constexpr int kHistogramTimeBuckets = 50; + + // Do a GL fence for flush to apply back-pressure before drawing. + { + base::TimeTicks start_time = base::TimeTicks::Now(); + ApplyBackpressure(); + + UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES( + "Gpu.Mac.BackpressureUs", base::TimeTicks::Now() - start_time, + kHistogramMinTime, kHistogramMaxTime, kHistogramTimeBuckets); + } + + // Update the CALayer tree in the GPU process. + base::TimeTicks before_transaction_time = base::TimeTicks::Now(); + { + TRACE_EVENT0("gpu", "CommitPendingTreesToCA"); + ca_layer_tree_coordinator_->CommitPendingTreesToCA(); + + base::TimeDelta transaction_time = + base::TimeTicks::Now() - before_transaction_time; + UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES( + "GPU.IOSurface.CATransactionTimeUs", transaction_time, + kHistogramMinTime, kHistogramMaxTime, kHistogramTimeBuckets); + } + + // Populate the swap-complete parameters to send to the browser. + SwapBuffersCompleteParams params; + { + TRACE_EVENT_INSTANT2("test_gpu", "SwapBuffers", TRACE_EVENT_SCOPE_THREAD, + "GLImpl", static_cast<int>(gl::GetGLImplementation()), + "width", pixel_size_.width()); + if (use_remote_layer_api_) { + params.ca_layer_params.ca_context_id = [ca_context_ contextId]; + } else { + IOSurfaceRef io_surface = + ca_layer_tree_coordinator_->GetIOSurfaceForDisplay(); + if (io_surface) { + params.ca_layer_params.io_surface_mach_port.reset( + IOSurfaceCreateMachPort(io_surface)); + } + } + params.ca_layer_params.pixel_size = pixel_size_; + params.ca_layer_params.scale_factor = scale_factor_; + params.ca_layer_params.is_empty = false; + params.swap_response.swap_id = 0; // Set later, in DecoderClient. + params.swap_response.result = gfx::SwapResult::SWAP_ACK; + // TODO(brianderson): Tie swap_start to before_flush_time. + params.swap_response.timings.swap_start = before_transaction_time; + params.swap_response.timings.swap_end = before_transaction_time; + for (auto& query : ca_layer_in_use_queries_) { + gpu::TextureInUseResponse response; + response.texture = query.texture; + bool in_use = false; + gl::GLImageIOSurface* io_surface_image = + gl::GLImageIOSurface::FromGLImage(query.image.get()); + if (io_surface_image) + in_use = io_surface_image->IsInUseByWindowServer(); + response.in_use = in_use; + params.texture_in_use_responses.push_back(std::move(response)); + } + ca_layer_in_use_queries_.clear(); + } + + // Send the swap parameters to the browser. + if (completion_callback) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce( + std::move(completion_callback), + gfx::SwapCompletionResult( + gfx::SwapResult::SWAP_ACK, + std::make_unique<gfx::CALayerParams>(params.ca_layer_params)))); + } + delegate_->DidSwapBuffersComplete(std::move(params), + /*release_fence=*/gfx::GpuFenceHandle()); + constexpr int64_t kRefreshIntervalInMicroseconds = + base::Time::kMicrosecondsPerSecond / 60; + gfx::PresentationFeedback feedback( + base::TimeTicks::Now(), + base::Microseconds(kRefreshIntervalInMicroseconds), /*flags=*/0); + feedback.ca_layer_error_code = ca_layer_error_code_; + + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&ImageTransportSurfaceOverlayMacEGL::BufferPresented, + weak_ptr_factory_.GetWeakPtr(), + std::move(presentation_callback), feedback)); + return gfx::SwapResult::SWAP_ACK; +} + +gfx::SwapResult ImageTransportSurfaceOverlayMacEGL::SwapBuffers( + gl::GLSurface::PresentationCallback callback) { + return SwapBuffersInternal(base::DoNothing(), std::move(callback)); +} + +void ImageTransportSurfaceOverlayMacEGL::SwapBuffersAsync( + gl::GLSurface::SwapCompletionCallback completion_callback, + gl::GLSurface::PresentationCallback presentation_callback) { + SwapBuffersInternal(std::move(completion_callback), + std::move(presentation_callback)); +} + +gfx::SwapResult ImageTransportSurfaceOverlayMacEGL::PostSubBuffer( + int x, + int y, + int width, + int height, + gl::GLSurface::PresentationCallback callback) { + return SwapBuffersInternal(base::DoNothing(), std::move(callback)); +} + +void ImageTransportSurfaceOverlayMacEGL::PostSubBufferAsync( + int x, + int y, + int width, + int height, + gl::GLSurface::SwapCompletionCallback completion_callback, + gl::GLSurface::PresentationCallback presentation_callback) { + SwapBuffersInternal(std::move(completion_callback), + std::move(presentation_callback)); +} + +gfx::SwapResult ImageTransportSurfaceOverlayMacEGL::CommitOverlayPlanes( + gl::GLSurface::PresentationCallback callback) { + return SwapBuffersInternal(base::DoNothing(), std::move(callback)); +} + +void ImageTransportSurfaceOverlayMacEGL::CommitOverlayPlanesAsync( + gl::GLSurface::SwapCompletionCallback completion_callback, + gl::GLSurface::PresentationCallback presentation_callback) { + SwapBuffersInternal(std::move(completion_callback), + std::move(presentation_callback)); +} + +bool ImageTransportSurfaceOverlayMacEGL::SupportsPostSubBuffer() { + return true; +} + +bool ImageTransportSurfaceOverlayMacEGL::SupportsCommitOverlayPlanes() { + return true; +} + +bool ImageTransportSurfaceOverlayMacEGL::SupportsAsyncSwap() { + return true; +} + +gfx::Size ImageTransportSurfaceOverlayMacEGL::GetSize() { + return gfx::Size(); +} + +void* ImageTransportSurfaceOverlayMacEGL::GetHandle() { + return nullptr; +} + +gl::GLSurfaceFormat ImageTransportSurfaceOverlayMacEGL::GetFormat() { + return gl::GLSurfaceFormat(); +} + +bool ImageTransportSurfaceOverlayMacEGL::OnMakeCurrent(gl::GLContext* context) { + // Ensure that the context is on the appropriate GL renderer. The GL renderer + // will generally only change when the GPU changes. + if (gl_renderer_id_ && context) + context->share_group()->SetRendererID(gl_renderer_id_); + return true; +} + +bool ImageTransportSurfaceOverlayMacEGL::ScheduleOverlayPlane( + gl::GLImage* image, + std::unique_ptr<gfx::GpuFence> gpu_fence, + const gfx::OverlayPlaneData& overlay_plane_data) { + if (overlay_plane_data.plane_transform != gfx::OVERLAY_TRANSFORM_NONE) { + DLOG(ERROR) << "Invalid overlay plane transform."; + return false; + } + if (overlay_plane_data.z_order) { + DLOG(ERROR) << "Invalid non-zero Z order."; + return false; + } + gl::GLImageIOSurface* io_surface_image = + gl::GLImageIOSurface::FromGLImage(image); + if (!io_surface_image) { + DLOG(ERROR) << "Not an IOSurface image."; + return false; + } + // TODO(1290313): the display_bounds might not need to be rounded to the + // nearest rect as this eventually gets made into a CALayer. CALayers work in + // floats. + const ui::CARendererLayerParams overlay_as_calayer_params( + false, // is_clipped + gfx::Rect(), // clip_rect + gfx::RRectF(), // rounded_corner_bounds + 0, // sorting_context_id + gfx::Transform(), image, + overlay_plane_data.crop_rect, // contents_rect + gfx::ToNearestRect(overlay_plane_data.display_bounds), // rect + SK_ColorTRANSPARENT, // background_color + 0, // edge_aa_mask + 1.f, // opacity + GL_LINEAR, // filter + gfx::ProtectedVideoType::kClear); // protected_video_type + return ca_layer_tree_coordinator_->GetPendingCARendererLayerTree() + ->ScheduleCALayer(overlay_as_calayer_params); +} + +bool ImageTransportSurfaceOverlayMacEGL::ScheduleCALayer( + const ui::CARendererLayerParams& params) { + if (params.image) { + gl::GLImageIOSurface* io_surface_image = + gl::GLImageIOSurface::FromGLImage(params.image); + if (!io_surface_image) { + DLOG(ERROR) << "Cannot schedule CALayer with non-IOSurface GLImage"; + return false; + } + } + return ca_layer_tree_coordinator_->GetPendingCARendererLayerTree() + ->ScheduleCALayer(params); +} + +void ImageTransportSurfaceOverlayMacEGL::ScheduleCALayerInUseQuery( + std::vector<gl::GLSurface::CALayerInUseQuery> queries) { + ca_layer_in_use_queries_.swap(queries); +} + +bool ImageTransportSurfaceOverlayMacEGL::IsSurfaceless() const { + return true; +} + +gfx::SurfaceOrigin ImageTransportSurfaceOverlayMacEGL::GetOrigin() const { + return gfx::SurfaceOrigin::kTopLeft; +} + +bool ImageTransportSurfaceOverlayMacEGL::Resize( + const gfx::Size& pixel_size, + float scale_factor, + const gfx::ColorSpace& color_space, + bool has_alpha) { + pixel_size_ = pixel_size; + scale_factor_ = scale_factor; + ca_layer_tree_coordinator_->Resize(pixel_size, scale_factor); + return true; +} + +void ImageTransportSurfaceOverlayMacEGL::OnGpuSwitched( + gl::GpuPreference active_gpu_heuristic) { + // Create a new context, and use the GL renderer ID that the new context gets. + scoped_refptr<ui::IOSurfaceContext> context_on_new_gpu = + ui::IOSurfaceContext::Get(ui::IOSurfaceContext::kCALayerContext); + if (!context_on_new_gpu) + return; + GLint context_renderer_id = -1; + if (CGLGetParameter(context_on_new_gpu->cgl_context(), + kCGLCPCurrentRendererID, + &context_renderer_id) != kCGLNoError) { + LOG(ERROR) << "Failed to create test context after GPU switch"; + return; + } + gl_renderer_id_ = context_renderer_id & kCGLRendererIDMatchingMask; + + // Delay releasing the reference to the new GL context. The reason for this + // is to avoid creating-then-destroying the context for every image transport + // surface that is observing the GPU switch. + base::ThreadTaskRunnerHandle::Get()->ReleaseSoon( + FROM_HERE, std::move(context_on_new_gpu)); +} + +void ImageTransportSurfaceOverlayMacEGL::SetCALayerErrorCode( + gfx::CALayerResult ca_layer_error_code) { + ca_layer_error_code_ = ca_layer_error_code; +} + +#endif // USE_EGL } // namespace gpu
diff --git a/gpu/ipc/service/image_transport_surface_win.cc b/gpu/ipc/service/image_transport_surface_win.cc index ccd9f6b..af15f10 100644 --- a/gpu/ipc/service/image_transport_surface_win.cc +++ b/gpu/ipc/service/image_transport_surface_win.cc
@@ -56,7 +56,8 @@ auto settings = CreateDirectCompositionSurfaceSettings( delegate->GetFeatureInfo()->workarounds()); auto dc_surface = base::MakeRefCounted<gl::DirectCompositionSurfaceWin>( - surface_handle, std::move(vsync_callback), settings); + gl::GLSurfaceEGL::GetGLDisplayEGL(), surface_handle, + std::move(vsync_callback), settings); if (!dc_surface->Initialize(gl::GLSurfaceFormat())) return nullptr; delegate->DidCreateAcceleratedSurfaceChildWindow(surface_handle, @@ -65,7 +66,7 @@ } else { surface = gl::InitializeGLSurface( base::MakeRefCounted<gl::NativeViewGLSurfaceEGL>( - surface_handle, + gl::GLSurfaceEGL::GetGLDisplayEGL(), surface_handle, std::make_unique<gl::VSyncProviderWin>(surface_handle))); if (!surface) return nullptr;
diff --git "a/infra/config/generated/builders/ci/Android arm64 Builder All Targets \050dbg\051/properties.json" "b/infra/config/generated/builders/ci/Android arm64 Builder All Targets \050dbg\051/properties.json" new file mode 100644 index 0000000..dcb664df --- /dev/null +++ "b/infra/config/generated/builders/ci/Android arm64 Builder All Targets \050dbg\051/properties.json"
@@ -0,0 +1,71 @@ +{ + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Android arm64 Builder All Targets (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_mb" + }, + "legacy_chromium_config": { + "apply_configs": [ + "download_vr_test_apks" + ], + "build_config": "Debug", + "config": "android", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android", + "enable_reclient" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Android arm64 Builder All Targets (dbg)", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-arm64-all-targets-dbg", + "group": "tryserver.chromium.android" + } + ] + } + }, + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 500, + "metrics_project": "chromium-reclient-metrics" + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "chromium.android", + "recipe": "chromium", + "sheriff_rotations": [ + "android" + ] +} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/GPU FYI Lacros x64 Builder/properties.json b/infra/config/generated/builders/ci/GPU FYI Lacros x64 Builder/properties.json index def7636..c01b8ac 100644 --- a/infra/config/generated/builders/ci/GPU FYI Lacros x64 Builder/properties.json +++ b/infra/config/generated/builders/ci/GPU FYI Lacros x64 Builder/properties.json
@@ -1,9 +1,8 @@ { - "$build/goma": { - "enable_ats": true, - "rpc_extra_params": "?prod", - "server_host": "goma.chromium.org", - "use_luci_auth": true + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 500, + "metrics_project": "chromium-reclient-metrics" }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git "a/infra/config/generated/builders/ci/Win ASan Release \050reclient shadow\051/properties.json" "b/infra/config/generated/builders/ci/Win ASan Release \050reclient shadow\051/properties.json" deleted file mode 100644 index c5b49c9..0000000 --- "a/infra/config/generated/builders/ci/Win ASan Release \050reclient shadow\051/properties.json" +++ /dev/null
@@ -1,16 +0,0 @@ -{ - "$build/reclient": { - "instance": "rbe-chromium-trusted", - "jobs": 80, - "metrics_project": "chromium-reclient-metrics" - }, - "$recipe_engine/resultdb/test_presentation": { - "column_keys": [], - "grouping_keys": [ - "status", - "v.test_suite" - ] - }, - "builder_group": "chromium.fyi", - "recipe": "chromium" -} \ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win ASan Release Media \050reclient shadow\051/properties.json" "b/infra/config/generated/builders/ci/Win ASan Release Media \050reclient shadow\051/properties.json" deleted file mode 100644 index c5b49c9..0000000 --- "a/infra/config/generated/builders/ci/Win ASan Release Media \050reclient shadow\051/properties.json" +++ /dev/null
@@ -1,16 +0,0 @@ -{ - "$build/reclient": { - "instance": "rbe-chromium-trusted", - "jobs": 80, - "metrics_project": "chromium-reclient-metrics" - }, - "$recipe_engine/resultdb/test_presentation": { - "column_keys": [], - "grouping_keys": [ - "status", - "v.test_suite" - ] - }, - "builder_group": "chromium.fyi", - "recipe": "chromium" -} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/lacros-amd64-generic-binary-size-rel/properties.json b/infra/config/generated/builders/ci/lacros-amd64-generic-binary-size-rel/properties.json index b1c64ed..4301eae 100644 --- a/infra/config/generated/builders/ci/lacros-amd64-generic-binary-size-rel/properties.json +++ b/infra/config/generated/builders/ci/lacros-amd64-generic-binary-size-rel/properties.json
@@ -24,11 +24,10 @@ } ] }, - "$build/goma": { - "enable_ats": true, - "rpc_extra_params": "?prod", - "server_host": "goma.chromium.org", - "use_luci_auth": true + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 500, + "metrics_project": "chromium-reclient-metrics" }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
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 fc3bce3..342b501 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,9 +1,8 @@ { - "$build/goma": { - "enable_ats": true, - "rpc_extra_params": "?prod", - "server_host": "goma.chromium.org", - "use_luci_auth": true + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 500, + "metrics_project": "chromium-reclient-metrics" }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
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 573155d..886262c 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
@@ -6,11 +6,10 @@ ], "use_clang_coverage": true }, - "$build/goma": { - "enable_ats": true, - "rpc_extra_params": "?prod", - "server_host": "goma.chromium.org", - "use_luci_auth": true + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 500, + "metrics_project": "chromium-reclient-metrics" }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
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 fc3bce3..342b501 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,9 +1,8 @@ { - "$build/goma": { - "enable_ats": true, - "rpc_extra_params": "?prod", - "server_host": "goma.chromium.org", - "use_luci_auth": true + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 500, + "metrics_project": "chromium-reclient-metrics" }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/ci/linux-lacros-dbg/properties.json b/infra/config/generated/builders/ci/linux-lacros-dbg/properties.json index a2dcb4f..20179b4 100644 --- a/infra/config/generated/builders/ci/linux-lacros-dbg/properties.json +++ b/infra/config/generated/builders/ci/linux-lacros-dbg/properties.json
@@ -1,9 +1,8 @@ { - "$build/goma": { - "enable_ats": true, - "rpc_extra_params": "?prod", - "server_host": "goma.chromium.org", - "use_luci_auth": true + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 500, + "metrics_project": "chromium-reclient-metrics" }, "$recipe_engine/resultdb/test_presentation": { "column_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 fc3bce3..342b501 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,9 +1,8 @@ { - "$build/goma": { - "enable_ats": true, - "rpc_extra_params": "?prod", - "server_host": "goma.chromium.org", - "use_luci_auth": true + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 500, + "metrics_project": "chromium-reclient-metrics" }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [],
diff --git a/infra/config/generated/builders/try/android-arm64-all-targets-dbg/properties.json b/infra/config/generated/builders/try/android-arm64-all-targets-dbg/properties.json new file mode 100644 index 0000000..2c4e4763 --- /dev/null +++ b/infra/config/generated/builders/try/android-arm64-all-targets-dbg/properties.json
@@ -0,0 +1,64 @@ +{ + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "Android arm64 Builder All Targets (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_mb" + }, + "legacy_chromium_config": { + "apply_configs": [ + "download_vr_test_apks" + ], + "build_config": "Debug", + "config": "android", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android", + "enable_reclient" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "Android arm64 Builder All Targets (dbg)", + "project": "chromium" + } + ] + } + }, + "$build/goma": { + "enable_ats": true, + "jobs": 300, + "rpc_extra_params": "?prod", + "server_host": "goma.chromium.org", + "use_luci_auth": true + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "tryserver.chromium.android", + "recipe": "chromium_trybot" +} \ No newline at end of file
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg index 493ef79..82b36cb2 100644 --- a/infra/config/generated/luci/commit-queue.cfg +++ b/infra/config/generated/luci/commit-queue.cfg
@@ -322,6 +322,10 @@ includable_only: true } builders { + name: "chromium/try/android-arm64-all-targets-dbg" + includable_only: true + } + builders { name: "chromium/try/android-asan" includable_only: true }
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 9ddb2d7..adb43ee 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -1945,6 +1945,88 @@ } } builders { + name: "Android arm64 Builder All Targets (dbg)" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-18.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/ci/Android arm64 Builder All Targets (dbg)/properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "chromium.android",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "android"' + ' ]' + '}' + execution_timeout_secs: 25200 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://[^/]*blink_web_tests/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { name: "Android x64 Builder (dbg)" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1" @@ -19436,85 +19518,6 @@ } } builders { - name: "Win ASan Release (reclient shadow)" - swarming_host: "chromium-swarm.appspot.com" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Windows-10" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - exe { - cipd_package: "infra/chromium/bootstrapper/${platform}" - cipd_version: "latest" - cmd: "bootstrapper" - } - properties: - '{' - ' "$bootstrap/exe": {' - ' "exe": {' - ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' - ' "cipd_version": "refs/heads/main",' - ' "cmd": [' - ' "luciexe"' - ' ]' - ' }' - ' },' - ' "$bootstrap/properties": {' - ' "properties_file": "infra/config/generated/builders/ci/Win ASan Release (reclient shadow)/properties.json",' - ' "top_level_project": {' - ' "ref": "refs/heads/main",' - ' "repo": {' - ' "host": "chromium.googlesource.com",' - ' "project": "chromium/src"' - ' }' - ' }' - ' },' - ' "builder_group": "chromium.fyi",' - ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' - '}' - execution_timeout_secs: 36000 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } - resultdb { - enable: true - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "ci_test_results" - test_results {} - } - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "gpu_ci_test_results" - test_results { - predicate { - test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" - } - } - } - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "blink_web_tests_ci_test_results" - test_results { - predicate { - test_id_regexp: "ninja://[^/]*blink_web_tests/.+" - } - } - } - history_options { - use_invocation_timestamp: true - } - } - } - builders { name: "Win ASan Release Media" swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:Win ASan Release Media" @@ -19593,85 +19596,6 @@ } } builders { - name: "Win ASan Release Media (reclient shadow)" - swarming_host: "chromium-swarm.appspot.com" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Windows-10" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - exe { - cipd_package: "infra/chromium/bootstrapper/${platform}" - cipd_version: "latest" - cmd: "bootstrapper" - } - properties: - '{' - ' "$bootstrap/exe": {' - ' "exe": {' - ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' - ' "cipd_version": "refs/heads/main",' - ' "cmd": [' - ' "luciexe"' - ' ]' - ' }' - ' },' - ' "$bootstrap/properties": {' - ' "properties_file": "infra/config/generated/builders/ci/Win ASan Release Media (reclient shadow)/properties.json",' - ' "top_level_project": {' - ' "ref": "refs/heads/main",' - ' "repo": {' - ' "host": "chromium.googlesource.com",' - ' "project": "chromium/src"' - ' }' - ' }' - ' },' - ' "builder_group": "chromium.fyi",' - ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' - '}' - execution_timeout_secs: 36000 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.recipes.use_python3" - value: 100 - } - resultdb { - enable: true - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "ci_test_results" - test_results {} - } - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "gpu_ci_test_results" - test_results { - predicate { - test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" - } - } - } - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "blink_web_tests_ci_test_results" - test_results { - predicate { - test_id_regexp: "ninja://[^/]*blink_web_tests/.+" - } - } - } - history_options { - use_invocation_timestamp: true - } - } - } - builders { name: "Win Builder" swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:Win Builder" @@ -48394,6 +48318,96 @@ } } builders { + name: "android-arm64-all-targets-dbg" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-18.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/try/android-arm64-all-targets-dbg/properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "tryserver.chromium.android",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium_trybot"' + '}' + execution_timeout_secs: 14400 + expiration_secs: 7200 + grace_period { + seconds: 120 + } + caches { + name: "win_toolchain" + path: "win_toolchain" + } + build_numbers: YES + service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage { + value: 5 + } + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "try_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_try_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_try_test_results" + test_results { + predicate { + test_id_regexp: "ninja://[^/]*blink_web_tests/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { name: "android-asan" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg index abe35f7..cd5e079 100644 --- a/infra/config/generated/luci/luci-milo.cfg +++ b/infra/config/generated/luci/luci-milo.cfg
@@ -1163,6 +1163,11 @@ short_name: "64" } builders { + name: "buildbucket/luci.chromium.ci/Android arm64 Builder All Targets (dbg)" + category: "chromium.android|builder|arm" + short_name: "64" + } + builders { name: "buildbucket/luci.chromium.ci/Android x86 Builder (dbg)" category: "chromium.android|builder|x86" short_name: "32" @@ -3231,6 +3236,11 @@ short_name: "64" } builders { + name: "buildbucket/luci.chromium.ci/Android arm64 Builder All Targets (dbg)" + category: "builder|arm" + short_name: "64" + } + builders { name: "buildbucket/luci.chromium.ci/Android ASAN (dbg)" category: "builder|arm" short_name: "san" @@ -7243,16 +7253,6 @@ category: "win" short_name: "re x" } - builders { - name: "buildbucket/luci.chromium.ci/Win ASan Release Media (reclient shadow)" - category: "win asan" - short_name: "med" - } - builders { - name: "buildbucket/luci.chromium.ci/Win ASan Release (reclient shadow)" - category: "win asan" - short_name: "rel" - } header { oncalls { name: "Chromium" @@ -14574,6 +14574,9 @@ name: "buildbucket/luci.chromium.try/android-angle-try" } builders { + name: "buildbucket/luci.chromium.try/android-arm64-all-targets-dbg" + } + builders { name: "buildbucket/luci.chromium.try/android-asan" } builders { @@ -15700,6 +15703,9 @@ name: "buildbucket/luci.chromium.try/android-12-x64-rel-compilator" } builders { + name: "buildbucket/luci.chromium.try/android-arm64-all-targets-dbg" + } + builders { name: "buildbucket/luci.chromium.try/android-asan" } builders {
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg index 0b542e2..b2a43e2c 100644 --- a/infra/config/generated/luci/luci-scheduler.cfg +++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -316,6 +316,16 @@ } } job { + id: "Android arm64 Builder All Targets (dbg)" + realm: "ci" + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "ci" + builder: "Android arm64 Builder All Targets (dbg)" + } +} +job { id: "Android x64 Builder (dbg)" realm: "ci" acl_sets: "ci" @@ -3445,16 +3455,6 @@ } } job { - id: "Win ASan Release (reclient shadow)" - realm: "ci" - acl_sets: "ci" - buildbucket { - server: "cr-buildbucket.appspot.com" - bucket: "ci" - builder: "Win ASan Release (reclient shadow)" - } -} -job { id: "Win ASan Release Media" realm: "ci" acl_sets: "ci" @@ -3469,16 +3469,6 @@ } } job { - id: "Win ASan Release Media (reclient shadow)" - realm: "ci" - acl_sets: "ci" - buildbucket { - server: "cr-buildbucket.appspot.com" - bucket: "ci" - builder: "Win ASan Release Media (reclient shadow)" - } -} -job { id: "Win Builder" realm: "ci" acl_sets: "ci" @@ -7101,6 +7091,7 @@ triggers: "Android Release (Nexus 5X)" triggers: "Android arm Builder (dbg)" triggers: "Android arm64 Builder (dbg)" + triggers: "Android arm64 Builder All Targets (dbg)" triggers: "Android x64 Builder (dbg)" triggers: "Android x86 Builder (dbg)" triggers: "CFI Linux CF" @@ -7251,9 +7242,7 @@ triggers: "WebKit Linux MSAN" triggers: "Win 10 Fast Ring" triggers: "Win ASan Release" - triggers: "Win ASan Release (reclient shadow)" triggers: "Win ASan Release Media" - triggers: "Win ASan Release Media (reclient shadow)" triggers: "Win Builder" triggers: "Win Builder (dbg)" triggers: "Win x64 Builder"
diff --git a/infra/config/generated/sheriff-rotations/android.txt b/infra/config/generated/sheriff-rotations/android.txt index 402bf399..927aa67 100644 --- a/infra/config/generated/sheriff-rotations/android.txt +++ b/infra/config/generated/sheriff-rotations/android.txt
@@ -5,6 +5,7 @@ ci/Android WebView P (dbg) ci/Android arm Builder (dbg) ci/Android arm64 Builder (dbg) +ci/Android arm64 Builder All Targets (dbg) ci/Android x64 Builder (dbg) ci/Android x86 Builder (dbg) ci/Cast Android (dbg)
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star index 8db6d98..a127bf3 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -262,6 +262,50 @@ tree_closing = True, ) +# We want to confirm that we can compile everything. +# Android however has some non standard buildchains +# which cause gn analyze to not filter out our compile targets +# when running a try bot. +# This means that our trybots would result in compile times of +# 5+ hours. So instead we have this bot which will compile all on CI. +# It should match "Android arm64 Builder (dbg)" +# History: crbug.com/1246468 +ci.builder( + name = "Android arm64 Builder All Targets (dbg)", + branch_selector = branches.STANDARD_MILESTONE, + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "android", + "enable_reclient", + ], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "download_vr_test_apks", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config( + config = "main_builder_mb", + ), + build_gs_bucket = "chromium-android-archive", + ), + console_view_entry = consoles.console_view_entry( + category = "builder|arm", + short_name = "64", + ), + cq_mirrors_console_view = "mirrors", + execution_timeout = 7 * time.hour, + # We will make this tree closing once we have confirmed that this builder works correctly + # crbug.com/1246468 + tree_closing = False, +) + ci.builder( name = "Android x64 Builder (dbg)", branch_selector = branches.STANDARD_MILESTONE,
diff --git a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star index c044e73..ef7f2d52 100644 --- a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star +++ b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
@@ -554,6 +554,9 @@ ], }, }, + goma_backend = None, + reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, + reclient_instance = rbe_instance.DEFAULT, ) ci.builder( @@ -673,6 +676,9 @@ cq_mirrors_console_view = "mirrors", main_console_view = "main", os = os.LINUX_BIONIC_REMOVE, + goma_backend = None, + reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, + reclient_instance = rbe_instance.DEFAULT, ) # For Chromebox for meetings(CfM)
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star index 8b09982..259a96d 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -364,6 +364,9 @@ category = "default", ), os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + goma_backend = None, + reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, + reclient_instance = rbe_instance.DEFAULT, ) ci.builder( @@ -483,6 +486,9 @@ category = "linux", ), os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + goma_backend = None, + reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, + reclient_instance = rbe_instance.DEFAULT, ) ci.thin_tester( @@ -499,6 +505,9 @@ category = "linux", ), os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + goma_backend = None, + reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, + reclient_instance = rbe_instance.DEFAULT, ) ci.thin_tester( @@ -839,32 +848,6 @@ # End - Reclient migration, phase 2, block 1 shadow builders ci.builder( - name = "Win ASan Release (reclient shadow)", - builderless = True, - console_view_entry = consoles.console_view_entry( - category = "win asan", - short_name = "rel", - ), - os = os.WINDOWS_DEFAULT, - goma_backend = None, - reclient_jobs = 80, - reclient_instance = rbe_instance.DEFAULT, -) - -ci.builder( - name = "Win ASan Release Media (reclient shadow)", - builderless = True, - console_view_entry = consoles.console_view_entry( - category = "win asan", - short_name = "med", - ), - os = os.WINDOWS_DEFAULT, - goma_backend = None, - reclient_jobs = 80, - reclient_instance = rbe_instance.DEFAULT, -) - -ci.builder( name = "Win x64 Builder (reclient)", builderless = True, console_view_entry = consoles.console_view_entry( @@ -1177,6 +1160,9 @@ os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, use_clang_coverage = True, coverage_test_types = ["overall", "unit"], + goma_backend = None, + reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, + reclient_instance = rbe_instance.DEFAULT, ) fyi_coverage_builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star b/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star index ea43aa2..3dd37648 100644 --- a/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
@@ -280,6 +280,9 @@ category = "Lacros|Builder", short_name = "rel", ), + goma_backend = None, + reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, + reclient_instance = rbe_instance.DEFAULT, ) ci.gpu.linux_builder(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star index 96007e4..730cce7 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -457,6 +457,14 @@ ) try_.builder( + name = "android-arm64-all-targets-dbg", + goma_jobs = goma.jobs.J300, + mirrors = [ + "ci/Android arm64 Builder All Targets (dbg)", + ], +) + +try_.builder( name = "android_blink_rel", )
diff --git a/ios/chrome/app/application_delegate/BUILD.gn b/ios/chrome/app/application_delegate/BUILD.gn index 33b5fed..932a153 100644 --- a/ios/chrome/app/application_delegate/BUILD.gn +++ b/ios/chrome/app/application_delegate/BUILD.gn
@@ -149,6 +149,7 @@ "app_state.h", "app_state_agent.h", "app_state_observer.h", + "startup_information.h", ] public_deps = [ "//ios/chrome/browser/ui/main:scene_state_observer", @@ -183,7 +184,6 @@ "browser_launcher.h", "metrics_mediator.h", "metrics_mediator.mm", - "startup_information.h", "tab_switching.h", "url_opener.h", "url_opener.mm",
diff --git a/ios/chrome/browser/policy/new_tab_page_location_policy_handler.cc b/ios/chrome/browser/policy/new_tab_page_location_policy_handler.cc index ac76868e..fad72de 100644 --- a/ios/chrome/browser/policy/new_tab_page_location_policy_handler.cc +++ b/ios/chrome/browser/policy/new_tab_page_location_policy_handler.cc
@@ -4,6 +4,7 @@ #include "ios/chrome/browser/policy/new_tab_page_location_policy_handler.h" +#include "base/strings/strcat.h" #include "base/values.h" #include "components/policy/core/browser/policy_error_map.h" #include "components/policy/core/common/policy_map.h" @@ -24,6 +25,32 @@ NewTabPageLocationPolicyHandler::~NewTabPageLocationPolicyHandler() {} +std::string NewTabPageLocationPolicyHandler::FormatNewTabPageLocationURL( + const std::string ntp_location) { + url::Component scheme; + std::string new_ntp_location = ntp_location; + if (!ntp_location.empty() && + !url::ExtractScheme(ntp_location.data(), + static_cast<int>(ntp_location.length()), &scheme)) { + new_ntp_location = base::StrCat( + {url::kHttpsScheme, url::kStandardSchemeSeparator, ntp_location}); + } + return new_ntp_location; +} + +bool NewTabPageLocationPolicyHandler::ValidateNewTabPageLocationURL( + const base::Value* value) { + if (value) { + std::string ntp_location = value->GetString(); + if (ntp_location.empty()) + return false; + ntp_location = NewTabPageLocationPolicyHandler::FormatNewTabPageLocationURL( + ntp_location); + return GURL(ntp_location).is_valid(); + } + return false; +} + bool NewTabPageLocationPolicyHandler::CheckPolicySettings( const policy::PolicyMap& policies, policy::PolicyErrorMap* errors) { @@ -32,11 +59,11 @@ // |GetValueUnsafe| is used to differentiate between the policy value being // unset vs being set with an incorrect type. const base::Value* value = policies.GetValueUnsafe(policy_name()); - if (value && !GURL(value->GetString()).is_valid()) { - errors->AddError(policy_name(), IDS_POLICY_VALUE_FORMAT_ERROR); - return false; + if (NewTabPageLocationPolicyHandler::ValidateNewTabPageLocationURL(value)) { + return true; } - return true; + errors->AddError(policy_name(), IDS_POLICY_VALUE_FORMAT_ERROR); + return false; } void NewTabPageLocationPolicyHandler::ApplyPolicySettings( @@ -45,7 +72,11 @@ const base::Value* value = policies.GetValue(policy_name(), base::Value::Type::STRING); if (value) { - prefs->SetValue(prefs::kNewTabPageLocationOverride, value->Clone()); + std::string ntp_location = + NewTabPageLocationPolicyHandler::FormatNewTabPageLocationURL( + value->GetString()); + prefs->SetValue(prefs::kNewTabPageLocationOverride, + base::Value(ntp_location)); } }
diff --git a/ios/chrome/browser/policy/new_tab_page_location_policy_handler.h b/ios/chrome/browser/policy/new_tab_page_location_policy_handler.h index 846f7d5..98c6634 100644 --- a/ios/chrome/browser/policy/new_tab_page_location_policy_handler.h +++ b/ios/chrome/browser/policy/new_tab_page_location_policy_handler.h
@@ -24,6 +24,14 @@ policy::PolicyErrorMap* errors) override; void ApplyPolicySettings(const PolicyMap& policies, PrefValueMap* prefs) override; + + private: + // Format the New Tab Page Location URL string to be the correct format of a + // URL. + std::string FormatNewTabPageLocationURL(const std::string ntp_location); + + // Verifies that the value is a valid URL. + bool ValidateNewTabPageLocationURL(const base::Value* value); }; } // namespace policy
diff --git a/ios/chrome/browser/policy/new_tab_page_location_policy_handler_unittest.cc b/ios/chrome/browser/policy/new_tab_page_location_policy_handler_unittest.cc index 5eb2e676..c902cfe 100644 --- a/ios/chrome/browser/policy/new_tab_page_location_policy_handler_unittest.cc +++ b/ios/chrome/browser/policy/new_tab_page_location_policy_handler_unittest.cc
@@ -34,6 +34,26 @@ EXPECT_TRUE(prefs.GetString(prefs::kNewTabPageLocationOverride, &value)); } +// Tests that calling `ApplyPolicySettings` set the preference to the correct +// value when the policy overrides "NewTabPageLocation" even if the URL is +// missing the scheme. +TEST_F(NewTabPageLocationPolicyHandlerTest, ApplyPolicySettings_NoScheme) { + std::string value = "m.google.com"; + + PolicyMap::Entry entry; + entry.set_value(base::Value(value)); + + PolicyMap policies; + policies.Set(key::kNewTabPageLocation, std::move(entry)); + + PrefValueMap prefs; + NewTabPageLocationPolicyHandler handler = NewTabPageLocationPolicyHandler(); + handler.ApplyPolicySettings(policies, &prefs); + + std::string new_value = "https://m.google.com"; + EXPECT_TRUE(prefs.GetString(prefs::kNewTabPageLocationOverride, &new_value)); +} + // Tests that calling `ApplyPolicySettings` does not set the preference when the // policy does not override "NewTabPageLocation". TEST_F(NewTabPageLocationPolicyHandlerTest, ApplyPolicySettings_NoOverride) { @@ -62,11 +82,28 @@ EXPECT_FALSE(errors.HasError(key::kNewTabPageLocation)); } -// Tests that `CheckPolicySettings` reports an error if the policy can't -// override "NewTabPageLocation" because it is not a valid URL string. -TEST_F(NewTabPageLocationPolicyHandlerTest, - CheckPolicySettings_InvalidURLFormat) { - std::string value = "blabla"; +// Tests that `CheckPolicySettings` does not report an error if the policy +// overrides "NewTabPageLocation" with a valid value even though it is missing +// the scheme. +TEST_F(NewTabPageLocationPolicyHandlerTest, CheckPolicySettings_NoSchemeURL) { + std::string value = "wayfair.com"; + + PolicyMap::Entry entry; + entry.set_value(base::Value(value)); + + PolicyMap policies; + policies.Set(key::kNewTabPageLocation, std::move(entry)); + + PolicyErrorMap errors; + NewTabPageLocationPolicyHandler handler = NewTabPageLocationPolicyHandler(); + ASSERT_TRUE(handler.CheckPolicySettings(policies, &errors)); + EXPECT_FALSE(errors.HasError(key::kNewTabPageLocation)); +} + +// Tests that `CheckPolicySettings` report an error if the policy overrides +// "NewTabPageLocation" with an empty value. +TEST_F(NewTabPageLocationPolicyHandlerTest, CheckPolicySettings_EmptyValue) { + std::string value = ""; PolicyMap::Entry entry; entry.set_value(base::Value(value));
diff --git a/ios/chrome/browser/translate/BUILD.gn b/ios/chrome/browser/translate/BUILD.gn index 94fdafb..0a3501d 100644 --- a/ios/chrome/browser/translate/BUILD.gn +++ b/ios/chrome/browser/translate/BUILD.gn
@@ -88,7 +88,7 @@ "//ios/chrome/browser", "//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/web:web_internal", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/web/public", "//ios/web/public/test:test", "//ios/web/public/test:util",
diff --git a/ios/chrome/browser/ui/authentication/signin/forced_signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/forced_signin/BUILD.gn index 250d7e0..bda72a1 100644 --- a/ios/chrome/browser/ui/authentication/signin/forced_signin/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/signin/forced_signin/BUILD.gn
@@ -49,7 +49,7 @@ "//ios/chrome/browser/ui/first_run:constants", "//ios/chrome/browser/ui/first_run:eg_test_support+eg2", "//ios/chrome/browser/ui/settings/google_services:constants", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/test/earl_grey:eg_test_support+eg2", "//ios/public/provider/chrome/browser/signin:constants", "//ios/public/provider/chrome/browser/signin:fake_chrome_identity",
diff --git a/ios/chrome/browser/ui/authentication/signin_sync/BUILD.gn b/ios/chrome/browser/ui/authentication/signin_sync/BUILD.gn index 3797e41..efbb722 100644 --- a/ios/chrome/browser/ui/authentication/signin_sync/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/signin_sync/BUILD.gn
@@ -65,7 +65,7 @@ "//ios/chrome/browser/ui/first_run:field_trial", "//ios/chrome/browser/ui/settings/elements:constants", "//ios/chrome/browser/ui/settings/elements:enterprise_info_popover_view_controller", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/elements:popover_label_view_controller", "//ios/chrome/common/ui/promo_style",
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn b/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn index 33a9d9a..35e10c4 100644 --- a/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn
@@ -48,7 +48,7 @@ "//ios/chrome/browser/ui/authentication/views", "//ios/chrome/browser/ui/colors", "//ios/chrome/browser/ui/util", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/util", "//ui/base", @@ -82,7 +82,7 @@ "//ios/chrome/browser/signin", "//ios/chrome/browser/signin:test_support", "//ios/chrome/browser/unified_consent", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/test:test_support", "//ios/public/provider/chrome/browser/signin:fake_chrome_identity", "//ios/public/provider/chrome/browser/signin:test_support",
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn index 0a1cb04..ec3328ab 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn +++ b/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn
@@ -60,7 +60,8 @@ "//ios/chrome/browser/ui/content_suggestions/identifier", "//ios/chrome/browser/ui/material_components", "//ios/chrome/browser/ui/util", - "//ios/chrome/common", + "//ios/chrome/common:string_util", + "//ios/chrome/common:timing", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/favicon", "//ios/chrome/common/ui/table_view:cells_constants",
diff --git a/ios/chrome/browser/ui/elements/BUILD.gn b/ios/chrome/browser/ui/elements/BUILD.gn index 0e98998..3d3a2ff 100644 --- a/ios/chrome/browser/ui/elements/BUILD.gn +++ b/ios/chrome/browser/ui/elements/BUILD.gn
@@ -32,7 +32,7 @@ "//ios/chrome/browser/ui/colors", "//ios/chrome/browser/ui/material_components", "//ios/chrome/browser/ui/util", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/util", "//ios/chrome/common/ui/util:dynamic_type_util",
diff --git a/ios/chrome/browser/ui/first_run/BUILD.gn b/ios/chrome/browser/ui/first_run/BUILD.gn index 148ba62e..7c806fe 100644 --- a/ios/chrome/browser/ui/first_run/BUILD.gn +++ b/ios/chrome/browser/ui/first_run/BUILD.gn
@@ -84,7 +84,7 @@ "//ios/chrome/browser/ui/util", "//ios/chrome/browser/ui/util:terms_util", "//ios/chrome/browser/web_state_list", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/confirmation_alert", "//ios/chrome/common/ui/promo_style", @@ -238,7 +238,7 @@ "//ios/chrome/browser/ui/authentication/signin:constants", "//ios/chrome/browser/ui/authentication/views:views_constants", "//ios/chrome/browser/ui/settings/google_services:constants", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/promo_style:constants", "//ios/chrome/test/earl_grey:eg_test_support+eg2", "//ios/chrome/test/earl_grey:switches",
diff --git a/ios/chrome/browser/ui/first_run/legacy_signin/BUILD.gn b/ios/chrome/browser/ui/first_run/legacy_signin/BUILD.gn index 86ae6c532..4711436 100644 --- a/ios/chrome/browser/ui/first_run/legacy_signin/BUILD.gn +++ b/ios/chrome/browser/ui/first_run/legacy_signin/BUILD.gn
@@ -55,7 +55,7 @@ "//ios/chrome/browser/ui/first_run/resources:legacy_signin_screen_banner", "//ios/chrome/browser/ui/settings/elements:constants", "//ios/chrome/browser/ui/settings/elements:enterprise_info_popover_view_controller", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/elements:popover_label_view_controller", "//ios/chrome/common/ui/promo_style",
diff --git a/ios/chrome/browser/ui/first_run/signin/BUILD.gn b/ios/chrome/browser/ui/first_run/signin/BUILD.gn index a0d0e6ba6..5c5675e 100644 --- a/ios/chrome/browser/ui/first_run/signin/BUILD.gn +++ b/ios/chrome/browser/ui/first_run/signin/BUILD.gn
@@ -50,7 +50,7 @@ "//ios/chrome/browser/ui/first_run:constants", "//ios/chrome/browser/ui/first_run/resources:signin_banner", "//ios/chrome/browser/ui/settings/elements:enterprise_info_popover_view_controller", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/elements:popover_label_view_controller", "//ios/chrome/common/ui/promo_style",
diff --git a/ios/chrome/browser/ui/first_run/sync/BUILD.gn b/ios/chrome/browser/ui/first_run/sync/BUILD.gn index 4372133e..23a4a280 100644 --- a/ios/chrome/browser/ui/first_run/sync/BUILD.gn +++ b/ios/chrome/browser/ui/first_run/sync/BUILD.gn
@@ -54,7 +54,7 @@ "//ios/chrome/browser/ui/first_run:constants", "//ios/chrome/browser/ui/first_run/resources:sync_screen_banner", "//ios/chrome/browser/ui/settings/elements:enterprise_info_popover_view_controller", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/elements:popover_label_view_controller", "//ios/chrome/common/ui/promo_style",
diff --git a/ios/chrome/browser/ui/first_run/uma/BUILD.gn b/ios/chrome/browser/ui/first_run/uma/BUILD.gn index a2a7bdc..c6937a6 100644 --- a/ios/chrome/browser/ui/first_run/uma/BUILD.gn +++ b/ios/chrome/browser/ui/first_run/uma/BUILD.gn
@@ -33,7 +33,7 @@ "//ios/chrome/browser/ui/list_model", "//ios/chrome/browser/ui/table_view", "//ios/chrome/browser/ui/table_view:utils", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/table_view:cells_constants", "//ui/base",
diff --git a/ios/chrome/browser/ui/first_run/welcome/BUILD.gn b/ios/chrome/browser/ui/first_run/welcome/BUILD.gn index e0acf67..27ef1bc 100644 --- a/ios/chrome/browser/ui/first_run/welcome/BUILD.gn +++ b/ios/chrome/browser/ui/first_run/welcome/BUILD.gn
@@ -58,7 +58,7 @@ "//ios/chrome/browser/ui/first_run/uma", "//ios/chrome/browser/ui/settings/resources:enterprise_icon", "//ios/chrome/browser/ui/util", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/promo_style", "//ios/chrome/common/ui/util",
diff --git a/ios/chrome/browser/ui/history/BUILD.gn b/ios/chrome/browser/ui/history/BUILD.gn index bd2a5d03..40e8953 100644 --- a/ios/chrome/browser/ui/history/BUILD.gn +++ b/ios/chrome/browser/ui/history/BUILD.gn
@@ -184,7 +184,7 @@ "//ios/chrome/browser/ui/popup_menu:constants", "//ios/chrome/browser/ui/settings/cells:clear_browsing_data_constants", "//ios/chrome/browser/ui/table_view:constants", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/test/earl_grey:eg_test_support+eg2", "//ios/testing/earl_grey:eg_test_support+eg2", "//ios/third_party/earl_grey2:test_lib",
diff --git a/ios/chrome/browser/ui/infobars/modals/permissions/BUILD.gn b/ios/chrome/browser/ui/infobars/modals/permissions/BUILD.gn index 3421781..ff43db4 100644 --- a/ios/chrome/browser/ui/infobars/modals/permissions/BUILD.gn +++ b/ios/chrome/browser/ui/infobars/modals/permissions/BUILD.gn
@@ -21,7 +21,7 @@ "//ios/chrome/browser/ui/settings/cells:cells", "//ios/chrome/browser/ui/table_view", "//ios/chrome/browser/ui/table_view:styler", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/table_view:cells_constants", "//ios/web/public/permissions", "//ui/base",
diff --git a/ios/chrome/browser/ui/ntp/BUILD.gn b/ios/chrome/browser/ui/ntp/BUILD.gn index c0ef6ef4..7b621b2 100644 --- a/ios/chrome/browser/ui/ntp/BUILD.gn +++ b/ios/chrome/browser/ui/ntp/BUILD.gn
@@ -195,7 +195,7 @@ "//ios/chrome/browser/ui/util", "//ios/chrome/browser/url_loading", "//ios/chrome/browser/web_state_list", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/app_group", "//ios/chrome/common/ntp_tile", "//ios/chrome/common/ui/colors", @@ -226,6 +226,7 @@ deps = [ "//base", "//components/feed/core/v2/public:common", + "//ios/chrome/browser/discover_feed:constants", "//ios/chrome/browser/ui/content_suggestions:metrics", ] }
diff --git a/ios/chrome/browser/ui/ntp/feed_metrics_recorder.h b/ios/chrome/browser/ui/ntp/feed_metrics_recorder.h index 519f573b..6893d4a 100644 --- a/ios/chrome/browser/ui/ntp/feed_metrics_recorder.h +++ b/ios/chrome/browser/ui/ntp/feed_metrics_recorder.h
@@ -7,6 +7,8 @@ #import <UIKit/UIKit.h> +#include "ios/chrome/browser/discover_feed/feed_constants.h" + // DO NOT CHANGE. Values are from enums.xml representing what could be broken in // the NTP view hierarchy. These values are persisted to logs. Entries should // not be renumbered and numeric values should never be reused. @@ -173,6 +175,9 @@ // Records that the feed is about to be refreshed. - (void)recordFeedWillRefresh; +// The currently selected feed type in the NTP. +@property(nonatomic, assign) FeedType selectedFeedType; + // Whether or not the feed is currently being shown on the Start Surface. @property(nonatomic, assign) BOOL isShownOnStartSurface;
diff --git a/ios/chrome/browser/ui/ntp/feed_metrics_recorder.mm b/ios/chrome/browser/ui/ntp/feed_metrics_recorder.mm index 2f3bf48..11ef7fb2 100644 --- a/ios/chrome/browser/ui/ntp/feed_metrics_recorder.mm +++ b/ios/chrome/browser/ui/ntp/feed_metrics_recorder.mm
@@ -143,6 +143,10 @@ // Histogram name for the feed engagement types. const char kDiscoverFeedEngagementTypeHistogram[] = "ContentSuggestions.Feed.EngagementType"; +const char kFollowingFeedEngagementTypeHistogram[] = + "ContentSuggestions.Feed.WebFeed.EngagementType"; +const char kAllFeedsEngagementTypeHistogram[] = + "ContentSuggestions.Feed.AllFeeds.EngagementType"; // Histogram name for a feed card shown at index. const char kDiscoverFeedCardShownAtIndex[] = @@ -219,13 +223,16 @@ // Tracking property to avoid duplicate recordings of // FeedEngagementType::kFeedEngagedSimple. -@property(nonatomic, assign) BOOL engagedSimpleReported; +@property(nonatomic, assign) BOOL engagedSimpleReportedDiscover; +@property(nonatomic, assign) BOOL engagedSimpleReportedFollowing; // Tracking property to avoid duplicate recordings of // FeedEngagementType::kFeedEngaged. -@property(nonatomic, assign) BOOL engagedReported; +@property(nonatomic, assign) BOOL engagedReportedDiscover; +@property(nonatomic, assign) BOOL engagedReportedFollowing; // Tracking property to avoid duplicate recordings of // FeedEngagementType::kFeedScrolled. -@property(nonatomic, assign) BOOL scrolledReported; +@property(nonatomic, assign) BOOL scrolledReportedDiscover; +@property(nonatomic, assign) BOOL scrolledReportedFollowing; // The time when the first metric is being recorded for this session. @property(nonatomic, assign) base::Time sessionStartTime; @@ -238,9 +245,26 @@ - (void)recordFeedScrolled:(int)scrollDistance { [self recordEngagement:scrollDistance interacted:NO]; - if (!self.scrolledReported) { - [self recordEngagementTypeHistogram:FeedEngagementType::kFeedScrolled]; - self.scrolledReported = YES; + // If neither feed has been scrolled into, log "AllFeeds" scrolled. + if (!self.scrolledReportedDiscover && !self.scrolledReportedFollowing) { + UMA_HISTOGRAM_ENUMERATION(kAllFeedsEngagementTypeHistogram, + FeedEngagementType::kFeedScrolled); + } + + // Log scrolled into Discover feed. + if (self.selectedFeedType == FeedTypeDiscover && + !self.scrolledReportedDiscover) { + UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedEngagementTypeHistogram, + FeedEngagementType::kFeedScrolled); + self.scrolledReportedDiscover = YES; + } + + // Log scrolled into Following feed. + if (self.selectedFeedType == FeedTypeFollowing && + !self.scrolledReportedFollowing) { + UMA_HISTOGRAM_ENUMERATION(kFollowingFeedEngagementTypeHistogram, + FeedEngagementType::kFeedScrolled); + self.scrolledReportedFollowing = YES; } } @@ -556,42 +580,111 @@ // Report the user as engaged-simple if they have scrolled any amount or // interacted with the card, and we have not already reported it for this // chrome run. - if (!self.engagedSimpleReported && (scrollDistance > 0 || interacted)) { - [self recordEngagementTypeHistogram:FeedEngagementType::kFeedEngagedSimple]; - self.engagedSimpleReported = YES; + if (scrollDistance > 0 || interacted) { + [self recordEngagedSimple]; } // Report the user as engaged if they have scrolled more than the threshold or // interacted with the card, and we have not already reported it this chrome // run. - if (!self.engagedReported && - (scrollDistance > kMinScrollThreshold || interacted)) { - [self recordEngagementTypeHistogram:FeedEngagementType::kFeedEngaged]; - base::RecordAction(base::UserMetricsAction(kDiscoverFeedUserActionEngaged)); - self.engagedReported = YES; + if (scrollDistance > kMinScrollThreshold || interacted) { + [self recordEngaged]; } } // Records any direct interaction with the Feed, this doesn't include scrolling. - (void)recordInteraction { [self recordEngagement:0 interacted:YES]; - [self recordEngagementTypeHistogram:FeedEngagementType::kFeedInteracted]; + + // Log interaction for all feeds + UMA_HISTOGRAM_ENUMERATION(kAllFeedsEngagementTypeHistogram, + FeedEngagementType::kFeedInteracted); + + // Log interaction for Discover feed. + if (self.selectedFeedType == FeedTypeDiscover) { + UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedEngagementTypeHistogram, + FeedEngagementType::kFeedInteracted); + } + + // Log interaction for Following feed. + if (self.selectedFeedType == FeedTypeFollowing) { + UMA_HISTOGRAM_ENUMERATION(kFollowingFeedEngagementTypeHistogram, + FeedEngagementType::kFeedInteracted); + } } -// Records Engagement histograms of |engagementType|. -- (void)recordEngagementTypeHistogram:(FeedEngagementType)engagementType { - UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedEngagementTypeHistogram, - engagementType); +// Records simple engagement for the current |selectedFeedType|. +- (void)recordEngagedSimple { + // If neither feed has been engaged with, log "AllFeeds" simple engagement. + if (!self.engagedSimpleReportedDiscover && + !self.engagedSimpleReportedFollowing) { + UMA_HISTOGRAM_ENUMERATION(kAllFeedsEngagementTypeHistogram, + FeedEngagementType::kFeedEngagedSimple); + } + + // Log simple engagment for Discover feed. + if (self.selectedFeedType == FeedTypeDiscover && + !self.engagedSimpleReportedDiscover) { + UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedEngagementTypeHistogram, + FeedEngagementType::kFeedEngagedSimple); + self.engagedSimpleReportedDiscover = YES; + } + + // Log simple engagement for Following feed. + if (self.selectedFeedType == FeedTypeFollowing && + !self.engagedSimpleReportedFollowing) { + UMA_HISTOGRAM_ENUMERATION(kFollowingFeedEngagementTypeHistogram, + FeedEngagementType::kFeedEngagedSimple); + self.engagedSimpleReportedFollowing = YES; + } +} + +// Records engagement for the current |selectedFeedType|. +- (void)recordEngaged { + // If neither feed has been engaged with, log "AllFeeds" engagement. + if (!self.engagedReportedDiscover && !self.engagedReportedFollowing) { + UMA_HISTOGRAM_ENUMERATION(kAllFeedsEngagementTypeHistogram, + FeedEngagementType::kFeedEngaged); + } + + // Log engagment for Discover feed. + if (self.selectedFeedType == FeedTypeDiscover && + !self.engagedReportedDiscover) { + UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedEngagementTypeHistogram, + FeedEngagementType::kFeedEngaged); + self.engagedReportedDiscover = YES; + } + + // Log engagement for Following feed. + if (self.selectedFeedType == FeedTypeFollowing && + !self.engagedReportedFollowing) { + UMA_HISTOGRAM_ENUMERATION(kFollowingFeedEngagementTypeHistogram, + FeedEngagementType::kFeedEngaged); + self.engagedReportedFollowing = YES; + } + + // TODO(crbug.com/1322640): Separate user action for Following feed + base::RecordAction(base::UserMetricsAction(kDiscoverFeedUserActionEngaged)); } // Resets the session tracking values, this occurs if there's been // kMinutesBetweenSessions minutes between sessions. - (void)finalizeSession { - if (!self.engagedSimpleReported) + // If simple engagement hasn't been logged, then there's no session to + // finalize. + if (!self.engagedSimpleReportedDiscover && + !self.engagedSimpleReportedFollowing) { return; - self.engagedReported = NO; - self.engagedSimpleReported = NO; - self.scrolledReported = NO; + } + + self.engagedReportedDiscover = NO; + self.engagedReportedFollowing = NO; + + self.engagedSimpleReportedDiscover = NO; + self.engagedSimpleReportedFollowing = NO; + + self.scrolledReportedDiscover = NO; + self.scrolledReportedFollowing = NO; } // Records the |durationInSeconds| it took to Discover feed to perform any
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 9a91168..14d45f1 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
@@ -273,6 +273,7 @@ self, self.discoverFeedService); self.feedMetricsRecorder = self.discoverFeedService->GetFeedMetricsRecorder(); + self.feedMetricsRecorder.selectedFeedType = self.selectedFeed; if (IsContentSuggestionsHeaderMigrationEnabled()) { self.headerController = @@ -1159,6 +1160,13 @@ return _feedHeaderViewController; } +#pragma mark - Setters + +- (void)setSelectedFeed:(FeedType)selectedFeed { + _selectedFeed = selectedFeed; + self.feedMetricsRecorder.selectedFeedType = selectedFeed; +} + #pragma mark - DiscoverFeedWrapperViewControllerDelegate - (void)updateTheme {
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm b/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm index cbf5e19..103a38e 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/strings/strcat.h" #import "base/test/ios/wait_util.h" #include "base/test/scoped_command_line.h" #include "components/policy/core/common/policy_test_utils.h" @@ -33,7 +34,6 @@ const char kPageLoadedString[] = "Page loaded!"; const char kPageURL[] = "/test-page.html"; const char kPageTitle[] = "Page title!"; -const char kInvalidNTPLocation[] = "invalid_url"; // Provides responses for redirect and changed window location URLs. std::unique_ptr<net::test_server::HttpResponse> StandardResponse( @@ -264,10 +264,10 @@ } // Tests that the new tab doesn't open the policy's New Tab Page Location when -// the URL is invalid. -- (void)testInvalidNTPLocation { +// the URL is empty. +- (void)testEmptyNTPLocation { // Set the policy's NTP Location value at runtime. - [self setNTPPolicyValue:kInvalidNTPLocation]; + [self setNTPPolicyValue:""]; // Open a new tab page. [ChromeEarlGrey openNewTab];
diff --git a/ios/chrome/browser/ui/omnibox/popup/shared/popup_match_row_view.swift b/ios/chrome/browser/ui/omnibox/popup/shared/popup_match_row_view.swift index 9c7a190..de2902b 100644 --- a/ios/chrome/browser/ui/omnibox/popup/shared/popup_match_row_view.swift +++ b/ios/chrome/browser/ui/omnibox/popup/shared/popup_match_row_view.swift
@@ -108,6 +108,7 @@ image: image, highlightColor: highlightColor ) .accessibilityHidden(true) + .clipShape(RoundedRectangle(cornerRadius: 7, style: .continuous)) } Spacer() }.frame(width: Dimensions.leadingSpacing)
diff --git a/ios/chrome/browser/ui/page_info/BUILD.gn b/ios/chrome/browser/ui/page_info/BUILD.gn index ef0b0b7d..7f622a4 100644 --- a/ios/chrome/browser/ui/page_info/BUILD.gn +++ b/ios/chrome/browser/ui/page_info/BUILD.gn
@@ -38,7 +38,7 @@ "//ios/chrome/browser/ui/table_view", "//ios/chrome/browser/ui/table_view:utils", "//ios/chrome/browser/ui/util", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/table_view:cells_constants", "//ios/chrome/common/ui/util",
diff --git a/ios/chrome/browser/ui/popup_menu/cells/BUILD.gn b/ios/chrome/browser/ui/popup_menu/cells/BUILD.gn index 37d3aa9..9b8adf1a 100644 --- a/ios/chrome/browser/ui/popup_menu/cells/BUILD.gn +++ b/ios/chrome/browser/ui/popup_menu/cells/BUILD.gn
@@ -21,7 +21,8 @@ "//ios/chrome/browser/ui/reading_list:reading_list_ui", "//ios/chrome/browser/ui/table_view:styler", "//ios/chrome/browser/ui/table_view/cells", - "//ios/chrome/common", + "//ios/chrome/common:string_util", + "//ios/chrome/common:timing", "//ios/chrome/common/ui/util", ] frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn b/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn index 4b8939a..02760f43 100644 --- a/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn +++ b/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn
@@ -57,7 +57,7 @@ "//ios/chrome/browser/ui/table_view", "//ios/chrome/browser/ui/table_view:styler", "//ios/chrome/browser/ui/table_view/cells", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/table_view:cells_constants", "//ui/base",
diff --git a/ios/chrome/browser/ui/settings/elements/BUILD.gn b/ios/chrome/browser/ui/settings/elements/BUILD.gn index 35a0919..b18e00d 100644 --- a/ios/chrome/browser/ui/settings/elements/BUILD.gn +++ b/ios/chrome/browser/ui/settings/elements/BUILD.gn
@@ -19,7 +19,7 @@ "//base:base", "//ios/chrome/app/strings", "//ios/chrome/browser:chrome_url_constants", - "//ios/chrome/common:common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/elements:popover_label_view_controller", "//ios/chrome/common/ui/util",
diff --git a/ios/chrome/browser/ui/settings/password/BUILD.gn b/ios/chrome/browser/ui/settings/password/BUILD.gn index de81856..7208b9dd 100644 --- a/ios/chrome/browser/ui/settings/password/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/BUILD.gn
@@ -41,7 +41,7 @@ "//ios/chrome/browser/ui/settings/utils", "//ios/chrome/browser/ui/table_view", "//ios/chrome/browser/ui/table_view:utils", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/favicon:favicon_constants", "//ios/chrome/common/ui/reauthentication",
diff --git a/ios/chrome/browser/ui/settings/password/passwords_in_other_apps/BUILD.gn b/ios/chrome/browser/ui/settings/password/passwords_in_other_apps/BUILD.gn index e45e844..a1ebde02 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_in_other_apps/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/passwords_in_other_apps/BUILD.gn
@@ -42,7 +42,7 @@ "//ios/chrome/browser/ui/settings/resources:settings_passwords_in_other_apps_banner", "//ios/chrome/browser/ui/settings/utils", "//ios/chrome/browser/ui/util", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/elements", "//ios/chrome/common/ui/util",
diff --git a/ios/chrome/browser/ui/settings/privacy/BUILD.gn b/ios/chrome/browser/ui/settings/privacy/BUILD.gn index 597979ed..9eaed2b8 100644 --- a/ios/chrome/browser/ui/settings/privacy/BUILD.gn +++ b/ios/chrome/browser/ui/settings/privacy/BUILD.gn
@@ -60,7 +60,7 @@ "//ios/chrome/browser/ui/table_view:utils", "//ios/chrome/browser/ui/table_view/cells", "//ios/chrome/browser/web_state_list", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/reauthentication", "//ios/chrome/common/ui/table_view:cells_constants",
diff --git a/ios/chrome/browser/ui/settings/safety_check/BUILD.gn b/ios/chrome/browser/ui/settings/safety_check/BUILD.gn index faf260b6..525ebef71 100644 --- a/ios/chrome/browser/ui/settings/safety_check/BUILD.gn +++ b/ios/chrome/browser/ui/settings/safety_check/BUILD.gn
@@ -83,6 +83,7 @@ "//ios/chrome/browser/upgrade", "//ios/chrome/browser/upgrade:public", "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/elements:popover_label_view_controller", "//ios/chrome/common/ui/table_view:cells_constants", @@ -123,7 +124,7 @@ "//ios/chrome/browser/ui/table_view/cells", "//ios/chrome/browser/upgrade", "//ios/chrome/browser/upgrade:public", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/test:test_support", "//ios/web/public/test", "//testing/gtest",
diff --git a/ios/chrome/browser/ui/start_surface/BUILD.gn b/ios/chrome/browser/ui/start_surface/BUILD.gn index ef06f5a6..e5d1d96 100644 --- a/ios/chrome/browser/ui/start_surface/BUILD.gn +++ b/ios/chrome/browser/ui/start_surface/BUILD.gn
@@ -60,16 +60,24 @@ ":start_surface", "//base", "//base/test:test_support", + "//components/favicon/ios", + "//ios/chrome/app:app_internal", + "//ios/chrome/app/application_delegate:app_state_header", + "//ios/chrome/app/application_delegate:application_delegate_internal", + "//ios/chrome/app/application_delegate:test_support", "//ios/chrome/browser", "//ios/chrome/browser:chrome_url_constants", "//ios/chrome/browser/browser_state:test_support", + "//ios/chrome/browser/ntp", "//ios/chrome/browser/ui:feature_flags", "//ios/chrome/browser/ui/main:browser_interface_provider", "//ios/chrome/browser/ui/main:scene", "//ios/chrome/browser/ui/main/test", "//ios/chrome/browser/web_state_list", + "//ios/chrome/test:test_support", "//ios/web/public/test/fakes", "//testing/gtest", + "//third_party/ocmock", ] }
diff --git a/ios/chrome/browser/ui/start_surface/start_surface_egtest.mm b/ios/chrome/browser/ui/start_surface/start_surface_egtest.mm index 05d1af8..64d16e4 100644 --- a/ios/chrome/browser/ui/start_surface/start_surface_egtest.mm +++ b/ios/chrome/browser/ui/start_surface/start_surface_egtest.mm
@@ -46,7 +46,8 @@ // Tests that navigating to a page and restarting upon cold start, an NTP page // is opened with the Return to Recent Tab tile. -- (void)testColdStartOpenStartSurface { +// TODO(crbug.com/1323001): Fix flakiness. +- (void)DISABLED_testColdStartOpenStartSurface { GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); const GURL destinationUrl = self.testServer->GetURL("/pony.html"); [ChromeEarlGrey loadURL:destinationUrl]; @@ -69,7 +70,8 @@ // Tests that navigating to a page and then backgrounding and foregrounding, an // NTP page is opened. Then, switching to the last tab and then back to the NTP // does not show the Return to Recent Tab tile. -- (void)testWarmStartOpenStartSurface { +// TODO(crbug.com/1323001): Fix flakiness. +- (void)DISABLED_testWarmStartOpenStartSurface { GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); const GURL destinationUrl = self.testServer->GetURL("/pony.html"); [ChromeEarlGrey loadURL:destinationUrl]; @@ -105,7 +107,8 @@ // Tests that navigating to a page and restarting upon cold start, an NTP page // is opened with the Return to Recent Tab tile. Then, removing that last tab // also removes the tile while that NTP is still being shown. -- (void)testRemoveRecentTabRemovesReturnToRecenTabTile { +// TODO(crbug.com/1323001): Fix flakiness. +- (void)DISABLED_testRemoveRecentTabRemovesReturnToRecenTabTile { GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); const GURL destinationUrl = self.testServer->GetURL("/pony.html"); [ChromeEarlGrey loadURL:destinationUrl];
diff --git a/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.h b/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.h index aa30b52..4fb54d8 100644 --- a/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.h +++ b/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.h
@@ -11,4 +11,4 @@ @interface StartSurfaceSceneAgent : ObservingSceneAgent @end -#endif // IOS_CHROME_BROWSER_UI_START_SURFACE_START_SURFACE_SCENE_AGENT_H_ \ No newline at end of file +#endif // IOS_CHROME_BROWSER_UI_START_SURFACE_START_SURFACE_SCENE_AGENT_H_
diff --git a/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.mm b/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.mm index e040c155..298c29e 100644 --- a/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.mm +++ b/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.mm
@@ -4,9 +4,12 @@ #import "ios/chrome/browser/ui/start_surface/start_surface_scene_agent.h" #include "base/feature_list.h" +#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" #include "base/metrics/user_metrics_action.h" +#import "ios/chrome/app/application_delegate/app_state.h" +#import "ios/chrome/app/application_delegate/startup_information.h" #include "ios/chrome/browser/chrome_url_constants.h" #import "ios/chrome/browser/chrome_url_util.h" #import "ios/chrome/browser/main/browser.h" @@ -73,13 +76,14 @@ if (level >= SceneActivationLevelForegroundInactive && self.previousActivationLevel < SceneActivationLevelForegroundInactive) { if (IsStartSurfaceSplashStartupEnabled()) { - [self handleShowStartSurfaceIfNecessary]; + [self logBackgroundDurationMetricForActivationLevel:level]; + [self showStartSurfaceIfNecessary]; } } self.previousActivationLevel = level; } -- (void)handleShowStartSurfaceIfNecessary { +- (void)showStartSurfaceIfNecessary { if (!ShouldShowStartSurfaceForSceneState(self.sceneState)) { return; } @@ -194,4 +198,23 @@ } } +- (void)logBackgroundDurationMetricForActivationLevel: + (SceneActivationLevel)level { + NSInteger timeSinceBackgroundInMinutes = + GetTimeSinceMostRecentTabWasOpenForSceneState(self.sceneState) / 60; + BOOL isColdStart = (level > SceneActivationLevelBackground && + self.sceneState.appState.startupInformation.isColdStart); + if (isColdStart) { + base::UmaHistogramCustomTimes("IOS.ColdStartBackgroundTime", + base::Minutes(timeSinceBackgroundInMinutes), + base::Seconds(0), + base::Seconds(12 * 60 /* 12 hours */), 24); + } else { + base::UmaHistogramCustomTimes("IOS.WarmStartBackgroundTime", + base::Minutes(timeSinceBackgroundInMinutes), + base::Seconds(0), + base::Seconds(12 * 60 /* 12 hours */), 24); + } +} + @end
diff --git a/ios/chrome/browser/ui/start_surface/start_surface_scene_agent_unittest.mm b/ios/chrome/browser/ui/start_surface/start_surface_scene_agent_unittest.mm index 3ece60e..007b5b4 100644 --- a/ios/chrome/browser/ui/start_surface/start_surface_scene_agent_unittest.mm +++ b/ios/chrome/browser/ui/start_surface/start_surface_scene_agent_unittest.mm
@@ -4,21 +4,32 @@ #import "ios/chrome/browser/ui/start_surface/start_surface_scene_agent.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #import "base/test/task_environment.h" +#include "components/favicon/ios/web_favicon_driver.h" +#import "ios/chrome/app/application_delegate/app_state.h" +#import "ios/chrome/app/application_delegate/browser_launcher.h" +#include "ios/chrome/app/application_delegate/fake_startup_information.h" +#import "ios/chrome/app/main_application_delegate.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #include "ios/chrome/browser/chrome_url_constants.h" #import "ios/chrome/browser/chrome_url_util.h" #import "ios/chrome/browser/main/browser.h" +#import "ios/chrome/browser/ntp/new_tab_page_tab_helper.h" #import "ios/chrome/browser/ui/main/browser_interface_provider.h" #import "ios/chrome/browser/ui/main/test/fake_scene_state.h" #import "ios/chrome/browser/ui/start_surface/start_surface_features.h" +#import "ios/chrome/browser/ui/start_surface/start_surface_recent_tab_browser_agent.h" +#import "ios/chrome/browser/ui/start_surface/start_surface_util.h" #include "ios/chrome/browser/ui/ui_feature_flags.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #import "ios/chrome/browser/web_state_list/web_state_opener.h" +#import "ios/chrome/test/scoped_key_window.h" #import "ios/web/public/test/fakes/fake_web_state.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -28,15 +39,43 @@ const char kURL[] = "https://chromium.org/"; } +// A fake that allows setting initStage. +@interface FakeAppStateInitStage : AppState +// Init stage that will be returned by the initStage getter when testing. +@property(nonatomic, assign) InitStage initStageForTesting; +@end + +@implementation FakeAppStateInitStage + +- (InitStage)initStage { + return self.initStageForTesting; +} + +@end + class StartSurfaceSceneAgentTest : public PlatformTest { public: StartSurfaceSceneAgentTest() : browser_state_(TestChromeBrowserState::Builder().Build()), + browser_launcher_mock_( + [OCMockObject mockForProtocol:@protocol(BrowserLauncher)]), + startup_information_([[FakeStartupInformation alloc] init]), + main_application_delegate_( + [OCMockObject mockForClass:[MainApplicationDelegate class]]), + app_state_([[FakeAppStateInitStage alloc] + initWithBrowserLauncher:browser_launcher_mock_ + startupInformation:startup_information_ + applicationDelegate:main_application_delegate_]), scene_state_([[FakeSceneState alloc] - initWithAppState:nil + initWithAppState:app_state_ browserState:browser_state_.get()]), agent_([[StartSurfaceSceneAgent alloc] init]) { + scene_state_.scene = static_cast<UIWindowScene*>( + [[[UIApplication sharedApplication] connectedScenes] anyObject]); agent_.sceneState = scene_state_; + Browser* browser = scene_state_.interfaceProvider.mainInterface.browser; + StartSurfaceRecentTabBrowserAgent::CreateForBrowser(browser); + histogram_tester_.reset(new base::HistogramTester()); } void TearDown() override { @@ -48,18 +87,26 @@ protected: base::test::TaskEnvironment task_environment_; std::unique_ptr<TestChromeBrowserState> browser_state_; + id browser_launcher_mock_; + FakeStartupInformation* startup_information_; + id main_application_delegate_; + FakeAppStateInitStage* app_state_; // The scene state that the agent works with. FakeSceneState* scene_state_; + ScopedKeyWindow scoped_window_; // The tested agent StartSurfaceSceneAgent* agent_; + std::unique_ptr<base::HistogramTester> histogram_tester_; // Create WebState at |index| with |url| as the current url. void InsertNewWebState(int index, WebStateOpener opener, GURL url) { auto test_web_state = std::make_unique<web::FakeWebState>(); test_web_state->SetCurrentURL(url); test_web_state->SetNavigationItemCount(1); + test_web_state->SetBrowserState(browser_state_.get()); Browser* browser = scene_state_.interfaceProvider.mainInterface.browser; WebStateList* web_state_list = browser->GetWebStateList(); + NewTabPageTabHelper::CreateForWebState(test_web_state.get()); web_state_list->InsertWebState(index, std::move(test_web_state), WebStateList::INSERT_FORCE_INDEX, opener); } @@ -155,3 +202,57 @@ EXPECT_EQ(web_state_list->GetActiveWebState(), web_state_list->GetWebStateAt(0)); } + +// Tests that IOS.StartSurfaceShown is correctly logged for a valid warm start +// open. +TEST_F(StartSurfaceSceneAgentTest, LogCorrectWarmStartHistogram) { + std::map<std::string, std::string> parameters; + parameters[kReturnToStartSurfaceInactiveDurationInSeconds] = "0"; + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeatureWithParameters(kStartSurface, + parameters); + + app_state_.initStageForTesting = InitStageFinal; + + InsertNewWebState(0, WebStateOpener(), GURL(kURL)); + InsertNewWebState(1, WebStateOpener(), GURL(kChromeUINewTabURL)); + WebStateList* web_state_list = + scene_state_.interfaceProvider.mainInterface.browser->GetWebStateList(); + web_state_list->ActivateWebStateAt(0); + favicon::WebFaviconDriver::CreateForWebState( + web_state_list->GetActiveWebState(), + /*favicon_service=*/nullptr); + SetStartSurfaceSessionObjectForSceneState(scene_state_); + + histogram_tester_->ExpectTotalCount("IOS.WarmStartBackgroundTime", 0); + [agent_ sceneState:scene_state_ + transitionedToActivationLevel:SceneActivationLevelForegroundActive]; + histogram_tester_->ExpectTotalCount("IOS.WarmStartBackgroundTime", 1); +} + +// Tests that IOS.StartSurfaceShown is correctly logged for a valid cold start +// open. +TEST_F(StartSurfaceSceneAgentTest, LogCorrectColdStartHistogram) { + std::map<std::string, std::string> parameters; + parameters[kReturnToStartSurfaceInactiveDurationInSeconds] = "0"; + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeatureWithParameters(kStartSurface, + parameters); + + app_state_.initStageForTesting = InitStageFinal; + [startup_information_ setIsColdStart:YES]; + + InsertNewWebState(0, WebStateOpener(), GURL(kURL)); + InsertNewWebState(1, WebStateOpener(), GURL(kChromeUINewTabURL)); + WebStateList* web_state_list = + scene_state_.interfaceProvider.mainInterface.browser->GetWebStateList(); + web_state_list->ActivateWebStateAt(0); + favicon::WebFaviconDriver::CreateForWebState( + web_state_list->GetActiveWebState(), + /*favicon_service=*/nullptr); + + histogram_tester_->ExpectTotalCount("IOS.ColdStartBackgroundTime", 0); + [agent_ sceneState:scene_state_ + transitionedToActivationLevel:SceneActivationLevelForegroundActive]; + histogram_tester_->ExpectTotalCount("IOS.ColdStartBackgroundTime", 1); +}
diff --git a/ios/chrome/browser/ui/start_surface/start_surface_util.h b/ios/chrome/browser/ui/start_surface/start_surface_util.h index 7752afe5..5fcf054ed 100644 --- a/ios/chrome/browser/ui/start_surface/start_surface_util.h +++ b/ios/chrome/browser/ui/start_surface/start_surface_util.h
@@ -7,6 +7,10 @@ #import "ios/chrome/browser/ui/main/scene_state.h" +// Returns the time since the most recent tab was opened. +NSTimeInterval GetTimeSinceMostRecentTabWasOpenForSceneState( + SceneState* sceneState); + // Checks whether the Start Surface should be shown for the given scene state. bool ShouldShowStartSurfaceForSceneState(SceneState* sceneState);
diff --git a/ios/chrome/browser/ui/start_surface/start_surface_util.mm b/ios/chrome/browser/ui/start_surface/start_surface_util.mm index 1a71ca07..0d34d40 100644 --- a/ios/chrome/browser/ui/start_surface/start_surface_util.mm +++ b/ios/chrome/browser/ui/start_surface/start_surface_util.mm
@@ -31,8 +31,7 @@ NSDate* timestamp = (NSDate*)[sceneState sessionObjectForKey:kStartSurfaceSceneEnterIntoBackgroundTime]; - if (timestamp == nil || [[NSDate date] timeIntervalSinceDate:timestamp] < - GetReturnToStartSurfaceDuration()) { + if (timestamp == nil) { return 0; } return [[NSDate date] timeIntervalSinceDate:timestamp];
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 43ecde8..6a0d872 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn
@@ -157,7 +157,7 @@ "//ios/chrome/browser/ui/thumb_strip:feature_flags", "//ios/chrome/browser/ui/thumb_strip:public", "//ios/chrome/browser/ui/util", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/util", "//ios/web/public", "//ui/base",
diff --git a/ios/chrome/browser/ui/table_view/cells/BUILD.gn b/ios/chrome/browser/ui/table_view/cells/BUILD.gn index fa23896eaa5..652c51b 100644 --- a/ios/chrome/browser/ui/table_view/cells/BUILD.gn +++ b/ios/chrome/browser/ui/table_view/cells/BUILD.gn
@@ -72,7 +72,7 @@ "//ios/chrome/browser/ui/tab_switcher/tab_grid/suggested_actions/resources", "//ios/chrome/browser/ui/table_view:styler", "//ios/chrome/browser/ui/util", - "//ios/chrome/common", + "//ios/chrome/common:string_util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/favicon", "//ios/chrome/common/ui/table_view",
diff --git a/ios/chrome/common/BUILD.gn b/ios/chrome/common/BUILD.gn index aea22d2..5ff1ea4 100644 --- a/ios/chrome/common/BUILD.gn +++ b/ios/chrome/common/BUILD.gn
@@ -10,8 +10,6 @@ sources = [ "channel_info.h", "channel_info.mm", - "string_util.h", - "string_util.mm", "x_callback_url.cc", "x_callback_url.h", ] @@ -25,10 +23,7 @@ "//net", "//url", ] - public_deps = [ ":timing" ] - - frameworks = [ "QuartzCore.framework" ] } source_set("constants") { @@ -40,6 +35,16 @@ frameworks = [ "Foundation.framework" ] } +source_set("string_util") { + sources = [ + "string_util.h", + "string_util.mm", + ] + deps = [ "//base" ] + configs += [ "//build/config/compiler:enable_arc" ] + frameworks = [ "UIKit.framework" ] +} + source_set("timing") { sources = [ "material_timing.h", @@ -62,6 +67,7 @@ deps = [ ":common", ":noarc_unit_tests", + ":string_util", "//base", "//base/test:test_support", "//ios/chrome/common/ui/colors",
diff --git a/ios/chrome/test/data/policy/policy_test_cases.json b/ios/chrome/test/data/policy/policy_test_cases.json index b0b6f8e..a062099 100644 --- a/ios/chrome/test/data/policy/policy_test_cases.json +++ b/ios/chrome/test/data/policy/policy_test_cases.json
@@ -378,7 +378,7 @@ "policy_pref_mapping_tests": [ { "policies": { - "NewTabPageLocation": "not_a_url" + "NewTabPageLocation": "" }, "prefs": { "ios.ntp.location_override": { @@ -388,6 +388,16 @@ }, { "policies": { + "NewTabPageLocation": "m.youtube.com" + }, + "prefs": { + "ios.ntp.location_override": { + "value": "https://m.youtube.com" + } + } + }, + { + "policies": { "NewTabPageLocation": "https://store.google.com" }, "prefs": {
diff --git a/ios/web/common/features.h b/ios/web/common/features.h index 85c19eb..e03a553 100644 --- a/ios/web/common/features.h +++ b/ios/web/common/features.h
@@ -59,11 +59,6 @@ // Feature flag that enable Shared Highlighting color change in iOS. extern const base::Feature kIOSSharedHighlightingColorChange; -// Feature flag that enables creating pending item on POST form submission. -// Also, for GET form submissions with same page navigation, retains the -// transition type of new navigation item. -extern const base::Feature kCreatePendingItemForPostFormSubmission; - // Enable the new download API if available. extern const base::Feature kEnableNewDownloadAPI;
diff --git a/ios/web/common/features.mm b/ios/web/common/features.mm index c70fad1..77e05c5 100644 --- a/ios/web/common/features.mm +++ b/ios/web/common/features.mm
@@ -53,9 +53,6 @@ const base::Feature kIOSSharedHighlightingColorChange{ "IOSSharedHighlightingColorChange", base::FEATURE_ENABLED_BY_DEFAULT}; -const base::Feature kCreatePendingItemForPostFormSubmission{ - "CreatePendingItemForPostFormSubmission", base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature kEnableNewDownloadAPI{"EnableNewDownloadAPI", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/web/navigation/crw_wk_navigation_handler.mm b/ios/web/navigation/crw_wk_navigation_handler.mm index 26ba9b8..4d74ea4b 100644 --- a/ios/web/navigation/crw_wk_navigation_handler.mm +++ b/ios/web/navigation/crw_wk_navigation_handler.mm
@@ -183,11 +183,8 @@ navigationItem]; if (item) { item->SetUserAgentType(userAgentType); - if (base::FeatureList::IsEnabled( - web::features::kCreatePendingItemForPostFormSubmission)) { - if (web::wk_navigation_util::IsRestoreSessionUrl(item->GetURL())) { - self.webStateImpl->SetUserAgent(userAgentType); - } + if (web::wk_navigation_util::IsRestoreSessionUrl(item->GetURL())) { + self.webStateImpl->SetUserAgent(userAgentType); } } }
diff --git a/ios/web/navigation/navigation_manager_impl.mm b/ios/web/navigation/navigation_manager_impl.mm index bf7b385f..89f69119 100644 --- a/ios/web/navigation/navigation_manager_impl.mm +++ b/ios/web/navigation/navigation_manager_impl.mm
@@ -249,8 +249,6 @@ current_item_url == net::GURLWithNSURL(proxy.URL); bool is_form_post = - base::FeatureList::IsEnabled( - web::features::kCreatePendingItemForPostFormSubmission) && is_post_navigation && (navigation_type & ui::PageTransition::PAGE_TRANSITION_FORM_SUBMIT); if (proxy.backForwardList.currentItem && isCurrentURLSameAsPending && @@ -267,13 +265,10 @@ current_item = pending_item_.get(); SetNavigationItemInWKItem(current_wk_item, std::move(pending_item_)); } - if (base::FeatureList::IsEnabled( - web::features::kCreatePendingItemForPostFormSubmission)) { - // Updating the transition type of the item is needed, for example when - // doing a FormSubmit with a GET method on the same URL. See - // crbug.com/1211879. - current_item->SetTransitionType(transition); - } + // Updating the transition type of the item is needed, for example when + // doing a FormSubmit with a GET method on the same URL. See + // crbug.com/1211879. + current_item->SetTransitionType(transition); pending_item_.reset(); }
diff --git a/ios/web/navigation/navigation_manager_impl_unittest.mm b/ios/web/navigation/navigation_manager_impl_unittest.mm index 8966571..e53691f6 100644 --- a/ios/web/navigation/navigation_manager_impl_unittest.mm +++ b/ios/web/navigation/navigation_manager_impl_unittest.mm
@@ -803,8 +803,6 @@ // Tests that when the last committed item exists, adding a pending item with // the same URL fails if the new item is not form submission. TEST_F(NavigationManagerTest, NotAddSameUrlPendingItemIfNotFormSubmission) { - feature_.InitAndEnableFeature( - web::features::kCreatePendingItemForPostFormSubmission); GURL existing_url = GURL("http://www.existing.com"); navigation_manager()->AddPendingItem( existing_url, Referrer(), ui::PAGE_TRANSITION_TYPED, @@ -845,8 +843,6 @@ // the same URL updates the existing committed item if the form submission isn't // using POST. TEST_F(NavigationManagerTest, NotAddSameUrlPendingItemIfGETFormSubmission) { - feature_.InitAndEnableFeature( - web::features::kCreatePendingItemForPostFormSubmission); GURL existing_url = GURL("http://www.existing.com"); navigation_manager()->AddPendingItem( existing_url, Referrer(), ui::PAGE_TRANSITION_TYPED, @@ -884,8 +880,6 @@ // Tests that when the last committed item exists, adding a pending item with // the same URL creates a new pending item if the form submission is using POST. TEST_F(NavigationManagerTest, AddSameUrlPendingItemIfPOSTFormSubmission) { - feature_.InitAndEnableFeature( - web::features::kCreatePendingItemForPostFormSubmission); GURL existing_url = GURL("http://www.existing.com"); navigation_manager()->AddPendingItem( existing_url, Referrer(), ui::PAGE_TRANSITION_TYPED, @@ -922,8 +916,6 @@ // Tests that when the last committed item exists, adding a pending item with // the same URL fails if the user agent override option is INHERIT. TEST_F(NavigationManagerTest, NotAddSameUrlPendingItemIfOverrideInherit) { - feature_.InitAndEnableFeature( - web::features::kCreatePendingItemForPostFormSubmission); GURL existing_url = GURL("http://www.existing.com"); navigation_manager()->AddPendingItem( existing_url, Referrer(), ui::PAGE_TRANSITION_TYPED, @@ -962,8 +954,6 @@ // Tests that when the last committed item exists, adding a pending item with // the same URL succeeds. TEST_F(NavigationManagerTest, AddSameUrlPendingItem) { - feature_.InitAndEnableFeature( - web::features::kCreatePendingItemForPostFormSubmission); GURL existing_url = GURL("http://www.existing.com"); navigation_manager()->AddPendingItem( existing_url, Referrer(), ui::PAGE_TRANSITION_TYPED,
diff --git a/ios/web/web_state/ui/crw_web_request_controller.mm b/ios/web/web_state/ui/crw_web_request_controller.mm index 8695e94..2efe5f1 100644 --- a/ios/web/web_state/ui/crw_web_request_controller.mm +++ b/ios/web/web_state/ui/crw_web_request_controller.mm
@@ -303,13 +303,9 @@ self.navigationManagerImpl->UpdatePendingItemUrl(requestURL); } } else { - BOOL isPostNavigation = NO; - if (base::FeatureList::IsEnabled( - web::features::kCreatePendingItemForPostFormSubmission)) { - isPostNavigation = - [self.navigationHandler.pendingNavigationInfo.HTTPMethod - isEqual:@"POST"]; - } + BOOL isPostNavigation = + [self.navigationHandler.pendingNavigationInfo.HTTPMethod + isEqual:@"POST"]; self.navigationManagerImpl->AddPendingItem( requestURL, referrer, transition, rendererInitiated ? web::NavigationInitiationType::RENDERER_INITIATED
diff --git a/media/gpu/android/codec_image_unittest.cc b/media/gpu/android/codec_image_unittest.cc index 308d574..01c3db2 100644 --- a/media/gpu/android/codec_image_unittest.cc +++ b/media/gpu/android/codec_image_unittest.cc
@@ -57,7 +57,8 @@ /*init_extensions=*/false, /*system_device_id=*/0); - surface_ = new gl::PbufferGLSurfaceEGL(gfx::Size(320, 240)); + surface_ = new gl::PbufferGLSurfaceEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), + gfx::Size(320, 240)); surface_->Initialize(); share_group_ = new gl::GLShareGroup(); context_ = new gl::GLContextEGL(share_group_.get()); @@ -281,8 +282,8 @@ TEST_F(CodecImageTest, RenderToFrontBufferRestoresGLContext) { // Make a new context current. - scoped_refptr<gl::GLSurface> surface( - new gl::PbufferGLSurfaceEGL(gfx::Size(320, 240))); + scoped_refptr<gl::GLSurface> surface(new gl::PbufferGLSurfaceEGL( + gl::GLSurfaceEGL::GetGLDisplayEGL(), gfx::Size(320, 240))); surface->Initialize(); scoped_refptr<gl::GLShareGroup> share_group(new gl::GLShareGroup()); scoped_refptr<gl::GLContext> context(new gl::GLContextEGL(share_group.get()));
diff --git a/media/mojo/services/media_foundation_service.cc b/media/mojo/services/media_foundation_service.cc index 02ab9ffd..5f33736 100644 --- a/media/mojo/services/media_foundation_service.cc +++ b/media/mojo/services/media_foundation_service.cc
@@ -73,10 +73,15 @@ constexpr AudioCodec kAllAudioCodecs[] = { #if BUILDFLAG(USE_PROPRIETARY_CODECS) - AudioCodec::kAAC, AudioCodec::kEAC3, AudioCodec::kAC3, + AudioCodec::kAAC, +#if BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO) + AudioCodec::kEAC3, AudioCodec::kAC3, +#endif // BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO) +#if BUILDFLAG(ENABLE_PLATFORM_MPEG_H_AUDIO) AudioCodec::kMpegHAudio, -#endif - AudioCodec::kVorbis, AudioCodec::kFLAC, AudioCodec::kOpus}; +#endif // BUILDFLAG(ENABLE_PLATFORM_MPEG_H_AUDIO) +#endif // BUILDFLAG(USE_PROPRIETARY_CODECS) + AudioCodec::kVorbis, AudioCodec::kFLAC, AudioCodec::kOpus}; constexpr EncryptionScheme kAllEncryptionSchemes[] = {EncryptionScheme::kCenc, EncryptionScheme::kCbcs};
diff --git a/storage/browser/quota/usage_tracker.cc b/storage/browser/quota/usage_tracker.cc index 052a3fad..bacec98 100644 --- a/storage/browser/quota/usage_tracker.cc +++ b/storage/browser/quota/usage_tracker.cc
@@ -74,6 +74,22 @@ weak_factory_.GetWeakPtr(), host)); } +void UsageTracker::GetStorageKeyUsageWithBreakdown( + const blink::StorageKey& storage_key, + UsageWithBreakdownCallback callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + std::vector<UsageWithBreakdownCallback>& storage_key_callbacks = + storage_key_usage_callbacks_[storage_key]; + storage_key_callbacks.emplace_back(std::move(callback)); + if (storage_key_callbacks.size() > 1) + return; + + quota_manager_impl_->GetBucketsForStorageKey( + storage_key, type_, + base::BindOnce(&UsageTracker::DidGetBucketsForStorageKey, + weak_factory_.GetWeakPtr(), storage_key)); +} + void UsageTracker::GetBucketUsageWithBreakdown( const BucketLocator& bucket, UsageWithBreakdownCallback callback) { @@ -256,6 +272,47 @@ } } +void UsageTracker::DidGetBucketsForStorageKey( + const blink::StorageKey& storage_key, + QuotaErrorOr<std::set<BucketLocator>> result) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + auto info = std::make_unique<AccumulateInfo>(); + if (!result.ok()) { + // Return with invalid values on error. + info->usage = -1; + info->unlimited_usage = -1; + FinallySendStorageKeyUsageWithBreakdown(std::move(info), storage_key); + return; + } + + const std::set<BucketLocator>& buckets = result.value(); + if (buckets.empty()) { + FinallySendStorageKeyUsageWithBreakdown(std::move(info), storage_key); + return; + } + + auto* info_ptr = info.get(); + base::RepeatingClosure barrier = base::BarrierClosure( + client_tracker_count_, + base::BindOnce(&UsageTracker::FinallySendStorageKeyUsageWithBreakdown, + weak_factory_.GetWeakPtr(), std::move(info), storage_key)); + + for (const auto& client_type_and_trackers : client_tracker_map_) { + for (const auto& client_tracker : client_type_and_trackers.second) { + client_tracker->GetBucketsUsage( + buckets, + // base::Unretained usage is safe here because BarrierClosure holds + // the std::unque_ptr that keeps AccumulateInfo alive, and the + // BarrierClosure will outlive all the AccumulateClientGlobalUsage + // closures. + base::BindOnce(&UsageTracker::AccumulateClientUsageWithBreakdown, + weak_factory_.GetWeakPtr(), barrier, + base::Unretained(info_ptr), + client_type_and_trackers.first)); + } + } +} + void UsageTracker::AccumulateClientGlobalUsage( base::OnceClosure barrier_callback, AccumulateInfo* info, @@ -349,6 +406,24 @@ std::move(callback).Run(info->usage, info->usage_breakdown->Clone()); } +void UsageTracker::FinallySendStorageKeyUsageWithBreakdown( + std::unique_ptr<AccumulateInfo> info, + const blink::StorageKey& storage_key) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + auto it = storage_key_usage_callbacks_.find(storage_key); + if (it == storage_key_usage_callbacks_.end()) + return; + + std::vector<UsageWithBreakdownCallback> pending_callbacks; + pending_callbacks.swap(it->second); + DCHECK(pending_callbacks.size() > 0) << "storage_key_usage_callbacks_ should " + "only have non-empty callback lists"; + storage_key_usage_callbacks_.erase(it); + + for (auto& callback : pending_callbacks) + std::move(callback).Run(info->usage, info->usage_breakdown->Clone()); +} + void UsageTracker::FinallySendBucketUsageWithBreakdown( std::unique_ptr<AccumulateInfo> info, const BucketLocator& bucket) {
diff --git a/storage/browser/quota/usage_tracker.h b/storage/browser/quota/usage_tracker.h index 1c9f1c0..763ddf6 100644 --- a/storage/browser/quota/usage_tracker.h +++ b/storage/browser/quota/usage_tracker.h
@@ -66,9 +66,17 @@ // Retrieves all buckets for host from QuotaDatabase and requests bucket usage // from each registered client. Returns cached bucket usage if one exists for // a bucket. + // TODO(crbug/1202325): Remove once all usages move to + // GetStorageKeyUsageWithBreakdown. void GetHostUsageWithBreakdown(const std::string& host, UsageWithBreakdownCallback callback); + // Retrieves all buckets for a `storage_key` from QuotaDatabase and requests + // bucket usage from each registered client. Returns cached bucket usage if + // one exists for a bucket. + void GetStorageKeyUsageWithBreakdown(const blink::StorageKey& storage_key, + UsageWithBreakdownCallback callback); + // Requests bucket usage from each registered client. Returns cached bucket // usage if one exists for a bucket. void GetBucketUsageWithBreakdown(const BucketLocator& bucket, @@ -116,6 +124,8 @@ void DidGetBucketsForType(QuotaErrorOr<std::set<BucketLocator>> result); void DidGetBucketsForHost(const std::string& host, QuotaErrorOr<std::set<BucketLocator>> result); + void DidGetBucketsForStorageKey(const blink::StorageKey& storage_key, + QuotaErrorOr<std::set<BucketLocator>> result); void DidGetBucketForUsage(QuotaClientType client_type, int64_t delta, QuotaErrorOr<BucketInfo> result); @@ -133,6 +143,9 @@ void FinallySendGlobalUsage(std::unique_ptr<AccumulateInfo> info); void FinallySendHostUsageWithBreakdown(std::unique_ptr<AccumulateInfo> info, const std::string& host); + void FinallySendStorageKeyUsageWithBreakdown( + std::unique_ptr<AccumulateInfo> info, + const blink::StorageKey& storage_key); void FinallySendBucketUsageWithBreakdown(std::unique_ptr<AccumulateInfo> info, const BucketLocator& bucket); @@ -150,6 +163,8 @@ std::vector<UsageCallback> global_usage_callbacks_; std::map<std::string, std::vector<UsageWithBreakdownCallback>> host_usage_callbacks_; + std::map<blink::StorageKey, std::vector<UsageWithBreakdownCallback>> + storage_key_usage_callbacks_; std::map<BucketLocator, std::vector<UsageWithBreakdownCallback>> bucket_usage_callbacks_;
diff --git a/storage/browser/quota/usage_tracker_unittest.cc b/storage/browser/quota/usage_tracker_unittest.cc index 43602e62b..1cf26dbc7 100644 --- a/storage/browser/quota/usage_tracker_unittest.cc +++ b/storage/browser/quota/usage_tracker_unittest.cc
@@ -144,6 +144,15 @@ } std::pair<int64_t, blink::mojom::UsageBreakdownPtr> + GetStorageKeyUsageWithBreakdown(const blink::StorageKey& storage_key) { + base::test::TestFuture<int64_t, blink::mojom::UsageBreakdownPtr> future; + usage_tracker_->GetStorageKeyUsageWithBreakdown(storage_key, + future.GetCallback()); + return std::make_pair(future.Get<0>(), + std::move(std::get<1>(future.Take()))); + } + + std::pair<int64_t, blink::mojom::UsageBreakdownPtr> GetBucketUsageWithBreakdown(const BucketLocator& bucket) { base::test::TestFuture<int64_t, blink::mojom::UsageBreakdownPtr> future; usage_tracker_->GetBucketUsageWithBreakdown(bucket, future.GetCallback()); @@ -224,6 +233,8 @@ int64_t unlimited_usage = 0; blink::mojom::UsageBreakdownPtr host_usage_breakdown_expected = blink::mojom::UsageBreakdown::New(); + blink::mojom::UsageBreakdownPtr storage_key_usage_breakdown_expected = + blink::mojom::UsageBreakdown::New(); blink::mojom::UsageBreakdownPtr bucket_usage_breakdown_expected = blink::mojom::UsageBreakdown::New(); GetGlobalUsage(&usage, &unlimited_usage); @@ -245,6 +256,13 @@ GetHostUsageWithBreakdown(host); EXPECT_EQ(100, host_usage_breakdown.first); EXPECT_EQ(host_usage_breakdown_expected, host_usage_breakdown.second); + storage_key_usage_breakdown_expected->fileSystem = 100; + std::pair<int64_t, blink::mojom::UsageBreakdownPtr> + storage_key_usage_breakdown = + GetStorageKeyUsageWithBreakdown(storage_key); + EXPECT_EQ(100, storage_key_usage_breakdown.first); + EXPECT_EQ(storage_key_usage_breakdown_expected, + storage_key_usage_breakdown.second); bucket_usage_breakdown_expected->fileSystem = 100; std::pair<int64_t, blink::mojom::UsageBreakdownPtr> bucket_usage_breakdown = GetBucketUsageWithBreakdown(bucket); @@ -258,6 +276,10 @@ host_usage_breakdown = GetHostUsageWithBreakdown(host); EXPECT_EQ(100, host_usage_breakdown.first); EXPECT_EQ(host_usage_breakdown_expected, host_usage_breakdown.second); + storage_key_usage_breakdown = GetStorageKeyUsageWithBreakdown(storage_key); + EXPECT_EQ(100, storage_key_usage_breakdown.first); + EXPECT_EQ(storage_key_usage_breakdown_expected, + storage_key_usage_breakdown.second); bucket_usage_breakdown = GetBucketUsageWithBreakdown(bucket); EXPECT_EQ(100, bucket_usage_breakdown.first); EXPECT_EQ(bucket_usage_breakdown_expected, bucket_usage_breakdown.second); @@ -269,6 +291,10 @@ GetHostUsageWithBreakdown(host); EXPECT_EQ(100, host_usage_breakdown.first); EXPECT_EQ(host_usage_breakdown_expected, host_usage_breakdown.second); + GetStorageKeyUsageWithBreakdown(storage_key); + EXPECT_EQ(100, storage_key_usage_breakdown.first); + EXPECT_EQ(storage_key_usage_breakdown_expected, + storage_key_usage_breakdown.second); GetBucketUsageWithBreakdown(bucket); EXPECT_EQ(100, bucket_usage_breakdown.first); EXPECT_EQ(bucket_usage_breakdown_expected, bucket_usage_breakdown.second); @@ -279,6 +305,8 @@ int64_t unlimited_usage = 0; blink::mojom::UsageBreakdownPtr host_usage_breakdown_expected = blink::mojom::UsageBreakdown::New(); + blink::mojom::UsageBreakdownPtr storage_key_usage_breakdown_expected = + blink::mojom::UsageBreakdown::New(); blink::mojom::UsageBreakdownPtr bucket_usage_breakdown_expected = blink::mojom::UsageBreakdown::New(); @@ -297,6 +325,13 @@ GetHostUsageWithBreakdown(host); EXPECT_EQ(100, host_usage_breakdown.first); EXPECT_EQ(host_usage_breakdown_expected, host_usage_breakdown.second); + storage_key_usage_breakdown_expected->fileSystem = 100; + std::pair<int64_t, blink::mojom::UsageBreakdownPtr> + storage_key_usage_breakdown = + GetStorageKeyUsageWithBreakdown(storage_key); + EXPECT_EQ(100, storage_key_usage_breakdown.first); + EXPECT_EQ(storage_key_usage_breakdown_expected, + storage_key_usage_breakdown.second); bucket_usage_breakdown_expected->fileSystem = 100; std::pair<int64_t, blink::mojom::UsageBreakdownPtr> bucket_usage_breakdown = GetBucketUsageWithBreakdown(bucket); @@ -310,6 +345,10 @@ host_usage_breakdown = GetHostUsageWithBreakdown(host); EXPECT_EQ(100, host_usage_breakdown.first); EXPECT_EQ(host_usage_breakdown_expected, host_usage_breakdown.second); + storage_key_usage_breakdown = GetStorageKeyUsageWithBreakdown(storage_key); + EXPECT_EQ(100, storage_key_usage_breakdown.first); + EXPECT_EQ(storage_key_usage_breakdown_expected, + storage_key_usage_breakdown.second); bucket_usage_breakdown = GetBucketUsageWithBreakdown(bucket); EXPECT_EQ(100, bucket_usage_breakdown.first); EXPECT_EQ(bucket_usage_breakdown_expected, bucket_usage_breakdown.second); @@ -326,6 +365,11 @@ host_usage_breakdown_expected->fileSystem = 400; EXPECT_EQ(400, host_usage_breakdown.first); EXPECT_EQ(host_usage_breakdown_expected, host_usage_breakdown.second); + storage_key_usage_breakdown = GetStorageKeyUsageWithBreakdown(storage_key); + storage_key_usage_breakdown_expected->fileSystem = 400; + EXPECT_EQ(400, storage_key_usage_breakdown.first); + EXPECT_EQ(storage_key_usage_breakdown_expected, + storage_key_usage_breakdown.second); bucket_usage_breakdown = GetBucketUsageWithBreakdown(bucket); bucket_usage_breakdown_expected->fileSystem = 400; EXPECT_EQ(400, bucket_usage_breakdown.first); @@ -338,6 +382,10 @@ host_usage_breakdown = GetHostUsageWithBreakdown(host); EXPECT_EQ(400, host_usage_breakdown.first); EXPECT_EQ(host_usage_breakdown_expected, host_usage_breakdown.second); + storage_key_usage_breakdown = GetStorageKeyUsageWithBreakdown(storage_key); + EXPECT_EQ(400, storage_key_usage_breakdown.first); + EXPECT_EQ(storage_key_usage_breakdown_expected, + storage_key_usage_breakdown.second); bucket_usage_breakdown = GetBucketUsageWithBreakdown(bucket); EXPECT_EQ(400, host_usage_breakdown.first); EXPECT_EQ(bucket_usage_breakdown_expected, bucket_usage_breakdown.second); @@ -352,6 +400,11 @@ host_usage_breakdown_expected->fileSystem = 500; EXPECT_EQ(500, host_usage_breakdown.first); EXPECT_EQ(host_usage_breakdown_expected, host_usage_breakdown.second); + storage_key_usage_breakdown = GetStorageKeyUsageWithBreakdown(storage_key); + storage_key_usage_breakdown_expected->fileSystem = 500; + EXPECT_EQ(500, storage_key_usage_breakdown.first); + EXPECT_EQ(storage_key_usage_breakdown_expected, + storage_key_usage_breakdown.second); bucket_usage_breakdown = GetBucketUsageWithBreakdown(bucket); bucket_usage_breakdown_expected->fileSystem = 500; EXPECT_EQ(500, bucket_usage_breakdown.first);
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json index bdedb49c..b748173 100644 --- a/testing/buildbot/chrome.json +++ b/testing/buildbot/chrome.json
@@ -1837,7 +1837,40 @@ "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", "trigger_script": { "script": "//testing/trigger_scripts/chromeos_device_trigger.py" - } + }, + "variant_id": "eve" + }, + { + "args": [ + "--board=amd64-generic", + "--use-vm" + ], + "experiment_percentage": 100, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "lacros_variations_tast_tests amd64-generic", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86", + "kvm": "1", + "os": "Ubuntu-18.04", + "pool": "chrome.tests" + } + ], + "idempotent": false, + "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "lacros_variations_tast_tests", + "test_id_prefix": "ninja://chromeos/lacros:lacros_variations_tast_tests/", + "variant_id": "amd64-generic" } ], "isolated_scripts": [ @@ -1888,7 +1921,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "ATLAS_RELEASE_LKGM" }, { "args": [], @@ -1903,7 +1937,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "ATLAS_RELEASE_DEV" }, { "args": [], @@ -1918,7 +1953,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "ATLAS_RELEASE_BETA" }, { "args": [], @@ -1933,7 +1969,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "ATLAS_RELEASE_STABLE" }, { "args": [], @@ -1948,7 +1985,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "EVE_RELEASE_LKGM" }, { "args": [], @@ -1963,7 +2001,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "EVE_RELEASE_DEV" }, { "args": [], @@ -1978,7 +2017,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "EVE_RELEASE_BETA" }, { "args": [], @@ -1993,7 +2033,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "EVE_RELEASE_STABLE" } ] }, @@ -2053,7 +2094,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "HANA_RELEASE_LKGM" }, { "args": [], @@ -2068,7 +2110,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "HANA_RELEASE_DEV" }, { "args": [], @@ -2083,7 +2126,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "HANA_RELEASE_BETA" }, { "args": [], @@ -2098,7 +2142,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "HANA_RELEASE_STABLE" }, { "args": [], @@ -2113,7 +2158,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "JACUZZI_RELEASE_LKGM" }, { "args": [], @@ -2128,7 +2174,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "JACUZZI_RELEASE_DEV" }, { "args": [], @@ -2143,7 +2190,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "JACUZZI_RELEASE_BETA" }, { "args": [], @@ -2158,7 +2206,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "JACUZZI_RELEASE_STABLE" }, { "args": [ @@ -2174,7 +2223,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "HANA_RELEASE_LKGM" }, { "args": [ @@ -2190,7 +2240,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "HANA_RELEASE_DEV" }, { "args": [ @@ -2206,7 +2257,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "HANA_RELEASE_BETA" }, { "args": [ @@ -2222,7 +2274,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "HANA_RELEASE_STABLE" }, { "args": [ @@ -2238,7 +2291,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "JACUZZI_RELEASE_LKGM" }, { "args": [ @@ -2254,7 +2308,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "JACUZZI_RELEASE_DEV" }, { "args": [ @@ -2270,7 +2325,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "JACUZZI_RELEASE_BETA" }, { "args": [ @@ -2286,7 +2342,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "JACUZZI_RELEASE_STABLE" }, { "args": [ @@ -2302,7 +2359,8 @@ "swarming": {}, "test": "viz_unittests", "test_id_prefix": "ninja://components/viz:viz_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "HANA_RELEASE_LKGM" }, { "args": [ @@ -2318,7 +2376,8 @@ "swarming": {}, "test": "viz_unittests", "test_id_prefix": "ninja://components/viz:viz_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "HANA_RELEASE_DEV" }, { "args": [ @@ -2334,7 +2393,8 @@ "swarming": {}, "test": "viz_unittests", "test_id_prefix": "ninja://components/viz:viz_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "HANA_RELEASE_BETA" }, { "args": [ @@ -2350,7 +2410,8 @@ "swarming": {}, "test": "viz_unittests", "test_id_prefix": "ninja://components/viz:viz_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "HANA_RELEASE_STABLE" }, { "args": [ @@ -2366,7 +2427,8 @@ "swarming": {}, "test": "viz_unittests", "test_id_prefix": "ninja://components/viz:viz_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "JACUZZI_RELEASE_LKGM" }, { "args": [ @@ -2382,7 +2444,8 @@ "swarming": {}, "test": "viz_unittests", "test_id_prefix": "ninja://components/viz:viz_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "JACUZZI_RELEASE_DEV" }, { "args": [ @@ -2398,7 +2461,8 @@ "swarming": {}, "test": "viz_unittests", "test_id_prefix": "ninja://components/viz:viz_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "JACUZZI_RELEASE_BETA" }, { "args": [ @@ -2414,7 +2478,8 @@ "swarming": {}, "test": "viz_unittests", "test_id_prefix": "ninja://components/viz:viz_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "JACUZZI_RELEASE_STABLE" } ] },
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index 15f1253..6cf1cf03 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -8291,7 +8291,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "weblayer_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/", + "variant_id": "ToT_Tests" }, { "args": [ @@ -8375,7 +8376,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_100" }, { "args": [ @@ -8459,7 +8461,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_101" }, { "args": [ @@ -8543,7 +8546,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_102" }, { "args": [ @@ -8627,7 +8631,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_97" }, { "args": [ @@ -8711,7 +8716,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_98" }, { "args": [ @@ -8795,7 +8801,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_99" }, { "args": [ @@ -8879,7 +8886,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_100" }, { "args": [ @@ -8963,7 +8971,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_101" }, { "args": [ @@ -9047,7 +9056,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_102" }, { "args": [ @@ -9131,7 +9141,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_97" }, { "args": [ @@ -9215,7 +9226,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_98" }, { "args": [ @@ -9299,7 +9311,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_99" } ] },
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 0fd4ae7a..e5ecfee 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -1741,7 +1741,8 @@ } ] }, - "Android arm64 Builder (dbg)": { + "Android arm64 Builder (dbg)": {}, + "Android arm64 Builder All Targets (dbg)": { "additional_compile_targets": [ "all" ] @@ -46036,7 +46037,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "weblayer_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/", + "variant_id": "ToT_Tests" }, { "args": [ @@ -46120,7 +46122,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_100" }, { "args": [ @@ -46204,7 +46207,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_101" }, { "args": [ @@ -46288,7 +46292,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_102" }, { "args": [ @@ -46372,7 +46377,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_97" }, { "args": [ @@ -46456,7 +46462,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_98" }, { "args": [ @@ -46540,7 +46547,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_99" }, { "args": [ @@ -46624,7 +46632,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_100" }, { "args": [ @@ -46708,7 +46717,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_101" }, { "args": [ @@ -46792,7 +46802,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_102" }, { "args": [ @@ -46876,7 +46887,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_97" }, { "args": [ @@ -46960,7 +46972,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_98" }, { "args": [ @@ -47044,7 +47057,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_99" } ] }, @@ -47132,7 +47146,8 @@ "shards": 2 }, "test": "weblayer_skew_tests_with_chrome", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", + "variant_id": "with_client_from_100" }, { "args": [ @@ -47216,7 +47231,8 @@ "shards": 2 }, "test": "weblayer_skew_tests_with_chrome", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", + "variant_id": "with_client_from_101" }, { "args": [ @@ -47300,7 +47316,8 @@ "shards": 2 }, "test": "weblayer_skew_tests_with_chrome", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", + "variant_id": "with_client_from_102" }, { "args": [ @@ -47384,7 +47401,8 @@ "shards": 2 }, "test": "weblayer_skew_tests_with_chrome", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", + "variant_id": "with_client_from_97" }, { "args": [ @@ -47468,7 +47486,8 @@ "shards": 2 }, "test": "weblayer_skew_tests_with_chrome", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", + "variant_id": "with_client_from_98" }, { "args": [ @@ -47552,7 +47571,8 @@ "shards": 2 }, "test": "weblayer_skew_tests_with_chrome", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", + "variant_id": "with_client_from_99" }, { "args": [ @@ -47636,7 +47656,8 @@ "shards": 2 }, "test": "weblayer_skew_tests_with_chrome", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", + "variant_id": "with_impl_from_100" }, { "args": [ @@ -47720,7 +47741,8 @@ "shards": 2 }, "test": "weblayer_skew_tests_with_chrome", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", + "variant_id": "with_impl_from_101" }, { "args": [ @@ -47804,7 +47826,8 @@ "shards": 2 }, "test": "weblayer_skew_tests_with_chrome", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", + "variant_id": "with_impl_from_102" }, { "args": [ @@ -47888,7 +47911,8 @@ "shards": 2 }, "test": "weblayer_skew_tests_with_chrome", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", + "variant_id": "with_impl_from_97" }, { "args": [ @@ -47972,7 +47996,8 @@ "shards": 2 }, "test": "weblayer_skew_tests_with_chrome", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", + "variant_id": "with_impl_from_98" }, { "args": [ @@ -48056,7 +48081,8 @@ "shards": 2 }, "test": "weblayer_skew_tests_with_chrome", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", + "variant_id": "with_impl_from_99" } ] }, @@ -48127,7 +48153,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "weblayer_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/", + "variant_id": "ToT_Tests" }, { "args": [ @@ -48211,7 +48238,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_100" }, { "args": [ @@ -48295,7 +48323,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_101" }, { "args": [ @@ -48379,7 +48408,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_102" }, { "args": [ @@ -48463,7 +48493,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_97" }, { "args": [ @@ -48547,7 +48578,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_98" }, { "args": [ @@ -48631,7 +48663,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_99" }, { "args": [ @@ -48715,7 +48748,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_100" }, { "args": [ @@ -48799,7 +48833,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_101" }, { "args": [ @@ -48883,7 +48918,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_102" }, { "args": [ @@ -48967,7 +49003,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_97" }, { "args": [ @@ -49051,7 +49088,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_98" }, { "args": [ @@ -49135,7 +49173,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_99" } ] }, @@ -49206,7 +49245,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "weblayer_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/", + "variant_id": "ToT_Tests" }, { "args": [ @@ -49290,7 +49330,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_100" }, { "args": [ @@ -49374,7 +49415,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_101" }, { "args": [ @@ -49458,7 +49500,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_102" }, { "args": [ @@ -49542,7 +49585,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_97" }, { "args": [ @@ -49626,7 +49670,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_98" }, { "args": [ @@ -49710,7 +49755,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_99" }, { "args": [ @@ -49794,7 +49840,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_100" }, { "args": [ @@ -49878,7 +49925,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_101" }, { "args": [ @@ -49962,7 +50010,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_102" }, { "args": [ @@ -50046,7 +50095,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_97" }, { "args": [ @@ -50130,7 +50180,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_98" }, { "args": [ @@ -50214,7 +50265,8 @@ "shards": 2 }, "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/" + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_99" } ] },
diff --git a/testing/buildbot/chromium.angle.json b/testing/buildbot/chromium.angle.json index 74d6fde1..0130290 100644 --- a/testing/buildbot/chromium.angle.json +++ b/testing/buildbot/chromium.angle.json
@@ -320,7 +320,8 @@ }, "test": "angle_end2end_tests", "test_id_prefix": "ninja://third_party/angle/src/tests:angle_end2end_tests/", - "use_isolated_scripts_api": true + "use_isolated_scripts_api": true, + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -378,7 +379,8 @@ }, "test": "angle_white_box_tests", "test_id_prefix": "ninja://third_party/angle/src/tests:angle_white_box_tests/", - "use_isolated_scripts_api": true + "use_isolated_scripts_api": true, + "variant_id": "iPhone X 14.4" } ] },
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 8a90be50..8841d11 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -1424,7 +1424,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "cc_unittests", - "test_id_prefix": "ninja://cc:cc_unittests/" + "test_id_prefix": "ninja://cc:cc_unittests/", + "variant_id": "amd64-generic" }, { "args": [ @@ -1454,7 +1455,8 @@ "test_id_prefix": "ninja://cc:cc_unittests/", "trigger_script": { "script": "//testing/trigger_scripts/chromeos_device_trigger.py" - } + }, + "variant_id": "eve" }, { "args": [ @@ -1483,7 +1485,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_all_tast_tests", - "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/" + "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", + "variant_id": "amd64-generic" }, { "args": [ @@ -1514,7 +1517,8 @@ "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", "trigger_script": { "script": "//testing/trigger_scripts/chromeos_device_trigger.py" - } + }, + "variant_id": "eve" }, { "args": [ @@ -1542,7 +1546,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "ozone_unittests", - "test_id_prefix": "ninja://ui/ozone:ozone_unittests/" + "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", + "variant_id": "amd64-generic" }, { "args": [ @@ -1572,7 +1577,8 @@ "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", "trigger_script": { "script": "//testing/trigger_scripts/chromeos_device_trigger.py" - } + }, + "variant_id": "eve" } ] }, @@ -5816,7 +5822,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 100.0.4896.133" }, { "args": [ @@ -5846,7 +5853,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 102.0.5005.22" }, { "args": [ @@ -5876,7 +5884,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 103.0.5030.0" }, { "args": [ @@ -5906,7 +5915,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 103.0.5044.0" }, { "args": [ @@ -5958,7 +5968,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 100.0.4896.133" }, { "args": [ @@ -5988,7 +5999,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 102.0.5005.22" }, { "args": [ @@ -6018,7 +6030,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 103.0.5030.0" }, { "args": [ @@ -6048,7 +6061,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 103.0.5044.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index 4138aca..655e41d 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -40761,7 +40761,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -40812,7 +40813,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -40863,7 +40865,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -40914,7 +40917,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -40965,7 +40969,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41016,7 +41021,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41067,7 +41073,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41118,7 +41125,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41169,7 +41177,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41220,7 +41229,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41271,7 +41281,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41322,7 +41333,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41373,7 +41385,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41424,7 +41437,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41475,7 +41489,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41526,7 +41541,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41577,7 +41593,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41628,7 +41645,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 6s 15.2" } ] }, @@ -41697,7 +41715,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -41743,7 +41762,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -41789,7 +41809,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -41835,7 +41856,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -41881,7 +41903,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -41927,7 +41950,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -41973,7 +41997,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -42019,7 +42044,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -42065,7 +42091,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -42111,7 +42138,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -42157,7 +42185,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -42203,7 +42232,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -42249,7 +42279,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -42295,7 +42326,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -42341,7 +42373,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -42387,7 +42420,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -42433,7 +42467,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 7 15.4.1" }, { "args": [ @@ -42479,7 +42514,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 7 15.4.1" } ] },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 09c166fe..4ad7849 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -8940,16 +8940,6 @@ } ] }, - "Win ASan Release (reclient shadow)": { - "additional_compile_targets": [ - "chromium_builder_asan" - ] - }, - "Win ASan Release Media (reclient shadow)": { - "additional_compile_targets": [ - "chromium_builder_asan" - ] - }, "Win x64 Builder (reclient compare)": { "additional_compile_targets": [ "pdf_fuzzers" @@ -26930,7 +26920,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -26981,7 +26972,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -27032,7 +27024,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -27083,7 +27076,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -27134,7 +27128,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -27185,7 +27180,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -27236,7 +27232,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -27287,7 +27284,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -27338,7 +27336,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -27389,7 +27388,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -27440,7 +27440,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -27491,7 +27492,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -27542,7 +27544,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -27593,7 +27596,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -27644,7 +27648,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -27695,7 +27700,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -27746,7 +27752,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -27797,7 +27804,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -27848,7 +27856,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -27899,7 +27908,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -27950,7 +27960,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -28001,7 +28012,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -28053,7 +28065,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -28105,7 +28118,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -28156,7 +28170,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -28207,7 +28222,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -28258,7 +28274,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -28309,7 +28326,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -28360,7 +28378,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -28411,7 +28430,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -28462,7 +28482,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -28513,7 +28534,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -28564,7 +28586,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -28615,7 +28638,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -28666,7 +28690,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -28717,7 +28742,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -28768,7 +28794,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -28819,7 +28846,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -28870,7 +28898,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -28921,7 +28950,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -28972,7 +29002,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -29023,7 +29054,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -29074,7 +29106,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -29125,7 +29158,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -29176,7 +29210,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -29227,7 +29262,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -29278,7 +29314,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -29329,7 +29366,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone X 15.2" } ] }, @@ -29386,7 +29424,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -29439,7 +29478,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -29493,7 +29533,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -29547,7 +29588,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -29601,7 +29643,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -29655,7 +29698,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -29709,7 +29753,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -29763,7 +29808,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -29816,7 +29862,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -29869,7 +29916,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -29923,7 +29971,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -29977,7 +30026,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -30030,7 +30080,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -30083,7 +30134,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -30136,7 +30188,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -30189,7 +30242,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -30242,7 +30296,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -30295,7 +30350,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" } ] }, @@ -30353,7 +30409,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -30404,7 +30461,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -30455,7 +30513,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -30506,7 +30565,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -30557,7 +30617,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -30608,7 +30669,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -30659,7 +30721,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -30710,7 +30773,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -30761,7 +30825,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -30812,7 +30877,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -30863,7 +30929,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -30914,7 +30981,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -30965,7 +31033,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -31016,7 +31085,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -31067,7 +31137,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -31118,7 +31189,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -31169,7 +31241,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -31220,7 +31293,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -31272,7 +31346,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -31324,7 +31399,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -31376,7 +31452,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -31429,7 +31506,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -31482,7 +31560,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Pro (12.9-inch) (2nd generation) 14.5" }, { "args": [ @@ -31535,7 +31614,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -31588,7 +31668,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -31641,7 +31722,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -31694,7 +31776,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -31747,7 +31830,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -31800,7 +31884,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Pro (12.9-inch) (2nd generation) 14.5" }, { "args": [ @@ -31853,7 +31938,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -31905,7 +31991,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -31957,7 +32044,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -32009,7 +32097,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -32062,7 +32151,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -32115,7 +32205,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Pro (12.9-inch) (2nd generation) 14.5" }, { "args": [ @@ -32168,7 +32259,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -32219,7 +32311,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -32270,7 +32363,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -32321,7 +32415,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -32372,7 +32467,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -32424,7 +32520,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -32476,7 +32573,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -32528,7 +32626,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -32579,7 +32678,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -32631,7 +32731,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -32682,7 +32783,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -32734,7 +32836,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -32786,7 +32889,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -32838,7 +32942,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -32889,7 +32994,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -32940,7 +33046,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -32991,7 +33098,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -33042,7 +33150,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -33093,7 +33202,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -33145,7 +33255,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -33197,7 +33308,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Pro (12.9-inch) (2nd generation) 14.5" }, { "args": [ @@ -33249,7 +33361,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -33300,7 +33413,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -33351,7 +33465,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -33402,7 +33517,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -33453,7 +33569,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -33504,7 +33621,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -33555,7 +33673,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -33606,7 +33725,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -33657,7 +33777,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -33708,7 +33829,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -33759,7 +33881,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -33810,7 +33933,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -33861,7 +33985,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -33912,7 +34037,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -33963,7 +34089,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -34014,7 +34141,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -34065,7 +34193,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -34116,7 +34245,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -34167,7 +34297,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -34218,7 +34349,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -34269,7 +34401,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -34320,7 +34453,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -34371,7 +34505,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -34422,7 +34557,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -34473,7 +34609,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 6s 14.5" } ] }, @@ -34528,7 +34665,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components/cronet/ios/test:cronet_test/" + "test_id_prefix": "ninja://components/cronet/ios/test:cronet_test/", + "variant_id": "iPhone X 15.2" } ] }, @@ -34586,7 +34724,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -34637,7 +34776,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -34688,7 +34828,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -34739,7 +34880,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -34790,7 +34932,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -34841,7 +34984,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -34892,7 +35036,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -34943,7 +35088,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -34994,7 +35140,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -35045,7 +35192,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -35096,7 +35244,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -35147,7 +35296,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -35198,7 +35348,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -35249,7 +35400,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -35300,7 +35452,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -35351,7 +35504,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -35402,7 +35556,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -35453,7 +35608,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -35504,7 +35660,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -35555,7 +35712,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -35606,7 +35764,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -35657,7 +35816,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -35708,7 +35868,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -35759,7 +35920,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -35810,7 +35972,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -35861,7 +36024,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -35912,7 +36076,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -35963,7 +36128,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -36014,7 +36180,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -36065,7 +36232,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -36116,7 +36284,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -36167,7 +36336,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -36218,7 +36388,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -36269,7 +36440,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -36321,7 +36493,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -36373,7 +36546,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -36425,7 +36599,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -36477,7 +36652,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -36529,7 +36705,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -36581,7 +36758,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -36634,7 +36812,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -36687,7 +36866,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -36740,7 +36920,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -36793,7 +36974,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -36846,7 +37028,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -36899,7 +37082,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -36952,7 +37136,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -37005,7 +37190,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -37058,7 +37244,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -37111,7 +37298,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -37164,7 +37352,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -37217,7 +37406,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -37270,7 +37460,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -37323,7 +37514,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -37376,7 +37568,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -37429,7 +37622,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -37482,7 +37676,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -37535,7 +37730,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -37587,7 +37783,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -37639,7 +37836,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -37691,7 +37889,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -37743,7 +37942,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -37795,7 +37995,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -37847,7 +38048,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -37900,7 +38102,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -37953,7 +38156,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -38006,7 +38210,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -38059,7 +38264,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -38112,7 +38318,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -38165,7 +38372,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -38216,7 +38424,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -38267,7 +38476,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -38318,7 +38528,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -38369,7 +38580,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -38420,7 +38632,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -38471,7 +38684,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -38522,7 +38736,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -38573,7 +38788,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -38625,7 +38841,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -38677,7 +38894,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -38729,7 +38947,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -38781,7 +39000,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -38833,7 +39053,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -38885,7 +39106,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -38936,7 +39158,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -38987,7 +39210,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -39039,7 +39263,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -39091,7 +39316,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -39142,7 +39368,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -39193,7 +39420,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -39245,7 +39473,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -39297,7 +39526,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -39349,7 +39579,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -39401,7 +39632,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -39453,7 +39685,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -39505,7 +39738,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -39556,7 +39790,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -39607,7 +39842,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -39658,7 +39894,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -39709,7 +39946,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -39760,7 +39998,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -39811,7 +40050,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -39862,7 +40102,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -39913,7 +40154,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -39964,7 +40206,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -40015,7 +40258,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -40067,7 +40311,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -40119,7 +40364,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -40171,7 +40417,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -40223,7 +40470,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -40275,7 +40523,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -40327,7 +40576,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -40378,7 +40628,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -40429,7 +40680,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -40480,7 +40732,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -40531,7 +40784,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -40582,7 +40836,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -40633,7 +40888,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -40684,7 +40940,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -40735,7 +40992,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -40786,7 +41044,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -40837,7 +41096,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -40888,7 +41148,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -40939,7 +41200,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -40990,7 +41252,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -41041,7 +41304,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -41092,7 +41356,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -41143,7 +41408,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -41194,7 +41460,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -41245,7 +41512,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -41296,7 +41564,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -41347,7 +41616,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41398,7 +41668,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -41449,7 +41720,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -41500,7 +41772,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -41551,7 +41824,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -41602,7 +41876,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -41653,7 +41928,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41704,7 +41980,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -41755,7 +42032,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -41806,7 +42084,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -41857,7 +42136,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -41908,7 +42188,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -41959,7 +42240,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -42010,7 +42292,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -42061,7 +42344,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -42112,7 +42396,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -42163,7 +42448,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -42214,7 +42500,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -42265,7 +42552,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -42316,7 +42604,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -42367,7 +42656,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -42418,7 +42708,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -42469,7 +42760,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -42520,7 +42812,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -42571,7 +42864,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -42622,7 +42916,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -42673,7 +42968,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -42724,7 +43020,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -42775,7 +43072,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 6s 15.2" } ] }, @@ -42833,7 +43131,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -42887,7 +43186,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -42941,7 +43241,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -42995,7 +43296,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -43049,7 +43351,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -43103,7 +43406,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -43157,7 +43461,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -43211,7 +43516,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -43265,7 +43571,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -43319,7 +43626,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -43373,7 +43681,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -43427,7 +43736,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -43481,7 +43791,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -43535,7 +43846,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -43589,7 +43901,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -43643,7 +43956,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -43697,7 +44011,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -43751,7 +44066,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -43805,7 +44121,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -43859,7 +44176,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -43913,7 +44231,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -43967,7 +44286,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -44021,7 +44341,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -44075,7 +44396,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -44129,7 +44451,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -44183,7 +44506,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -44237,7 +44561,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -44291,7 +44616,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -44345,7 +44671,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -44399,7 +44726,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -44453,7 +44781,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -44507,7 +44836,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -44561,7 +44891,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -44615,7 +44946,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -44670,7 +45002,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -44725,7 +45058,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -44780,7 +45114,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -44835,7 +45170,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -44890,7 +45226,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -44945,7 +45282,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -45001,7 +45339,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -45057,7 +45396,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -45113,7 +45453,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -45169,7 +45510,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -45225,7 +45567,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -45281,7 +45624,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -45337,7 +45681,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -45393,7 +45738,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -45449,7 +45795,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -45505,7 +45852,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -45561,7 +45909,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -45617,7 +45966,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -45673,7 +46023,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -45729,7 +46080,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -45785,7 +46137,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -45841,7 +46194,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -45897,7 +46251,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -45953,7 +46308,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -46008,7 +46364,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -46063,7 +46420,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -46118,7 +46476,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -46173,7 +46532,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -46228,7 +46588,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -46283,7 +46644,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -46339,7 +46701,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -46395,7 +46758,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -46451,7 +46815,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -46507,7 +46872,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -46563,7 +46929,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -46619,7 +46986,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -46673,7 +47041,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -46727,7 +47096,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -46781,7 +47151,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -46835,7 +47206,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -46889,7 +47261,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -46943,7 +47316,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -46997,7 +47371,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -47051,7 +47426,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -47106,7 +47482,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -47161,7 +47538,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -47216,7 +47594,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -47271,7 +47650,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -47326,7 +47706,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -47381,7 +47762,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -47435,7 +47817,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -47489,7 +47872,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -47544,7 +47928,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -47599,7 +47984,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -47653,7 +48039,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -47707,7 +48094,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -47762,7 +48150,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -47817,7 +48206,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -47872,7 +48262,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -47927,7 +48318,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -47982,7 +48374,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -48037,7 +48430,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -48091,7 +48485,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -48145,7 +48540,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -48199,7 +48595,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -48253,7 +48650,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -48307,7 +48705,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -48361,7 +48760,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -48415,7 +48815,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -48469,7 +48870,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -48523,7 +48925,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -48577,7 +48980,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -48632,7 +49036,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -48687,7 +49092,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -48742,7 +49148,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -48797,7 +49204,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -48852,7 +49260,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -48907,7 +49316,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -48961,7 +49371,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -49015,7 +49426,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -49069,7 +49481,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -49123,7 +49536,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -49177,7 +49591,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -49231,7 +49646,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -49285,7 +49701,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -49339,7 +49756,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -49393,7 +49811,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -49447,7 +49866,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -49501,7 +49921,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -49555,7 +49976,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -49609,7 +50031,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -49663,7 +50086,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -49717,7 +50141,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -49771,7 +50196,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -49825,7 +50251,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -49879,7 +50306,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -49933,7 +50361,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -49987,7 +50416,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -50041,7 +50471,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -50095,7 +50526,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -50149,7 +50581,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -50203,7 +50636,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -50257,7 +50691,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -50311,7 +50746,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -50365,7 +50801,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -50419,7 +50856,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -50473,7 +50911,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -50527,7 +50966,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -50581,7 +51021,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -50635,7 +51076,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -50689,7 +51131,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -50743,7 +51186,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -50797,7 +51241,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -50851,7 +51296,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -50905,7 +51351,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -50959,7 +51406,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -51013,7 +51461,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -51067,7 +51516,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -51121,7 +51571,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -51175,7 +51626,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -51229,7 +51681,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -51283,7 +51736,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -51337,7 +51791,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -51391,7 +51846,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -51445,7 +51901,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -51499,7 +51956,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 6s 15.2" } ] }, @@ -51554,7 +52012,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components/cronet/ios/test:cronet_test/" + "test_id_prefix": "ninja://components/cronet/ios/test:cronet_test/", + "variant_id": "iPhone X 15.2" } ] }, @@ -51609,7 +52068,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -51660,7 +52120,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -51711,7 +52172,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -51762,7 +52224,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -51813,7 +52276,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -51864,7 +52328,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -51915,7 +52380,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -51966,7 +52432,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52018,7 +52485,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52071,7 +52539,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52124,7 +52593,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52177,7 +52647,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52229,7 +52700,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52282,7 +52754,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52333,7 +52806,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52385,7 +52859,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52436,7 +52911,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52488,7 +52964,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52539,7 +53016,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52591,7 +53069,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52642,7 +53121,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52693,7 +53173,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52745,7 +53226,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52796,7 +53278,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52847,7 +53330,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52898,7 +53382,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -52949,7 +53434,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -53000,7 +53486,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -53051,7 +53538,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -53102,7 +53590,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -53153,7 +53642,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -53204,7 +53694,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPad Air 2 15.2" } ] }, @@ -53261,7 +53752,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -53314,7 +53806,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -53367,7 +53860,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -53420,7 +53914,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -53473,7 +53968,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -53526,7 +54022,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -53579,7 +54076,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -53632,7 +54130,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -53685,7 +54184,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -53738,7 +54238,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -53791,7 +54292,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -53844,7 +54346,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -53897,7 +54400,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -53950,7 +54454,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -54003,7 +54508,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -54056,7 +54562,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -54110,7 +54617,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -54164,7 +54672,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -54219,7 +54728,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -54274,7 +54784,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -54329,7 +54840,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -54384,7 +54896,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -54439,7 +54952,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -54494,7 +55008,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -54548,7 +55063,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -54602,7 +55118,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -54657,7 +55174,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -54712,7 +55230,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -54765,7 +55284,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -54818,7 +55338,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -54872,7 +55393,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -54926,7 +55448,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -54979,7 +55502,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -55032,7 +55556,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -55086,7 +55611,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -55140,7 +55666,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -55193,7 +55720,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -55246,7 +55774,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -55300,7 +55829,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -55354,7 +55884,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -55407,7 +55938,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -55460,7 +55992,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -55513,7 +56046,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -55566,7 +56100,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -55620,7 +56155,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -55674,7 +56210,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -55727,7 +56264,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -55780,7 +56318,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -55833,7 +56372,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -55886,7 +56426,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -55939,7 +56480,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -55992,7 +56534,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -56045,7 +56588,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -56098,7 +56642,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -56151,7 +56696,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -56204,7 +56750,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -56257,7 +56804,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -56310,7 +56858,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -56363,7 +56912,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -56416,7 +56966,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -56469,7 +57020,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -56522,7 +57074,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone X 15.0" }, { "args": [ @@ -56575,7 +57128,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPad Air 2 15.0" }, { "args": [ @@ -56628,7 +57182,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone X 15.0" } ] }, @@ -56686,7 +57241,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -56737,7 +57293,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -56788,7 +57345,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -56839,7 +57397,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -56890,7 +57449,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -56941,7 +57501,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -56992,7 +57553,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -57043,7 +57605,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -57094,7 +57657,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -57145,7 +57709,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -57196,7 +57761,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -57247,7 +57813,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -57298,7 +57865,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -57349,7 +57917,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -57400,7 +57969,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -57452,7 +58022,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad (6th generation) 14.5" }, { "args": [ @@ -57504,7 +58075,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air (3rd generation) 14.5" }, { "args": [ @@ -57556,7 +58128,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -57608,7 +58181,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -57661,7 +58235,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad (6th generation) 14.5" }, { "args": [ @@ -57714,7 +58289,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Pro (12.9-inch) (2nd generation) 14.5" }, { "args": [ @@ -57767,7 +58343,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -57820,7 +58397,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -57873,7 +58451,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad (6th generation) 14.5" }, { "args": [ @@ -57926,7 +58505,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air (3rd generation) 14.5" }, { "args": [ @@ -57979,7 +58559,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -58032,7 +58613,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -58085,7 +58667,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad (6th generation) 14.5" }, { "args": [ @@ -58138,7 +58721,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Pro (12.9-inch) (2nd generation) 14.5" }, { "args": [ @@ -58191,7 +58775,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -58244,7 +58829,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -58296,7 +58882,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad (6th generation) 14.5" }, { "args": [ @@ -58348,7 +58935,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air (3rd generation) 14.5" }, { "args": [ @@ -58400,7 +58988,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -58452,7 +59041,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -58505,7 +59095,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad (6th generation) 14.5" }, { "args": [ @@ -58558,7 +59149,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Pro (12.9-inch) (2nd generation) 14.5" }, { "args": [ @@ -58611,7 +59203,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -58664,7 +59257,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -58715,7 +59309,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -58766,7 +59361,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -58817,7 +59413,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -58869,7 +59466,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad (6th generation) 14.5" }, { "args": [ @@ -58921,7 +59519,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air (3rd generation) 14.5" }, { "args": [ @@ -58973,7 +59572,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -59025,7 +59625,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -59076,7 +59677,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -59128,7 +59730,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -59179,7 +59782,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -59231,7 +59835,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad (6th generation) 14.5" }, { "args": [ @@ -59283,7 +59888,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air (3rd generation) 14.5" }, { "args": [ @@ -59335,7 +59941,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -59387,7 +59994,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -59438,7 +60046,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -59489,7 +60098,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -59540,7 +60150,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -59591,7 +60202,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -59643,7 +60255,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad (6th generation) 14.5" }, { "args": [ @@ -59695,7 +60308,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Pro (12.9-inch) (2nd generation) 14.5" }, { "args": [ @@ -59747,7 +60361,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -59799,7 +60414,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -59850,7 +60466,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -59901,7 +60518,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -59952,7 +60570,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -60003,7 +60622,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -60054,7 +60674,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -60105,7 +60726,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -60156,7 +60778,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -60207,7 +60830,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -60258,7 +60882,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -60309,7 +60934,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -60360,7 +60986,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -60411,7 +61038,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -60462,7 +61090,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -60513,7 +61142,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -60564,7 +61194,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -60615,7 +61246,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -60666,7 +61298,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -60717,7 +61350,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -60768,7 +61402,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone X 14.5" } ] }, @@ -60831,7 +61466,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -60882,7 +61518,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -60933,7 +61570,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -60984,7 +61622,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -61035,7 +61674,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -61086,7 +61726,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -61137,7 +61778,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -61188,7 +61830,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -61239,7 +61882,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -61290,7 +61934,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -61341,7 +61986,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -61392,7 +62038,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -61443,7 +62090,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -61494,7 +62142,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -61545,7 +62194,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -61596,7 +62246,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -61647,7 +62298,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -61698,7 +62350,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -61749,7 +62402,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -61800,7 +62454,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -61851,7 +62506,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -61902,7 +62558,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -61953,7 +62610,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -62004,7 +62662,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -62055,7 +62714,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -62106,7 +62766,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -62157,7 +62818,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -62208,7 +62870,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -62259,7 +62922,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -62310,7 +62974,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -62361,7 +63026,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -62412,7 +63078,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -62463,7 +63130,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -62514,7 +63182,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -62565,7 +63234,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -62616,7 +63286,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -62668,7 +63339,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -62720,7 +63392,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -62772,7 +63445,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -62824,7 +63498,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -62876,7 +63551,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -62928,7 +63604,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -62981,7 +63658,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -63034,7 +63712,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -63087,7 +63766,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -63140,7 +63820,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -63193,7 +63874,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -63246,7 +63928,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -63299,7 +63982,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -63352,7 +64036,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -63405,7 +64090,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -63458,7 +64144,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -63511,7 +64198,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -63564,7 +64252,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -63617,7 +64306,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -63670,7 +64360,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -63723,7 +64414,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -63776,7 +64468,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -63829,7 +64522,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -63882,7 +64576,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -63934,7 +64629,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -63986,7 +64682,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -64038,7 +64735,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -64090,7 +64788,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -64142,7 +64841,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -64194,7 +64894,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -64247,7 +64948,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -64300,7 +65002,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -64353,7 +65056,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -64406,7 +65110,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -64459,7 +65164,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -64512,7 +65218,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -64563,7 +65270,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -64614,7 +65322,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -64665,7 +65374,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -64716,7 +65426,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -64767,7 +65478,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -64818,7 +65530,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -64869,7 +65582,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -64920,7 +65634,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -64972,7 +65687,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -65024,7 +65740,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -65076,7 +65793,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -65128,7 +65846,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -65180,7 +65899,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -65232,7 +65952,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -65283,7 +66004,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -65334,7 +66056,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -65386,7 +66109,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -65438,7 +66162,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -65489,7 +66214,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -65540,7 +66266,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -65592,7 +66319,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -65644,7 +66372,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -65696,7 +66425,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -65748,7 +66478,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -65800,7 +66531,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -65852,7 +66584,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -65904,7 +66637,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/swift_interop:ios_swift_interop_xcuitests_module/" + "test_id_prefix": "ninja://ios/chrome/test/swift_interop:ios_swift_interop_xcuitests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -65956,7 +66690,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/swift_interop:ios_swift_interop_xcuitests_module/" + "test_id_prefix": "ninja://ios/chrome/test/swift_interop:ios_swift_interop_xcuitests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -66007,7 +66742,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -66058,7 +66794,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -66109,7 +66846,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -66160,7 +66898,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -66211,7 +66950,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -66262,7 +67002,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -66313,7 +67054,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -66364,7 +67106,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -66415,7 +67158,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -66466,7 +67210,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -66518,7 +67263,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -66570,7 +67316,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -66622,7 +67369,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -66674,7 +67422,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -66726,7 +67475,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -66778,7 +67528,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -66829,7 +67580,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -66880,7 +67632,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -66931,7 +67684,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -66982,7 +67736,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -67033,7 +67788,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -67084,7 +67840,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -67135,7 +67892,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -67186,7 +67944,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -67237,7 +67996,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -67288,7 +68048,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -67339,7 +68100,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -67390,7 +68152,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -67441,7 +68204,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -67492,7 +68256,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -67543,7 +68308,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -67594,7 +68360,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -67645,7 +68412,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -67696,7 +68464,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -67747,7 +68516,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -67798,7 +68568,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -67849,7 +68620,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -67900,7 +68672,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -67951,7 +68724,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -68002,7 +68776,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -68053,7 +68828,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -68104,7 +68880,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -68155,7 +68932,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -68206,7 +68984,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -68257,7 +69036,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -68308,7 +69088,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -68359,7 +69140,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -68410,7 +69192,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -68461,7 +69244,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -68512,7 +69296,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -68563,7 +69348,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -68614,7 +69400,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -68665,7 +69452,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -68716,7 +69504,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -68767,7 +69556,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -68818,7 +69608,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -68869,7 +69660,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -68920,7 +69712,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -68971,7 +69764,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -69022,7 +69816,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -69073,7 +69868,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -69124,7 +69920,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -69175,7 +69972,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -69226,7 +70024,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 6s 15.4" } ] }, @@ -69289,7 +70088,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -69340,7 +70140,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -69391,7 +70192,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -69442,7 +70244,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -69493,7 +70296,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -69544,7 +70348,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -69595,7 +70400,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -69646,7 +70452,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -69697,7 +70504,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -69748,7 +70556,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -69799,7 +70608,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -69850,7 +70660,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -69901,7 +70712,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -69952,7 +70764,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -70003,7 +70816,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -70054,7 +70868,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -70105,7 +70920,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -70156,7 +70972,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -70207,7 +71024,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -70258,7 +71076,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -70309,7 +71128,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -70360,7 +71180,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -70411,7 +71232,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -70462,7 +71284,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -70513,7 +71336,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -70564,7 +71388,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -70615,7 +71440,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -70666,7 +71492,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -70717,7 +71544,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -70768,7 +71596,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -70819,7 +71648,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -70870,7 +71700,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -70921,7 +71752,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -70972,7 +71804,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -71023,7 +71856,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -71074,7 +71908,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -71126,7 +71961,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -71178,7 +72014,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -71230,7 +72067,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -71282,7 +72120,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -71334,7 +72173,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -71386,7 +72226,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -71439,7 +72280,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -71492,7 +72334,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -71545,7 +72388,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -71598,7 +72442,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -71651,7 +72496,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -71704,7 +72550,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -71757,7 +72604,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -71810,7 +72658,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -71863,7 +72712,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -71916,7 +72766,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -71969,7 +72820,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -72022,7 +72874,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -72075,7 +72928,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -72128,7 +72982,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -72181,7 +73036,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -72234,7 +73090,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -72287,7 +73144,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -72340,7 +73198,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -72392,7 +73251,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -72444,7 +73304,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -72496,7 +73357,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -72548,7 +73410,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -72600,7 +73463,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -72652,7 +73516,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -72705,7 +73570,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -72758,7 +73624,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -72811,7 +73678,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -72864,7 +73732,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -72917,7 +73786,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -72970,7 +73840,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -73021,7 +73892,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -73072,7 +73944,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -73123,7 +73996,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -73174,7 +74048,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -73225,7 +74100,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -73276,7 +74152,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -73327,7 +74204,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -73378,7 +74256,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -73430,7 +74309,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -73482,7 +74362,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -73534,7 +74415,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -73586,7 +74468,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -73638,7 +74521,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -73690,7 +74574,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -73741,7 +74626,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -73792,7 +74678,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -73844,7 +74731,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -73896,7 +74784,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -73947,7 +74836,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -73998,7 +74888,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -74050,7 +74941,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -74102,7 +74994,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -74154,7 +75047,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -74206,7 +75100,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -74258,7 +75153,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -74310,7 +75206,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -74361,7 +75258,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -74412,7 +75310,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -74463,7 +75362,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -74514,7 +75414,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -74565,7 +75466,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -74616,7 +75518,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -74667,7 +75570,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -74718,7 +75622,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -74769,7 +75674,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -74820,7 +75726,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -74872,7 +75779,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -74924,7 +75832,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -74976,7 +75885,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 7 14.5" }, { "args": [ @@ -75028,7 +75938,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 7 15.4" }, { "args": [ @@ -75080,7 +75991,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone X 14.5" }, { "args": [ @@ -75132,7 +76044,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone X 15.4" }, { "args": [ @@ -75183,7 +76096,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -75234,7 +76148,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -75285,7 +76200,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -75336,7 +76252,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -75387,7 +76304,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -75438,7 +76356,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -75489,7 +76408,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -75540,7 +76460,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -75591,7 +76512,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -75642,7 +76564,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -75693,7 +76616,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -75744,7 +76668,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -75795,7 +76720,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -75846,7 +76772,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -75897,7 +76824,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -75948,7 +76876,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -75999,7 +76928,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -76050,7 +76980,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -76101,7 +77032,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -76152,7 +77084,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -76203,7 +77136,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -76254,7 +77188,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -76305,7 +77240,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -76356,7 +77292,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -76407,7 +77344,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -76458,7 +77396,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -76509,7 +77448,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -76560,7 +77500,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -76611,7 +77552,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -76662,7 +77604,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -76713,7 +77656,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -76764,7 +77708,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -76815,7 +77760,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -76866,7 +77812,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -76917,7 +77864,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -76968,7 +77916,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -77019,7 +77968,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -77070,7 +78020,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -77121,7 +78072,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 14.5" }, { "args": [ @@ -77172,7 +78124,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 15.4" }, { "args": [ @@ -77223,7 +78176,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -77274,7 +78228,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s 15.4" }, { "args": [ @@ -77325,7 +78280,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s Plus 14.5" }, { "args": [ @@ -77376,7 +78332,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s Plus 15.4" }, { "args": [ @@ -77427,7 +78384,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone SE (1st generation) 14.5" }, { "args": [ @@ -77478,7 +78436,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone SE (1st generation) 15.4" }, { "args": [ @@ -77529,7 +78488,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 6s 14.5" }, { "args": [ @@ -77580,7 +78540,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 6s 15.4" } ] }, @@ -77625,7 +78586,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "aura_unittests", - "test_id_prefix": "ninja://ui/aura:aura_unittests/" + "test_id_prefix": "ninja://ui/aura:aura_unittests/", + "variant_id": "amd64-generic" }, { "args": [ @@ -77655,7 +78617,8 @@ "test_id_prefix": "ninja://ui/aura:aura_unittests/", "trigger_script": { "script": "//testing/trigger_scripts/chromeos_device_trigger.py" - } + }, + "variant_id": "eve" }, { "args": [ @@ -77683,7 +78646,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "cc_unittests", - "test_id_prefix": "ninja://cc:cc_unittests/" + "test_id_prefix": "ninja://cc:cc_unittests/", + "variant_id": "amd64-generic" }, { "args": [ @@ -77713,7 +78677,8 @@ "test_id_prefix": "ninja://cc:cc_unittests/", "trigger_script": { "script": "//testing/trigger_scripts/chromeos_device_trigger.py" - } + }, + "variant_id": "eve" }, { "args": [ @@ -77742,7 +78707,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_all_tast_tests_informational", - "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests_informational/" + "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests_informational/", + "variant_id": "amd64-generic" }, { "args": [ @@ -77773,7 +78739,8 @@ "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests_informational/", "trigger_script": { "script": "//testing/trigger_scripts/chromeos_device_trigger.py" - } + }, + "variant_id": "eve" }, { "args": [ @@ -77802,7 +78769,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_fyi_tast_tests", - "test_id_prefix": "ninja://chromeos/lacros:lacros_fyi_tast_tests/" + "test_id_prefix": "ninja://chromeos/lacros:lacros_fyi_tast_tests/", + "variant_id": "amd64-generic" }, { "args": [ @@ -77833,7 +78801,8 @@ "test_id_prefix": "ninja://chromeos/lacros:lacros_fyi_tast_tests/", "trigger_script": { "script": "//testing/trigger_scripts/chromeos_device_trigger.py" - } + }, + "variant_id": "eve" }, { "args": [ @@ -77861,7 +78830,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "ozone_unittests", - "test_id_prefix": "ninja://ui/ozone:ozone_unittests/" + "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", + "variant_id": "amd64-generic" }, { "args": [ @@ -77891,7 +78861,8 @@ "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", "trigger_script": { "script": "//testing/trigger_scripts/chromeos_device_trigger.py" - } + }, + "variant_id": "eve" } ] }, @@ -77909,7 +78880,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_fyi_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_fyi_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "OCTOPUS_FULL" }, { "args": [], @@ -77920,7 +78892,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_fyi_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_fyi_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "EVE_FULL" }, { "args": [], @@ -77930,7 +78903,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "OCTOPUS_FULL" }, { "args": [], @@ -77940,7 +78914,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "EVE_FULL" } ] }, @@ -86836,7 +87811,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 100.0.4896.133" }, { "args": [ @@ -86861,7 +87837,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 102.0.5005.22" }, { "args": [ @@ -86886,7 +87863,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 103.0.5030.0" }, { "args": [ @@ -86911,7 +87889,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 103.0.5044.0" }, { "args": [ @@ -86953,7 +87932,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 100.0.4896.133" }, { "args": [ @@ -86978,7 +87958,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 102.0.5005.22" }, { "args": [ @@ -87003,7 +87984,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 103.0.5030.0" }, { "args": [ @@ -87028,7 +88010,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 103.0.5044.0" }, { "isolate_profile_data": true, @@ -88335,7 +89318,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 100.0.4896.133" }, { "args": [ @@ -88365,7 +89349,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 102.0.5005.22" }, { "args": [ @@ -88395,7 +89380,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 103.0.5030.0" }, { "args": [ @@ -88425,7 +89411,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 103.0.5044.0" }, { "args": [ @@ -88477,7 +89464,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 100.0.4896.133" }, { "args": [ @@ -88507,7 +89495,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 102.0.5005.22" }, { "args": [ @@ -88537,7 +89526,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 103.0.5030.0" }, { "args": [ @@ -88567,7 +89557,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 103.0.5044.0" }, { "merge": { @@ -90032,7 +91023,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 100.0.4896.133" }, { "args": [ @@ -90062,7 +91054,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 102.0.5005.22" }, { "args": [ @@ -90092,7 +91085,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 103.0.5030.0" }, { "args": [ @@ -90122,7 +91116,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", + "variant_id": "Lacros version skew testing ash 103.0.5044.0" }, { "args": [ @@ -90174,7 +91169,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 100.0.4896.133" }, { "args": [ @@ -90204,7 +91200,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 102.0.5005.22" }, { "args": [ @@ -90234,7 +91231,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 103.0.5030.0" }, { "args": [ @@ -90264,7 +91262,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", - "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/" + "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", + "variant_id": "Lacros version skew testing ash 103.0.5044.0" }, { "merge": { @@ -90931,7 +91930,8 @@ "shards": 3 }, "test": "interactive_ui_tests", - "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/" + "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", + "variant_id": "Lacros version skew testing ash 100.0.4896.133" }, { "args": [ @@ -90961,7 +91961,8 @@ "shards": 3 }, "test": "interactive_ui_tests", - "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/" + "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", + "variant_id": "Lacros version skew testing ash 102.0.5005.22" }, { "args": [ @@ -90991,7 +91992,8 @@ "shards": 3 }, "test": "interactive_ui_tests", - "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/" + "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", + "variant_id": "Lacros version skew testing ash 103.0.5030.0" }, { "args": [ @@ -91021,7 +92023,8 @@ "shards": 3 }, "test": "interactive_ui_tests", - "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/" + "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", + "variant_id": "Lacros version skew testing ash 103.0.5044.0" } ] },
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json index 53808df1..73a4e6b 100644 --- a/testing/buildbot/chromium.mac.json +++ b/testing/buildbot/chromium.mac.json
@@ -12229,7 +12229,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -12281,7 +12282,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -12333,7 +12335,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -12385,7 +12388,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -12437,7 +12441,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -12489,7 +12494,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -12541,7 +12547,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -12593,7 +12600,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -12645,7 +12653,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -12697,7 +12706,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://base:base_unittests/" + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -12749,7 +12759,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -12801,7 +12812,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -12853,7 +12865,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -12905,7 +12918,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -12957,7 +12971,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -13009,7 +13024,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -13061,7 +13077,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -13113,7 +13130,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -13165,7 +13183,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -13217,7 +13236,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -13269,7 +13289,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -13321,7 +13342,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://components:components_unittests/" + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -13373,7 +13395,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -13425,7 +13448,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -13477,7 +13501,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -13529,7 +13554,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -13581,7 +13607,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -13633,7 +13660,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -13685,7 +13713,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -13737,7 +13766,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -13789,7 +13819,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -13841,7 +13872,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -13893,7 +13925,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -13945,7 +13978,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -13999,7 +14033,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -14053,7 +14088,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -14107,7 +14143,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -14161,7 +14198,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -14215,7 +14253,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -14269,7 +14308,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -14321,7 +14361,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -14373,7 +14414,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -14425,7 +14467,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -14477,7 +14520,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -14529,7 +14573,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -14581,7 +14626,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -14633,7 +14679,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -14685,7 +14732,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/" + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -14737,7 +14785,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -14789,7 +14838,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -14842,7 +14892,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -14895,7 +14946,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -14947,7 +14999,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -14999,7 +15052,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -15051,7 +15105,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -15103,7 +15158,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -15155,7 +15211,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -15207,7 +15264,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -15259,7 +15317,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -15311,7 +15370,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -15363,7 +15423,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -15415,7 +15476,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -15467,7 +15529,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -15519,7 +15582,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_inttests/" + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -15572,7 +15636,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -15625,7 +15690,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -15677,7 +15743,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -15729,7 +15796,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -15781,7 +15849,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -15833,7 +15902,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -15885,7 +15955,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -15937,7 +16008,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -15989,7 +16061,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -16041,7 +16114,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web:ios_web_unittests/" + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -16093,7 +16167,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -16145,7 +16220,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -16197,7 +16273,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -16249,7 +16326,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -16301,7 +16379,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -16353,7 +16432,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -16405,7 +16485,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -16457,7 +16538,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -16509,7 +16591,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -16561,7 +16644,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -16613,7 +16697,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -16665,7 +16750,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -16717,7 +16803,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -16769,7 +16856,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -16821,7 +16909,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -16873,7 +16962,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/" + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -16925,7 +17015,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -16977,7 +17068,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -17029,7 +17121,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -17081,7 +17174,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -17133,7 +17227,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -17185,7 +17280,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -17237,7 +17333,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -17289,7 +17386,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -17341,7 +17439,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -17393,7 +17492,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -17445,7 +17545,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -17497,7 +17598,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://skia:skia_unittests/" + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -17549,7 +17651,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -17601,7 +17704,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -17653,7 +17757,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -17705,7 +17810,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -17757,7 +17863,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -17809,7 +17916,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s 15.2" }, { "args": [ @@ -17861,7 +17969,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -17913,7 +18022,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 6s Plus 15.2" }, { "args": [ @@ -17965,7 +18075,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -18017,7 +18128,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone SE (1st generation) 15.2" }, { "args": [ @@ -18069,7 +18181,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -18121,7 +18234,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 6s 15.2" } ] }, @@ -18181,7 +18295,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -18234,7 +18349,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -18287,7 +18403,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -18340,7 +18457,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -18393,7 +18511,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -18446,7 +18565,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -18500,7 +18620,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -18554,7 +18675,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -18608,7 +18730,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -18662,7 +18785,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -18716,7 +18840,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -18770,7 +18895,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -18824,7 +18950,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -18878,7 +19005,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -18932,7 +19060,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -18986,7 +19115,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -19040,7 +19170,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -19094,7 +19225,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -19148,7 +19280,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -19202,7 +19335,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -19255,7 +19389,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -19308,7 +19443,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -19361,7 +19497,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -19414,7 +19551,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -19467,7 +19605,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -19520,7 +19659,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -19574,7 +19714,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -19628,7 +19769,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -19682,7 +19824,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -19736,7 +19879,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -19789,7 +19933,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -19842,7 +19987,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -19895,7 +20041,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -19948,7 +20095,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -20001,7 +20149,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -20054,7 +20203,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -20107,7 +20257,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -20160,7 +20311,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -20213,7 +20365,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -20266,7 +20419,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -20319,7 +20473,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone X 14.4" }, { "args": [ @@ -20372,7 +20527,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone X 15.2" }, { "args": [ @@ -20425,7 +20581,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -20478,7 +20635,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 15.2" }, { "args": [ @@ -20531,7 +20689,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -20584,7 +20743,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 7 15.2" } ] }, @@ -20642,7 +20802,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -20693,7 +20854,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -20744,7 +20906,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -20795,7 +20958,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://crypto:crypto_unittests/" + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -20846,7 +21010,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -20898,7 +21063,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -20951,7 +21117,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -21004,7 +21171,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -21057,7 +21225,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -21110,7 +21279,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -21163,7 +21333,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -21216,7 +21387,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -21269,7 +21441,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -21322,7 +21495,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -21375,7 +21549,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 5 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -21427,7 +21602,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -21480,7 +21656,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -21533,7 +21710,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -21586,7 +21764,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -21639,7 +21818,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 12 }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -21691,7 +21871,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/" + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -21742,7 +21923,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/components:ios_components_unittests/" + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -21794,7 +21976,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/crashpad/crashpad/test/ios:ios_crash_xcuitests_module/" + "test_id_prefix": "ninja://third_party/crashpad/crashpad/test/ios:ios_crash_xcuitests_module/", + "variant_id": "iPhone 7 14.4" }, { "args": [ @@ -21846,7 +22029,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://third_party/crashpad/crashpad/test/ios:ios_crash_xcuitests_module/" + "test_id_prefix": "ninja://third_party/crashpad/crashpad/test/ios:ios_crash_xcuitests_module/", + "variant_id": "iPhone 7 15.2" }, { "args": [ @@ -21898,7 +22082,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, - "test_id_prefix": "ninja://ios/net:ios_net_unittests/" + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -21949,7 +22134,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -22001,7 +22187,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/" + "test_id_prefix": "ninja://ios/showcase:ios_showcase_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -22052,7 +22239,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/" + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -22104,7 +22292,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPad Air 2 14.4" }, { "args": [ @@ -22156,7 +22345,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -22208,7 +22398,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 6s Plus 14.4" }, { "args": [ @@ -22260,7 +22451,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/" + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone SE (1st generation) 14.4" }, { "args": [ @@ -22311,7 +22503,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://net:net_unittests/" + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -22362,7 +22555,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://services:services_unittests/" + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -22413,7 +22607,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://sql:sql_unittests/" + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 6s 14.4" }, { "args": [ @@ -22464,7 +22659,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://url:url_unittests/" + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 6s 14.4" } ] },
diff --git a/testing/buildbot/chromium.webrtc.fyi.json b/testing/buildbot/chromium.webrtc.fyi.json index 2b23d99..d28089a 100644 --- a/testing/buildbot/chromium.webrtc.fyi.json +++ b/testing/buildbot/chromium.webrtc.fyi.json
@@ -611,7 +611,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPad Air (3rd generation) 14.5" }, { "args": [ @@ -662,7 +663,8 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/" + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone X 14.5" } ] }
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py index 78365d0..4d7c491 100755 --- a/testing/buildbot/generate_buildbot_json.py +++ b/testing/buildbot/generate_buildbot_json.py
@@ -438,6 +438,12 @@ return (tester_config.get('os_type') == 'win' and tester_config.get('browser_config') == 'release_x64') + def add_variant_to_test_name(self, test_name, variant_id): + return '{} {}'.format(test_name, variant_id) + + def remove_variant_from_test_name(self, test_name, variant_id): + return test_name.split(variant_id)[0].strip() + def get_exception_for_test(self, test_name, test_config): # gtests may have both "test" and "name" fields, and usually, if the "name" # field is specified, it means that the same test is being repurposed @@ -944,8 +950,15 @@ # (At least, this was true some time ago.) Continue to use this # naming convention for the time being to minimize changes. step_name = test_config.get('name', test_name) + variant_id = test_config.get('variant_id') + if variant_id: + step_name = self.remove_variant_from_test_name(step_name, variant_id) if not (step_name.endswith('test') or step_name.endswith('tests')): step_name = '%s_tests' % step_name + if variant_id: + step_name = self.add_variant_to_test_name(step_name, variant_id) + if 'name' in test_config: + test_config['name'] = step_name result = self.generate_isolated_script_test( waterfall, tester_name, tester_config, step_name, test_config) if not result: @@ -1219,8 +1232,15 @@ # The identifier is used to make the name of the test unique. # Generators in the recipe uniquely identify a test by it's name, so we # don't want to have the same name for each variant. - cloned_config['name'] = '{} {}'.format(test_name, - cloned_variant['identifier']) + cloned_config['name'] = self.add_variant_to_test_name( + cloned_config.get('name') or test_name, + cloned_variant['identifier']) + + # Attach the variant identifier to the test config so downstream + # generators can make modifications based on the original name. This + # is mainly used in generate_gpu_telemetry_test(). + cloned_config['variant_id'] = cloned_variant['identifier'] + definitions.append(cloned_config) test_suite[test_name] = definitions return test_suite
diff --git a/testing/buildbot/generate_buildbot_json_coveragetest.py b/testing/buildbot/generate_buildbot_json_coveragetest.py index fa4cb1d..57f3f713 100755 --- a/testing/buildbot/generate_buildbot_json_coveragetest.py +++ b/testing/buildbot/generate_buildbot_json_coveragetest.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env vpython3 # Copyright 2017 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/testing/buildbot/generate_buildbot_json_unittest.py b/testing/buildbot/generate_buildbot_json_unittest.py index 4ab619f4..af0195d 100755 --- a/testing/buildbot/generate_buildbot_json_unittest.py +++ b/testing/buildbot/generate_buildbot_json_unittest.py
@@ -513,6 +513,32 @@ ] """ +GPU_TELEMETRY_TEST_VARIANTS_WATERFALL = """\ +[ + { + 'project': 'chromium', + 'bucket': 'ci', + 'name': 'chromium.test', + 'machines': { + 'Fake Tester': { + 'os_type': 'win', + 'browser_config': 'release', + 'swarming': { + 'dimension_sets': [ + { + 'gpu': '8086:3e92-24.20.100.6286', + }, + ], + }, + 'test_suites': { + 'gpu_telemetry_tests': 'matrix_tests', + }, + }, + }, + }, +] +""" + UNKNOWN_TEST_SUITE_WATERFALL = """\ [ { @@ -1912,6 +1938,79 @@ } """ +GPU_TELEMETRY_TEST_VARIANTS_OUTPUT = """\ +{ + "AAAAA1 AUTOGENERATED FILE DO NOT EDIT": {}, + "AAAAA2 See generate_buildbot_json.py to make changes": {}, + "Fake Tester": { + "isolated_scripts": [ + { + "args": [ + "swarming_test", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", + "--platform", + "device", + "--version", + "1" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "swarming_test a_variant", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "8086:3e92-24.20.100.6286" + } + ], + "idempotent": false + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "a_variant" + }, + { + "args": [ + "swarming_test", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", + "a", + "b" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "swarming_test ab", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "8086:3e92-24.20.100.6286" + } + ], + "idempotent": false + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "ab" + } + ] + } +} +""" + ANDROID_WATERFALL_OUTPUT = """\ { "AAAAA1 AUTOGENERATED FILE DO NOT EDIT": {}, @@ -2820,6 +2919,19 @@ fbb.check_output_file_consistency(verbose=True) self.assertFalse(fbb.printed_lines) + def test_gpu_telemetry_tests_with_variants(self): + fbb = FakeBBGen(self.args, + GPU_TELEMETRY_TEST_VARIANTS_WATERFALL, + MATRIX_COMPOUND_MIXED_VARIANTS_REF, + LUCI_MILO_CFG, + exceptions=NO_BAR_TEST_EXCEPTIONS, + gn_isolate_map=GPU_TELEMETRY_GN_ISOLATE_MAP, + variants=MULTI_VARIANTS_FILE) + self.create_testing_buildbot_json_file('chromium.test.json', + GPU_TELEMETRY_TEST_VARIANTS_OUTPUT) + fbb.check_output_file_consistency(verbose=True) + self.assertFalse(fbb.printed_lines) + def test_intel_uhd_gpu_telemetry_tests(self): fbb = FakeBBGen(self.args, INTEL_UHD_GPU_TELEMETRY_TEST_WATERFALL, @@ -5839,7 +5951,8 @@ "swarming": { "can_use_on_swarming_builders": true }, - "test": "foo_test_apk" + "test": "foo_test_apk", + "variant_id": "a_variant" } ] } @@ -5865,7 +5978,8 @@ "swarming": { "can_use_on_swarming_builders": true }, - "test": "args_test" + "test": "args_test", + "variant_id": "args" }, { "args": [ @@ -5884,7 +5998,8 @@ } ] }, - "test": "args_test" + "test": "args_test", + "variant_id": "mixins" }, { "args": [ @@ -5904,7 +6019,8 @@ } ] }, - "test": "args_test" + "test": "args_test", + "variant_id": "swarming" } ] } @@ -5931,7 +6047,8 @@ "value": "test" }, "test": "mixins_test", - "value": "random" + "value": "random", + "variant_id": "args" }, { "args": [], @@ -5950,7 +6067,8 @@ "value": "test" }, "test": "mixins_test", - "value": "random" + "value": "random", + "variant_id": "mixins" }, { "args": [], @@ -5970,7 +6088,8 @@ "value": "test" }, "test": "mixins_test", - "value": "random" + "value": "random", + "variant_id": "swarming" } ] } @@ -6001,7 +6120,8 @@ ], "foo": "bar" }, - "test": "swarming_test" + "test": "swarming_test", + "variant_id": "args" }, { "args": [], @@ -6020,7 +6140,8 @@ ], "foo": "bar" }, - "test": "swarming_test" + "test": "swarming_test", + "variant_id": "mixins" }, { "args": [], @@ -6040,7 +6161,8 @@ ], "foo": "bar" }, - "test": "swarming_test" + "test": "swarming_test", + "variant_id": "swarming" } ] } @@ -6068,7 +6190,8 @@ "swarming": { "can_use_on_swarming_builders": true }, - "test": "swarming_test" + "test": "swarming_test", + "variant_id": "a_variant" } ] } @@ -6209,7 +6332,8 @@ "suite": "tast.basic", "swarming": {}, "test": "tast.basic", - "timeout": 3600 + "timeout": 3600, + "variant_id": "OCTOPUS_TOT" }, { "args": [], @@ -6219,7 +6343,8 @@ "suite": "tast.basic", "swarming": {}, "test": "tast.basic", - "timeout": 3600 + "timeout": 3600, + "variant_id": "OCTOPUS_TOT-1" } ] } @@ -6240,7 +6365,8 @@ "suite": "tast.basic", "swarming": {}, "test": "tast.basic", - "timeout": 3600 + "timeout": 3600, + "variant_id": "OCTOPUS_TOT" } ] }
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 9f8f25ee..c486d65a 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -1163,6 +1163,13 @@ "label": "//build/lacros:lacros_version_metadata", "type": "additional_compile_target", }, + "lacros_variations_tast_tests" : { + "label": "//chromeos/lacros:lacros_variations_tast_tests", + "type": "generated_script", + "args": [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], + }, "latency_unittests": { "label": "//ui/latency:latency_unittests", "type": "console_test_launcher",
diff --git a/testing/buildbot/internal.chromeos.fyi.json b/testing/buildbot/internal.chromeos.fyi.json index 7319b880..f45dcaa 100644 --- a/testing/buildbot/internal.chromeos.fyi.json +++ b/testing/buildbot/internal.chromeos.fyi.json
@@ -1132,7 +1132,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_fyi_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_fyi_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "OCTOPUS_RELEASE_LKGM" }, { "args": [], @@ -1143,7 +1144,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_fyi_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_fyi_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "OCTOPUS_RELEASE_DEV" }, { "args": [], @@ -1154,7 +1156,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_fyi_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_fyi_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "OCTOPUS_RELEASE_BETA" }, { "args": [], @@ -1165,7 +1168,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_fyi_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_fyi_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "OCTOPUS_RELEASE_STABLE" }, { "args": [], @@ -1175,7 +1179,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "OCTOPUS_RELEASE_LKGM" }, { "args": [], @@ -1185,7 +1190,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "OCTOPUS_RELEASE_DEV" }, { "args": [], @@ -1195,7 +1201,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "OCTOPUS_RELEASE_BETA" }, { "args": [], @@ -1205,7 +1212,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "OCTOPUS_RELEASE_STABLE" } ] }, @@ -1224,7 +1232,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "STRONGBAD_RELEASE_LKGM" }, { "args": [], @@ -1235,7 +1244,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "strongbad_RELEASE_DEV" }, { "args": [], @@ -1246,7 +1256,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "STRONGBAD_RELEASE_BETA" }, { "args": [], @@ -1257,7 +1268,8 @@ "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", "test": "lacros_all_tast_tests", "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "timeout_sec": 10800 + "timeout_sec": 10800, + "variant_id": "STRONGBAD_RELEASE_STABLE" }, { "args": [], @@ -1267,7 +1279,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "STRONGBAD_RELEASE_LKGM" }, { "args": [], @@ -1277,7 +1290,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "strongbad_RELEASE_DEV" }, { "args": [], @@ -1287,7 +1301,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "STRONGBAD_RELEASE_BETA" }, { "args": [], @@ -1297,7 +1312,8 @@ "swarming": {}, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "STRONGBAD_RELEASE_STABLE" }, { "args": [], @@ -1307,7 +1323,8 @@ "swarming": {}, "test": "viz_unittests", "test_id_prefix": "ninja://components/viz:viz_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "STRONGBAD_RELEASE_LKGM" }, { "args": [], @@ -1317,7 +1334,8 @@ "swarming": {}, "test": "viz_unittests", "test_id_prefix": "ninja://components/viz:viz_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "strongbad_RELEASE_DEV" }, { "args": [], @@ -1327,7 +1345,8 @@ "swarming": {}, "test": "viz_unittests", "test_id_prefix": "ninja://components/viz:viz_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "STRONGBAD_RELEASE_BETA" }, { "args": [], @@ -1337,7 +1356,8 @@ "swarming": {}, "test": "viz_unittests", "test_id_prefix": "ninja://components/viz:viz_unittests/", - "timeout_sec": 3600 + "timeout_sec": 3600, + "variant_id": "STRONGBAD_RELEASE_STABLE" } ] }
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 4b24c854..2473ff0 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -4074,6 +4074,18 @@ }, }, + 'lacros_variations_tast_tests': { + 'lacros_variations_tast_tests': { + 'swarming': { + 'idempotent': False, # https://crbug.com/923426#c27 + }, + 'resultdb': { + 'enable': True, + }, + 'experiment_percentage': 100, + }, + }, + 'layout_ng_gtests': { 'webkit_unit_tests_ng': { 'args': [ @@ -7442,14 +7454,6 @@ }, }, - 'lacros_all_tast_tests_eve': { - 'lacros_all_tast_tests': { - 'variants': [ - 'LACROS_EVE', - ] - }, - }, - 'lacros_amd64_generic_rel_skylab_fyi': { 'lacros_skylab_poc': { 'variants': [ @@ -7459,6 +7463,19 @@ }, }, + 'lacros_device_or_vm_tast_tests': { + 'lacros_all_tast_tests': { + 'variants': [ + 'LACROS_EVE', + ] + }, + 'lacros_variations_tast_tests': { + 'variants': [ + 'LACROS_AMD64_GENERIC', + ] + }, + }, + 'lacros_device_or_vm_tests': { 'lacros_all_tast_tests': { 'variants': [
diff --git a/testing/buildbot/tryserver.chromium.linux.json b/testing/buildbot/tryserver.chromium.linux.json index 5f8ead2..1cb25d3 100644 --- a/testing/buildbot/tryserver.chromium.linux.json +++ b/testing/buildbot/tryserver.chromium.linux.json
@@ -180,7 +180,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "gles2_conform_test", - "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/" + "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/", + "variant_id": "GTX 1660" }, { "args": [ @@ -203,7 +204,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "gles2_conform_test", - "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/" + "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/", + "variant_id": "HD 630" } ], "isolated_scripts": [ @@ -225,7 +227,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "info_collection GTX 1660", + "name": "info_collection_tests GTX 1660", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -243,7 +245,8 @@ "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "GTX 1660" }, { "args": [ @@ -263,7 +266,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "info_collection HD 630", + "name": "info_collection_tests HD 630", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -281,7 +284,8 @@ "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "HD 630" }, { "args": [ @@ -297,7 +301,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "mediapipe_passthrough GTX 1660", + "name": "mediapipe_passthrough_tests GTX 1660", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -315,7 +319,8 @@ "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "GTX 1660" }, { "args": [ @@ -331,7 +336,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "mediapipe_passthrough HD 630", + "name": "mediapipe_passthrough_tests HD 630", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -349,7 +354,8 @@ "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "HD 630" }, { "args": [ @@ -383,7 +389,8 @@ "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "GTX 1660" }, { "args": [ @@ -417,7 +424,8 @@ "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "HD 630" }, { "args": [ @@ -433,7 +441,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "webcodecs GTX 1660", + "name": "webcodecs_tests GTX 1660", "should_retry_with_patch": false, "swarming": { "can_use_on_swarming_builders": true, @@ -447,7 +455,8 @@ "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "GTX 1660" }, { "args": [ @@ -463,7 +472,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "webcodecs HD 630", + "name": "webcodecs_tests HD 630", "should_retry_with_patch": false, "swarming": { "can_use_on_swarming_builders": true, @@ -477,7 +486,8 @@ "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "HD 630" }, { "args": [ @@ -514,7 +524,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 20 }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "GTX 1660" }, { "args": [ @@ -551,7 +562,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 20 }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "HD 630" }, { "args": [ @@ -568,7 +580,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "webgl_conformance_gl_passthrough GTX 1660", + "name": "webgl_conformance_gl_passthrough_tests GTX 1660", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -587,7 +599,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 2 }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "GTX 1660" }, { "args": [ @@ -604,7 +617,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "webgl_conformance_gl_passthrough HD 630", + "name": "webgl_conformance_gl_passthrough_tests HD 630", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -623,7 +636,8 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 2 }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "HD 630" } ] }
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 61be02c..0d5b6d7 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -214,7 +214,7 @@ 'has_native_resultdb_integration', ], 'test_suites': { - 'gtest_tests': 'lacros_all_tast_tests_eve', + 'gtest_tests': 'lacros_device_or_vm_tast_tests', 'isolated_scripts': 'chrome_sizes', }, 'os_type': 'chromeos', @@ -600,7 +600,8 @@ 'junit_tests': 'chromium_junit_tests', }, }, - 'Android arm64 Builder (dbg)': { + 'Android arm64 Builder (dbg)': {}, + 'Android arm64 Builder All Targets (dbg)': { 'additional_compile_targets': [ 'all', ], @@ -2936,16 +2937,6 @@ }, 'use_swarming': False, }, - 'Win ASan Release (reclient shadow)': { - 'additional_compile_targets': [ - 'chromium_builder_asan', - ], - }, - 'Win ASan Release Media (reclient shadow)': { - 'additional_compile_targets': [ - 'chromium_builder_asan', - ], - }, 'Win x64 Builder (reclient compare)': { # Copied from # https://source.chromium.org/chromium/chromium/src/+/7b147a6777cb32d6a12e1716c61a0ed50dc1229a:testing/buildbot/waterfalls.pyl;l=6023-6030
diff --git a/testing/scripts/run_finch_smoke_tests_android.py b/testing/scripts/run_finch_smoke_tests_android.py index cd12b7e..cce1cb6 100755 --- a/testing/scripts/run_finch_smoke_tests_android.py +++ b/testing/scripts/run_finch_smoke_tests_android.py
@@ -99,7 +99,6 @@ self.options.browser_apk) self.browser_activity_name = (self.options.browser_activity_name or self.default_browser_activity_name) - self.log_mon = None self.layout_test_results_subdir = None self.test_specific_browser_args = [] if self.options.webview_provider_apk: @@ -156,13 +155,6 @@ # Run below commands to ensure that the device can download a seed self._device.adb.Emu(['power', 'ac', 'on']) self._device.RunShellCommand(['svc', 'wifi', 'enable']) - self.log_mon = logcat_monitor.LogcatMonitor( - self._device.adb, - output_file=os.path.join( - os.path.dirname(self.options.isolated_script_test_output), - '%s_finch_smoke_tests_logcat.txt' % self.product_name()), - filter_specs=LOGCAT_FILTERS) - self.log_mon.Start() self._skia_gold_tmp_dir = tempfile.mkdtemp() self._skia_gold_session_manager = ( finch_skia_gold_session_manager.FinchSkiaGoldSessionManager( @@ -174,7 +166,6 @@ if self._skia_gold_tmp_dir: shutil.rmtree(self._skia_gold_tmp_dir) self._skia_gold_tmp_dir = None - self.log_mon.Stop() @property def rest_args(self):
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 2d0055ad..dd33075 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -3636,27 +3636,6 @@ ] } ], - "HappinessTrackingSystemEnt": [ - { - "platforms": [ - "chromeos" - ], - "experiments": [ - { - "name": "Enabled", - "params": { - "prob": "0.01", - "survey_cycle_length": "7", - "survey_start_date_ms": "1641024000000", - "trigger_id": "yBY8rziNW0jBnuKU19R0UdAcCDpC" - }, - "enable_features": [ - "HappinessTrackingSystemEnt" - ] - } - ] - } - ], "HappinessTrackingSystemPerformance": [ { "platforms": [ @@ -3678,27 +3657,6 @@ ] } ], - "HappinessTrackingSystemStability": [ - { - "platforms": [ - "chromeos" - ], - "experiments": [ - { - "name": "Enabled", - "params": { - "prob": "0.001", - "survey_cycle_length": "7", - "survey_start_date_ms": "1641024000000", - "trigger_id": "d6XgkEBLK0jBnuKU19R0VEK7mCc9" - }, - "enable_features": [ - "HappinessTrackingSystemStability" - ] - } - ] - } - ], "HardwareToolbar": [ { "platforms": [ @@ -4842,24 +4800,6 @@ ] } ], - "NetworkServiceUsesDisplayThreadPriority": [ - { - "platforms": [ - "linux", - "mac", - "windows", - "chromeos" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "NetworkServiceUsesDisplayThreadPriority" - ] - } - ] - } - ], "NeuralPalmRejectionModelV2AndAdaptiveHold": [ { "platforms": [ @@ -7679,6 +7619,23 @@ ] } ], + "UseRealColorSpaceForAndroidVideo": [ + { + "platforms": [ + "android", + "android_weblayer" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "UseRealColorSpaceForAndroidVideo", + "UseRealVideoColorSpaceForDisplay" + ] + } + ] + } + ], "UseSkiaRenderer": [ { "platforms": [
diff --git a/third_party/androidx/fetch_all_androidx.py b/third_party/androidx/fetch_all_androidx.py index 94c416a..20dd629a4 100755 --- a/third_party/androidx/fetch_all_androidx.py +++ b/third_party/androidx/fetch_all_androidx.py
@@ -137,8 +137,17 @@ build_info_dict = json.loads(f.read()) dir_list = build_info_dict['target']['dir_list'] - dependency_version_map = _parse_dir_list(dir_list) - return (dependency_version_map, version) + return dir_list, version + + +def _create_local_dir_list(repo_path): + repo_path = repo_path.rstrip('/') + prefix_len = len(repo_path) + 1 + ret = [] + for dirpath, _, filenames in os.walk(repo_path): + for name in filenames: + ret.append(os.path.join('repository', dirpath[prefix_len:], name)) + return ret def _process_build_gradle(dependency_version_map, androidx_repository_url): @@ -210,6 +219,9 @@ default=0, action='count', help='Verbose level (multiple times for more)') + parser.add_argument('--local-repo', + help='Path to a locally androidx maven repo to use ' + 'instead of fetching the latest.') args = parser.parse_args() logging.basicConfig( @@ -217,11 +229,8 @@ format='%(levelname).1s %(relativeCreated)6d %(message)s') libs_dir = os.path.join(_ANDROIDX_PATH, 'libs') - - # Let recipe delete contents of lib directory because it has API to retry - # directory deletion if the first deletion attempt does not work. - if os.path.exists(libs_dir) and os.listdir(libs_dir): - raise Exception('Recipe did not empty \'libs\' directory.') + if os.path.exists(libs_dir): + shutil.rmtree(libs_dir) # Files uploaded to cipd are read-only. Delete them because they will be # re-generated. @@ -232,8 +241,16 @@ os.path.join(_ANDROIDX_PATH, 'build.gradle'), ]) - dependency_version_map, version = _download_and_parse_build_info() - androidx_snapshot_repository_url = _build_snapshot_repository_url(version) + if args.local_repo: + version = 'local' + dir_list = _create_local_dir_list(args.local_repo) + androidx_snapshot_repository_url = ('file://' + + os.path.abspath(args.local_repo)) + else: + dir_list, version = _download_and_parse_build_info() + androidx_snapshot_repository_url = _build_snapshot_repository_url( + version) + dependency_version_map = _parse_dir_list(dir_list) _process_build_gradle(dependency_version_map, androidx_snapshot_repository_url) @@ -243,15 +260,16 @@ ] subprocess.run(fetch_all_cmd, check=True) - # Prepend '0' to version to avoid conflicts with previous version format. - version = 'cr-0' + version + if not args.local_repo: + # Prepend '0' to version to avoid conflicts with previous version format. + version = 'cr-0' + version - version_txt_path = os.path.join(_ANDROIDX_PATH, 'VERSION.txt') - with open(version_txt_path, 'w') as f: - f.write(version) + version_txt_path = os.path.join(_ANDROIDX_PATH, 'VERSION.txt') + with open(version_txt_path, 'w') as f: + f.write(version) - yaml_path = os.path.join(_ANDROIDX_PATH, 'cipd.yaml') - _write_cipd_yaml(libs_dir, version, yaml_path) + yaml_path = os.path.join(_ANDROIDX_PATH, 'cipd.yaml') + _write_cipd_yaml(libs_dir, version, yaml_path) if __name__ == '__main__':
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc index 345047b..bf687ff3 100644 --- a/third_party/blink/renderer/core/animation/animation.cc +++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -2213,6 +2213,10 @@ !compositor_state_->start_time || !start_time_) { compositor_pending_ = true; document_->GetPendingAnimations().Add(this); + // Determine if we need to reset the cached state of a background color + // animation to force Paint to re-evaluate whether the background should be + // painted via a paint worklet. + UpdateCompositedPaintStatus(); } } @@ -2546,6 +2550,7 @@ pending_play_ = false; SetHoldTimeAndPhase(pause_time, TimelinePhase::kActive); start_time_ = absl::nullopt; + UpdateCompositedPaintStatus(); } void Animation::SetEffectSuppressed(bool suppressed) { @@ -2851,6 +2856,30 @@ return is_in_display_locked_subtree_; } +void Animation::UpdateCompositedPaintStatus() { + if (!RuntimeEnabledFeatures::CompositeBGColorAnimationEnabled()) + return; + + KeyframeEffect* keyframe_effect = DynamicTo<KeyframeEffect>(content_.Get()); + if (!keyframe_effect) + return; + + if (!keyframe_effect->Affects( + PropertyHandle(GetCSSPropertyBackgroundColor()))) { + return; + } + + Element* target = keyframe_effect->EffectTarget(); + if (!target) + return; + + ElementAnimations* element_animations = target->GetElementAnimations(); + DCHECK(element_animations); + + element_animations->SetCompositedBackgroundColorStatus( + ElementAnimations::CompositedPaintStatus::kNeedsRepaintOrNoAnimation); +} + void Animation::Trace(Visitor* visitor) const { visitor->Trace(content_); visitor->Trace(document_);
diff --git a/third_party/blink/renderer/core/animation/animation.h b/third_party/blink/renderer/core/animation/animation.h index f55f534..78c0ce7f 100644 --- a/third_party/blink/renderer/core/animation/animation.h +++ b/third_party/blink/renderer/core/animation/animation.h
@@ -410,6 +410,15 @@ // Tracking the state of animations in dev tools. void NotifyProbe(); + // Reset the cached value for the status of a possible background color + // animation if required. Any time an animation affecting background color + // changes we need to reset the flag so that Paint can make a fresh + // compositing decision and create a fresh paint worklet image from the + // keyframes. + // TODO(crbug.com/1310961): Investigate if we need a similar fix for + // non-native paint worklets. + void UpdateCompositedPaintStatus(); + String id_; // Extended play state reported to dev tools. This play state has an
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.cc b/third_party/blink/renderer/core/animation/compositor_animations.cc index ab70db0..a752da79 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations.cc +++ b/third_party/blink/renderer/core/animation/compositor_animations.cc
@@ -251,13 +251,11 @@ const auto& keyframe_effect = To<KeyframeEffectModelBase>(effect); LayoutObject* layout_object = target_element.GetLayoutObject(); - if (paint_artifact_compositor) { - // Elements with subtrees containing will-change: contents are not - // composited for animations as if the contents change the tiles - // would need to be rerastered anyways. - if (layout_object && layout_object->Style()->SubtreeWillChangeContents()) { - reasons |= kTargetHasInvalidCompositingState; - } + // Elements with subtrees containing will-change: contents are not + // composited for animations as if the contents change the tiles + // would need to be rerastered anyways. + if (layout_object && layout_object->Style()->SubtreeWillChangeContents()) { + reasons |= kTargetHasInvalidCompositingState; } PropertyHandleSet properties = keyframe_effect.Properties(); @@ -441,6 +439,15 @@ if (CompositorPropertyAnimationsHaveNoEffect(target_element, effect, paint_artifact_compositor)) { +#if DCHECK_IS_ON() + if (effect.Affects(PropertyHandle(GetCSSPropertyBackgroundColor()))) { + ElementAnimations* element_animations = + target_element.GetElementAnimations(); + DCHECK(element_animations && + element_animations->CompositedBackgroundColorStatus() != + ElementAnimations::CompositedPaintStatus::kComposited); + } +#endif reasons |= kCompositorPropertyAnimationsHaveNoEffect; }
diff --git a/third_party/blink/renderer/core/animation/element_animations.cc b/third_party/blink/renderer/core/animation/element_animations.cc index ec433bb..4ca0299e 100644 --- a/third_party/blink/renderer/core/animation/element_animations.cc +++ b/third_party/blink/renderer/core/animation/element_animations.cc
@@ -36,7 +36,7 @@ namespace blink { -ElementAnimations::ElementAnimations() : animation_style_change_(false) {} +ElementAnimations::ElementAnimations() = default; ElementAnimations::~ElementAnimations() = default;
diff --git a/third_party/blink/renderer/core/animation/element_animations.h b/third_party/blink/renderer/core/animation/element_animations.h index 4d2281c..90f4261 100644 --- a/third_party/blink/renderer/core/animation/element_animations.h +++ b/third_party/blink/renderer/core/animation/element_animations.h
@@ -57,6 +57,29 @@ ElementAnimations& operator=(const ElementAnimations&) = delete; ~ElementAnimations(); + enum class CompositedPaintStatus { + // Either no animation is running that affects the target property, or a + // fresh compositing decision is required for an animated property. + // Any style change for the corresponding property requires paint + // invalidation. Even if rendered by a composited animation, we need to + // trigger repaint in order to set up a worklet paint image. If the property + // is animated, paint will decide if the animation is composited and will + // update the status accordingly. + kNeedsRepaintOrNoAnimation, + + // An animation is affecting the target property, but it is not being + // composited. Paint can short-circuit setting up a worklet paint image + // since it is not required. Any style change affecting the target property + // requires repaint, but no new compositing decision. + kNotComposited, + + // An animation affecting the target property is being rendered on the + // compositor. Though repaint won't get triggered by a change to the + // property, it can still be triggered for other reasons, in which case a + // worklet paint image must be generated. + kComposited + }; + // Animations that are currently active for this element, their effects will // be applied during a style recalc. CSS Transitions are included in this // stack. @@ -88,6 +111,16 @@ bool UpdateBoxSizeAndCheckTransformAxisAlignment(const gfx::SizeF& box_size); bool IsIdentityOrTranslation() const; + // TODO(crbug.com/1301961): Consider converting to an array or flat map of + // fields for paint properties that can be composited. + CompositedPaintStatus CompositedBackgroundColorStatus() { + return composited_background_color_status; + } + + void SetCompositedBackgroundColorStatus(CompositedPaintStatus status) { + composited_background_color_status = status; + } + void Trace(Visitor*) const; private: @@ -104,7 +137,12 @@ // applying only the animation changes on top of it. // // See also StyleBaseData. - bool animation_style_change_; + bool animation_style_change_ = false; + + // The decision of whether to composite a background color animation needs to + // be made at Paint time and respected by the compositor. + CompositedPaintStatus composited_background_color_status = + CompositedPaintStatus::kNeedsRepaintOrNoAnimation; FRIEND_TEST_ALL_PREFIXES(StyleEngineTest, PseudoElementBaseComputedStyle); };
diff --git a/third_party/blink/renderer/core/frame/frame.cc b/third_party/blink/renderer/core/frame/frame.cc index b1d7ed5b..095837b 100644 --- a/third_party/blink/renderer/core/frame/frame.cc +++ b/third_party/blink/renderer/core/frame/frame.cc
@@ -639,11 +639,10 @@ // TODO(crbug.com/1123606): Remove this once we use MPArch as the underlying // fenced frames implementation, instead of the // `FencedFrameShadowDOMDelegate`. - if (frame_tree_boundary == FrameTreeBoundary::kFenced && - RuntimeEnabledFeatures::FencedFramesEnabledByRuntimeFlag() && - features::kFencedFramesImplementationTypeParam.Get() == - features::FencedFramesImplementationType::kShadowDOM && - Owner() && Owner()->GetFramePolicy().is_fenced) { + if (frame_tree_boundary == FrameTreeBoundary::kFenced && Owner() && + Owner()->GetFramePolicy().is_fenced && + features::IsFencedFramesEnabled() && + features::IsFencedFramesShadowDOMBased()) { return nullptr; }
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index 50f90a3..6dcb901 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -195,6 +195,48 @@ return true; } +bool HasNativeBackgroundPainter(Node* node) { + if (!RuntimeEnabledFeatures::CompositeBGColorAnimationEnabled()) + return false; + + Element* element = DynamicTo<Element>(node); + if (!element) + return false; + + ElementAnimations* element_animations = element->GetElementAnimations(); + if (!element_animations) + return false; + + return element_animations->CompositedBackgroundColorStatus() == + ElementAnimations::CompositedPaintStatus::kComposited; +} + +StyleDifference AdjustForBackgroundColorPaint( + scoped_refptr<const ComputedStyle> old_style, + scoped_refptr<const ComputedStyle> new_style, + Node* node, + StyleDifference diff) { + // Background color changes that are triggered by animations on the compositor + // thread can skip paint invalidation. + bool had_background_color_animation = + old_style ? old_style->HasCurrentBackgroundColorAnimation() : false; + DCHECK(new_style); + bool has_background_color_animation = + new_style->HasCurrentBackgroundColorAnimation(); + // If animation status changed, we need a paint invalidation regardless of + // whether the background color changed. + if (RuntimeEnabledFeatures::CompositeBGColorAnimationEnabled() && + (had_background_color_animation != has_background_color_animation)) + diff.SetNeedsPaintInvalidation(); + + bool skip_background_color_paint_invalidation = + !diff.BackgroundColorChanged() || HasNativeBackgroundPainter(node); + if (!skip_background_color_paint_invalidation) + diff.SetNeedsPaintInvalidation(); + + return diff; +} + } // namespace static int g_allow_destroying_layout_object_in_finalizer = 0; @@ -2560,6 +2602,10 @@ diff = AdjustStyleDifference(diff); + // A change to the background color or status of BG color animation may + // require paint invalidation. + diff = AdjustForBackgroundColorPaint(style_, style, GetNode(), diff); + StyleWillChange(diff, *style); scoped_refptr<const ComputedStyle> old_style = std::move(style_); @@ -3096,6 +3142,8 @@ if (const auto* new_first_line_style = FirstLineStyleWithoutFallback()) { diff = old_first_line_style->VisualInvalidationDiff( GetDocument(), *new_first_line_style); + diff = AdjustForBackgroundColorPaint( + old_first_line_style, new_first_line_style, GetNode(), diff); has_diff = true; } }
diff --git a/third_party/blink/renderer/core/layout/layout_shift_tracker.cc b/third_party/blink/renderer/core/layout/layout_shift_tracker.cc index 9f17aab..3a6f535 100644 --- a/third_party/blink/renderer/core/layout/layout_shift_tracker.cc +++ b/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
@@ -350,7 +350,7 @@ LocalFrame& frame = frame_view_->GetFrame(); if (ShouldLog(frame)) { - VLOG(1) << "in " << (frame.IsMainFrame() ? "" : "subframe ") + VLOG(1) << "in " << (frame.IsOutermostMainFrame() ? "" : "subframe ") << frame.GetDocument()->Url() << ", " << object << " moved from " << old_rect_in_root.ToString() << " to " << new_rect_in_root.ToString() << " (visible from " @@ -532,7 +532,7 @@ LocalFrame& frame = frame_view_->GetFrame(); if (ShouldLog(frame)) { - VLOG(1) << "in " << (frame.IsMainFrame() ? "" : "subframe ") + VLOG(1) << "in " << (frame.IsOutermostMainFrame() ? "" : "subframe ") << frame.GetDocument()->Url() << ", viewport was " << (impact_fraction * 100) << "% impacted with distance fraction " << move_distance_factor << " and subframe weighting factor " @@ -611,7 +611,7 @@ "frame", ToTraceValue(&frame)); if (ShouldLog(frame)) { - VLOG(1) << "in " << (frame.IsMainFrame() ? "" : "subframe ") + VLOG(1) << "in " << (frame.IsOutermostMainFrame() ? "" : "subframe ") << frame.GetDocument()->Url().GetString() << ", layout shift of " << score_delta << (had_recent_input ? " excluded by recent input" : " reported")
diff --git a/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc b/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc index 2082e437..8eb4c5442 100644 --- a/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc +++ b/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc
@@ -77,16 +77,71 @@ <a id='anchor1' href='about:blank'>example</a> <script> const a = document.getElementById('anchor1'); - var event = new PointerEvent('pointerdown'); + var event = new PointerEvent('pointerdown', {isPrimary: true}); a.dispatchEvent(event); </script> )HTML"); base::RunLoop().RunUntilIdle(); - absl::optional<KURL> expected_null_url = absl::nullopt; EXPECT_EQ(1u, hosts_.size()); absl::optional<KURL> url_received = hosts_[0]->url_received_; EXPECT_FALSE(url_received.has_value()); - EXPECT_EQ(expected_null_url, url_received); +} + +TEST_F(AnchorElementInteractionTest, NonPointerEventType) { + String source("https://example.com/p1"); + SimRequest main_resource(source, "text/html"); + LoadURL(source); + main_resource.Complete(R"HTML( + <a id='anchor1' href='https://anchor1.com/'>example</a> + <script> + const a = document.getElementById('anchor1'); + var event = new Event('pointerdown'); + a.dispatchEvent(event); + </script> + )HTML"); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1u, hosts_.size()); + absl::optional<KURL> url_received = hosts_[0]->url_received_; + EXPECT_FALSE(url_received.has_value()); +} + +TEST_F(AnchorElementInteractionTest, NonPrimary) { + String source("https://example.com/p1"); + SimRequest main_resource(source, "text/html"); + LoadURL(source); + main_resource.Complete(R"HTML( + <a id='anchor1' href='https://anchor1.com/'>example</a> + <script> + const a = document.getElementById('anchor1'); + var event = new PointerEvent('pointerdown', {isPrimary: false}); + a.dispatchEvent(event); + </script> + )HTML"); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1u, hosts_.size()); + absl::optional<KURL> url_received = hosts_[0]->url_received_; + EXPECT_FALSE(url_received.has_value()); +} + +TEST_F(AnchorElementInteractionTest, RightClick) { + String source("https://example.com/p1"); + SimRequest main_resource(source, "text/html"); + LoadURL(source); + main_resource.Complete(R"HTML( + <a id='anchor1' href='https://anchor1.com/'>example</a> + <script> + const a = document.getElementById('anchor1'); + var event = new PointerEvent('pointerdown', { + isPrimary: true, + button: 2 + }); + a.dispatchEvent(event); + </script> + )HTML"); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1u, hosts_.size()); + absl::optional<KURL> url_received = hosts_[0]->url_received_; + EXPECT_FALSE(url_received.has_value()); } TEST_F(AnchorElementInteractionTest, NestedAnchorElementCheck) { @@ -98,7 +153,7 @@ href='https://anchor2.com/'></a></a> <script> const a = document.getElementById('anchor2'); - var event = new PointerEvent('pointerdown'); + var event = new PointerEvent('pointerdown', {isPrimary: true}); a.dispatchEvent(event); </script> )HTML"); @@ -119,7 +174,7 @@ id='div1id'></div></a> <script> const a = document.getElementById('div1id'); - var event = new PointerEvent('pointerdown'); + var event = new PointerEvent('pointerdown', {isPrimary: true}); a.dispatchEvent(event); </script> )HTML"); @@ -140,7 +195,7 @@ id='div1id'><div id='div2id'></div></div></p></a> <script> const a = document.getElementById('div2id'); - var event = new PointerEvent('pointerdown'); + var event = new PointerEvent('pointerdown', {isPrimary: true}); a.dispatchEvent(event); </script> )HTML"); @@ -160,16 +215,14 @@ <div id='div1id'></div> <script> const a = document.getElementById('div2id'); - var event = new PointerEvent('pointerdown'); + var event = new PointerEvent('pointerdown', {isPrimary: true}); a.dispatchEvent(event); </script> )HTML"); base::RunLoop().RunUntilIdle(); - absl::optional<KURL> expected_null_url = absl::nullopt; EXPECT_EQ(1u, hosts_.size()); absl::optional<KURL> url_received = hosts_[0]->url_received_; EXPECT_FALSE(url_received.has_value()); - EXPECT_EQ(expected_null_url, url_received); } TEST_F(AnchorElementInteractionTest, OneAnchorElementCheck) { @@ -180,7 +233,7 @@ <a id="anchor1" href="https://anchor1.com/">foo</a> <script> const a = document.getElementById('anchor1'); - var event = new PointerEvent('pointerdown'); + var event = new PointerEvent('pointerdown', {isPrimary: true}); a.dispatchEvent(event); </script> )HTML");
diff --git a/third_party/blink/renderer/core/loader/anchor_element_listener.cc b/third_party/blink/renderer/core/loader/anchor_element_listener.cc index d866b4e7..7770745 100644 --- a/third_party/blink/renderer/core/loader/anchor_element_listener.cc +++ b/third_party/blink/renderer/core/loader/anchor_element_listener.cc
@@ -3,16 +3,12 @@ // found in the LICENSE file. #include "third_party/blink/renderer/core/loader/anchor_element_listener.h" +#include "third_party/blink/public/common/input/web_pointer_properties.h" #include "third_party/blink/renderer/core/dom/events/event.h" #include "third_party/blink/renderer/core/events/pointer_event.h" #include "third_party/blink/renderer/core/html/html_anchor_element.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" -namespace { -constexpr const int16_t kMainEventButtonValue = 0; -constexpr const int16_t kAuxiliaryEventButtonValue = 1; -} // namespace - namespace blink { AnchorElementListener::AnchorElementListener( @@ -30,9 +26,21 @@ if (!event->target()->ToNode()->IsHTMLElement()) { return; } + PointerEvent* pointer_event = DynamicTo<PointerEvent>(event); + if (!pointer_event) { + // Pages are allowed to dispatch any event to the 'pointerdown' type, which + // may result in this code running with an |event| that is not of type + // PointerEvent. + return; + } + if (!pointer_event->isPrimary()) { + return; + } // TODO(crbug.com/1297312): Check if user changed the default mouse settings - if (DynamicTo<PointerEvent>(event)->button() != kMainEventButtonValue && - DynamicTo<PointerEvent>(event)->button() != kAuxiliaryEventButtonValue) { + if (pointer_event->button() != + static_cast<int>(WebPointerProperties::Button::kLeft) && + pointer_event->button() != + static_cast<int>(WebPointerProperties::Button::kMiddle)) { return; } Node* node = event->srcElement()->ToNode();
diff --git a/third_party/blink/renderer/core/paint/box_painter_base.cc b/third_party/blink/renderer/core/paint/box_painter_base.cc index e13eb0b4..3415dda 100644 --- a/third_party/blink/renderer/core/paint/box_painter_base.cc +++ b/third_party/blink/renderer/core/paint/box_painter_base.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/core/paint/box_painter_base.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/blink/renderer/core/animation/element_animations.h" #include "third_party/blink/renderer/core/css/background_color_paint_image_generator.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/node_computed_style.h" @@ -34,6 +35,8 @@ namespace blink { +using CompositedPaintStatus = ElementAnimations::CompositedPaintStatus; + void BoxPainterBase::PaintFillLayers(const PaintInfo& paint_info, const Color& c, const FillLayer& fill_layer, @@ -77,6 +80,58 @@ : node; } +BackgroundColorPaintImageGenerator* GetBackgroundColorPaintImageGenerator( + const Document& document) { + if (!RuntimeEnabledFeatures::CompositeBGColorAnimationEnabled()) + return nullptr; + + return document.GetFrame()->GetBackgroundColorPaintImageGenerator(); +} + +void SetHasNativeBackgroundPainter(Node* node, bool state) { + if (!node || !node->IsElementNode()) + return; + + ElementAnimations* element_animations = + static_cast<Element*>(node)->GetElementAnimations(); + DCHECK(element_animations || !state); + if (element_animations) { + element_animations->SetCompositedBackgroundColorStatus( + state ? CompositedPaintStatus::kComposited + : CompositedPaintStatus::kNotComposited); + } +} + +bool CanCompositeBackgroundColorAnimation(Node* node) { + if (!node || !node->IsElementNode()) + return false; + + BackgroundColorPaintImageGenerator* generator = + GetBackgroundColorPaintImageGenerator(node->GetDocument()); + // The generator can be null in testing environment. + if (!generator) + return false; + + Animation* animation = + generator->GetAnimationIfCompositable(static_cast<Element*>(node)); + if (!animation) + return false; + + return animation->CheckCanStartAnimationOnCompositor(nullptr) == + CompositorAnimations::kNoFailure; +} + +CompositedPaintStatus CompositedBackgroundColorStatus(Node* node) { + if (!node || !node->IsElementNode()) + return CompositedPaintStatus::kNotComposited; + + ElementAnimations* element_animations = + static_cast<Element*>(node)->GetElementAnimations(); + DCHECK(element_animations); + + return element_animations->CompositedBackgroundColorStatus(); +} + } // namespace void BoxPainterBase::PaintNormalBoxShadow(const PaintInfo& info, @@ -595,11 +650,8 @@ scoped_refptr<Image> GetBGColorPaintWorkletImage(const Document* document, Node* node, const gfx::SizeF& image_size) { - LocalFrame* frame = document->GetFrame(); - if (!frame) - return nullptr; BackgroundColorPaintImageGenerator* generator = - frame->GetBackgroundColorPaintImageGenerator(); + GetBackgroundColorPaintImageGenerator(*document); // The generator can be null in testing environment. if (!generator) return nullptr; @@ -622,10 +674,30 @@ GraphicsContext& context) { if (!info.should_paint_color_with_paint_worklet_image) return false; + + CompositedPaintStatus status = CompositedBackgroundColorStatus(node); + + switch (status) { + case CompositedPaintStatus::kNotComposited: + DCHECK(!CanCompositeBackgroundColorAnimation(node)); + return false; + + case CompositedPaintStatus::kNeedsRepaintOrNoAnimation: + if (CanCompositeBackgroundColorAnimation(node)) { + SetHasNativeBackgroundPainter(node, true); + } else { + SetHasNativeBackgroundPainter(node, false); + return false; + } + break; + + case CompositedPaintStatus::kComposited: + DCHECK(CanCompositeBackgroundColorAnimation(node)); + } + scoped_refptr<Image> paint_worklet_image = GetBGColorPaintWorkletImage(document, node, dest_rect.Rect().size()); - if (!paint_worklet_image) - return false; + DCHECK(paint_worklet_image); gfx::RectF src_rect(dest_rect.Rect().size()); context.DrawImageRRect(paint_worklet_image.get(), Image::kSyncDecode, ImageAutoDarkMode::Disabled(), dest_rect, src_rect);
diff --git a/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc b/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc index cb844b0..1d209b3 100644 --- a/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc +++ b/third_party/blink/renderer/core/paint/image_paint_timing_detector.cc
@@ -114,8 +114,11 @@ value.SetInteger("size", static_cast<int>(first_image_paint.first_size)); value.SetInteger("candidateIndex", ++count_candidates_); value.SetBoolean("isMainFrame", frame_view_->GetFrame().IsMainFrame()); - value.SetBoolean("isOOPIF", - !frame_view_->GetFrame().LocalFrameRoot().IsMainFrame()); + value.SetBoolean("isOutermostMainFrame", + frame_view_->GetFrame().IsOutermostMainFrame()); + value.SetBoolean("isEmbeddedFrame", + !frame_view_->GetFrame().LocalFrameRoot().IsMainFrame() || + frame_view_->GetFrame().IsInFencedFrameTree()); if (first_image_paint.lcp_rect_info_) { first_image_paint.lcp_rect_info_->OutputToTraceValue(value); } @@ -141,8 +144,11 @@ auto value = std::make_unique<TracedValue>(); value->SetInteger("candidateIndex", ++count_candidates_); value->SetBoolean("isMainFrame", frame_view_->GetFrame().IsMainFrame()); - value->SetBoolean("isOOPIF", - !frame_view_->GetFrame().LocalFrameRoot().IsMainFrame()); + value->SetBoolean("isOutermostMainFrame", + frame_view_->GetFrame().IsOutermostMainFrame()); + value->SetBoolean("isEmbeddedFrame", + !frame_view_->GetFrame().LocalFrameRoot().IsMainFrame() || + frame_view_->GetFrame().IsInFencedFrameTree()); TRACE_EVENT2("loading", "LargestImagePaint::NoCandidate", "data", std::move(value), "frame", ToTraceValue(&frame_view_->GetFrame()));
diff --git a/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc b/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc index 24aab71..6c54307 100644 --- a/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc +++ b/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc
@@ -376,9 +376,13 @@ absl::optional<bool> isMainFrame = arg_dict.FindBool("isMainFrame"); EXPECT_TRUE(isMainFrame.has_value()); EXPECT_EQ(true, isMainFrame.value()); - absl::optional<bool> isOOPIF = arg_dict.FindBool("isOOPIF"); - EXPECT_TRUE(isOOPIF.has_value()); - EXPECT_EQ(false, isOOPIF.value()); + absl::optional<bool> is_outermost_main_frame = + arg_dict.FindBool("isOutermostMainFrame"); + EXPECT_TRUE(is_outermost_main_frame.has_value()); + EXPECT_EQ(true, is_outermost_main_frame.value()); + absl::optional<bool> is_embedded_frame = arg_dict.FindBool("isEmbeddedFrame"); + EXPECT_TRUE(is_embedded_frame.has_value()); + EXPECT_EQ(false, is_embedded_frame.value()); EXPECT_EQ(arg_dict.FindInt("frame_x").value_or(-1), 8); EXPECT_EQ(arg_dict.FindInt("frame_y").value_or(-1), 8); EXPECT_EQ(arg_dict.FindInt("frame_width").value_or(-1), 5); @@ -425,9 +429,13 @@ absl::optional<bool> isMainFrame = arg_dict.FindBool("isMainFrame"); EXPECT_TRUE(isMainFrame.has_value()); EXPECT_EQ(false, isMainFrame.value()); - absl::optional<bool> isOOPIF = arg_dict.FindBool("isOOPIF"); - EXPECT_TRUE(isOOPIF.has_value()); - EXPECT_EQ(false, isOOPIF.value()); + absl::optional<bool> is_outermost_main_frame = + arg_dict.FindBool("isOutermostMainFrame"); + EXPECT_TRUE(is_outermost_main_frame.has_value()); + EXPECT_EQ(false, is_outermost_main_frame.value()); + absl::optional<bool> is_embedded_frame = arg_dict.FindBool("isEmbeddedFrame"); + EXPECT_TRUE(is_embedded_frame.has_value()); + EXPECT_EQ(false, is_embedded_frame.value()); EXPECT_EQ(arg_dict.FindInt("frame_x").value_or(-1), 10); EXPECT_EQ(arg_dict.FindInt("frame_y").value_or(-1), 10); EXPECT_EQ(arg_dict.FindInt("frame_width").value_or(-1), 200); @@ -464,7 +472,8 @@ base::Value::Dict arg_dict = events[0]->GetKnownArgAsDict("data"); EXPECT_EQ(arg_dict.FindInt("candidateIndex").value_or(-1), 1); EXPECT_THAT(arg_dict.FindBool("isMainFrame"), Optional(true)); - EXPECT_THAT(arg_dict.FindBool("isOOPIF"), Optional(false)); + EXPECT_THAT(arg_dict.FindBool("isOutermostMainFrame"), Optional(true)); + EXPECT_THAT(arg_dict.FindBool("isEmbeddedFrame"), Optional(false)); } TEST_P(ImagePaintTimingDetectorTest, UpdatePerformanceTiming) {
diff --git a/third_party/blink/renderer/core/paint/largest_contentful_paint_calculator.cc b/third_party/blink/renderer/core/paint/largest_contentful_paint_calculator.cc index 2b51654..6039a39b 100644 --- a/third_party/blink/renderer/core/paint/largest_contentful_paint_calculator.cc +++ b/third_party/blink/renderer/core/paint/largest_contentful_paint_calculator.cc
@@ -137,6 +137,8 @@ value->SetInteger("size", static_cast<int>(largest_text.first_size)); value->SetInteger("candidateIndex", ++count_candidates_); auto* window = window_performance_->DomWindow(); + value->SetBoolean("isOutermostMainFrame", + window->GetFrame()->IsOutermostMainFrame()); value->SetBoolean("isMainFrame", window->GetFrame()->IsMainFrame()); value->SetString("navigationId", IdentifiersFactory::LoaderId(window->document()->Loader())); @@ -152,6 +154,8 @@ value->SetInteger("size", static_cast<int>(largest_image->first_size)); value->SetInteger("candidateIndex", ++count_candidates_); auto* window = window_performance_->DomWindow(); + value->SetBoolean("isOutermostMainFrame", + window->GetFrame()->IsOutermostMainFrame()); value->SetBoolean("isMainFrame", window->GetFrame()->IsMainFrame()); value->SetString("navigationId", IdentifiersFactory::LoaderId(window->document()->Loader()));
diff --git a/third_party/blink/renderer/core/paint/text_paint_timing_detector.cc b/third_party/blink/renderer/core/paint/text_paint_timing_detector.cc index 54cf29d..97e9360c 100644 --- a/third_party/blink/renderer/core/paint/text_paint_timing_detector.cc +++ b/third_party/blink/renderer/core/paint/text_paint_timing_detector.cc
@@ -40,8 +40,11 @@ value.SetInteger("size", static_cast<int>(first_text_paint.first_size)); value.SetInteger("candidateIndex", ++count_candidates_); value.SetBoolean("isMainFrame", frame_view_->GetFrame().IsMainFrame()); - value.SetBoolean("isOOPIF", - !frame_view_->GetFrame().LocalFrameRoot().IsMainFrame()); + value.SetBoolean("isOutermostMainFrame", + frame_view_->GetFrame().IsOutermostMainFrame()); + value.SetBoolean("isEmbeddedFrame", + !frame_view_->GetFrame().LocalFrameRoot().IsMainFrame() || + frame_view_->GetFrame().IsInFencedFrameTree()); if (first_text_paint.lcp_rect_info_) { first_text_paint.lcp_rect_info_->OutputToTraceValue(value); }
diff --git a/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc b/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc index 106fbb4..2b9ad02 100644 --- a/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc +++ b/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc
@@ -305,9 +305,13 @@ absl::optional<bool> is_main_frame = arg_dict.FindBool("isMainFrame"); EXPECT_TRUE(is_main_frame.has_value()); EXPECT_EQ(true, is_main_frame.value()); - absl::optional<bool> is_oopif = arg_dict.FindBool("isOOPIF"); - EXPECT_TRUE(is_oopif.has_value()); - EXPECT_EQ(false, is_oopif.value()); + absl::optional<bool> is_outermost_main_frame = + arg_dict.FindBool("isOutermostMainFrame"); + EXPECT_TRUE(is_outermost_main_frame.has_value()); + EXPECT_EQ(true, is_outermost_main_frame.value()); + absl::optional<bool> is_embedded_frame = arg_dict.FindBool("isEmbeddedFrame"); + EXPECT_TRUE(is_embedded_frame.has_value()); + EXPECT_EQ(false, is_embedded_frame.value()); EXPECT_GT(arg_dict.FindInt("frame_x").value_or(-1), 0); EXPECT_GT(arg_dict.FindInt("frame_y").value_or(-1), 0); EXPECT_GT(arg_dict.FindInt("frame_width").value_or(-1), 0); @@ -353,9 +357,13 @@ absl::optional<bool> is_main_frame = arg_dict.FindBool("isMainFrame"); EXPECT_TRUE(is_main_frame.has_value()); EXPECT_EQ(false, is_main_frame.value()); - absl::optional<bool> is_oopif = arg_dict.FindBool("isOOPIF"); - EXPECT_TRUE(is_oopif.has_value()); - EXPECT_EQ(false, is_oopif.value()); + absl::optional<bool> is_outermost_main_frame = + arg_dict.FindBool("isOutermostMainFrame"); + EXPECT_TRUE(is_outermost_main_frame.has_value()); + EXPECT_EQ(false, is_outermost_main_frame.value()); + absl::optional<bool> is_embedded_frame = arg_dict.FindBool("isEmbeddedFrame"); + EXPECT_TRUE(is_embedded_frame.has_value()); + EXPECT_EQ(false, is_embedded_frame.value()); // There's sometimes a 1 pixel offset for the y dimensions. EXPECT_EQ(arg_dict.FindInt("frame_x").value_or(-1), 10); EXPECT_GE(arg_dict.FindInt("frame_y").value_or(-1), 9);
diff --git a/third_party/blink/renderer/core/script/classic_script.cc b/third_party/blink/renderer/core/script/classic_script.cc index aa392ab8..732c0f5 100644 --- a/third_party/blink/renderer/core/script/classic_script.cc +++ b/third_party/blink/renderer/core/script/classic_script.cc
@@ -195,15 +195,4 @@ script_state, ExecuteScriptPolicy::kExecuteScriptWhenScriptsDisabled); } -bool ClassicScript::RunScriptOnWorkerOrWorklet( - WorkerOrWorkletGlobalScope& global_scope) { - DCHECK(global_scope.IsContextThread()); - - v8::HandleScope handle_scope( - global_scope.ScriptController()->GetScriptState()->GetIsolate()); - ScriptEvaluationResult result = RunScriptOnScriptStateAndReturnValue( - global_scope.ScriptController()->GetScriptState()); - return result.GetResultType() == ScriptEvaluationResult::ResultType::kSuccess; -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/script/classic_script.h b/third_party/blink/renderer/core/script/classic_script.h index dc2ea24..912c506 100644 --- a/third_party/blink/renderer/core/script/classic_script.h +++ b/third_party/blink/renderer/core/script/classic_script.h
@@ -98,10 +98,8 @@ const String& SourceMapUrl() const { return source_map_url_; } - bool RunScriptOnWorkerOrWorklet(WorkerOrWorkletGlobalScope&) override; - - // Unlike RunScript() and RunScriptOnWorkerOrWorklet(), callers of the - // following methods must enter a v8::HandleScope before calling. + // Unlike RunScript(), callers of the following methods must enter a + // v8::HandleScope before calling. [[nodiscard]] ScriptEvaluationResult RunScriptOnScriptStateAndReturnValue( ScriptState*, ExecuteScriptPolicy =
diff --git a/third_party/blink/renderer/core/script/module_script.cc b/third_party/blink/renderer/core/script/module_script.cc index f89fa1a..b1a4f98 100644 --- a/third_party/blink/renderer/core/script/module_script.cc +++ b/third_party/blink/renderer/core/script/module_script.cc
@@ -108,36 +108,6 @@ Script::Trace(visitor); } -bool ModuleScript::RunScriptOnWorkerOrWorklet( - WorkerOrWorkletGlobalScope& global_scope) { - // We need a HandleScope for the `ScriptEvaluationResult` returned from - // `RunScriptAndReturnValue`. - v8::HandleScope scope(SettingsObject()->GetScriptState()->GetIsolate()); - DCHECK_EQ(global_scope.ScriptController()->GetScriptState(), - SettingsObject()->GetScriptState()); - DCHECK(global_scope.IsContextThread()); - - // TODO(nhiroki): Catch an error when an evaluation error happens. - // (https://crbug.com/680046) - ScriptEvaluationResult result = - RunScriptOnScriptStateAndReturnValue(SettingsObject()->GetScriptState()); - - // Service workers prohibit async module graphs (those with top-level await), - // so the promise result from executing a service worker module is always - // settled. To maintain compatibility with synchronous module graphs, rejected - // promises are considered synchronous failures in service workers. - // - // https://github.com/w3c/ServiceWorker/pull/1444 - if (global_scope.IsServiceWorkerGlobalScope() && - result.GetResultType() == ScriptEvaluationResult::ResultType::kSuccess) { - v8::Local<v8::Promise> promise = result.GetSuccessValue().As<v8::Promise>(); - DCHECK_NE(promise->State(), v8::Promise::kPending); - return promise->State() == v8::Promise::kFulfilled; - } - - return result.GetResultType() == ScriptEvaluationResult::ResultType::kSuccess; -} - ScriptEvaluationResult ModuleScript::RunScriptOnScriptStateAndReturnValue( ScriptState* script_state, ExecuteScriptPolicy execute_script_policy,
diff --git a/third_party/blink/renderer/core/script/module_script.h b/third_party/blink/renderer/core/script/module_script.h index 95a1ad2..49d49547 100644 --- a/third_party/blink/renderer/core/script/module_script.h +++ b/third_party/blink/renderer/core/script/module_script.h
@@ -74,7 +74,6 @@ mojom::blink::ScriptType GetScriptType() const override { return mojom::blink::ScriptType::kModule; } - bool RunScriptOnWorkerOrWorklet(WorkerOrWorkletGlobalScope&) override; friend class ModuleTreeLinkerTestModulator;
diff --git a/third_party/blink/renderer/core/script/script.h b/third_party/blink/renderer/core/script/script.h index 36d0259..265c521 100644 --- a/third_party/blink/renderer/core/script/script.h +++ b/third_party/blink/renderer/core/script/script.h
@@ -17,7 +17,6 @@ namespace blink { class LocalDOMWindow; -class WorkerOrWorkletGlobalScope; // https://html.spec.whatwg.org/C/#concept-script class CORE_EXPORT Script : public GarbageCollected<Script> { @@ -67,10 +66,6 @@ ExecuteScriptPolicy::kDoNotExecuteScriptWhenScriptsDisabled, V8ScriptRunner::RethrowErrorsOption = V8ScriptRunner::RethrowErrorsOption::DoNotRethrow()); - // For worker top-level scripts and worklets. - // Returns true if evaluated successfully. - // TODO(crbug.com/1111134): Remove RunScriptOnWorkerOrWorklet(). - virtual bool RunScriptOnWorkerOrWorklet(WorkerOrWorkletGlobalScope&) = 0; const ScriptFetchOptions& FetchOptions() const { return fetch_options_; } const KURL& BaseURL() const { return base_url_; }
diff --git a/third_party/blink/renderer/core/style/computed_style.cc b/third_party/blink/renderer/core/style/computed_style.cc index ab10fb9..0a693a9 100644 --- a/third_party/blink/renderer/core/style/computed_style.cc +++ b/third_party/blink/renderer/core/style/computed_style.cc
@@ -910,9 +910,18 @@ const ComputedStyle& other, StyleDifference& diff) const { if (BackgroundColorInternal() != other.BackgroundColorInternal()) { - diff.SetNeedsPaintInvalidation(); - return; + // If the background color change is not due to a composited animation, then + // paint invalidation is required; but we can defer the decision until we + // know whether the color change will be rendered by the compositor. + diff.SetBackgroundColorChanged(); } + // The rendered color may differ from the reported color for a link to prevent + // leaking the visited status of a link. + if (InternalVisitedBackgroundColor() != + other.InternalVisitedBackgroundColor()) { + diff.SetBackgroundColorChanged(); + } + if (!BackgroundInternal().VisuallyEqual(other.BackgroundInternal())) { diff.SetNeedsPaintInvalidation(); return;
diff --git a/third_party/blink/renderer/core/style/computed_style_diff_functions.json5 b/third_party/blink/renderer/core/style/computed_style_diff_functions.json5 index 2e56a9b..5ea6784e 100644 --- a/third_party/blink/renderer/core/style/computed_style_diff_functions.json5 +++ b/third_party/blink/renderer/core/style/computed_style_diff_functions.json5
@@ -270,10 +270,6 @@ field_dependencies: ["InsideLink"] }, { - method: "InternalVisitedBackgroundColor()", - field_dependencies: ["-internal-visited-background-color"] - }, - { method: "Resize()", field_dependencies: ["resize"] },
diff --git a/third_party/blink/renderer/core/style/style_difference.h b/third_party/blink/renderer/core/style/style_difference.h index f8cc953..cf1add5fa 100644 --- a/third_party/blink/renderer/core/style/style_difference.h +++ b/third_party/blink/renderer/core/style/style_difference.h
@@ -29,6 +29,7 @@ kTextDecorationOrColorChanged = 1 << 5, kBlendModeChanged = 1 << 6, kMaskChanged = 1 << 7, + kBackgroundColorChanged = 1 << 8, // If you add a value here, be sure to update kPropertyDifferenceCount. }; @@ -150,6 +151,13 @@ } void SetMaskChanged() { property_specific_differences_ |= kMaskChanged; } + bool BackgroundColorChanged() const { + return property_specific_differences_ & kBackgroundColorChanged; + } + void SetBackgroundColorChanged() { + property_specific_differences_ |= kBackgroundColorChanged; + } + bool ScrollAnchorDisablingPropertyChanged() const { return scroll_anchor_disabling_property_changed_; } @@ -168,7 +176,7 @@ } private: - static constexpr int kPropertyDifferenceCount = 8; + static constexpr int kPropertyDifferenceCount = 9; friend CORE_EXPORT std::ostream& operator<<(std::ostream&, const StyleDifference&);
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.cc b/third_party/blink/renderer/core/workers/worker_global_scope.cc index 6fc69bc..f9b71e0 100644 --- a/third_party/blink/renderer/core/workers/worker_global_scope.cc +++ b/third_party/blink/renderer/core/workers/worker_global_scope.cc
@@ -491,7 +491,8 @@ if (debugger && stack_id_) debugger->ExternalAsyncTaskStarted(*stack_id_); - switch (worker_script_->GetScriptType()) { + const auto script_type = worker_script_->GetScriptType(); + switch (script_type) { case mojom::blink::ScriptType::kClassic: { ReportingProxy().WillEvaluateClassicScript(); break; @@ -503,9 +504,50 @@ // Step 24. If script is a classic script, then run the classic script script. // Otherwise, it is a module script; run the module script script. [spec text] - bool is_success = - std::move(worker_script_)->RunScriptOnWorkerOrWorklet(*this); - + bool is_success = false; + if (ScriptState* script_state = ScriptController()->GetScriptState()) { + v8::HandleScope handle_scope(script_state->GetIsolate()); + ScriptEvaluationResult result = + std::move(worker_script_) + ->RunScriptOnScriptStateAndReturnValue(script_state); + switch (script_type) { + case mojom::blink::ScriptType::kClassic: + is_success = result.GetResultType() == + ScriptEvaluationResult::ResultType::kSuccess; + break; + case mojom::blink::ScriptType::kModule: + // Service workers prohibit async module graphs (those with top-level + // await), so the promise result from executing a service worker module + // is always settled. To maintain compatibility with synchronous module + // graphs, rejected promises are considered synchronous failures in + // service workers. + // + // https://w3c.github.io/ServiceWorker/#run-service-worker + // Step 14.2-14.4 https://github.com/w3c/ServiceWorker/pull/1444 + if (IsServiceWorkerGlobalScope() && + result.GetResultType() == + ScriptEvaluationResult::ResultType::kSuccess) { + v8::Local<v8::Promise> promise = + result.GetSuccessValue().As<v8::Promise>(); + switch (promise->State()) { + case v8::Promise::kFulfilled: + is_success = true; + break; + case v8::Promise::kRejected: + is_success = false; + break; + case v8::Promise::kPending: + NOTREACHED(); + is_success = false; + break; + } + } else { + is_success = result.GetResultType() == + ScriptEvaluationResult::ResultType::kSuccess; + } + break; + } + } ReportingProxy().DidEvaluateTopLevelScript(is_success); if (debugger && stack_id_)
diff --git a/third_party/blink/renderer/modules/csspaint/nativepaint/background_color_paint_definition.cc b/third_party/blink/renderer/modules/csspaint/nativepaint/background_color_paint_definition.cc index a9e7664..0c5016a 100644 --- a/third_party/blink/renderer/modules/csspaint/nativepaint/background_color_paint_definition.cc +++ b/third_party/blink/renderer/modules/csspaint/nativepaint/background_color_paint_definition.cc
@@ -87,10 +87,7 @@ CSSPropertyName(CSSPropertyID::kBackgroundColor); const CSSValue* computed_value = StyleResolver::ComputeValue( const_cast<Element*>(element), property_name, *value); - // TODO(crbug.com/1255912): handle system color. - if (!computed_value->IsColorValue()) - return false; - + DCHECK(computed_value->IsColorValue()); const cssvalue::CSSColor* color_value = static_cast<const cssvalue::CSSColor*>(computed_value); animated_colors->push_back(color_value->Value()); @@ -100,19 +97,10 @@ To<TransitionKeyframe::PropertySpecificKeyframe>(frame); InterpolableValue* value = keyframe->GetValue()->Value().interpolable_value.get(); + DCHECK(value->IsList()); - if (!value->IsList()) - return false; - - // Transition keyframes store a pair of color values: one for the actual - // color and one for the reported color (conditionally resolved). This is to - // prevent JavaScript code from snooping the visited status of links. The - // color to use for the animation is stored first in the list. - // We need to further check that the color is a simple RGBA color and does - // not require blending with other colors (e.g. currentcolor). const InterpolableList& list = To<InterpolableList>(*value); - if (!CSSColorInterpolationType::IsRGBA(*(list.Get(0)))) - return false; + DCHECK(CSSColorInterpolationType::IsRGBA(*(list.Get(0)))); Color rgba = CSSColorInterpolationType::GetRGBA(*(list.Get(0))); animated_colors->push_back(rgba); @@ -144,6 +132,34 @@ return true; } +bool ValidateColorValue(const Element* element, + const CSSValue* value, + const InterpolableValue* interpolable_value) { + if (value) { + // Cannot composite a background color animation that depends on + // currentColor. For now, the color must resolve to a simple RGBA color. + // TODO(crbug.com/1255912): handle system color. + const CSSPropertyName property_name = + CSSPropertyName(CSSPropertyID::kBackgroundColor); + const CSSValue* computed_value = StyleResolver::ComputeValue( + const_cast<Element*>(element), property_name, *value); + return computed_value->IsColorValue(); + } else if (interpolable_value) { + // Transition keyframes store a pair of color values: one for the actual + // color and one for the reported color (conditionally resolved). This is to + // prevent JavaScript code from snooping the visited status of links. The + // color to use for the animation is stored first in the list. + // We need to further check that the color is a simple RGBA color and does + // not require blending with other colors (e.g. currentcolor). + if (!interpolable_value->IsList()) + return false; + + const InterpolableList& list = To<InterpolableList>(*interpolable_value); + return CSSColorInterpolationType::IsRGBA(*(list.Get(0))); + } + return false; +} + } // namespace template <> @@ -161,7 +177,8 @@ Animation* BackgroundColorPaintDefinition::GetAnimationIfCompositable( const Element* element) { - return GetAnimationForProperty(element, GetCSSPropertyBackgroundColor()); + return GetAnimationForProperty(element, GetCSSPropertyBackgroundColor(), + ValidateColorValue); } // static
diff --git a/third_party/blink/renderer/modules/csspaint/nativepaint/background_color_paint_definition_test.cc b/third_party/blink/renderer/modules/csspaint/nativepaint/background_color_paint_definition_test.cc index 60d626f..6870671 100644 --- a/third_party/blink/renderer/modules/csspaint/nativepaint/background_color_paint_definition_test.cc +++ b/third_party/blink/renderer/modules/csspaint/nativepaint/background_color_paint_definition_test.cc
@@ -85,6 +85,14 @@ absl::optional<double> progress; EXPECT_TRUE(BackgroundColorPaintDefinition::GetBGColorPaintWorkletParams( element, &animated_colors, &offsets, &progress)); + EXPECT_EQ( + element->GetElementAnimations()->CompositedBackgroundColorStatus(), + ElementAnimations::CompositedPaintStatus::kNeedsRepaintOrNoAnimation); + + UpdateAllLifecyclePhasesForTest(); + // Cannot composite without a compositor thread. + EXPECT_EQ(element->GetElementAnimations()->CompositedBackgroundColorStatus(), + ElementAnimations::CompositedPaintStatus::kNotComposited); } // Test the case when there is no animation attached to the element.
diff --git a/third_party/blink/renderer/modules/csspaint/nativepaint/native_css_paint_definition.cc b/third_party/blink/renderer/modules/csspaint/nativepaint/native_css_paint_definition.cc index 4d3863f..665a9e60 100644 --- a/third_party/blink/renderer/modules/csspaint/nativepaint/native_css_paint_definition.cc +++ b/third_party/blink/renderer/modules/csspaint/nativepaint/native_css_paint_definition.cc
@@ -18,28 +18,28 @@ : NativePaintDefinition(local_root, type) {} bool NativeCssPaintDefinition::CanGetValueFromKeyframe( + const Element* element, const PropertySpecificKeyframe* frame, - const KeyframeEffectModelBase* model) { + const KeyframeEffectModelBase* model, + ValueFilter filter) { if (model->IsStringKeyframeEffectModel()) { DCHECK(frame->IsCSSPropertySpecificKeyframe()); const CSSValue* value = To<CSSPropertySpecificKeyframe>(frame)->Value(); - if (!value) - return false; + return filter(element, value, nullptr); } else { DCHECK(frame->IsTransitionPropertySpecificKeyframe()); const TransitionKeyframe::PropertySpecificKeyframe* keyframe = To<TransitionKeyframe::PropertySpecificKeyframe>(frame); InterpolableValue* value = keyframe->GetValue()->Value().interpolable_value.get(); - if (!value) - return false; + return filter(element, nullptr, value); } - return true; } Animation* NativeCssPaintDefinition::GetAnimationForProperty( const Element* element, - const CSSProperty& property) { + const CSSProperty& property, + ValueFilter filter) { if (!element->GetElementAnimations()) return nullptr; Animation* compositable_animation = nullptr; @@ -68,11 +68,18 @@ model->GetPropertySpecificKeyframes(PropertyHandle(property)); DCHECK_GE(frames->size(), 2u); for (const auto& frame : *frames) { - if (!CanGetValueFromKeyframe(frame, model)) { + if (!CanGetValueFromKeyframe(element, frame, model, filter)) { return nullptr; } } return compositable_animation; } +bool NativeCssPaintDefinition::DefaultValueFilter( + const Element* element, + const CSSValue* value, + const InterpolableValue* interpolable_value) { + return value || interpolable_value; +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/csspaint/nativepaint/native_css_paint_definition.h b/third_party/blink/renderer/modules/csspaint/nativepaint/native_css_paint_definition.h index 902159e..84d5289 100644 --- a/third_party/blink/renderer/modules/csspaint/nativepaint/native_css_paint_definition.h +++ b/third_party/blink/renderer/modules/csspaint/nativepaint/native_css_paint_definition.h
@@ -19,11 +19,27 @@ public: ~NativeCssPaintDefinition() override = default; - static Animation* GetAnimationForProperty(const Element* element, - const CSSProperty& property); + // Validation function for determining if a value / interpolable_value is + // supported on the compositor. + using ValueFilter = bool (*)(const Element* element, + const CSSValue* value, + const InterpolableValue* interpolable_value); - static bool CanGetValueFromKeyframe(const PropertySpecificKeyframe* frame, - const KeyframeEffectModelBase* model); + static Animation* GetAnimationForProperty( + const Element* element, + const CSSProperty& property, + ValueFilter filter = DefaultValueFilter); + + static bool CanGetValueFromKeyframe(const Element* element, + const PropertySpecificKeyframe* frame, + const KeyframeEffectModelBase* model, + ValueFilter filter); + + // Default validator for a keyframe value, which accepts any non-null value + // as being supported. Replace with a property specific validator as needed. + static bool DefaultValueFilter(const Element* element, + const CSSValue* value, + const InterpolableValue* interpolable_value); protected: NativeCssPaintDefinition(LocalFrame*,
diff --git a/third_party/blink/renderer/modules/webcodecs/decoder_template_test.cc b/third_party/blink/renderer/modules/webcodecs/decoder_template_test.cc index 4196350..3cc9654 100644 --- a/third_party/blink/renderer/modules/webcodecs/decoder_template_test.cc +++ b/third_party/blink/renderer/modules/webcodecs/decoder_template_test.cc
@@ -86,8 +86,7 @@ ScriptState* script_state, const VideoDecoderInit* init, ExceptionState& exception_state) { - return MakeGarbageCollected<VideoDecoder>(script_state, init, - exception_state); + return VideoDecoder::Create(script_state, init, exception_state); } using DecoderTemplateImplementations =
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version index 1b2ebe2..a43ad78 100644 --- a/third_party/blink/web_tests/external/Version +++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@ -Version: dea5e8811cbd0136a387a71ead732eac26ab0bd0 +Version: bfe011aa848f680dc28a4c353bd51e08caffb757
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index f586ea2..51b8c8e 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -432,6 +432,13 @@ {} ] ], + "break-after-oof-before-preceding-pushed-float-crash.html": [ + "8c4355c22d34a474af96da5ddbc2316e5067a2a7", + [ + null, + {} + ] + ], "break-before-float-after-line-after-floats-crash.html": [ "9066cd77ecdc74037b9e75016fe0ec5975e399b0", [ @@ -495,6 +502,13 @@ {} ] ], + "chrome-bug-1318455-crash.html": [ + "f18a166e8cd475b88cb20a57ed7405053b182634", + [ + null, + {} + ] + ], "clear-br-in-size-containment-crash.html": [ "118e9a79016325331518553a690adcc901e510a3", [ @@ -509,6 +523,13 @@ {} ] ], + "clear-past-float-with-oof-twice-crash.html": [ + "82317ca85bb41851f9a2b9aa295b8ef98e76d98e", + [ + null, + {} + ] + ], "firefox-bug1693616-001-crash.html": [ "5aadb70037c3b31abc7bd91ee1dc8dc412e0c3e1", [ @@ -192027,19 +192048,6 @@ {} ] ], - "appearance-transition.tentative.html": [ - "199de7c05e1bc010185f91dbb8a095ffa42c5ddd", - [ - null, - [ - [ - "/css/css-ui/appearance-transition-ref.html", - "==" - ] - ], - {} - ] - ], "box-sizing-001.html": [ "870f4863774e904acbc581c9c375388fb357f16b", [ @@ -232588,6 +232596,73 @@ ] }, "widgets": { + "appearance": { + "appearance-animation-001.html": [ + "7d7474e0a4b93266010004246d08fa0a05314c93", + [ + null, + [ + [ + "/html/rendering/widgets/appearance/appearance-transition-001-ref.html", + "==" + ] + ], + {} + ] + ], + "appearance-animation-002.html": [ + "acca93eae7ce417db687459ae082e1f647ee6e57", + [ + null, + [ + [ + "/html/rendering/widgets/appearance/appearance-animation-002-ref.html", + "==" + ] + ], + {} + ] + ], + "appearance-transition-001.html": [ + "ec51cf9be528f460b6eee63eba8872ac54c1ec56", + [ + null, + [ + [ + "/html/rendering/widgets/appearance/appearance-transition-001-ref.html", + "==" + ] + ], + {} + ] + ], + "appearance-transition-002.html": [ + "b6c2a3dcadd520cc6792fcdb59d277584c26fd68", + [ + null, + [ + [ + "/html/rendering/widgets/appearance/appearance-transition-002-ref.html", + "==" + ] + ], + {} + ] + ], + "appearance-transition-003.html": [ + "109617b7b78c04d0c559a57c4de8ed39a7ecc228", + [ + null, + [ + [ + "/html/rendering/widgets/appearance/appearance-animation-002-ref.html", + "==" + ] + ], + {} + ] + ] + }, "button-layout": { "anonymous-button-content-box.html": [ "07c7b8e366f076996d3d1d5e49a54c4d8f96f800", @@ -286627,10 +286702,6 @@ "5304352e6bafd1d25436babfc2afc0ba1aa26fa3", [] ], - "appearance-transition-ref.html": [ - "b5ea559b9e7c158e254f2a7e047b56487ad8f281", - [] - ], "compute-kind-widget-fallback-button-ref.html": [ "9007ecb7fb9376a3a61cdeed18190e565c47b677", [] @@ -308024,6 +308095,20 @@ ] }, "widgets": { + "appearance": { + "appearance-animation-002-ref.html": [ + "fab70234d2be44ea73de81456b3dff7aab44ad74", + [] + ], + "appearance-transition-001-ref.html": [ + "69726c6cd28f9434a7f7831a2299ee8f8148ff37", + [] + ], + "appearance-transition-002-ref.html": [ + "febd6c55aa655b7a94d8cda2255e2320a6a3e97a", + [] + ] + }, "button-layout": { "anonymous-button-content-box-ref.html": [ "243f0add0deb144ff4fc9d7c822c7b283aef9dba",
diff --git a/third_party/blink/web_tests/external/wpt/.gitignore b/third_party/blink/web_tests/external/wpt/.gitignore index 23df18a..d93e645d 100644 --- a/third_party/blink/web_tests/external/wpt/.gitignore +++ b/third_party/blink/web_tests/external/wpt/.gitignore
@@ -2,14 +2,13 @@ *.py[co] *.sw[po] *~ -MANIFEST.json +/MANIFEST.json \#* _certs .virtualenv config.json node_modules scratch -/testharness_runner.html webdriver/.idea .vscode/ .DS_Store
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/background-color-animation-will-change-contents-ref.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/background-color-animation-will-change-contents-ref.html new file mode 100644 index 0000000..d980a29 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/background-color-animation-will-change-contents-ref.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<style> +.box { + width: 600px; + height: 600px; + background-color: rgba(0, 200, 0, 1); +} +</style> +<body> + <div class='box'></div> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/background-color-animation-will-change-contents.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/background-color-animation-will-change-contents.html new file mode 100644 index 0000000..a218098 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/background-color-animation-will-change-contents.html
@@ -0,0 +1,45 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#background-color"> +<link rel="match" href="background-color-animation-will-change-contents-ref.html"> +<style> +.container { + width: 600px; + height: 600px; + will-change: contents; + /* Start with a short delay and ensure that we pick up the color change when + the animation enters the active phase. */ + animation: bgcolor 10s steps(1, jump-start) backwards 0.2s; +} +@keyframes bgcolor { + 0% { background-color: rgba(200, 0, 0, 1); } + 100% { background-color: rgba(0, 200, 0, 1); } +} +</style> +<script src="/common/reftest-wait.js"></script> +<body> +<div class="container"></div> + +<script> + function waitForActiveAnimation() { + const anim = document.getAnimations()[0]; + return new Promise(resolve => { + const tick = () => { + requestAnimationFrame(() => { + if (anim.currentTime > 200) + resolve(); + else + tick(); + }); + }; + tick(); + }); + } + + window.onload = async () => { + await waitForActiveAnimation(); + takeScreenshot(); + }; +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/background-color-scroll-into-viewport-ref.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/background-color-scroll-into-viewport-ref.html new file mode 100644 index 0000000..e5bbf67 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/background-color-scroll-into-viewport-ref.html
@@ -0,0 +1,43 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<style> +.container { + width: 100vw; + height: 100vh; + overflow: hidden; + position: relative; +} +.spacer { + height: 1000vh; +} +#target { + width: 50vw; + height: 50vh; + background-color: rgb(100, 100, 0); +} +</style> +<script src="/common/reftest-wait.js"></script> +<body> + <div class="container"> + <div class="spacer"></div> + <div id="target"></div> + </div> +</body> +<script> +async function raf() { + return new Promise((resolve) => { + requestAnimationFrame(() => { + resolve(); + }); + }) +} + +window.onload = async () => { + await raf(); + await raf(); + target.scrollIntoView(); + takeScreenshot(); +}; +</script> + +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/background-color-scroll-into-viewport.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/background-color-scroll-into-viewport.html new file mode 100644 index 0000000..24b22b4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/background-color-scroll-into-viewport.html
@@ -0,0 +1,50 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#background-color"> +<link rel="match" href="background-color-scroll-into-viewport-ref.html"> +<style> +.container { + width: 100vw; + height: 100vh; + overflow: hidden; + position: relative; +} +.spacer { + height: 1000vh; +} +#target { + width: 50vw; + height: 50vh; + background-color: green; + animation: bgcolor 1000000s cubic-bezier(0,1,1,0) -500000s; +} +@keyframes bgcolor { + 0% { background-color: rgb(0, 200, 0); } + 100% { background-color: rgb(200, 0, 0); } +} +</style> +<script src="/common/reftest-wait.js"></script> +<body> + <div class="container"> + <div class="spacer"></div> + <div id="target"></div> + </div> +</body> +<script> +async function raf() { + return new Promise((resolve) => { + requestAnimationFrame(() => { + resolve(); + }); + }) +} + +document.getAnimations()[0].ready.then(async () => { + await raf(); + await raf(); + target.scrollIntoView(); + takeScreenshot(); +}); +</script> + +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-animation-001.html b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-animation-001.html new file mode 100644 index 0000000..7d7474e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-animation-001.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>compute the kind of widget: author origin and animation origin</title> +<link rel="match" href="appearance-transition-001-ref.html"> +<style> + input { + background-color: rgb(0, 0, 0); + } + .bg200 { + animation: 1e10s steps(2, start) animate-bg; + } + @keyframes animate-bg { + to { + background-color: rgb(0, 200, 0); + } + } +</style> +<input value="text" id=input> +<script> + document.documentElement.offsetTop; + input.classList.toggle('bg200'); +</script> +<p>PASS if the input field has a dark green background</p>
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-animation-002-ref.html b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-animation-002-ref.html new file mode 100644 index 0000000..fab7023 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-animation-002-ref.html
@@ -0,0 +1,3 @@ +<!DOCTYPE html> +<input value="text"> +<p>PASS if the input field does not have a red background</p>
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-animation-002.html b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-animation-002.html new file mode 100644 index 0000000..acca93e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-animation-002.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>compute the kind of widget: animation origin only</title> +<link rel="match" href="appearance-animation-002-ref.html"> +<style> + .bg200 { + animation: 1e10s steps(2, start) animate-bg; + } + @keyframes animate-bg { + to { + background-color: rgb(255, 0, 0); + } + } +</style> +<input value="text" id=input> +<script> + document.documentElement.offsetTop; + input.classList.toggle('bg200'); +</script> +<p>PASS if the input field does not have a red background</p>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/appearance-transition-ref.html b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-001-ref.html similarity index 86% rename from third_party/blink/web_tests/external/wpt/css/css-ui/appearance-transition-ref.html rename to third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-001-ref.html index b5ea559..69726c6 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-ui/appearance-transition-ref.html +++ b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-001-ref.html
@@ -1,4 +1,5 @@ <!DOCTYPE html> +<meta charset="utf-8"> <style> input { background-color: rgb(0, 100, 0); } </style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/appearance-transition.tentative.html b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-001.html similarity index 71% rename from third_party/blink/web_tests/external/wpt/css/css-ui/appearance-transition.tentative.html rename to third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-001.html index 199de7c..ec51cf9b 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-ui/appearance-transition.tentative.html +++ b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-001.html
@@ -1,6 +1,8 @@ <!DOCTYPE html> +<meta charset="utf-8"> +<title>compute the kind of widget: author origin and transition origin</title> <link rel="help" href="https://crbug.com/1086732"> -<link rel="match" href="appearance-transition-ref.html"> +<link rel="match" href="appearance-transition-001-ref.html"> <style> input { background-color: rgb(0, 0, 0);
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-002-ref.html b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-002-ref.html new file mode 100644 index 0000000..febd6c5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-002-ref.html
@@ -0,0 +1,6 @@ +<!DOCTYPE html> +<style> + input { background-color: rgb(128, 228, 128); } +</style> +<input value="text"> +<p>PASS if the input field has a light green background</p>
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-002.html b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-002.html new file mode 100644 index 0000000..b6c2a3d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-002.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>compute the kind of widget: transition origin without author origin style before the transition</title> +<link rel="match" href="appearance-transition-002-ref.html"> +<style> + input { + transition: background-color 1e10s steps(2, start); + } + + .bg200 { + background-color: rgb(0, 200, 0); + } +</style> +<input value="text" id=input> +<script> + document.documentElement.offsetTop; + input.classList.toggle('bg200'); +</script> +<p>PASS if the input field has a light green background</p>
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-003.html b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-003.html new file mode 100644 index 0000000..109617b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/appearance/appearance-transition-003.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>compute the kind of widget: transition origin without author origin style after the transition</title> +<link rel="match" href="appearance-animation-002-ref.html"> +<style> + input { + transition: background-color 1e10s steps(2, start); + } + + .bg200 { + background-color: rgb(255, 0, 0); + } +</style> +<input value="text" id=input class=bg200> +<script> + document.documentElement.offsetTop; + input.classList.toggle('bg200'); +</script> +<p>PASS if the input field does not have a red background</p>
diff --git a/third_party/blink/web_tests/external/wpt/lint.ignore b/third_party/blink/web_tests/external/wpt/lint.ignore index fd01861..33aafc9 100644 --- a/third_party/blink/web_tests/external/wpt/lint.ignore +++ b/third_party/blink/web_tests/external/wpt/lint.ignore
@@ -352,6 +352,13 @@ *: tools/* *: */third_party/* +# .gitignore files in child directories +*: cors/resources/.gitignore +*: css/.gitignore +*: css/css-writing-modes/tools/generators/.gitignore +*: resources/.gitignore +*: webaudio/.gitignore + # Build system virtualenv *: css/tools/_virtualenv/*
diff --git a/third_party/blink/web_tests/external/wpt/testharness_runner.html b/third_party/blink/web_tests/external/wpt/testharness_runner.html deleted file mode 100644 index 1cc80a2..0000000 --- a/third_party/blink/web_tests/external/wpt/testharness_runner.html +++ /dev/null
@@ -1,6 +0,0 @@ -<!doctype html> -<title></title> -<script> -var timeout_multiplier = 1; -var win = null; -</script>
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec index 6cda63d5..c44e671 100644 --- a/tools/gritsettings/resource_ids.spec +++ b/tools/gritsettings/resource_ids.spec
@@ -188,6 +188,10 @@ "META": {"sizes": {"includes": [40]}}, "includes": [1620], }, + "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/identity_internals/resources.grd": { + "META": {"sizes": {"includes": [10]}}, + "includes": [1621], + }, "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/image_editor/resources.grd": { "META": {"sizes": {"includes": [20]}}, "includes": [1625],
diff --git a/tools/gritsettings/translation_expectations.pyl b/tools/gritsettings/translation_expectations.pyl index a6e587c2..83a5ee804 100644 --- a/tools/gritsettings/translation_expectations.pyl +++ b/tools/gritsettings/translation_expectations.pyl
@@ -30,7 +30,7 @@ "ash/webui/camera_app_ui/resources/strings/camera_strings.grd", "chrome/android/features/vr/java/strings/android_chrome_vr_strings.grd", "chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings.grd", - "chrome/android/features/start_surface/internal/java/strings/android_chrome_start_surface_strings.grd", + "chrome/android/features/start_surface/java/strings/android_chrome_start_surface_strings.grd", "chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd", "chrome/android/webapk/strings/android_webapk_strings.grd", "chrome/app/chromium_strings.grd",
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 3408ca42..71f248a 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -25,7 +25,7 @@ 'chromeos-kevin-chrome': 'chromeos_kevin_include_unwind_tables_official_dchecks', 'chromeos-octopus-chrome': 'chromeos_octopus_include_unwind_tables_official_dchecks', 'chromeos-reven-chrome': 'chromeos_reven_include_unwind_tables_official_dchecks', - 'lacros-amd64-generic-chrome': 'chromeos_amd64-generic_lacros_official', + 'lacros-amd64-generic-chrome': 'chromeos_amd64-generic_lacros_official_no_symbols', 'lacros-amd64-generic-chrome-skylab': 'chromeos_amd64-generic_lacros_official_skylab', 'lacros-arm-generic-chrome': 'chromeos_arm-generic_lacros_official', 'lacros-arm-generic-chrome-skylab': 'chromeos_arm-generic_lacros_official_skylab', @@ -81,6 +81,7 @@ 'Android ASAN (dbg)': 'android_clang_asan_debug_bot_reclient', 'Android arm Builder (dbg)': 'android_webview_google_debug_static_bot_reclient', 'Android arm64 Builder (dbg)': 'android_webview_google_debug_static_bot_arm64_reclient', + 'Android arm64 Builder All Targets (dbg)': 'android_webview_google_debug_static_bot_arm64_reclient', # Trigger testers on Android Q+ 'Android x64 Builder (dbg)': 'android_debug_static_bot_x64_reclient_webview_trichrome_webview_shell', 'Android x86 Builder (dbg)': 'android_debug_static_bot_x86_reclient', @@ -170,7 +171,7 @@ 'chromeos-arm64-generic-rel': 'chromeos_arm64-generic_dchecks', 'chromeos-kevin-rel': 'chromeos_kevin_dchecks_reclient', 'chromeos-kevin-rel (reclient shadow)': 'chromeos_kevin_dchecks_reclient', - 'lacros-amd64-generic-binary-size-rel': 'chromeos_amd64-generic_lacros_rel', + 'lacros-amd64-generic-binary-size-rel': 'chromeos_amd64-generic_lacros_rel_reclient', 'lacros-amd64-generic-rel': 'chromeos_amd64-generic_lacros_rel_reclient', 'lacros-arm-generic-rel': 'chromeos_arm-generic_lacros_rel_reclient', 'linux-ash-chromium-generator-rel': 'chromeos_with_codecs_release_bot', @@ -179,7 +180,7 @@ 'linux-chromeos-rel': 'chromeos_with_codecs_with_lacros_release_bot', 'linux-chromeos-rel': 'chromeos_with_codecs_with_lacros_release_bot_reclient', 'linux-lacros-builder-rel': 'lacros_on_linux_release_bot_reclient', - 'linux-lacros-dbg': 'lacros_on_linux_debug_bot', + 'linux-lacros-dbg': 'lacros_on_linux_debug_bot_reclient', 'linux-lacros-tester-rel': 'lacros_on_linux_release_bot', }, @@ -355,8 +356,6 @@ 'Site Isolation Android': 'android_release_bot_minimal_symbols_arm64_reclient', 'VR Linux': 'vr_release_bot_reclient', 'Win 10 Fast Ring': 'release_trybot_minimal_symbols_reclient', - 'Win ASan Release (reclient shadow)': 'asan_fuzzer_v8_heap_release_bot_reclient', - 'Win ASan Release Media (reclient shadow)': 'asan_fuzzer_v8_heap_chrome_with_codecs_release_bot_reclient', 'Win x64 Builder (reclient compare)': 'gpu_tests_release_bot_minimal_symbols_reclient', 'Win x64 Builder (reclient)': 'gpu_tests_release_bot_minimal_symbols_reclient', 'Win x64 Builder (reclient)(cross)': 'gpu_tests_release_bot_minimal_symbols_reclient_win_cross', @@ -407,14 +406,14 @@ 'linux-example-builder': 'release_bot_reclient', 'linux-fieldtrial-rel': 'release_bot_minimal_symbols', 'linux-headless-shell-rel': 'headless_shell_release_bot_reclient', - 'linux-lacros-builder-fyi-rel': 'lacros_on_linux_release_bot', + 'linux-lacros-builder-fyi-rel': 'lacros_on_linux_release_bot_reclient', 'linux-lacros-builder-rel (goma cache silo)': 'lacros_on_linux_release_bot', 'linux-lacros-builder-rel (reclient)': 'lacros_on_linux_release_bot_reclient', - 'linux-lacros-code-coverage': 'lacros_on_linux_clang_code_coverage', - 'linux-lacros-dbg-fyi': 'lacros_on_linux_debug_bot', + 'linux-lacros-code-coverage': 'lacros_on_linux_clang_code_coverage_reclient', + 'linux-lacros-dbg-fyi': 'lacros_on_linux_debug_bot_reclient', 'linux-lacros-dbg-tests-fyi': 'lacros_on_linux_debug_bot', 'linux-lacros-tester-fyi-rel': 'lacros_on_linux_release_bot', - 'linux-lacros-version-skew-fyi': 'lacros_on_linux_release_not_build_ash_bot', + 'linux-lacros-version-skew-fyi': 'lacros_on_linux_release_not_build_ash_bot_reclient', 'linux-perfetto-rel': 'perfetto_release_bot_reclient', 'linux-upload-perfetto': 'release_bot_perfetto_zlib_reclient', 'linux-wpt-fyi-rel': 'release_trybot_minimal_symbols_reclient', @@ -530,7 +529,7 @@ 'ChromeOS FYI Release (kevin)': 'gpu_tests_chromeos_kevin_release_trybot_dcheck_off_no_symbols_reclient', 'GPU FYI Android arm Builder': 'gpu_tests_android_release_trybot_reclient', 'GPU FYI Android arm64 Builder': 'gpu_tests_android_release_trybot_arm64_reclient', - 'GPU FYI Lacros x64 Builder': 'gpu_tests_ozone_linux_non_x11_release_trybot', + 'GPU FYI Lacros x64 Builder': 'gpu_tests_ozone_linux_non_x11_release_trybot_reclient', 'GPU FYI Linux Builder': 'gpu_fyi_tests_release_trybot_reclient', 'GPU FYI Linux Builder (dbg)': 'gpu_fyi_tests_debug_trybot_reclient', 'GPU FYI Mac Builder': 'gpu_fyi_tests_release_trybot', @@ -844,7 +843,7 @@ 'chromeos-octopus-chrome': 'chromeos_octopus_include_unwind_tables_official_dchecks', 'chromeos-octopus-compile-chrome': 'chromeos_octopus_include_unwind_tables_official_dchecks', 'chromeos-reven-chrome': 'chromeos_reven_include_unwind_tables_official_dchecks', - 'lacros-amd64-generic-chrome': 'chromeos_amd64-generic_lacros_official', + 'lacros-amd64-generic-chrome': 'chromeos_amd64-generic_lacros_official_no_symbols', 'lacros-amd64-generic-chrome-skylab': 'chromeos_amd64-generic_lacros_official_skylab', 'lacros-arm-generic-chrome': 'chromeos_arm-generic_lacros_official', 'lacros-arm-generic-chrome-skylab': 'chromeos_arm-generic_lacros_official_skylab', @@ -891,6 +890,7 @@ 'android-12-x64-dbg': 'android_debug_trybot_x64_webview_trichrome_webview_shell', 'android-12-x64-fyi-rel': 'android_release_bot_minimal_symbols_x64_fastbuild_webview_trichrome_reclient', 'android-12-x64-rel': 'android_release_trybot_x64_fastbuild_webview_trichrome', + 'android-arm64-all-targets-dbg': 'android_debug_trybot_compile_only_arm64_fastbuild', 'android-asan': 'android_clang_asan_release_trybot', 'android-bfcache-rel': 'android_release_trybot', 'android-binary-size': 'android_binary_size', @@ -1971,6 +1971,15 @@ 'chromeos_amd64-generic-crostoolchain', 'lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto', ], + # This is the same as chromeos_amd64-generic_lacros_official except + # the symbol_level. Please keep them in sync. + # TODO(https://crbug.com/1316467): once lacros_variations_tast_tests + # is migrated to run in skylab, remove this use + # chromeos_amd64-generic_lacros_official instead. + 'chromeos_amd64-generic_lacros_official_no_symbols': [ + 'chromeos_amd64-generic-crostoolchain', 'lacros', 'official', 'no_symbols', 'cfi', 'thin_lto', + ], + # This is the same as 'chromeos_amd64-generic_lacros_official', except for # the 'is_skylab' arg. Please keep them in sync. 'chromeos_amd64-generic_lacros_official_skylab': [ @@ -2601,6 +2610,10 @@ 'gpu_tests', 'ozone_linux', 'ozone_linux_non_x11', 'release_trybot_minimal_symbols', ], + 'gpu_tests_ozone_linux_non_x11_release_trybot_reclient': [ + 'gpu_tests', 'ozone_linux', 'ozone_linux_non_x11', 'release_trybot_minimal_symbols_reclient', + ], + 'gpu_tests_release_bot': [ 'gpu_tests', 'release_bot', ], @@ -2809,14 +2822,18 @@ 'ios', 'ios_simulator', 'ios_cpu_x64', 'release_bot', 'asan', 'xctest', 'ios_disable_xcode_project_generation', ], - 'lacros_on_linux_clang_code_coverage': [ - 'lacros_on_linux', 'release_bot', 'also_build_ash_chrome', 'clang', 'use_clang_coverage', 'no_symbols', + 'lacros_on_linux_clang_code_coverage_reclient': [ + 'lacros_on_linux', 'release_bot_reclient', 'also_build_ash_chrome', 'clang', 'use_clang_coverage', 'no_symbols', ], 'lacros_on_linux_debug_bot': [ 'lacros_on_linux', 'debug_bot', 'also_build_ash_chrome', ], + 'lacros_on_linux_debug_bot_reclient': [ + 'lacros_on_linux', 'debug_bot_reclient', 'also_build_ash_chrome', + ], + 'lacros_on_linux_release_bot': [ 'lacros_on_linux', 'release_bot', 'also_build_ash_chrome', ], @@ -2829,6 +2846,10 @@ 'lacros_on_linux', 'release_bot', ], + 'lacros_on_linux_release_not_build_ash_bot_reclient': [ + 'lacros_on_linux', 'release_bot_reclient', + ], + 'lacros_on_linux_release_trybot': [ 'lacros_on_linux', 'release_trybot', 'also_build_ash_chrome', 'no_symbols', ],
diff --git a/tools/mb/mb_config_expectations/chrome.json b/tools/mb/mb_config_expectations/chrome.json index 62e088f9..1e85efb 100644 --- a/tools/mb/mb_config_expectations/chrome.json +++ b/tools/mb/mb_config_expectations/chrome.json
@@ -152,7 +152,7 @@ "is_chromeos_device": true, "is_official_build": true, "ozone_platform_headless": true, - "symbol_level": 1, + "symbol_level": 0, "target_os": "chromeos", "use_goma": true, "use_thin_lto": true
diff --git a/tools/mb/mb_config_expectations/chromium.android.json b/tools/mb/mb_config_expectations/chromium.android.json index 6ed8a68..7cb4884 100644 --- a/tools/mb/mb_config_expectations/chromium.android.json +++ b/tools/mb/mb_config_expectations/chromium.android.json
@@ -41,6 +41,20 @@ "use_remoteexec": true } }, + "Android arm64 Builder All Targets (dbg)": { + "gn_args": { + "ffmpeg_branding": "Chrome", + "is_component_build": false, + "is_debug": true, + "proprietary_codecs": true, + "symbol_level": 1, + "system_webview_package_name": "com.google.android.webview", + "target_cpu": "arm64", + "target_os": "android", + "use_rbe": true, + "use_remoteexec": true + } + }, "Android x64 Builder (dbg)": { "gn_args": { "ffmpeg_branding": "Chrome",
diff --git a/tools/mb/mb_config_expectations/chromium.chromiumos.json b/tools/mb/mb_config_expectations/chromium.chromiumos.json index 747375f..d390338 100644 --- a/tools/mb/mb_config_expectations/chromium.chromiumos.json +++ b/tools/mb/mb_config_expectations/chromium.chromiumos.json
@@ -188,7 +188,8 @@ "is_debug": false, "ozone_platform_headless": true, "target_os": "chromeos", - "use_goma": true + "use_rbe": true, + "use_remoteexec": true } }, "lacros-amd64-generic-rel": { @@ -284,7 +285,8 @@ "is_debug": true, "symbol_level": 1, "target_os": "chromeos", - "use_goma": true + "use_rbe": true, + "use_remoteexec": true } }, "linux-lacros-tester-rel": {
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json index 42dd49c..10bdef61 100644 --- a/tools/mb/mb_config_expectations/chromium.fyi.json +++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -433,34 +433,6 @@ "use_remoteexec": true } }, - "Win ASan Release (reclient shadow)": { - "gn_args": { - "dcheck_always_on": false, - "enable_ipc_fuzzer": true, - "is_asan": true, - "is_clang": true, - "is_component_build": false, - "is_debug": false, - "use_rbe": true, - "use_remoteexec": true, - "v8_enable_verify_heap": true - } - }, - "Win ASan Release Media (reclient shadow)": { - "gn_args": { - "dcheck_always_on": false, - "enable_ipc_fuzzer": true, - "ffmpeg_branding": "Chrome", - "is_asan": true, - "is_clang": true, - "is_component_build": false, - "is_debug": false, - "proprietary_codecs": true, - "use_rbe": true, - "use_remoteexec": true, - "v8_enable_verify_heap": true - } - }, "Win x64 Builder (reclient compare)": { "gn_args": { "dcheck_always_on": false, @@ -1114,7 +1086,8 @@ "is_component_build": false, "is_debug": false, "target_os": "chromeos", - "use_goma": true + "use_rbe": true, + "use_remoteexec": true } }, "linux-lacros-builder-rel (goma cache silo)": { @@ -1151,7 +1124,8 @@ "symbol_level": 0, "target_os": "chromeos", "use_clang_coverage": true, - "use_goma": true + "use_rbe": true, + "use_remoteexec": true } }, "linux-lacros-dbg-fyi": { @@ -1162,7 +1136,8 @@ "is_debug": true, "symbol_level": 1, "target_os": "chromeos", - "use_goma": true + "use_rbe": true, + "use_remoteexec": true } }, "linux-lacros-dbg-tests-fyi": { @@ -1194,7 +1169,8 @@ "is_component_build": false, "is_debug": false, "target_os": "chromeos", - "use_goma": true + "use_rbe": true, + "use_remoteexec": true } }, "linux-perfetto-rel": {
diff --git a/tools/mb/mb_config_expectations/chromium.gpu.fyi.json b/tools/mb/mb_config_expectations/chromium.gpu.fyi.json index 6b06792c..72523ed 100644 --- a/tools/mb/mb_config_expectations/chromium.gpu.fyi.json +++ b/tools/mb/mb_config_expectations/chromium.gpu.fyi.json
@@ -98,8 +98,9 @@ "proprietary_codecs": true, "symbol_level": 1, "use_bundled_weston": true, - "use_goma": true, - "use_ozone": true + "use_ozone": true, + "use_rbe": true, + "use_remoteexec": true } }, "GPU FYI Linux Builder": {
diff --git a/tools/mb/mb_config_expectations/tryserver.chrome.json b/tools/mb/mb_config_expectations/tryserver.chrome.json index fdaf614..9007692 100644 --- a/tools/mb/mb_config_expectations/tryserver.chrome.json +++ b/tools/mb/mb_config_expectations/tryserver.chrome.json
@@ -213,7 +213,7 @@ "is_chromeos_device": true, "is_official_build": true, "ozone_platform_headless": true, - "symbol_level": 1, + "symbol_level": 0, "target_os": "chromeos", "use_goma": true, "use_thin_lto": true
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.android.json b/tools/mb/mb_config_expectations/tryserver.chromium.android.json index 93ff6cc..d67bad2 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.android.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
@@ -118,6 +118,20 @@ "use_goma": true } }, + "android-arm64-all-targets-dbg": { + "gn_args": { + "disable_android_lint": true, + "ffmpeg_branding": "Chrome", + "is_component_build": true, + "is_debug": true, + "proprietary_codecs": true, + "symbol_level": 0, + "target_cpu": "arm64", + "target_os": "android", + "use_errorprone_java_compiler": false, + "use_goma": true + } + }, "android-asan": { "gn_args": { "dcheck_always_on": true,
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index ff7399d..ad80147 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -38335,6 +38335,7 @@ <int value="25" label="ManifestListInvalidResponse"/> <int value="26" label="ManifestNotInManifestList"/> <int value="27" label="ManifestListTooBig"/> + <int value="28" label="DisabledEmbargo"/> </enum> <enum name="FedCmRevokeStatus"> @@ -38350,6 +38351,12 @@ <int value="9" label="ManifestInvalidResponse"/> <int value="10" label="DisabledInSettings"/> <int value="11" label="DisabledInFlags"/> + <int value="12" label="ManifestListHttpNotFound"/> + <int value="13" label="ManifestListNoResponse"/> + <int value="14" label="ManifestListInvalidResponse"/> + <int value="15" label="ManifestNotInManifestList"/> + <int value="16" label="ManifestListTooBig"/> + <int value="17" label="ThirdPartyCookiesBlocked"/> </enum> <enum name="FeedAutoplayEvent">
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml index 178e852..613057c 100644 --- a/tools/metrics/histograms/metadata/blink/histograms.xml +++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -873,9 +873,9 @@ </histogram> <histogram name="Blink.Fetch.ReducedUserAgent" enum="Boolean" - expires_after="M102"> - <owner>abeyad@chromium.org</owner> - <owner>aarontag@chromium.org</owner> + expires_after="M110"> + <owner>miketaylr@chromium.org</owner> + <owner>victortan@chromium.org</owner> <summary> Whether the User-Agent header that was sent for a subresource request had a reduced user agent string value. The reduced user agent string is only sent
diff --git a/tools/metrics/histograms/metadata/compositing/histograms.xml b/tools/metrics/histograms/metadata/compositing/histograms.xml index 8c894ca..8b2a5c69 100644 --- a/tools/metrics/histograms/metadata/compositing/histograms.xml +++ b/tools/metrics/histograms/metadata/compositing/histograms.xml
@@ -712,51 +712,6 @@ </summary> </histogram> -<histogram - name="Compositing.RenderPass.AppendQuadData.CheckerboardedNeedRasterContentArea" - units="pixels/frame" expires_after="2020-04-19"> - <owner>weiliangc@chromium.org</owner> - <summary> - Checkerboarded area, in number of pixels, that has recording but does not - have time to finish rastering yet. A sample is recorded everytime a frame is - drawn while a scroll is in progress. Tracking bug 535732. - </summary> -</histogram> - -<histogram - name="Compositing.RenderPass.AppendQuadData.CheckerboardedNoRecordingContentArea" - units="pixels/frame" expires_after="M82"> - <owner>weiliangc@chromium.org</owner> - <summary> - Checkerboarded area, in number of pixels, that has no recording to raster - from. A sample is recorded everytime a frame is drawn while a scroll is in - progress. Tracking bug 535732. - </summary> -</histogram> - -<histogram name="Compositing.RenderPass.AppendQuadData.NumIncompleteTiles" - units="units" expires_after="M81"> - <owner>weiliangc@chromium.org</owner> - <summary> - Keeps track of number of incomplete tiles in a drawn compositor frame while - scrolling. This is a rough measurement of ugliness during user interaction. - Incomplete tiles are non ideal scaled. A sample is recorded everytime a - frame is drawn while a scroll is in progress. Tracking bug 381695. - </summary> -</histogram> - -<histogram name="Compositing.RenderPass.AppendQuadData.NumMissingTiles" - units="units" expires_after="M81"> - <owner>weiliangc@chromium.org</owner> - <summary> - Keeps track of number of missing tiles in a drawn compositor frame while - scrolling. This is a rough measurement of ugliness during user interaction. - Incomplete tiles are checkerboard or solid color. A sample is recorded - everytime a frame is drawn while a scroll is in progress. Tracking bug - 381695. - </summary> -</histogram> - <histogram base="true" name="Compositing.ResourcePoolMemoryUsage" units="MB" expires_after="2022-05-01"> <owner>sunnyps@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml index 7f1a63a9..ed32de4 100644 --- a/tools/metrics/histograms/metadata/ios/histograms.xml +++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -42,6 +42,16 @@ </summary> </histogram> +<histogram name="IOS.ColdStartBackgroundTime" units="minutes" + expires_after="2023-04-27"> + <owner>thegreenfrog@chromium.org</owner> + <owner>bling-team@google.com</owner> + <summary> + This event is recorded on every cold start app open. The value represents + how long the app was away from the foreground. + </summary> +</histogram> + <histogram name="IOS.CommittedNavigationHasContext" enum="Boolean" expires_after="2022-09-24"> <owner>ajuma@chromium.org</owner> @@ -1559,6 +1569,16 @@ </summary> </histogram> +<histogram name="IOS.WarmStartBackgroundTime" units="minutes" + expires_after="2023-04-27"> + <owner>thegreenfrog@chromium.org</owner> + <owner>bling-team@google.com</owner> + <summary> + This event is recorded on every warm start app open. The value represents + how long the app was away from the foreground. + </summary> +</histogram> + <histogram name="IOS.Web.URLDidChangeToEmptyURL" enum="BooleanHit" expires_after="2022-07-03"> <owner>gambard@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 630d676..9c397aa 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -13,16 +13,16 @@ "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "mac": { - "hash": "c67c0bb84d1fed4060267eabc15867eb7e57b084", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/0dba9ae3dc0924e53e3870aed1cc7b7c4cb95c93/trace_processor_shell" + "hash": "6e47d7972f7e4deac3e0cb411130b52321c7c341", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/2308bab3aebd39f00010c846cdcab351046158cc/trace_processor_shell" }, "mac_arm64": { "hash": "e1ad4861384b06d911a65f035317914b8cc975c6", "full_remote_path": "perfetto-luci-artifacts/v25.0/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "e25b407130619dc0bc8cd8fdcf21c88072c17877", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/2308bab3aebd39f00010c846cdcab351046158cc/trace_processor_shell" + "hash": "b9a6d822ab2d94541824488239c40696814c966d", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/4df14f2d7ef32e7a35d428b5abfc728609b1579d/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/ui/gfx/geometry/mask_filter_info.cc b/ui/gfx/geometry/mask_filter_info.cc index c033155..77621089 100644 --- a/ui/gfx/geometry/mask_filter_info.cc +++ b/ui/gfx/geometry/mask_filter_info.cc
@@ -17,7 +17,9 @@ if (!transform.TransformRRectF(&rounded_corner_bounds_)) return false; - gradient_mask_.Transform(transform); + if (!gradient_mask_.IsEmpty()) + gradient_mask_.Transform(transform); + return true; }
diff --git a/ui/gfx/geometry/mask_filter_info.h b/ui/gfx/geometry/mask_filter_info.h index c96bd18..6c33e8c 100644 --- a/ui/gfx/geometry/mask_filter_info.h +++ b/ui/gfx/geometry/mask_filter_info.h
@@ -63,7 +63,7 @@ RRectF rounded_corner_bounds_; // Shader based linear gradient mask to be applied to a layer. - gfx::LinearGradient gradient_mask_; + gfx::LinearGradient gradient_mask_ = gfx::LinearGradient::GetEmpty(); }; inline bool operator==(const MaskFilterInfo& lhs, const MaskFilterInfo& rhs) {
diff --git a/ui/gfx/mojom/BUILD.gn b/ui/gfx/mojom/BUILD.gn index 004d42f..f577092a 100644 --- a/ui/gfx/mojom/BUILD.gn +++ b/ui/gfx/mojom/BUILD.gn
@@ -323,7 +323,7 @@ ] traits_sources = [ "mask_filter_info_mojom_traits.cc" ] traits_headers = [ "mask_filter_info_mojom_traits.h" ] - traits_public_deps = [ "//ui/gfx" ] + traits_public_deps = [ "//ui/gfx/geometry:geometry_skia" ] }, { types = [ @@ -334,7 +334,7 @@ ] traits_sources = [ "linear_gradient_mojom_traits.cc" ] traits_headers = [ "linear_gradient_mojom_traits.h" ] - traits_public_deps = [ "//ui/gfx" ] + traits_public_deps = [ "//ui/gfx/geometry:geometry_skia" ] }, ]
diff --git a/ui/gfx/render_text.cc b/ui/gfx/render_text.cc index 62fbeb6..7fb46db 100644 --- a/ui/gfx/render_text.cc +++ b/ui/gfx/render_text.cc
@@ -974,8 +974,13 @@ int RenderText::GetBaseline() { if (baseline_ == kInvalidBaseline) { - baseline_ = - DetermineBaselineCenteringText(display_rect().height(), font_list()); + const int centering_height = + (vertical_alignment_ == ALIGN_MIDDLE) + ? display_rect().height() + : std::max(font_list().GetHeight(), min_line_height()); + baseline_ = DetermineBaselineCenteringText(centering_height, font_list()); + if (vertical_alignment_ == ALIGN_BOTTOM) + baseline_ += display_rect().height() - centering_height; } DCHECK_NE(kInvalidBaseline, baseline_); return baseline_;
diff --git a/ui/gfx/text_utils.cc b/ui/gfx/text_utils.cc index 2e73a65f..7f13e8a 100644 --- a/ui/gfx/text_utils.cc +++ b/ui/gfx/text_utils.cc
@@ -202,7 +202,7 @@ const int cap_height_diff = original_cap_height - to_center_cap_height; const int new_cap_top = - original_cap_leading + std::lround(cap_height_diff / 2.0f); + original_cap_leading + base::ClampRound(cap_height_diff / 2.0f); const int new_top = new_cap_top - to_center_leading; // Since we assume the old font starts at zero, the new top is the adjustment.
diff --git a/ui/gl/delegated_ink_point_renderer_gpu_unittest.cc b/ui/gl/delegated_ink_point_renderer_gpu_unittest.cc index 78f7442..a1eaa516 100644 --- a/ui/gl/delegated_ink_point_renderer_gpu_unittest.cc +++ b/ui/gl/delegated_ink_point_renderer_gpu_unittest.cc
@@ -131,7 +131,8 @@ void CreateDirectCompositionSurfaceWin() { DirectCompositionSurfaceWin::Settings settings; surface_ = base::MakeRefCounted<DirectCompositionSurfaceWin>( - parent_window_, DirectCompositionSurfaceWin::VSyncCallback(), settings); + gl::GLSurfaceEGL::GetGLDisplayEGL(), parent_window_, + DirectCompositionSurfaceWin::VSyncCallback(), settings); EXPECT_TRUE(surface_->Initialize(GLSurfaceFormat())); // ImageTransportSurfaceDelegate::DidCreateAcceleratedSurfaceChildWindow()
diff --git a/ui/gl/direct_composition_child_surface_win.cc b/ui/gl/direct_composition_child_surface_win.cc index 2644ebd..377a7cd 100644 --- a/ui/gl/direct_composition_child_surface_win.cc +++ b/ui/gl/direct_composition_child_surface_win.cc
@@ -78,12 +78,14 @@ PendingFrame&& other) = default; DirectCompositionChildSurfaceWin::DirectCompositionChildSurfaceWin( + GLDisplayEGL* display, VSyncCallback vsync_callback, bool use_angle_texture_offset, size_t max_pending_frames, bool force_full_damage, bool force_full_damage_always) - : vsync_callback_(std::move(vsync_callback)), + : GLSurfaceEGL(display), + vsync_callback_(std::move(vsync_callback)), use_angle_texture_offset_(use_angle_texture_offset), max_pending_frames_(max_pending_frames), force_full_damage_(force_full_damage), @@ -101,8 +103,6 @@ if (!dcomp_device_) return false; - EGLDisplay display = GetEGLDisplay(); - EGLint pbuffer_attribs[] = { EGL_WIDTH, 1, @@ -111,8 +111,8 @@ EGL_NONE, }; - default_surface_ = - eglCreatePbufferSurface(display, GetConfig(), pbuffer_attribs); + default_surface_ = eglCreatePbufferSurface(display_->GetDisplay(), + GetConfig(), pbuffer_attribs); if (!default_surface_) { DLOG(ERROR) << "eglCreatePbufferSurface failed with error " << ui::GetLastEGLErrorString(); @@ -138,7 +138,7 @@ DLOG_IF(ERROR, !result) << "Failed to make current in ReleaseDrawTexture"; if (egl_surface) - eglDestroySurface(GetEGLDisplay(), egl_surface); + eglDestroySurface(display_->GetDisplay(), egl_surface); if (dcomp_surface_.Get() == g_current_surface) g_current_surface = nullptr; @@ -252,14 +252,14 @@ vsync_thread_->RemoveObserver(this); if (default_surface_) { - if (!eglDestroySurface(GetEGLDisplay(), default_surface_)) { + if (!eglDestroySurface(display_->GetDisplay(), default_surface_)) { DLOG(ERROR) << "eglDestroySurface failed with error " << ui::GetLastEGLErrorString(); } default_surface_ = nullptr; } if (real_surface_) { - if (!eglDestroySurface(GetEGLDisplay(), real_surface_)) { + if (!eglDestroySurface(display_->GetDisplay(), real_surface_)) { DLOG(ERROR) << "eglDestroySurface failed with error " << ui::GetLastEGLErrorString(); } @@ -510,7 +510,7 @@ } real_surface_ = eglCreatePbufferFromClientBuffer( - GetEGLDisplay(), EGL_D3D_TEXTURE_ANGLE, buffer, GetConfig(), + display_->GetDisplay(), EGL_D3D_TEXTURE_ANGLE, buffer, GetConfig(), pbuffer_attribs.data()); if (!real_surface_) { DLOG(ERROR) << "eglCreatePbufferFromClientBuffer failed with error "
diff --git a/ui/gl/direct_composition_child_surface_win.h b/ui/gl/direct_composition_child_surface_win.h index b741d0e..678c089 100644 --- a/ui/gl/direct_composition_child_surface_win.h +++ b/ui/gl/direct_composition_child_surface_win.h
@@ -32,7 +32,8 @@ public: using VSyncCallback = base::RepeatingCallback<void(base::TimeTicks, base::TimeDelta)>; - DirectCompositionChildSurfaceWin(VSyncCallback vsync_callback, + DirectCompositionChildSurfaceWin(GLDisplayEGL* display, + VSyncCallback vsync_callback, bool use_angle_texture_offset, size_t max_pending_frames, bool force_full_damage,
diff --git a/ui/gl/direct_composition_surface_win.cc b/ui/gl/direct_composition_surface_win.cc index 2bf0aa1..5808c97 100644 --- a/ui/gl/direct_composition_surface_win.cc +++ b/ui/gl/direct_composition_surface_win.cc
@@ -383,12 +383,14 @@ } // namespace DirectCompositionSurfaceWin::DirectCompositionSurfaceWin( + GLDisplayEGL* display, HWND parent_window, VSyncCallback vsync_callback, const Settings& settings) - : GLSurfaceEGL(), + : GLSurfaceEGL(display), child_window_(parent_window), root_surface_(new DirectCompositionChildSurfaceWin( + display, std::move(vsync_callback), settings.use_angle_texture_offset, settings.max_pending_frames,
diff --git a/ui/gl/direct_composition_surface_win.h b/ui/gl/direct_composition_surface_win.h index 2dac4d02..9864e80 100644 --- a/ui/gl/direct_composition_surface_win.h +++ b/ui/gl/direct_composition_surface_win.h
@@ -50,6 +50,7 @@ }; DirectCompositionSurfaceWin( + GLDisplayEGL* display, HWND parent_window, VSyncCallback vsync_callback, const DirectCompositionSurfaceWin::Settings& settings);
diff --git a/ui/gl/direct_composition_surface_win_unittest.cc b/ui/gl/direct_composition_surface_win_unittest.cc index 28858e1..3da0b2c5 100644 --- a/ui/gl/direct_composition_surface_win_unittest.cc +++ b/ui/gl/direct_composition_surface_win_unittest.cc
@@ -150,8 +150,8 @@ DirectCompositionSurfaceWin::Settings settings; scoped_refptr<DirectCompositionSurfaceWin> surface = base::MakeRefCounted<DirectCompositionSurfaceWin>( - parent_window_, DirectCompositionSurfaceWin::VSyncCallback(), - settings); + gl::GLSurfaceEGL::GetGLDisplayEGL(), parent_window_, + DirectCompositionSurfaceWin::VSyncCallback(), settings); EXPECT_TRUE(surface->Initialize(GLSurfaceFormat())); // ImageTransportSurfaceDelegate::DidCreateAcceleratedSurfaceChildWindow()
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc index f73d405..6d1add2 100644 --- a/ui/gl/gl_surface_egl.cc +++ b/ui/gl/gl_surface_egl.cc
@@ -213,8 +213,10 @@ class EGLSyncControlVSyncProvider : public SyncControlVSyncProvider { public: - EGLSyncControlVSyncProvider(EGLSurface surface, GLDisplay* display) - : surface_(surface), display_(display) {} + EGLSyncControlVSyncProvider(EGLSurface surface, GLDisplayEGL* display) + : surface_(surface), display_(display) { + DCHECK(display_); + } EGLSyncControlVSyncProvider(const EGLSyncControlVSyncProvider&) = delete; EGLSyncControlVSyncProvider& operator=(const EGLSyncControlVSyncProvider&) = @@ -222,9 +224,10 @@ ~EGLSyncControlVSyncProvider() override {} - static bool IsSupported() { + static bool IsSupported(GLDisplayEGL* display) { + DCHECK(display); return SyncControlVSyncProvider::IsSupported() && - GLSurfaceEGL::GetGLDisplayEGL()->egl_sync_control_supported; + display->egl_sync_control_supported; } protected: @@ -245,7 +248,7 @@ } bool GetMscRate(int32_t* numerator, int32_t* denominator) override { - if (!GLSurfaceEGL::GetGLDisplayEGL()->egl_sync_control_rate_supported) { + if (!display_->egl_sync_control_rate_supported) { return false; } @@ -258,15 +261,22 @@ private: EGLSurface surface_; - GLDisplay* display_; + GLDisplayEGL* display_; }; class EGLGpuSwitchingObserver final : public ui::GpuSwitchingObserver { public: - void OnGpuSwitched(gl::GpuPreference active_gpu_heuristic) override { - DCHECK(GLSurfaceEGL::GetGLDisplayEGL()->IsANGLEPowerPreferenceSupported()); - eglHandleGPUSwitchANGLE(GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay()); + explicit EGLGpuSwitchingObserver(GLDisplayEGL* display) : display_(display) { + DCHECK(display_); } + + void OnGpuSwitched(gl::GpuPreference active_gpu_heuristic) override { + DCHECK(display_->IsANGLEPowerPreferenceSupported()); + eglHandleGPUSwitchANGLE(display_->GetDisplay()); + } + + private: + GLDisplayEGL* display_ = nullptr; }; std::vector<const char*> GetAttribArrayFromStringVector( @@ -951,19 +961,21 @@ } } -GLSurfaceEGL::GLSurfaceEGL() = default; +GLSurfaceEGL::GLSurfaceEGL(GLDisplayEGL* display) : display_(display) { + DCHECK(display_); +} GLSurfaceFormat GLSurfaceEGL::GetFormat() { return format_; } GLDisplay* GLSurfaceEGL::GetGLDisplay() { - return GetGLDisplayEGL(); + return display_; } EGLConfig GLSurfaceEGL::GetConfig() { if (!config_) { - config_ = ChooseConfig(GetEGLDisplay(), format_, IsSurfaceless(), + config_ = ChooseConfig(display_->GetDisplay(), format_, IsSurfaceless(), IsOffscreen(), GetNativeVisualID()); } return config_; @@ -974,8 +986,7 @@ } EGLDisplay GLSurfaceEGL::GetEGLDisplay() { - DCHECK(GetGLDisplay()); - return GetGLDisplay()->GetDisplay(); + return display_->GetDisplay(); } // static @@ -1094,7 +1105,8 @@ // EGL_KHR_surfaceless_context is supported but ensure // GL_OES_surfaceless_context is also supported. We need a current context // to query for supported GL extensions. - scoped_refptr<GLSurface> surface = new SurfacelessEGL(gfx::Size(1, 1)); + scoped_refptr<GLSurface> surface = + new SurfacelessEGL(display, gfx::Size(1, 1)); scoped_refptr<GLContext> context = InitializeGLContext( new GLContextEGL(nullptr), surface.get(), GLContextAttribs()); if (!context || !context->MakeCurrent(surface.get())) @@ -1149,7 +1161,7 @@ display->HasEGLExtension("EGL_ANGLE_vulkan_image"); if (display->egl_angle_power_preference_supported) { - g_egl_gpu_switching_observer = new EGLGpuSwitchingObserver(); + g_egl_gpu_switching_observer = new EGLGpuSwitchingObserver(display); ui::GpuSwitchingManager::GetInstance()->AddObserver( g_egl_gpu_switching_observer); } @@ -1366,9 +1378,12 @@ } NativeViewGLSurfaceEGL::NativeViewGLSurfaceEGL( + GLDisplayEGL* display, EGLNativeWindowType window, std::unique_ptr<gfx::VSyncProvider> vsync_provider) - : window_(window), vsync_provider_external_(std::move(vsync_provider)) { + : GLSurfaceEGL(display), + window_(window), + vsync_provider_external_(std::move(vsync_provider)) { #if BUILDFLAG(IS_ANDROID) if (window) ANativeWindow_acquire(window); @@ -1385,8 +1400,7 @@ DCHECK(!surface_); format_ = format; - GLDisplayEGL* display = GetGLDisplayEGL(); - if (!display->GetDisplay()) { + if (!display_->GetDisplay()) { LOG(ERROR) << "Trying to create surface with invalid display."; return false; } @@ -1400,7 +1414,7 @@ std::vector<EGLint> egl_window_attributes; - if (display->egl_window_fixed_size_supported && enable_fixed_size_angle_) { + if (display_->egl_window_fixed_size_supported && enable_fixed_size_angle_) { egl_window_attributes.push_back(EGL_FIXED_SIZE_ANGLE); egl_window_attributes.push_back(EGL_TRUE); egl_window_attributes.push_back(EGL_WIDTH); @@ -1414,9 +1428,9 @@ egl_window_attributes.push_back(EGL_TRUE); } - if (display->egl_surface_orientation_supported) { + if (display_->egl_surface_orientation_supported) { EGLint attrib; - eglGetConfigAttrib(display->GetDisplay(), GetConfig(), + eglGetConfigAttrib(display_->GetDisplay(), GetConfig(), EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE, &attrib); surface_origin_ = (attrib == EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE) ? gfx::SurfaceOrigin::kTopLeft @@ -1435,7 +1449,7 @@ // Note that COLORSPACE_LINEAR refers to the sRGB color space, but // without opting into sRGB blending. It is equivalent to // COLORSPACE_SRGB with Disable(FRAMEBUFFER_SRGB). - if (display->egl_khr_colorspace) { + if (display_->egl_khr_colorspace) { egl_window_attributes.push_back(EGL_GL_COLORSPACE_KHR); egl_window_attributes.push_back(EGL_GL_COLORSPACE_LINEAR_KHR); } @@ -1449,15 +1463,15 @@ // with the P3 gamut instead of the the sRGB gamut. // COLORSPACE_DISPLAY_P3_LINEAR has a linear transfer function, and is // intended for use with 16-bit formats. - bool p3_supported = display->egl_ext_colorspace_display_p3 || - display->egl_ext_colorspace_display_p3_passthrough; - if (display->egl_khr_colorspace && p3_supported) { + bool p3_supported = display_->egl_ext_colorspace_display_p3 || + display_->egl_ext_colorspace_display_p3_passthrough; + if (display_->egl_khr_colorspace && p3_supported) { egl_window_attributes.push_back(EGL_GL_COLORSPACE_KHR); // Chrome relied on incorrect Android behavior when dealing with P3 / // framebuffer_srgb interactions. This behavior was fixed in Q, which // causes invalid Chrome rendering. To achieve Android-P behavior in Q+, // use EGL_GL_COLORSPACE_P3_PASSTHROUGH_EXT where possible. - if (display->egl_ext_colorspace_display_p3_passthrough) { + if (display_->egl_ext_colorspace_display_p3_passthrough) { egl_window_attributes.push_back( EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT); } else { @@ -1469,8 +1483,8 @@ egl_window_attributes.push_back(EGL_NONE); // Create a surface for the native window. - surface_ = eglCreateWindowSurface(display->GetDisplay(), GetConfig(), window_, - &egl_window_attributes[0]); + surface_ = eglCreateWindowSurface(display_->GetDisplay(), GetConfig(), + window_, &egl_window_attributes[0]); if (!surface_) { LOG(ERROR) << "eglCreateWindowSurface failed with error " @@ -1482,7 +1496,7 @@ if (g_driver_egl.ext.b_EGL_NV_post_sub_buffer) { EGLint surfaceVal; EGLBoolean retVal = - eglQuerySurface(display->GetDisplay(), surface_, + eglQuerySurface(display_->GetDisplay(), surface_, EGL_POST_SUB_BUFFER_SUPPORTED_NV, &surfaceVal); supports_post_sub_buffer_ = (surfaceVal && retVal) == EGL_TRUE; } @@ -1490,9 +1504,10 @@ supports_swap_buffer_with_damage_ = g_driver_egl.ext.b_EGL_KHR_swap_buffers_with_damage; - if (!vsync_provider_external_ && EGLSyncControlVSyncProvider::IsSupported()) { + if (!vsync_provider_external_ && + EGLSyncControlVSyncProvider::IsSupported(display_)) { vsync_provider_internal_ = - std::make_unique<EGLSyncControlVSyncProvider>(surface_, GetGLDisplay()); + std::make_unique<EGLSyncControlVSyncProvider>(surface_, display_); } if (!vsync_provider_external_ && !vsync_provider_internal_) @@ -1521,12 +1536,13 @@ presentation_feedback_index_ = -1; composition_start_index_ = -1; - eglSurfaceAttrib(GetEGLDisplay(), surface_, EGL_TIMESTAMPS_ANDROID, EGL_TRUE); + eglSurfaceAttrib(display_->GetDisplay(), surface_, EGL_TIMESTAMPS_ANDROID, + EGL_TRUE); // Check if egl composite interval is supported or not. If not then return. // Else check which other timestamps are supported. EGLint interval_name = EGL_COMPOSITE_INTERVAL_ANDROID; - if (!eglGetCompositorTimingSupportedANDROID(GetEGLDisplay(), surface_, + if (!eglGetCompositorTimingSupportedANDROID(display_->GetDisplay(), surface_, interval_name)) return; @@ -1548,7 +1564,7 @@ supported_egl_timestamps_.reserve(kMaxTimestampsSupportable); supported_event_names_.reserve(kMaxTimestampsSupportable); for (const auto& ts : all_timestamps) { - if (!eglGetFrameTimestampSupportedANDROID(GetEGLDisplay(), surface_, + if (!eglGetFrameTimestampSupportedANDROID(display_->GetDisplay(), surface_, ts.egl_name)) continue; @@ -1602,7 +1618,7 @@ vsync_provider_internal_ = nullptr; if (surface_) { - if (!eglDestroySurface(GetEGLDisplay(), surface_)) { + if (!eglDestroySurface(display_->GetDisplay(), surface_)) { LOG(ERROR) << "eglDestroySurface failed with error " << GetLastEGLErrorString(); } @@ -1623,8 +1639,8 @@ EGLuint64KHR new_frame_id = 0; bool new_frame_id_is_valid = true; if (use_egl_timestamps_) { - new_frame_id_is_valid = - !!eglGetNextFrameIdANDROID(GetEGLDisplay(), surface_, &new_frame_id); + new_frame_id_is_valid = !!eglGetNextFrameIdANDROID(display_->GetDisplay(), + surface_, &new_frame_id); } if (!new_frame_id_is_valid) new_frame_id = -1; @@ -1632,7 +1648,7 @@ GLSurfacePresentationHelper::ScopedSwapBuffers scoped_swap_buffers( presentation_helper_.get(), std::move(callback), new_frame_id); - if (!eglSwapBuffers(GetEGLDisplay(), surface_)) { + if (!eglSwapBuffers(display_->GetDisplay(), surface_)) { DVLOG(1) << "eglSwapBuffers failed with error " << GetLastEGLErrorString(); scoped_swap_buffers.set_result(gfx::SwapResult::SWAP_FAILED); @@ -1673,7 +1689,7 @@ std::vector<EGLnsecsANDROID> egl_timestamps(supported_egl_timestamps_.size(), EGL_TIMESTAMP_INVALID_ANDROID); if (!eglGetFrameTimestampsANDROID( - GetEGLDisplay(), surface_, oldFrameId, + display_->GetDisplay(), surface_, oldFrameId, static_cast<EGLint>(supported_egl_timestamps_.size()), supported_egl_timestamps_.data(), egl_timestamps.data())) { TRACE_EVENT_INSTANT0("gpu", "eglGetFrameTimestamps:Failed", @@ -1766,8 +1782,8 @@ gfx::Size NativeViewGLSurfaceEGL::GetSize() { EGLint width; EGLint height; - if (!eglQuerySurface(GetEGLDisplay(), surface_, EGL_WIDTH, &width) || - !eglQuerySurface(GetEGLDisplay(), surface_, EGL_HEIGHT, &height)) { + if (!eglQuerySurface(display_->GetDisplay(), surface_, EGL_WIDTH, &width) || + !eglQuerySurface(display_->GetDisplay(), surface_, EGL_HEIGHT, &height)) { NOTREACHED() << "eglQuerySurface failed with error " << GetLastEGLErrorString(); return gfx::Size(); @@ -1802,7 +1818,7 @@ } SetVSyncEnabled(vsync_enabled_); if (use_egl_timestamps_) { - eglSurfaceAttrib(GetEGLDisplay(), surface_, EGL_TIMESTAMPS_ANDROID, + eglSurfaceAttrib(display_->GetDisplay(), surface_, EGL_TIMESTAMPS_ANDROID, EGL_TRUE); } return true; @@ -1828,7 +1844,7 @@ } SetVSyncEnabled(vsync_enabled_); if (use_egl_timestamps_) { - eglSurfaceAttrib(GetEGLDisplay(), surface_, EGL_TIMESTAMPS_ANDROID, + eglSurfaceAttrib(display_->GetDisplay(), surface_, EGL_TIMESTAMPS_ANDROID, EGL_TRUE); } return true; @@ -1910,7 +1926,7 @@ // TimeTicks::Now() (snapped to the next vsync) instead of 0. if ((frame_id < 0) || !eglGetFrameTimestampsANDROID( - GetEGLDisplay(), surface_, frame_id, + display_->GetDisplay(), surface_, frame_id, static_cast<EGLint>(supported_egl_timestamps_.size()), supported_egl_timestamps_.data(), egl_timestamps.data())) { // If we couldn't get the correct presentation time due to some errors, @@ -1964,7 +1980,7 @@ GLSurfacePresentationHelper::ScopedSwapBuffers scoped_swap_buffers( presentation_helper_.get(), std::move(callback)); - if (!eglSwapBuffersWithDamageKHR(GetEGLDisplay(), surface_, + if (!eglSwapBuffersWithDamageKHR(display_->GetDisplay(), surface_, const_cast<EGLint*>(rects.data()), static_cast<EGLint>(rects.size() / 4))) { DVLOG(1) << "eglSwapBuffersWithDamageKHR failed with error " @@ -2024,7 +2040,7 @@ void NativeViewGLSurfaceEGL::SetVSyncEnabled(bool enabled) { DCHECK(GLContext::GetCurrent() && GLContext::GetCurrent()->IsCurrent(this)); vsync_enabled_ = enabled; - if (!eglSwapInterval(GetEGLDisplay(), enabled ? 1 : 0)) { + if (!eglSwapInterval(display_->GetDisplay(), enabled ? 1 : 0)) { LOG(ERROR) << "eglSwapInterval failed with error " << GetLastEGLErrorString(); } @@ -2046,9 +2062,9 @@ #endif } -PbufferGLSurfaceEGL::PbufferGLSurfaceEGL(const gfx::Size& size) - : size_(size), - surface_(NULL) { +PbufferGLSurfaceEGL::PbufferGLSurfaceEGL(GLDisplayEGL* display, + const gfx::Size& size) + : GLSurfaceEGL(display), size_(size), surface_(nullptr) { // Some implementations of Pbuffer do not support having a 0 size. For such // cases use a (1, 1) surface. if (size_.GetArea() == 0) @@ -2069,12 +2085,6 @@ format_ = format; - EGLDisplay display = GetEGLDisplay(); - if (!display) { - LOG(ERROR) << "Trying to create surface with invalid display."; - return false; - } - // Allocate the new pbuffer surface before freeing the old one to ensure // they have different addresses. If they have the same address then a // future call to MakeCurrent might early out because it appears the current @@ -2087,7 +2097,7 @@ // Enable robust resource init when using SwANGLE if (IsSoftwareGLImplementation(GetGLImplementationParts()) && - GLSurfaceEGL::GetGLDisplayEGL()->IsRobustResourceInitSupported()) { + display_->IsRobustResourceInitSupported()) { pbuffer_attribs.push_back(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE); pbuffer_attribs.push_back(EGL_TRUE); } @@ -2096,8 +2106,8 @@ pbuffer_attribs.push_back(EGL_NONE); pbuffer_attribs.push_back(EGL_NONE); - EGLSurface new_surface = - eglCreatePbufferSurface(display, GetConfig(), &pbuffer_attribs[0]); + EGLSurface new_surface = eglCreatePbufferSurface( + display_->GetDisplay(), GetConfig(), &pbuffer_attribs[0]); if (!new_surface) { LOG(ERROR) << "eglCreatePbufferSurface failed with error " << GetLastEGLErrorString(); @@ -2105,7 +2115,7 @@ } if (old_surface) - eglDestroySurface(display, old_surface); + eglDestroySurface(display_->GetDisplay(), old_surface); surface_ = new_surface; return true; @@ -2113,7 +2123,7 @@ void PbufferGLSurfaceEGL::Destroy() { if (surface_) { - if (!eglDestroySurface(GetEGLDisplay(), surface_)) { + if (!eglDestroySurface(display_->GetDisplay(), surface_)) { LOG(ERROR) << "eglDestroySurface failed with error " << GetLastEGLErrorString(); } @@ -2182,7 +2192,7 @@ return nullptr; void* handle; - if (!eglQuerySurfacePointerANGLE(GetEGLDisplay(), GetHandle(), + if (!eglQuerySurfacePointerANGLE(display_->GetDisplay(), GetHandle(), EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE, &handle)) { return nullptr; @@ -2196,7 +2206,8 @@ Destroy(); } -SurfacelessEGL::SurfacelessEGL(const gfx::Size& size) : size_(size) {} +SurfacelessEGL::SurfacelessEGL(GLDisplayEGL* display, const gfx::Size& size) + : GLSurfaceEGL(display), size_(size) {} bool SurfacelessEGL::Initialize(GLSurfaceFormat format) { format_ = format;
diff --git a/ui/gl/gl_surface_egl.h b/ui/gl/gl_surface_egl.h index 12f3da9..e53b967 100644 --- a/ui/gl/gl_surface_egl.h +++ b/ui/gl/gl_surface_egl.h
@@ -45,8 +45,7 @@ // Interface for EGL surface. class GL_EXPORT GLSurfaceEGL : public GLSurface { public: - GLSurfaceEGL(); - + explicit GLSurfaceEGL(GLDisplayEGL* display); GLSurfaceEGL(const GLSurfaceEGL&) = delete; GLSurfaceEGL& operator=(const GLSurfaceEGL&) = delete; virtual EGLint GetNativeVisualID() const; @@ -77,6 +76,7 @@ EGLConfig config_ = nullptr; GLSurfaceFormat format_; + GLDisplayEGL* display_ = nullptr; private: static bool InitializeOneOffCommon(GLDisplayEGL* display); @@ -87,7 +87,8 @@ class GL_EXPORT NativeViewGLSurfaceEGL : public GLSurfaceEGL, public EGLTimestampClient { public: - NativeViewGLSurfaceEGL(EGLNativeWindowType window, + NativeViewGLSurfaceEGL(GLDisplayEGL* display, + EGLNativeWindowType window, std::unique_ptr<gfx::VSyncProvider> vsync_provider); NativeViewGLSurfaceEGL(const NativeViewGLSurfaceEGL&) = delete; @@ -192,7 +193,7 @@ // Encapsulates a pbuffer EGL surface. class GL_EXPORT PbufferGLSurfaceEGL : public GLSurfaceEGL { public: - explicit PbufferGLSurfaceEGL(const gfx::Size& size); + PbufferGLSurfaceEGL(GLDisplayEGL* display, const gfx::Size& size); PbufferGLSurfaceEGL(const PbufferGLSurfaceEGL&) = delete; PbufferGLSurfaceEGL& operator=(const PbufferGLSurfaceEGL&) = delete; @@ -223,7 +224,7 @@ // need to create a dummy EGLsurface in case we render to client API targets. class GL_EXPORT SurfacelessEGL : public GLSurfaceEGL { public: - explicit SurfacelessEGL(const gfx::Size& size); + SurfacelessEGL(GLDisplayEGL* display, const gfx::Size& size); SurfacelessEGL(const SurfacelessEGL&) = delete; SurfacelessEGL& operator=(const SurfacelessEGL&) = delete;
diff --git a/ui/gl/gl_surface_egl_surface_control.cc b/ui/gl/gl_surface_egl_surface_control.cc index 96835b8..1df4ac6e 100644 --- a/ui/gl/gl_surface_egl_surface_control.cc +++ b/ui/gl/gl_surface_egl_surface_control.cc
@@ -56,9 +56,11 @@ } // namespace GLSurfaceEGLSurfaceControl::GLSurfaceEGLSurfaceControl( + GLDisplayEGL* display, ANativeWindow* window, scoped_refptr<base::SingleThreadTaskRunner> task_runner) - : root_surface_name_(BuildSurfaceName(kRootSurfaceName)), + : GLSurfaceEGL(display), + root_surface_name_(BuildSurfaceName(kRootSurfaceName)), child_surface_name_(BuildSurfaceName(kChildSurfaceName)), window_rect_(0, 0, @@ -90,8 +92,7 @@ // Surfaceless is always disabled on Android so we create a 1x1 pbuffer // surface. if (!offscreen_surface_) { - EGLDisplay display = GetEGLDisplay(); - if (!display) { + if (!display_->GetDisplay()) { LOG(ERROR) << "Trying to create surface with invalid display."; return false; } @@ -99,8 +100,8 @@ EGLint pbuffer_attribs[] = { EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE, }; - offscreen_surface_ = - eglCreatePbufferSurface(display, GetConfig(), pbuffer_attribs); + offscreen_surface_ = eglCreatePbufferSurface(display_->GetDisplay(), + GetConfig(), pbuffer_attribs); if (!offscreen_surface_) { LOG(ERROR) << "eglCreatePbufferSurface failed with error " << ui::GetLastEGLErrorString(); @@ -140,7 +141,7 @@ root_surface_.reset(); if (offscreen_surface_) { - if (!eglDestroySurface(GetEGLDisplay(), offscreen_surface_)) { + if (!eglDestroySurface(display_->GetDisplay(), offscreen_surface_)) { LOG(ERROR) << "eglDestroySurface failed with error " << ui::GetLastEGLErrorString(); }
diff --git a/ui/gl/gl_surface_egl_surface_control.h b/ui/gl/gl_surface_egl_surface_control.h index c44939b..28f9a6eb 100644 --- a/ui/gl/gl_surface_egl_surface_control.h +++ b/ui/gl/gl_surface_egl_surface_control.h
@@ -31,7 +31,8 @@ class GL_EXPORT GLSurfaceEGLSurfaceControl : public GLSurfaceEGL { public: - explicit GLSurfaceEGLSurfaceControl( + GLSurfaceEGLSurfaceControl( + GLDisplayEGL* display, ANativeWindow* window, scoped_refptr<base::SingleThreadTaskRunner> task_runner);
diff --git a/ui/gl/gl_surface_egl_unittest.cc b/ui/gl/gl_surface_egl_unittest.cc index 03f786e..dabd89c 100644 --- a/ui/gl/gl_surface_egl_unittest.cc +++ b/ui/gl/gl_surface_egl_unittest.cc
@@ -95,8 +95,9 @@ gfx::Size window_size(400, 500); ui::WinWindow window(&platform_delegate, gfx::Rect(window_size)); - scoped_refptr<GLSurface> surface = InitializeGLSurface( - base::MakeRefCounted<NativeViewGLSurfaceEGL>(window.hwnd(), nullptr)); + scoped_refptr<GLSurface> surface = + InitializeGLSurface(base::MakeRefCounted<NativeViewGLSurfaceEGL>( + GLSurfaceEGL::GetGLDisplayEGL(), window.hwnd(), nullptr)); ASSERT_TRUE(surface); EXPECT_EQ(window_size, surface->GetSize());
diff --git a/ui/gl/gl_surface_egl_x11.cc b/ui/gl/gl_surface_egl_x11.cc index e39323f7..50a03a0 100644 --- a/ui/gl/gl_surface_egl_x11.cc +++ b/ui/gl/gl_surface_egl_x11.cc
@@ -13,8 +13,9 @@ namespace gl { -NativeViewGLSurfaceEGLX11::NativeViewGLSurfaceEGLX11(x11::Window window) - : NativeViewGLSurfaceEGL(static_cast<uint32_t>(window), nullptr) {} +NativeViewGLSurfaceEGLX11::NativeViewGLSurfaceEGLX11(GLDisplayEGL* display, + x11::Window window) + : NativeViewGLSurfaceEGL(display, static_cast<uint32_t>(window), nullptr) {} bool NativeViewGLSurfaceEGLX11::Initialize(GLSurfaceFormat format) { if (!NativeViewGLSurfaceEGL::Initialize(format))
diff --git a/ui/gl/gl_surface_egl_x11.h b/ui/gl/gl_surface_egl_x11.h index efaffcd..6f8d883 100644 --- a/ui/gl/gl_surface_egl_x11.h +++ b/ui/gl/gl_surface_egl_x11.h
@@ -18,7 +18,7 @@ class GL_EXPORT NativeViewGLSurfaceEGLX11 : public NativeViewGLSurfaceEGL, public x11::EventObserver { public: - explicit NativeViewGLSurfaceEGLX11(x11::Window window); + NativeViewGLSurfaceEGLX11(GLDisplayEGL* display, x11::Window window); NativeViewGLSurfaceEGLX11(const NativeViewGLSurfaceEGLX11& other) = delete; NativeViewGLSurfaceEGLX11& operator=(const NativeViewGLSurfaceEGLX11& rhs) = delete;
diff --git a/ui/gl/gl_surface_egl_x11_gles2.cc b/ui/gl/gl_surface_egl_x11_gles2.cc index 23b76ef..4133662 100644 --- a/ui/gl/gl_surface_egl_x11_gles2.cc +++ b/ui/gl/gl_surface_egl_x11_gles2.cc
@@ -15,8 +15,10 @@ namespace gl { NativeViewGLSurfaceEGLX11GLES2::NativeViewGLSurfaceEGLX11GLES2( + gl::GLDisplayEGL* display, x11::Window window) - : NativeViewGLSurfaceEGLX11(x11::Window::None), parent_window_(window) {} + : NativeViewGLSurfaceEGLX11(display, x11::Window::None), + parent_window_(window) {} bool NativeViewGLSurfaceEGLX11GLES2::InitializeNativeWindow() { auto* connection = GetXNativeConnection();
diff --git a/ui/gl/gl_surface_egl_x11_gles2.h b/ui/gl/gl_surface_egl_x11_gles2.h index 74c44261..9ef8837b 100644 --- a/ui/gl/gl_surface_egl_x11_gles2.h +++ b/ui/gl/gl_surface_egl_x11_gles2.h
@@ -17,7 +17,8 @@ class GL_EXPORT NativeViewGLSurfaceEGLX11GLES2 : public NativeViewGLSurfaceEGLX11 { public: - explicit NativeViewGLSurfaceEGLX11GLES2(x11::Window window); + explicit NativeViewGLSurfaceEGLX11GLES2(gl::GLDisplayEGL* display, + x11::Window window); NativeViewGLSurfaceEGLX11GLES2(const NativeViewGLSurfaceEGLX11GLES2&) = delete;
diff --git a/ui/gl/init/gl_factory_android.cc b/ui/gl/init/gl_factory_android.cc index 039e13b..222e612 100644 --- a/ui/gl/init/gl_factory_android.cc +++ b/ui/gl/init/gl_factory_android.cc
@@ -123,7 +123,8 @@ case kGLImplementationEGLGLES2: case kGLImplementationEGLANGLE: if (window != gfx::kNullAcceleratedWidget) { - return InitializeGLSurface(new NativeViewGLSurfaceEGL(window, nullptr)); + return InitializeGLSurface(new NativeViewGLSurfaceEGL( + GLSurfaceEGL::GetGLDisplayEGL(), window, nullptr)); } else { return InitializeGLSurface(new GLSurfaceStub()); } @@ -142,10 +143,12 @@ case kGLImplementationEGLANGLE: { if (GLSurfaceEGL::GetGLDisplayEGL()->IsEGLSurfacelessContextSupported() && (size.width() == 0 && size.height() == 0)) { - return InitializeGLSurfaceWithFormat(new SurfacelessEGL(size), format); + return InitializeGLSurfaceWithFormat( + new SurfacelessEGL(GLSurfaceEGL::GetGLDisplayEGL(), size), format); } else { - return InitializeGLSurfaceWithFormat(new PbufferGLSurfaceEGL(size), - format); + return InitializeGLSurfaceWithFormat( + new PbufferGLSurfaceEGL(GLSurfaceEGL::GetGLDisplayEGL(), size), + format); } } case kGLImplementationMockGL:
diff --git a/ui/gl/init/gl_factory_mac.cc b/ui/gl/init/gl_factory_mac.cc index 7cae0d3..a70f8631 100644 --- a/ui/gl/init/gl_factory_mac.cc +++ b/ui/gl/init/gl_factory_mac.cc
@@ -143,10 +143,12 @@ case kGLImplementationEGLANGLE: if (GLSurfaceEGL::GetGLDisplayEGL()->IsEGLSurfacelessContextSupported() && size.width() == 0 && size.height() == 0) { - return InitializeGLSurfaceWithFormat(new SurfacelessEGL(size), format); + return InitializeGLSurfaceWithFormat( + new SurfacelessEGL(GLSurfaceEGL::GetGLDisplayEGL(), size), format); } else { - return InitializeGLSurfaceWithFormat(new PbufferGLSurfaceEGL(size), - format); + return InitializeGLSurfaceWithFormat( + new PbufferGLSurfaceEGL(GLSurfaceEGL::GetGLDisplayEGL(), size), + format); } #endif // defined(USE_EGL) case kGLImplementationMockGL:
diff --git a/ui/gl/init/gl_factory_win.cc b/ui/gl/init/gl_factory_win.cc index 9356c32..3aa35bb 100644 --- a/ui/gl/init/gl_factory_win.cc +++ b/ui/gl/init/gl_factory_win.cc
@@ -65,7 +65,8 @@ case kGLImplementationEGLANGLE: { DCHECK_NE(window, gfx::kNullAcceleratedWidget); return InitializeGLSurface(base::MakeRefCounted<NativeViewGLSurfaceEGL>( - window, std::make_unique<VSyncProviderWin>(window))); + GLSurfaceEGL::GetGLDisplayEGL(), window, + std::make_unique<VSyncProviderWin>(window))); } case kGLImplementationMockGL: case kGLImplementationStubGL: @@ -83,10 +84,12 @@ case kGLImplementationEGLANGLE: if (GLSurfaceEGL::GetGLDisplayEGL()->IsEGLSurfacelessContextSupported() && size.width() == 0 && size.height() == 0) { - return InitializeGLSurfaceWithFormat(new SurfacelessEGL(size), format); + return InitializeGLSurfaceWithFormat( + new SurfacelessEGL(GLSurfaceEGL::GetGLDisplayEGL(), size), format); } else { - return InitializeGLSurfaceWithFormat(new PbufferGLSurfaceEGL(size), - format); + return InitializeGLSurfaceWithFormat( + new PbufferGLSurfaceEGL(GLSurfaceEGL::GetGLDisplayEGL(), size), + format); } case kGLImplementationMockGL: case kGLImplementationStubGL:
diff --git a/ui/ozone/common/gl_surface_egl_readback.cc b/ui/ozone/common/gl_surface_egl_readback.cc index b3b271d..8d14021 100644 --- a/ui/ozone/common/gl_surface_egl_readback.cc +++ b/ui/ozone/common/gl_surface_egl_readback.cc
@@ -20,7 +20,7 @@ } // namespace GLSurfaceEglReadback::GLSurfaceEglReadback() - : PbufferGLSurfaceEGL(gfx::Size(1, 1)), + : PbufferGLSurfaceEGL(GLSurfaceEGL::GetGLDisplayEGL(), gfx::Size(1, 1)), task_runner_(base::ThreadTaskRunnerHandle::Get()) {} bool GLSurfaceEglReadback::Resize(const gfx::Size& size,
diff --git a/ui/ozone/platform/cast/gl_ozone_egl_cast.cc b/ui/ozone/platform/cast/gl_ozone_egl_cast.cc index 13b6222..779f213 100644 --- a/ui/ozone/platform/cast/gl_ozone_egl_cast.cc +++ b/ui/ozone/platform/cast/gl_ozone_egl_cast.cc
@@ -97,7 +97,8 @@ scoped_refptr<gl::GLSurface> GLOzoneEglCast::CreateOffscreenGLSurface( const gfx::Size& size) { - return gl::InitializeGLSurface(new gl::PbufferGLSurfaceEGL(size)); + return gl::InitializeGLSurface( + new gl::PbufferGLSurfaceEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), size)); } gl::EGLDisplayPlatform GLOzoneEglCast::GetNativeDisplay() {
diff --git a/ui/ozone/platform/cast/gl_surface_cast.cc b/ui/ozone/platform/cast/gl_surface_cast.cc index e3463b5..80eccd2 100644 --- a/ui/ozone/platform/cast/gl_surface_cast.cc +++ b/ui/ozone/platform/cast/gl_surface_cast.cc
@@ -46,6 +46,7 @@ GLSurfaceCast::GLSurfaceCast(gfx::AcceleratedWidget widget, GLOzoneEglCast* parent) : NativeViewGLSurfaceEGL( + GLSurfaceEGL::GetGLDisplayEGL(), parent->GetNativeWindow(), std::make_unique<gfx::FixedVSyncProvider>(base::TimeTicks(), GetVSyncInterval())),
diff --git a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc index 0c54d912..6b4aafb9 100644 --- a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc +++ b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
@@ -129,7 +129,8 @@ const gfx::Size& size) override { DCHECK_EQ(size.width(), 0); DCHECK_EQ(size.height(), 0); - return gl::InitializeGLSurface(new gl::SurfacelessEGL(size)); + return gl::InitializeGLSurface( + new gl::SurfacelessEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), size)); } protected:
diff --git a/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc b/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc index 9037b6b..43cb0c2 100644 --- a/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc +++ b/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
@@ -40,7 +40,7 @@ GbmSurfaceless::GbmSurfaceless(GbmSurfaceFactory* surface_factory, std::unique_ptr<DrmWindowProxy> window, gfx::AcceleratedWidget widget) - : SurfacelessEGL(gfx::Size()), + : SurfacelessEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), gfx::Size()), surface_factory_(surface_factory), window_(std::move(window)), widget_(widget),
diff --git a/ui/ozone/platform/flatland/flatland_surface_factory.cc b/ui/ozone/platform/flatland/flatland_surface_factory.cc index 15a56cad..13c151f 100644 --- a/ui/ozone/platform/flatland/flatland_surface_factory.cc +++ b/ui/ozone/platform/flatland/flatland_surface_factory.cc
@@ -48,14 +48,14 @@ // GL rendering to Flatland views is not supported. This function is // used only for unittests. Return an off-screen surface, so the tests pass. // TODO(crbug.com/1271760): Use Vulkan in unittests and remove this hack. - return gl::InitializeGLSurface( - base::MakeRefCounted<gl::SurfacelessEGL>(gfx::Size(100, 100))); + return gl::InitializeGLSurface(base::MakeRefCounted<gl::SurfacelessEGL>( + gl::GLSurfaceEGL::GetGLDisplayEGL(), gfx::Size(100, 100))); } scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface( const gfx::Size& size) override { - return gl::InitializeGLSurface( - base::MakeRefCounted<gl::SurfacelessEGL>(size)); + return gl::InitializeGLSurface(base::MakeRefCounted<gl::SurfacelessEGL>( + gl::GLSurfaceEGL::GetGLDisplayEGL(), size)); } gl::EGLDisplayPlatform GetNativeDisplay() override {
diff --git a/ui/ozone/platform/headless/headless_surface_factory.cc b/ui/ozone/platform/headless/headless_surface_factory.cc index 95ee659..8c81c38a 100644 --- a/ui/ozone/platform/headless/headless_surface_factory.cc +++ b/ui/ozone/platform/headless/headless_surface_factory.cc
@@ -203,7 +203,8 @@ scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface( const gfx::Size& size) override { return gl::InitializeGLSurface( - base::MakeRefCounted<gl::PbufferGLSurfaceEGL>(size)); + base::MakeRefCounted<gl::PbufferGLSurfaceEGL>( + gl::GLSurfaceEGL::GetGLDisplayEGL(), size)); } protected:
diff --git a/ui/ozone/platform/scenic/scenic_surface_factory.cc b/ui/ozone/platform/scenic/scenic_surface_factory.cc index 27d0c1e1..7be47d7 100644 --- a/ui/ozone/platform/scenic/scenic_surface_factory.cc +++ b/ui/ozone/platform/scenic/scenic_surface_factory.cc
@@ -60,14 +60,14 @@ // GL rendering to Flatland views is not supported. This function is // used only for unittests. Return an off-screen surface, so the tests pass. // TODO(crbug.com/1271760): Use Vulkan in unittests and remove this hack. - return gl::InitializeGLSurface( - base::MakeRefCounted<gl::SurfacelessEGL>(gfx::Size(100, 100))); + return gl::InitializeGLSurface(base::MakeRefCounted<gl::SurfacelessEGL>( + gl::GLSurfaceEGL::GetGLDisplayEGL(), gfx::Size(100, 100))); } scoped_refptr<gl::GLSurface> CreateOffscreenGLSurface( const gfx::Size& size) override { - return gl::InitializeGLSurface( - base::MakeRefCounted<gl::SurfacelessEGL>(size)); + return gl::InitializeGLSurface(base::MakeRefCounted<gl::SurfacelessEGL>( + gl::GLSurfaceEGL::GetGLDisplayEGL(), size)); } gl::EGLDisplayPlatform GetNativeDisplay() override {
diff --git a/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc b/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc index 35f1008..0501524 100644 --- a/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc +++ b/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc
@@ -113,7 +113,7 @@ GbmSurfacelessWayland::GbmSurfacelessWayland( WaylandBufferManagerGpu* buffer_manager, gfx::AcceleratedWidget widget) - : SurfacelessEGL(gfx::Size()), + : SurfacelessEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), gfx::Size()), buffer_manager_(buffer_manager), widget_(widget), has_implicit_external_sync_(
diff --git a/ui/ozone/platform/wayland/gpu/gl_surface_wayland.cc b/ui/ozone/platform/wayland/gpu/gl_surface_wayland.cc index d79ce4f3..fa02957 100644 --- a/ui/ozone/platform/wayland/gpu/gl_surface_wayland.cc +++ b/ui/ozone/platform/wayland/gpu/gl_surface_wayland.cc
@@ -29,9 +29,11 @@ window->root_surface()->surface(), size.width(), size.height())); } -GLSurfaceWayland::GLSurfaceWayland(WaylandEglWindowPtr egl_window, +GLSurfaceWayland::GLSurfaceWayland(gl::GLDisplayEGL* display, + WaylandEglWindowPtr egl_window, WaylandWindow* window) : NativeViewGLSurfaceEGL( + display, reinterpret_cast<EGLNativeWindowType>(egl_window.get()), nullptr), egl_window_(std::move(egl_window)),
diff --git a/ui/ozone/platform/wayland/gpu/gl_surface_wayland.h b/ui/ozone/platform/wayland/gpu/gl_surface_wayland.h index ae26555..21c6541 100644 --- a/ui/ozone/platform/wayland/gpu/gl_surface_wayland.h +++ b/ui/ozone/platform/wayland/gpu/gl_surface_wayland.h
@@ -29,7 +29,9 @@ public: using WaylandEglWindowPtr = std::unique_ptr<wl_egl_window, EGLWindowDeleter>; - GLSurfaceWayland(WaylandEglWindowPtr egl_window, WaylandWindow* window); + GLSurfaceWayland(gl::GLDisplayEGL* display, + WaylandEglWindowPtr egl_window, + WaylandWindow* window); GLSurfaceWayland(const GLSurfaceWayland&) = delete; GLSurfaceWayland& operator=(const GLSurfaceWayland&) = delete;
diff --git a/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc b/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc index 8f9757ff..907de8b 100644 --- a/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc +++ b/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc
@@ -79,8 +79,8 @@ auto egl_window = CreateWaylandEglWindow(window); if (!egl_window) return nullptr; - return gl::InitializeGLSurface( - new GLSurfaceWayland(std::move(egl_window), window)); + return gl::InitializeGLSurface(new GLSurfaceWayland( + gl::GLSurfaceEGL::GetGLDisplayEGL(), std::move(egl_window), window)); } scoped_refptr<gl::GLSurface> GLOzoneEGLWayland::CreateSurfacelessViewGLSurface( @@ -106,9 +106,11 @@ const gfx::Size& size) { if (gl::GLSurfaceEGL::GetGLDisplayEGL()->IsEGLSurfacelessContextSupported() && size.width() == 0 && size.height() == 0) { - return gl::InitializeGLSurface(new gl::SurfacelessEGL(size)); + return gl::InitializeGLSurface( + new gl::SurfacelessEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), size)); } else { - return gl::InitializeGLSurface(new gl::PbufferGLSurfaceEGL(size)); + return gl::InitializeGLSurface( + new gl::PbufferGLSurfaceEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), size)); } }
diff --git a/ui/ozone/platform/x11/x11_surface_factory.cc b/ui/ozone/platform/x11/x11_surface_factory.cc index 9d797ca6..054344a4 100644 --- a/ui/ozone/platform/x11/x11_surface_factory.cc +++ b/ui/ozone/platform/x11/x11_surface_factory.cc
@@ -53,10 +53,12 @@ case gl::kGLImplementationEGLGLES2: DCHECK(window != gfx::kNullAcceleratedWidget); return gl::InitializeGLSurface(new gl::NativeViewGLSurfaceEGLX11GLES2( + gl::GLSurfaceEGL::GetGLDisplayEGL(), static_cast<x11::Window>(window))); case gl::kGLImplementationEGLANGLE: DCHECK(window != gfx::kNullAcceleratedWidget); return gl::InitializeGLSurface(new gl::NativeViewGLSurfaceEGLX11( + gl::GLSurfaceEGL::GetGLDisplayEGL(), static_cast<x11::Window>(window))); default: NOTREACHED(); @@ -70,9 +72,11 @@ if (gl::GLSurfaceEGL::GetGLDisplayEGL() ->IsEGLSurfacelessContextSupported() && size.width() == 0 && size.height() == 0) { - return InitializeGLSurface(new gl::SurfacelessEGL(size)); + return InitializeGLSurface( + new gl::SurfacelessEGL(gl::GLSurfaceEGL::GetGLDisplayEGL(), size)); } else { - return InitializeGLSurface(new gl::PbufferGLSurfaceEGL(size)); + return InitializeGLSurface(new gl::PbufferGLSurfaceEGL( + gl::GLSurfaceEGL::GetGLDisplayEGL(), size)); } }
diff --git a/ui/views/animation/animation_sequence_block.cc b/ui/views/animation/animation_sequence_block.cc index 4bd2c13..ed10ff1 100644 --- a/ui/views/animation/animation_sequence_block.cc +++ b/ui/views/animation/animation_sequence_block.cc
@@ -171,6 +171,21 @@ return SetRoundedCorners(target->layer(), rounded_corners, tween_type); } +AnimationSequenceBlock& AnimationSequenceBlock::SetGradientMask( + ui::Layer* target, + const gfx::LinearGradient& gradient_mask, + gfx::Tween::Type tween_type) { + return AddAnimation({target, ui::LayerAnimationElement::GRADIENT_MASK}, + Element(gradient_mask, tween_type)); +} + +AnimationSequenceBlock& AnimationSequenceBlock::SetGradientMask( + ui::LayerOwner* target, + const gfx::LinearGradient& gradient_mask, + gfx::Tween::Type tween_type) { + return SetGradientMask(target->layer(), gradient_mask, tween_type); +} + AnimationSequenceBlock& AnimationSequenceBlock::SetVisibility( ui::Layer* target, bool visible, @@ -273,6 +288,11 @@ absl::get<gfx::RoundedCornersF>(pair.second.animation_value_), duration); break; + case ui::LayerAnimationElement::GRADIENT_MASK: + element = ui::LayerAnimationElement::CreateGradientMaskElement( + absl::get<gfx::LinearGradient>(pair.second.animation_value_), + duration); + break; default: NOTREACHED(); }
diff --git a/ui/views/animation/animation_sequence_block.h b/ui/views/animation/animation_sequence_block.h index 1411b9c..1f4442a7 100644 --- a/ui/views/animation/animation_sequence_block.h +++ b/ui/views/animation/animation_sequence_block.h
@@ -22,6 +22,7 @@ namespace gfx { class Rect; class RoundedCornersF; +class LinearGradient; } // namespace gfx namespace ui { @@ -119,6 +120,14 @@ ui::LayerOwner* target, const gfx::RoundedCornersF& rounded_corners, gfx::Tween::Type tween_type = gfx::Tween::LINEAR); + AnimationSequenceBlock& SetGradientMask( + ui::Layer* target, + const gfx::LinearGradient& gradient_mask, + gfx::Tween::Type tween_type = gfx::Tween::LINEAR); + AnimationSequenceBlock& SetGradientMask( + ui::LayerOwner* target, + const gfx::LinearGradient& gradient_mask, + gfx::Tween::Type tween_type = gfx::Tween::LINEAR); AnimationSequenceBlock& SetVisibility( ui::Layer* target, bool visible, @@ -138,6 +147,7 @@ float, SkColor, gfx::RoundedCornersF, + gfx::LinearGradient, bool, gfx::Transform>;
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm index 14a62d94..e1c9370 100644 --- a/ui/views/cocoa/bridged_native_widget_unittest.mm +++ b/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -250,45 +250,6 @@ @end -// Class to override -[NSWindow toggleFullScreen:] to a no-op. This simulates -// NSWindow's behavior when attempting to toggle fullscreen state again, when -// the last attempt failed but Cocoa has not yet sent -// windowDidFailToEnterFullScreen:. -@interface BridgedNativeWidgetTestWindow : NativeWidgetMacNSWindow { - @private - BOOL _ignoreToggleFullScreen; - int _ignoredToggleFullScreenCount; -} -@property(assign, nonatomic) BOOL ignoreToggleFullScreen; -@property(readonly, nonatomic) int ignoredToggleFullScreenCount; -@end - -@implementation BridgedNativeWidgetTestWindow - -@synthesize ignoreToggleFullScreen = _ignoreToggleFullScreen; -@synthesize ignoredToggleFullScreenCount = _ignoredToggleFullScreenCount; - -- (void)performSelector:(SEL)aSelector - withObject:(id)anArgument - afterDelay:(NSTimeInterval)delay { - // This is used in simulations without a message loop. Don't start a message - // loop since that would expose the tests to system notifications and - // potential flakes. Instead, just pretend the message loop is flushed here. - if (_ignoreToggleFullScreen && aSelector == @selector(toggleFullScreen:)) - [self toggleFullScreen:anArgument]; - else - [super performSelector:aSelector withObject:anArgument afterDelay:delay]; -} - -- (void)toggleFullScreen:(id)sender { - if (_ignoreToggleFullScreen) - ++_ignoredToggleFullScreenCount; - else - [super toggleFullScreen:sender]; -} - -@end - namespace views { namespace test { @@ -309,7 +270,7 @@ ownership_ = params.ownership; base::scoped_nsobject<NativeWidgetMacNSWindow> window( - [[BridgedNativeWidgetTestWindow alloc] + [[NativeWidgetMacNSWindow alloc] initWithContentRect:ui::kWindowSizeDeterminedLater styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered @@ -1960,69 +1921,5 @@ } } -typedef BridgedNativeWidgetTestBase BridgedNativeWidgetSimulateFullscreenTest; - -// Simulate the notifications that AppKit would send out if a fullscreen -// operation begins, and then fails and must abort. This notification sequence -// was determined by posting delayed tasks to toggle fullscreen state and then -// mashing Ctrl+Left/Right to keep OSX in a transition between Spaces to cause -// the fullscreen transition to fail. -TEST_F(BridgedNativeWidgetSimulateFullscreenTest, FailToEnterAndExit) { - BridgedNativeWidgetTestWindow* window = - base::mac::ObjCCastStrict<BridgedNativeWidgetTestWindow>( - widget_->GetNativeWindow().GetNativeNSWindow()); - [window setIgnoreToggleFullScreen:YES]; - widget_->Show(); - - NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; - - EXPECT_FALSE(bridge()->target_fullscreen_state()); - - // Simulate an initial toggleFullScreen: (user- or Widget-initiated). - [center postNotificationName:NSWindowWillEnterFullScreenNotification - object:window]; - - // On a failure, Cocoa starts by sending an unexpected *exit* fullscreen, and - // NativeWidgetNSWindowBridge will think it's just a delayed transition and - // try to go back into fullscreen but get ignored by Cocoa. - EXPECT_EQ(0, [window ignoredToggleFullScreenCount]); - EXPECT_TRUE(bridge()->target_fullscreen_state()); - [center postNotificationName:NSWindowDidExitFullScreenNotification - object:window]; - EXPECT_EQ(1, [window ignoredToggleFullScreenCount]); - EXPECT_FALSE(bridge()->target_fullscreen_state()); - - // Cocoa follows up with a failure message sent to the NSWindowDelegate (there - // is no equivalent notification for failure). - ViewsNSWindowDelegate* window_delegate = - base::mac::ObjCCast<ViewsNSWindowDelegate>([window delegate]); - [window_delegate windowDidFailToEnterFullScreen:window]; - EXPECT_FALSE(bridge()->target_fullscreen_state()); - - // Now perform a successful fullscreen operation. - [center postNotificationName:NSWindowWillEnterFullScreenNotification - object:window]; - EXPECT_TRUE(bridge()->target_fullscreen_state()); - [center postNotificationName:NSWindowDidEnterFullScreenNotification - object:window]; - EXPECT_TRUE(bridge()->target_fullscreen_state()); - - // And try to get out. - [center postNotificationName:NSWindowWillExitFullScreenNotification - object:window]; - EXPECT_FALSE(bridge()->target_fullscreen_state()); - - // On a failure, Cocoa sends a failure message, but then just dumps the window - // out of fullscreen anyway (in that order). - [window_delegate windowDidFailToExitFullScreen:window]; - EXPECT_FALSE(bridge()->target_fullscreen_state()); - [center postNotificationName:NSWindowDidExitFullScreenNotification - object:window]; - EXPECT_EQ(1, [window ignoredToggleFullScreenCount]); // No change. - EXPECT_FALSE(bridge()->target_fullscreen_state()); - - widget_->CloseNow(); -} - } // namespace test } // namespace views
diff --git a/ui/views/cocoa/native_widget_mac_ns_window_host.h b/ui/views/cocoa/native_widget_mac_ns_window_host.h index c93aedb..1ca8dab 100644 --- a/ui/views/cocoa/native_widget_mac_ns_window_host.h +++ b/ui/views/cocoa/native_widget_mac_ns_window_host.h
@@ -154,11 +154,8 @@ // Tell the window to transition to being fullscreen or not-fullscreen. // If `fullscreen` is true, then `target_display_id` specifies the display to - // which window should move (or an invalid display, to use the default). If - // `delay` is given, this sets the target fullscreen state and then posts a - // delayed task to request the window transition. See crbug.com/1210548. + // which window should move (or an invalid display, to use the default). void SetFullscreen(bool fullscreen, - base::TimeDelta delay = {}, int64_t target_display_id = display::kInvalidDisplayId); // The ultimate fullscreen state that is being targeted (irrespective of any @@ -255,10 +252,6 @@ void UpdateCompositorProperties(); void DestroyCompositor(); - // This is used to request a delayed fullscreen window transition after some - // other window placement occurs; see SetFullscreen() and crbug.com/1210548. - static void SetFullscreenAfterDelay(uint64_t bridged_native_widget_id); - // Sort |attached_native_view_host_views_| by the order in which their // NSViews should appear as subviews. This does a recursive pre-order // traversal of the views::View tree starting at |view|.
diff --git a/ui/views/cocoa/native_widget_mac_ns_window_host.mm b/ui/views/cocoa/native_widget_mac_ns_window_host.mm index 1c4c4a7..ac7f93e 100644 --- a/ui/views/cocoa/native_widget_mac_ns_window_host.mm +++ b/ui/views/cocoa/native_widget_mac_ns_window_host.mm
@@ -9,7 +9,6 @@ #include "base/base64.h" #include "base/containers/contains.h" -#include "base/feature_list.h" #include "base/mac/foundation_util.h" #include "base/no_destructor.h" #include "base/strings/sys_string_conversions.h" @@ -40,7 +39,6 @@ #include "ui/views/controls/menu/menu_config.h" #include "ui/views/controls/menu/menu_controller.h" #include "ui/views/views_delegate.h" -#include "ui/views/views_features.h" #include "ui/views/widget/native_widget_mac.h" #include "ui/views/widget/widget_delegate.h" #include "ui/views/window/dialog_delegate.h" @@ -478,7 +476,6 @@ } void NativeWidgetMacNSWindowHost::SetFullscreen(bool fullscreen, - base::TimeDelta delay, int64_t target_display_id) { // Note that when the NSWindow begins a fullscreen transition, the value of // |target_fullscreen_state_| updates via OnWindowFullscreenTransitionStart. @@ -487,30 +484,10 @@ // called until the current transition completes). target_fullscreen_state_ = fullscreen; - if (!delay.is_zero()) { - // Synchronously requesting fullscreen after moving the window to another - // display causes the window to resign key. Workaround this OS-specific - // quirk by delaying the fullscreen request, after setting the target state, - // to encapsulate some of these details from the calling client window code, - // i.e. so BrowserView::ProcessFullscreen will still hide its frame, etc. - // TODO(crbug.com/1034783): Refine cross-display fullscreen implementations. - // TODO(crbug.com/1210548): Find a better solution to avoid key resignation. - DCHECK_EQ(target_display_id, display::kInvalidDisplayId); - auto callback = base::BindOnce( - &NativeWidgetMacNSWindowHost::SetFullscreenAfterDelay, widget_id_); - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, std::move(callback), delay); - return; - } - - if (base::FeatureList::IsEnabled(features::kFullscreenControllerMac)) { - if (target_fullscreen_state_) - GetNSWindowMojo()->EnterFullscreen(target_display_id); - else - GetNSWindowMojo()->ExitFullscreen(); - } else { - GetNSWindowMojo()->SetFullscreen(fullscreen); - } + if (target_fullscreen_state_) + GetNSWindowMojo()->EnterFullscreen(target_display_id); + else + GetNSWindowMojo()->ExitFullscreen(); } void NativeWidgetMacNSWindowHost::SetRootView(views::View* root_view) { @@ -608,14 +585,6 @@ std::move(compositor_)); } -// static -void NativeWidgetMacNSWindowHost::SetFullscreenAfterDelay( - uint64_t bridged_native_widget_id) { - DCHECK(!base::FeatureList::IsEnabled(features::kFullscreenControllerMac)); - if (NativeWidgetMacNSWindowHost* host = GetFromId(bridged_native_widget_id)) - host->GetNSWindowMojo()->SetFullscreen(host->target_fullscreen_state_); -} - bool NativeWidgetMacNSWindowHost::SetWindowTitle(const std::u16string& title) { if (window_title_ == title) return false;
diff --git a/ui/views/controls/label.cc b/ui/views/controls/label.cc index 1852dff..4353a812 100644 --- a/ui/views/controls/label.cc +++ b/ui/views/controls/label.cc
@@ -735,6 +735,16 @@ display_text_->GetStringSize()); } +int Label::GetFontListY() const { + MaybeBuildDisplayText(); + + if (!display_text_) + return 0; + + return GetInsets().top() + display_text_->GetBaseline() - + font_list().GetBaseline(); +} + void Label::PaintText(gfx::Canvas* canvas) { MaybeBuildDisplayText();
diff --git a/ui/views/controls/label.h b/ui/views/controls/label.h index 8132b9b9..109e19f 100644 --- a/ui/views/controls/label.h +++ b/ui/views/controls/label.h
@@ -325,6 +325,11 @@ // which may exceed the local bounds of the label. gfx::Rect GetTextBounds() const; + // Returns the Y coordinate the font_list() will actually be drawn at, in + // local coordinates. This may differ from GetTextBounds().y() since the font + // is positioned inside the display rect. + int GetFontListY() const; + void PaintText(gfx::Canvas* canvas); // View:
diff --git a/ui/views/controls/menu/menu_controller_unittest.cc b/ui/views/controls/menu/menu_controller_unittest.cc index 11d8b1a7..0b68148 100644 --- a/ui/views/controls/menu/menu_controller_unittest.cc +++ b/ui/views/controls/menu/menu_controller_unittest.cc
@@ -72,7 +72,7 @@ #include "ui/events/test/events_test_utils_x11.h" #endif -#if defined(IS_WIN) +#if BUILDFLAG(IS_WIN) #include "base/win/windows_version.h" #endif @@ -2629,7 +2629,7 @@ // that a request to relaunch the context menu is received, and that // subsequently pressing ESC does not crash the browser. TEST_F(MenuControllerTest, RepostEventToEmptyMenuItem) { -#if defined(IS_WIN) +#if BUILDFLAG(IS_WIN) // TODO(crbug.com/1286137): This test is consistently failing on Win11. if (base::win::OSInfo::GetInstance()->version() >= base::win::Version::WIN11) { @@ -2815,7 +2815,7 @@ // Tests that |aura::Window| has the correct properties when a context menu is // shown. TEST_F(MenuControllerTest, ContextMenuInitializesAuraWindowWhenShown) { -#if defined(IS_WIN) +#if BUILDFLAG(IS_WIN) // TODO(crbug.com/1286137): This test is consistently failing on Win11. if (base::win::OSInfo::GetInstance()->version() >= base::win::Version::WIN11) { @@ -2876,7 +2876,7 @@ // Tests that |aura::Window| has the correct properties when a root or a child // menu is shown. TEST_F(MenuControllerTest, RootAndChildMenusInitializeAuraWindowWhenShown) { -#if defined(IS_WIN) +#if BUILDFLAG(IS_WIN) // TODO(crbug.com/1286137): This test is consistently failing on Win11. if (base::win::OSInfo::GetInstance()->version() >= base::win::Version::WIN11) { @@ -2983,7 +2983,7 @@ } TEST_F(MenuControllerTest, SetSelectionIndices_MenuItemsOnly) { -#if defined(IS_WIN) +#if BUILDFLAG(IS_WIN) // TODO(crbug.com/1286137): This test is consistently failing on Win11. if (base::win::OSInfo::GetInstance()->version() >= base::win::Version::WIN11) { @@ -3016,7 +3016,7 @@ TEST_F(MenuControllerTest, SetSelectionIndices_MenuItemsOnly_SkipHiddenAndDisabled) { -#if defined(IS_WIN) +#if BUILDFLAG(IS_WIN) // TODO(crbug.com/1286137): This test is consistently failing on Win11. if (base::win::OSInfo::GetInstance()->version() >= base::win::Version::WIN11) { @@ -3042,7 +3042,7 @@ } TEST_F(MenuControllerTest, SetSelectionIndices_Buttons) { -#if defined(IS_WIN) +#if BUILDFLAG(IS_WIN) // TODO(crbug.com/1286137): This test is consistently failing on Win11. if (base::win::OSInfo::GetInstance()->version() >= base::win::Version::WIN11) { @@ -3091,7 +3091,7 @@ } TEST_F(MenuControllerTest, SetSelectionIndices_Buttons_SkipHiddenAndDisabled) { -#if defined(IS_WIN) +#if BUILDFLAG(IS_WIN) // TODO(crbug.com/1286137): This test is consistently failing on Win11. if (base::win::OSInfo::GetInstance()->version() >= base::win::Version::WIN11) { @@ -3134,7 +3134,7 @@ } TEST_F(MenuControllerTest, SetSelectionIndices_NestedButtons) { -#if defined(IS_WIN) +#if BUILDFLAG(IS_WIN) // TODO(crbug.com/1286137): This test is consistently failing on Win11. if (base::win::OSInfo::GetInstance()->version() >= base::win::Version::WIN11) {
diff --git a/ui/views/views_features.cc b/ui/views/views_features.cc index 06e664b..c86bbdc 100644 --- a/ui/views/views_features.cc +++ b/ui/views/views_features.cc
@@ -23,14 +23,5 @@ const base::Feature kEnableViewPaintOptimization{ "EnableViewPaintOptimization", base::FEATURE_DISABLED_BY_DEFAULT}; -#if BUILDFLAG(IS_MAC) -// Pushing of fullscreen control from the cross-platform Widget level down to -// the native NativeWidgetMac level and below. Once this lands and all bugs and -// flakes are mopped up, this feature will be removed. -// https://crbug.com/1302857 -const base::Feature kFullscreenControllerMac{"FullscreenControllerMac", - base::FEATURE_ENABLED_BY_DEFAULT}; -#endif - } // namespace features } // namespace views
diff --git a/ui/views/views_features.h b/ui/views/views_features.h index 23bd1276..d0e00d8 100644 --- a/ui/views/views_features.h +++ b/ui/views/views_features.h
@@ -16,10 +16,6 @@ VIEWS_EXPORT extern const base::Feature kEnablePlatformHighContrastInkDrop; VIEWS_EXPORT extern const base::Feature kEnableViewPaintOptimization; -#if BUILDFLAG(IS_MAC) -VIEWS_EXPORT extern const base::Feature kFullscreenControllerMac; -#endif - } // namespace features } // namespace views
diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc index e5a3e90..abd7f6d2 100644 --- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc +++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
@@ -985,7 +985,6 @@ } void DesktopNativeWidgetAura::SetFullscreen(bool fullscreen, - const base::TimeDelta& delay, int64_t target_display_id) { // The `target_display_id` argument is unsupported in Aura. DCHECK_EQ(target_display_id, display::kInvalidDisplayId);
diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.h b/ui/views/widget/desktop_aura/desktop_native_widget_aura.h index 3fb6734..d32ed5e 100644 --- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.h +++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
@@ -173,9 +173,7 @@ bool IsMaximized() const override; bool IsMinimized() const override; void Restore() override; - void SetFullscreen(bool fullscreen, - const base::TimeDelta& delay, - int64_t target_display_id) override; + void SetFullscreen(bool fullscreen, int64_t target_display_id) override; bool IsFullscreen() const override; void SetCanAppearInExistingFullscreenSpaces( bool can_appear_in_existing_fullscreen_spaces) override;
diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc index 159ce44..586c283 100644 --- a/ui/views/widget/native_widget_aura.cc +++ b/ui/views/widget/native_widget_aura.cc
@@ -713,7 +713,6 @@ } void NativeWidgetAura::SetFullscreen(bool fullscreen, - const base::TimeDelta& delay, int64_t target_display_id) { // The `target_display_id` argument is unsupported in Aura. DCHECK_EQ(target_display_id, display::kInvalidDisplayId);
diff --git a/ui/views/widget/native_widget_aura.h b/ui/views/widget/native_widget_aura.h index 1c7c0a3..f78b1c0 100644 --- a/ui/views/widget/native_widget_aura.h +++ b/ui/views/widget/native_widget_aura.h
@@ -133,9 +133,7 @@ bool IsMaximized() const override; bool IsMinimized() const override; void Restore() override; - void SetFullscreen(bool fullscreen, - const base::TimeDelta& delay, - int64_t target_display_id) override; + void SetFullscreen(bool fullscreen, int64_t target_display_id) override; bool IsFullscreen() const override; void SetCanAppearInExistingFullscreenSpaces( bool can_appear_in_existing_fullscreen_spaces) override;
diff --git a/ui/views/widget/native_widget_mac.h b/ui/views/widget/native_widget_mac.h index 3e501938..2955adf 100644 --- a/ui/views/widget/native_widget_mac.h +++ b/ui/views/widget/native_widget_mac.h
@@ -161,9 +161,7 @@ bool IsMaximized() const override; bool IsMinimized() const override; void Restore() override; - void SetFullscreen(bool fullscreen, - const base::TimeDelta& delay, - int64_t target_display_id) override; + void SetFullscreen(bool fullscreen, int64_t target_display_id) override; bool IsFullscreen() const override; void SetCanAppearInExistingFullscreenSpaces( bool can_appear_in_existing_fullscreen_spaces) override;
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm index c0092160..157a3d0 100644 --- a/ui/views/widget/native_widget_mac.mm +++ b/ui/views/widget/native_widget_mac.mm
@@ -217,10 +217,6 @@ [CreateNSWindow(create_window_params.get()) retain]); ns_window_host_->CreateInProcessNSWindowBridge(std::move(window)); } - // TODO(https://crbug.com/1302857): Remove this once FullscreenControllerMac - // is on by default. - if (base::FeatureList::IsEnabled(features::kFullscreenControllerMac)) - GetNSWindowMojo()->CreateFullscreenController(); ns_window_host_->SetParent(parent_host); ns_window_host_->InitWindow(params, ConvertBoundsToScreenIfNeeded(params.bounds)); @@ -646,20 +642,15 @@ void NativeWidgetMac::Restore() { if (!GetNSWindowMojo()) return; - if (base::FeatureList::IsEnabled(features::kFullscreenControllerMac)) { - GetNSWindowMojo()->ExitFullscreen(); - } else { - GetNSWindowMojo()->SetFullscreen(false); - } + GetNSWindowMojo()->ExitFullscreen(); GetNSWindowMojo()->SetMiniaturized(false); } void NativeWidgetMac::SetFullscreen(bool fullscreen, - const base::TimeDelta& delay, int64_t target_display_id) { if (!ns_window_host_) return; - ns_window_host_->SetFullscreen(fullscreen, delay, target_display_id); + ns_window_host_->SetFullscreen(fullscreen, target_display_id); } bool NativeWidgetMac::IsFullscreen() const {
diff --git a/ui/views/widget/native_widget_private.h b/ui/views/widget/native_widget_private.h index 5208d00..1131983 100644 --- a/ui/views/widget/native_widget_private.h +++ b/ui/views/widget/native_widget_private.h
@@ -197,9 +197,7 @@ virtual bool IsMaximized() const = 0; virtual bool IsMinimized() const = 0; virtual void Restore() = 0; - virtual void SetFullscreen(bool fullscreen, - const base::TimeDelta& delay, - int64_t target_display_id) = 0; + virtual void SetFullscreen(bool fullscreen, int64_t target_display_id) = 0; virtual bool IsFullscreen() const = 0; virtual void SetCanAppearInExistingFullscreenSpaces( bool can_appear_in_existing_fullscreen_spaces) = 0;
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc index b54e69e..77dd782 100644 --- a/ui/views/widget/widget.cc +++ b/ui/views/widget/widget.cc
@@ -805,9 +805,7 @@ return native_widget_->IsMinimized(); } -void Widget::SetFullscreen(bool fullscreen, - base::TimeDelta delay, - int64_t target_display_id) { +void Widget::SetFullscreen(bool fullscreen, int64_t target_display_id) { // It isn't valid to specify `target_display_id` when exiting fullscreen. if (!fullscreen) DCHECK(target_display_id == display::kInvalidDisplayId); @@ -817,7 +815,7 @@ } auto weak_ptr = GetWeakPtr(); - native_widget_->SetFullscreen(fullscreen, delay, target_display_id); + native_widget_->SetFullscreen(fullscreen, target_display_id); if (!weak_ptr) return;
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h index 003e55b7..0100fd5d 100644 --- a/ui/views/widget/widget.h +++ b/ui/views/widget/widget.h
@@ -716,15 +716,10 @@ bool IsMinimized() const; // Accessors for fullscreen state. - // If `delay` is given, some underlying implementations will set their target - // fullscreen state and then post a delayed task to request the actual window - // transition, in order to handle some platform-specific quirks in specific - // fullscreen scenarios. See crbug.com/1210548 and crbug.com/1034783. // The `target_display_id` may only be specified if `fullscreen` is true, and // indicates a specific display to become fullscreen on (note that this may // move a fullscreen widget from one display to another). void SetFullscreen(bool fullscreen, - base::TimeDelta delay = {}, int64_t target_display_id = display::kInvalidDisplayId); bool IsFullscreen() const;
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java index da98918..dccbe53 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java
@@ -157,7 +157,7 @@ if (majorVersion >= 92) { mNavigationEntryOffset = navigation.getNavigationEntryOffset(); } - if (majorVersion >= 103) { + if (majorVersion >= 102) { mWasFetchedFromCache = navigation.wasFetchedFromCache(); } notifyCalled(); @@ -1731,7 +1731,7 @@ assertEquals("fr", mCallback.onPageLanguageDeterminedCallback.getLanguage()); } - @MinWebLayerVersion(103) + @MinWebLayerVersion(102) @Test @SmallTest public void testWasFetchedFromCache() throws Exception {
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/INavigation.aidl b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/INavigation.aidl index 0d664f9..261730d1 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/INavigation.aidl +++ b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/INavigation.aidl
@@ -58,6 +58,6 @@ // @since 97 void disableIntentProcessing() = 23; - // @since 103 + // @since 102 boolean wasFetchedFromCache() = 24; }
diff --git a/weblayer/public/java/org/chromium/weblayer/Navigation.java b/weblayer/public/java/org/chromium/weblayer/Navigation.java index 90edada..4e71b03 100644 --- a/weblayer/public/java/org/chromium/weblayer/Navigation.java +++ b/weblayer/public/java/org/chromium/weblayer/Navigation.java
@@ -498,11 +498,11 @@ /** * Returns true if the navigation response was fetched from the cache. * - * @since 103 + * @since 102 */ public boolean wasFetchedFromCache() { ThreadCheck.ensureOnUiThread(); - if (WebLayer.getSupportedMajorVersionInternal() < 103) { + if (WebLayer.getSupportedMajorVersionInternal() < 102) { throw new UnsupportedOperationException(); } try {