blob: d2498e1b9eaca232e9e5aade623cebf9a0055ded [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <memory>
#include "ash/test/ash_test_base.h"
#include "ash/test/pixel/ash_pixel_differ.h"
#include "ash/test/pixel/ash_pixel_test_init_params.h"
#include "ui/compositor/scoped_animation_duration_scale_mode.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/touch_selection/touch_selection_magnifier_aura.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/controls/textfield/textfield_test_api.h"
#include "ui/views/view.h"
#include "ui/views/widget/widget.h"
namespace ash {
namespace {
gfx::Rect GetCursorBoundsInScreen(views::Textfield* textfield, int cursor_pos) {
gfx::Rect cursor_bounds =
views::TextfieldTestApi(textfield).GetRenderText()->GetCursorBounds(
gfx::SelectionModel(cursor_pos, gfx::CURSOR_FORWARD),
/*insert_mode=*/true);
views::View::ConvertRectToScreen(textfield, &cursor_bounds);
return cursor_bounds;
}
class TouchSelectionPixelTest : public AshTestBase {
public:
TouchSelectionPixelTest() = default;
TouchSelectionPixelTest(const TouchSelectionPixelTest&) = delete;
TouchSelectionPixelTest& operator=(const TouchSelectionPixelTest&) = delete;
~TouchSelectionPixelTest() override = default;
// AshTestBase:
absl::optional<pixel_test::InitParams> CreatePixelTestInitParams()
const override {
return pixel_test::InitParams();
}
std::unique_ptr<views::Widget> CreateContainerWidget() {
std::unique_ptr<views::Widget> widget = CreateFramelessTestWidget();
widget->SetBounds(gfx::Rect(5, 5, 500, 500));
widget->SetContentsView(std::make_unique<views::View>());
widget->Show();
return widget;
}
private:
// Disable animations so that touch selection UI appears immediately when
// triggered.
ui::ScopedAnimationDurationScaleMode disable_animations_{
ui::ScopedAnimationDurationScaleMode::ZERO_DURATION};
};
TEST_F(TouchSelectionPixelTest, MagnifierOnTextfield) {
auto widget = CreateContainerWidget();
auto* textfield = widget->GetContentsView()->AddChildView(
std::make_unique<views::Textfield>());
textfield->SetAccessibleName(u"Textfield");
textfield->SetBoundsRect(gfx::Rect(100, 100, 200, 30));
textfield->SetText(u"Text in a textfield");
textfield->SetSelectedRange({0, 9});
textfield->RequestFocus();
ui::TouchSelectionMagnifierAura magnifier;
const gfx::Rect cursor_bounds =
GetCursorBoundsInScreen(textfield, /*cursor_pos=*/9);
magnifier.ShowFocusBound(textfield->GetNativeView()->GetRootWindow()->layer(),
cursor_bounds.top_center(),
cursor_bounds.bottom_center());
EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
"touch_selection",
/*revision_number=*/2, widget.get()));
}
} // namespace
} // namespace ash