Add some styling to ChromeOS touch selection magnifier.
Add border, shadow, zoom amount, and magnifier size according to magnifier specs in go/cros-tte-specs. Also add some basic animation so that magnifier bounds are updated more smoothly. Still need some more work to set the correct bounds/offset (b/273613374). In the meantime, clean up some of the bounds so that the bounds referenced by the magnifier layer are all in coordinates of the magnifier parent container. Bug: b:244116654, b:264823675 Change-Id: Iabba891042432af75ea6eba27a85c6262aec2f40 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4337092 Commit-Queue: Michelle Chen <michellegc@google.com> Reviewed-by: Ahmed Fakhry <afakhry@chromium.org> Cr-Commit-Position: refs/heads/main@{#1122725}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
203aace329
commit
30b94564a4
@ -4,28 +4,76 @@
|
|||||||
|
|
||||||
#include "ash/touch/touch_selection_magnifier_runner_ash.h"
|
#include "ash/touch/touch_selection_magnifier_runner_ash.h"
|
||||||
|
|
||||||
#include "ash/constants/ash_features.h"
|
|
||||||
#include "ash/public/cpp/shell_window_ids.h"
|
#include "ash/public/cpp/shell_window_ids.h"
|
||||||
|
#include "ash/style/color_util.h"
|
||||||
|
#include "third_party/skia/include/core/SkDrawLooper.h"
|
||||||
#include "ui/aura/window.h"
|
#include "ui/aura/window.h"
|
||||||
|
#include "ui/chromeos/styles/cros_tokens_color_mappings.h"
|
||||||
|
#include "ui/color/color_provider_source_observer.h"
|
||||||
#include "ui/compositor/layer.h"
|
#include "ui/compositor/layer.h"
|
||||||
|
#include "ui/compositor/paint_recorder.h"
|
||||||
|
#include "ui/compositor/scoped_layer_animation_settings.h"
|
||||||
#include "ui/gfx/geometry/point_conversions.h"
|
#include "ui/gfx/geometry/point_conversions.h"
|
||||||
#include "ui/gfx/geometry/rect.h"
|
#include "ui/gfx/geometry/rect.h"
|
||||||
#include "ui/gfx/geometry/size.h"
|
#include "ui/gfx/geometry/size.h"
|
||||||
|
#include "ui/gfx/shadow_value.h"
|
||||||
|
#include "ui/gfx/skia_paint_util.h"
|
||||||
|
|
||||||
namespace ash {
|
namespace ash {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
// Gets the bounds of the magnifier when showing the specified point of
|
constexpr int kMagnifierRadius = 20;
|
||||||
// interest. `point_of_interest` and returned bounds are in root window
|
|
||||||
// coordinates.
|
constexpr int kMagnifierBorderThickness = 1;
|
||||||
gfx::Rect GetBounds(const gfx::Point& point_of_interest) {
|
|
||||||
const gfx::Size size = TouchSelectionMagnifierRunnerAsh::kMagnifierLayerSize;
|
const gfx::ShadowValues kMagnifierShadowValues =
|
||||||
|
gfx::ShadowValue::MakeChromeOSSystemUIShadowValues(3);
|
||||||
|
|
||||||
|
// The space outside the zoom layer needed for shadows.
|
||||||
|
const gfx::Outsets kMagnifierShadowOutsets =
|
||||||
|
gfx::ShadowValue::GetMargin(kMagnifierShadowValues).ToOutsets();
|
||||||
|
|
||||||
|
// Bounds of the zoom layer in coordinates of its parent. These zoom layer
|
||||||
|
// bounds are fixed since we only update the bounds of the parent magnifier
|
||||||
|
// layer when the magnifier moves.
|
||||||
|
const gfx::Rect kZoomLayerBounds =
|
||||||
|
gfx::Rect(kMagnifierShadowOutsets.left(),
|
||||||
|
kMagnifierShadowOutsets.top(),
|
||||||
|
TouchSelectionMagnifierRunnerAsh::kMagnifierSize.width(),
|
||||||
|
TouchSelectionMagnifierRunnerAsh::kMagnifierSize.height());
|
||||||
|
|
||||||
|
// Size of the border layer, which includes space for the zoom layer and
|
||||||
|
// surrounding border and shadows.
|
||||||
|
const gfx::Size kBorderLayerSize =
|
||||||
|
TouchSelectionMagnifierRunnerAsh::kMagnifierSize +
|
||||||
|
kMagnifierShadowOutsets.size();
|
||||||
|
|
||||||
|
// Duration of the animation when updating magnifier bounds.
|
||||||
|
constexpr base::TimeDelta kMagnifierTransitionDuration = base::Milliseconds(50);
|
||||||
|
|
||||||
|
// Gets the bounds of the magnifier layer for showing the specified point of
|
||||||
|
// interest. These bounds include the magnifier border and shadows.
|
||||||
|
// `point_of_interest` and returned bounds are in coordinates of the magnifier's
|
||||||
|
// parent container.
|
||||||
|
gfx::Rect GetMagnifierLayerBounds(const gfx::Point& point_of_interest) {
|
||||||
|
const gfx::Size& size = TouchSelectionMagnifierRunnerAsh::kMagnifierSize;
|
||||||
const gfx::Point origin(
|
const gfx::Point origin(
|
||||||
point_of_interest.x() - size.width() / 2,
|
point_of_interest.x() - size.width() / 2,
|
||||||
point_of_interest.y() - size.height() / 2 +
|
point_of_interest.y() - size.height() / 2 +
|
||||||
TouchSelectionMagnifierRunnerAsh::kMagnifierVerticalOffset);
|
TouchSelectionMagnifierRunnerAsh::kMagnifierVerticalOffset);
|
||||||
return gfx::Rect(origin, size);
|
gfx::Rect magnifier_layer_bounds(origin, size);
|
||||||
|
magnifier_layer_bounds.Outset(kMagnifierShadowOutsets);
|
||||||
|
return magnifier_layer_bounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the border color using `color_provider_source`. Defaults to black if
|
||||||
|
// `color_provider_source` is nullptr.
|
||||||
|
SkColor GetBorderColor(const ui::ColorProviderSource* color_provider_source) {
|
||||||
|
return color_provider_source
|
||||||
|
? color_provider_source->GetColorProvider()->GetColor(
|
||||||
|
cros_tokens::kCrosSysSeparator)
|
||||||
|
: SkColorSetARGB(51, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the child container in `root` that should parent the magnifier layer.
|
// Returns the child container in `root` that should parent the magnifier layer.
|
||||||
@ -35,6 +83,59 @@ aura::Window* GetMagnifierParentContainerForRoot(aura::Window* root) {
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
// Delegate for drawing the magnifier border and shadows onto the border layer.
|
||||||
|
class TouchSelectionMagnifierRunnerAsh::BorderRenderer
|
||||||
|
: public ui::LayerDelegate {
|
||||||
|
public:
|
||||||
|
explicit BorderRenderer(SkColor border_color) : border_color_(border_color) {}
|
||||||
|
|
||||||
|
BorderRenderer(const BorderRenderer&) = delete;
|
||||||
|
BorderRenderer& operator=(const BorderRenderer&) = delete;
|
||||||
|
~BorderRenderer() override = default;
|
||||||
|
|
||||||
|
void set_border_color(SkColor border_color) { border_color_ = border_color; }
|
||||||
|
|
||||||
|
// ui::LayerDelegate:
|
||||||
|
void OnPaintLayer(const ui::PaintContext& context) override {
|
||||||
|
ui::PaintRecorder recorder(context, kBorderLayerSize);
|
||||||
|
|
||||||
|
// Draw shadows onto the border layer. These shadows should surround the
|
||||||
|
// magnified area, so we draw them around the zoom layer bounds.
|
||||||
|
cc::PaintFlags shadow_flags;
|
||||||
|
shadow_flags.setAntiAlias(true);
|
||||||
|
shadow_flags.setColor(SK_ColorTRANSPARENT);
|
||||||
|
shadow_flags.setLooper(gfx::CreateShadowDrawLooper(kMagnifierShadowValues));
|
||||||
|
recorder.canvas()->DrawRoundRect(kZoomLayerBounds, kMagnifierRadius,
|
||||||
|
shadow_flags);
|
||||||
|
|
||||||
|
// Since the border layer is stacked above the zoom layer (to prevent the
|
||||||
|
// magnifier border and shadows from being magnified), we now need to clear
|
||||||
|
// the parts of the shadow covering the zoom layer.
|
||||||
|
cc::PaintFlags mask_flags;
|
||||||
|
mask_flags.setAntiAlias(true);
|
||||||
|
mask_flags.setBlendMode(SkBlendMode::kClear);
|
||||||
|
mask_flags.setStyle(cc::PaintFlags::kFill_Style);
|
||||||
|
recorder.canvas()->DrawRoundRect(kZoomLayerBounds, kMagnifierRadius,
|
||||||
|
mask_flags);
|
||||||
|
|
||||||
|
// Draw the magnifier border onto the border layer, using the zoom layer
|
||||||
|
// bounds so that the border surrounds the magnified area.
|
||||||
|
cc::PaintFlags border_flags;
|
||||||
|
border_flags.setAntiAlias(true);
|
||||||
|
border_flags.setStyle(cc::PaintFlags::kStroke_Style);
|
||||||
|
border_flags.setStrokeWidth(kMagnifierBorderThickness);
|
||||||
|
border_flags.setColor(border_color_);
|
||||||
|
recorder.canvas()->DrawRoundRect(kZoomLayerBounds, kMagnifierRadius,
|
||||||
|
border_flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnDeviceScaleFactorChanged(float old_device_scale_factor,
|
||||||
|
float new_device_scale_factor) override {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
SkColor border_color_;
|
||||||
|
};
|
||||||
|
|
||||||
TouchSelectionMagnifierRunnerAsh::TouchSelectionMagnifierRunnerAsh() = default;
|
TouchSelectionMagnifierRunnerAsh::TouchSelectionMagnifierRunnerAsh() = default;
|
||||||
|
|
||||||
TouchSelectionMagnifierRunnerAsh::~TouchSelectionMagnifierRunnerAsh() = default;
|
TouchSelectionMagnifierRunnerAsh::~TouchSelectionMagnifierRunnerAsh() = default;
|
||||||
@ -50,26 +151,47 @@ void TouchSelectionMagnifierRunnerAsh::ShowMagnifier(
|
|||||||
|
|
||||||
aura::Window* root_window = current_context_->GetRootWindow();
|
aura::Window* root_window = current_context_->GetRootWindow();
|
||||||
DCHECK(root_window);
|
DCHECK(root_window);
|
||||||
gfx::PointF position_in_root(position);
|
aura::Window* parent_container =
|
||||||
aura::Window::ConvertPointToTarget(context, root_window, &position_in_root);
|
GetMagnifierParentContainerForRoot(root_window);
|
||||||
|
gfx::PointF position_in_parent(position);
|
||||||
|
aura::Window::ConvertPointToTarget(context, parent_container,
|
||||||
|
&position_in_parent);
|
||||||
|
|
||||||
if (!magnifier_layer_) {
|
if (!magnifier_layer_) {
|
||||||
CreateMagnifierLayer(root_window, position_in_root);
|
CreateMagnifierLayer(parent_container, position_in_parent);
|
||||||
} else {
|
} else {
|
||||||
|
ui::ScopedLayerAnimationSettings settings(magnifier_layer_->GetAnimator());
|
||||||
|
settings.SetTransitionDuration(kMagnifierTransitionDuration);
|
||||||
|
settings.SetTweenType(gfx::Tween::LINEAR);
|
||||||
|
settings.SetPreemptionStrategy(
|
||||||
|
ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
|
||||||
magnifier_layer_->SetBounds(
|
magnifier_layer_->SetBounds(
|
||||||
GetBounds(gfx::ToRoundedPoint(position_in_root)));
|
GetMagnifierLayerBounds(gfx::ToRoundedPoint(position_in_parent)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TouchSelectionMagnifierRunnerAsh::CloseMagnifier() {
|
void TouchSelectionMagnifierRunnerAsh::CloseMagnifier() {
|
||||||
current_context_ = nullptr;
|
current_context_ = nullptr;
|
||||||
magnifier_layer_ = nullptr;
|
magnifier_layer_ = nullptr;
|
||||||
|
zoom_layer_ = nullptr;
|
||||||
|
border_layer_ = nullptr;
|
||||||
|
border_renderer_ = nullptr;
|
||||||
|
Observe(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TouchSelectionMagnifierRunnerAsh::IsRunning() const {
|
bool TouchSelectionMagnifierRunnerAsh::IsRunning() const {
|
||||||
return current_context_ != nullptr;
|
return current_context_ != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TouchSelectionMagnifierRunnerAsh::OnColorProviderChanged() {
|
||||||
|
if (border_renderer_) {
|
||||||
|
DCHECK(border_layer_);
|
||||||
|
border_renderer_->set_border_color(
|
||||||
|
GetBorderColor(GetColorProviderSource()));
|
||||||
|
border_layer_->SchedulePaint(gfx::Rect(border_layer_->size()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const aura::Window*
|
const aura::Window*
|
||||||
TouchSelectionMagnifierRunnerAsh::GetCurrentContextForTesting() const {
|
TouchSelectionMagnifierRunnerAsh::GetCurrentContextForTesting() const {
|
||||||
return current_context_;
|
return current_context_;
|
||||||
@ -80,21 +202,44 @@ const ui::Layer* TouchSelectionMagnifierRunnerAsh::GetMagnifierLayerForTesting()
|
|||||||
return magnifier_layer_.get();
|
return magnifier_layer_.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TouchSelectionMagnifierRunnerAsh::CreateMagnifierLayer(
|
const ui::Layer* TouchSelectionMagnifierRunnerAsh::GetZoomLayerForTesting()
|
||||||
aura::Window* root_window,
|
const {
|
||||||
const gfx::PointF& position_in_root) {
|
return zoom_layer_.get();
|
||||||
aura::Window* parent_container =
|
}
|
||||||
GetMagnifierParentContainerForRoot(root_window);
|
|
||||||
|
|
||||||
|
void TouchSelectionMagnifierRunnerAsh::CreateMagnifierLayer(
|
||||||
|
aura::Window* parent_container,
|
||||||
|
const gfx::PointF& position_in_parent) {
|
||||||
|
Observe(ColorUtil::GetColorProviderSourceForWindow(parent_container));
|
||||||
ui::Layer* parent_layer = parent_container->layer();
|
ui::Layer* parent_layer = parent_container->layer();
|
||||||
magnifier_layer_ = std::make_unique<ui::Layer>(ui::LAYER_SOLID_COLOR);
|
|
||||||
magnifier_layer_->SetBounds(GetBounds(gfx::ToRoundedPoint(position_in_root)));
|
// Create the magnifier layer, which will parent the zoom layer and border
|
||||||
magnifier_layer_->SetBackgroundZoom(kMagnifierScale, 0);
|
// layer.
|
||||||
magnifier_layer_->SetBackgroundOffset(
|
magnifier_layer_ = std::make_unique<ui::Layer>(ui::LAYER_NOT_DRAWN);
|
||||||
gfx::Point(0, kMagnifierVerticalOffset));
|
magnifier_layer_->SetBounds(
|
||||||
|
GetMagnifierLayerBounds(gfx::ToRoundedPoint(position_in_parent)));
|
||||||
magnifier_layer_->SetFillsBoundsOpaquely(false);
|
magnifier_layer_->SetFillsBoundsOpaquely(false);
|
||||||
magnifier_layer_->SetRoundedCornerRadius(kMagnifierRoundedCorners);
|
|
||||||
parent_layer->Add(magnifier_layer_.get());
|
parent_layer->Add(magnifier_layer_.get());
|
||||||
|
|
||||||
|
// Create the zoom layer, which will show the magnified area.
|
||||||
|
zoom_layer_ = std::make_unique<ui::Layer>(ui::LAYER_SOLID_COLOR);
|
||||||
|
zoom_layer_->SetBounds(kZoomLayerBounds);
|
||||||
|
zoom_layer_->SetBackgroundZoom(kMagnifierScale, 0);
|
||||||
|
zoom_layer_->SetBackgroundOffset(gfx::Point(0, kMagnifierVerticalOffset));
|
||||||
|
zoom_layer_->SetFillsBoundsOpaquely(false);
|
||||||
|
zoom_layer_->SetRoundedCornerRadius(gfx::RoundedCornersF{kMagnifierRadius});
|
||||||
|
magnifier_layer_->Add(zoom_layer_.get());
|
||||||
|
|
||||||
|
// Create the border layer. This is stacked above the zoom layer so that the
|
||||||
|
// magnifier border and shadows aren't shown in the magnified area drawn by
|
||||||
|
// the zoom layer.
|
||||||
|
border_layer_ = std::make_unique<ui::Layer>();
|
||||||
|
border_layer_->SetBounds(gfx::Rect(kBorderLayerSize));
|
||||||
|
border_renderer_ = std::make_unique<BorderRenderer>(
|
||||||
|
GetBorderColor(GetColorProviderSource()));
|
||||||
|
border_layer_->set_delegate(border_renderer_.get());
|
||||||
|
border_layer_->SetFillsBoundsOpaquely(false);
|
||||||
|
magnifier_layer_->Add(border_layer_.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ash
|
} // namespace ash
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include "ash/ash_export.h"
|
#include "ash/ash_export.h"
|
||||||
#include "base/memory/raw_ptr.h"
|
#include "base/memory/raw_ptr.h"
|
||||||
#include "ui/gfx/geometry/rounded_corners_f.h"
|
#include "ui/color/color_provider_source_observer.h"
|
||||||
#include "ui/gfx/geometry/size.h"
|
#include "ui/gfx/geometry/size.h"
|
||||||
#include "ui/touch_selection/touch_selection_magnifier_runner.h"
|
#include "ui/touch_selection/touch_selection_magnifier_runner.h"
|
||||||
|
|
||||||
@ -23,7 +23,8 @@ namespace ash {
|
|||||||
|
|
||||||
// Ash implementation for TouchSelectionMagnifierRunner.
|
// Ash implementation for TouchSelectionMagnifierRunner.
|
||||||
class ASH_EXPORT TouchSelectionMagnifierRunnerAsh
|
class ASH_EXPORT TouchSelectionMagnifierRunnerAsh
|
||||||
: public ui::TouchSelectionMagnifierRunner {
|
: public ui::TouchSelectionMagnifierRunner,
|
||||||
|
public ui::ColorProviderSourceObserver {
|
||||||
public:
|
public:
|
||||||
TouchSelectionMagnifierRunnerAsh();
|
TouchSelectionMagnifierRunnerAsh();
|
||||||
|
|
||||||
@ -34,15 +35,14 @@ class ASH_EXPORT TouchSelectionMagnifierRunnerAsh
|
|||||||
|
|
||||||
~TouchSelectionMagnifierRunnerAsh() override;
|
~TouchSelectionMagnifierRunnerAsh() override;
|
||||||
|
|
||||||
static constexpr float kMagnifierScale = 2.0f;
|
static constexpr float kMagnifierScale = 1.25f;
|
||||||
|
|
||||||
static constexpr gfx::Size kMagnifierLayerSize{100, 48};
|
// Size of the magnifier zoom layer, which excludes border and shadows.
|
||||||
|
static constexpr gfx::Size kMagnifierSize{100, 40};
|
||||||
static constexpr gfx::RoundedCornersF kMagnifierRoundedCorners{20};
|
|
||||||
|
|
||||||
// Offset to apply so that the magnifier is shown vertically above the point
|
// Offset to apply so that the magnifier is shown vertically above the point
|
||||||
// of interest. The offset specifies vertical displacement from the center of
|
// of interest. The offset specifies vertical displacement from the center of
|
||||||
// the text selection caret to the center of the magnifier bounds.
|
// the text selection caret to the center of the magnifier zoom layer.
|
||||||
static constexpr int kMagnifierVerticalOffset = -32;
|
static constexpr int kMagnifierVerticalOffset = -32;
|
||||||
|
|
||||||
// ui::TouchSelectionMagnifierRunner:
|
// ui::TouchSelectionMagnifierRunner:
|
||||||
@ -51,20 +51,37 @@ class ASH_EXPORT TouchSelectionMagnifierRunnerAsh
|
|||||||
void CloseMagnifier() override;
|
void CloseMagnifier() override;
|
||||||
bool IsRunning() const override;
|
bool IsRunning() const override;
|
||||||
|
|
||||||
|
// ui::ColorProviderSourceObserver:
|
||||||
|
void OnColorProviderChanged() override;
|
||||||
|
|
||||||
const aura::Window* GetCurrentContextForTesting() const;
|
const aura::Window* GetCurrentContextForTesting() const;
|
||||||
|
|
||||||
const ui::Layer* GetMagnifierLayerForTesting() const;
|
const ui::Layer* GetMagnifierLayerForTesting() const;
|
||||||
|
|
||||||
|
const ui::Layer* GetZoomLayerForTesting() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void CreateMagnifierLayer(aura::Window* root_window,
|
class BorderRenderer;
|
||||||
|
|
||||||
|
void CreateMagnifierLayer(aura::Window* parent_container,
|
||||||
const gfx::PointF& position_in_root);
|
const gfx::PointF& position_in_root);
|
||||||
|
|
||||||
// Current context window in which the magnifier is being shown, or `nullptr`
|
// Current context window in which the magnifier is being shown, or `nullptr`
|
||||||
// if no magnifier is running.
|
// if no magnifier is running.
|
||||||
raw_ptr<aura::Window> current_context_ = nullptr;
|
raw_ptr<aura::Window> current_context_ = nullptr;
|
||||||
|
|
||||||
// The magnifier layer, which draws the background with a zoom filter applied.
|
// The magnifier layer is the parent of the zoom layer and border layer. The
|
||||||
|
// layer bounds should be updated when selection updates occur.
|
||||||
std::unique_ptr<ui::Layer> magnifier_layer_;
|
std::unique_ptr<ui::Layer> magnifier_layer_;
|
||||||
|
|
||||||
|
// Draws the background with a zoom filter applied.
|
||||||
|
std::unique_ptr<ui::Layer> zoom_layer_;
|
||||||
|
|
||||||
|
// Draws a border and shadow. `border_layer_` must be ordered after
|
||||||
|
// `border_renderer_` so that it is destroyed before `border_renderer_`.
|
||||||
|
// Otherwise `border_layer_` will have a pointer to a deleted delegate.
|
||||||
|
std::unique_ptr<BorderRenderer> border_renderer_;
|
||||||
|
std::unique_ptr<ui::Layer> border_layer_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ash
|
} // namespace ash
|
||||||
|
@ -43,6 +43,34 @@ class TouchSelectionMagnifierRunnerAshTest : public NoSessionAshTestBase {
|
|||||||
NoSessionAshTestBase::SetUp();
|
NoSessionAshTestBase::SetUp();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Verifies that the magnifier has the correct bounds given the point of
|
||||||
|
// interest in context window coordinates.
|
||||||
|
// TODO(b/273613374): For now, we assume that the context window, root
|
||||||
|
// window, and magnifier parent container have the same bounds, but in
|
||||||
|
// practice this might not always be the case. Rewrite these tests once the
|
||||||
|
// bounds related parts of the magnifier have been cleaned up.
|
||||||
|
void VerifyMagnifierBounds(gfx::PointF point_of_interest) {
|
||||||
|
TouchSelectionMagnifierRunnerAsh* magnifier_runner = GetMagnifierRunner();
|
||||||
|
ASSERT_TRUE(magnifier_runner);
|
||||||
|
|
||||||
|
const ui::Layer* magnifier_layer =
|
||||||
|
magnifier_runner->GetMagnifierLayerForTesting();
|
||||||
|
const ui::Layer* zoom_layer = magnifier_runner->GetZoomLayerForTesting();
|
||||||
|
ASSERT_TRUE(magnifier_layer);
|
||||||
|
ASSERT_TRUE(zoom_layer);
|
||||||
|
|
||||||
|
gfx::Rect zoom_layer_bounds_in_context =
|
||||||
|
zoom_layer->bounds() + magnifier_layer->bounds().OffsetFromOrigin();
|
||||||
|
EXPECT_EQ(zoom_layer_bounds_in_context.size(),
|
||||||
|
TouchSelectionMagnifierRunnerAsh::kMagnifierSize);
|
||||||
|
EXPECT_EQ(
|
||||||
|
zoom_layer_bounds_in_context.CenterPoint(),
|
||||||
|
gfx::Point(
|
||||||
|
point_of_interest.x(),
|
||||||
|
point_of_interest.y() +
|
||||||
|
TouchSelectionMagnifierRunnerAsh::kMagnifierVerticalOffset));
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
base::test::ScopedFeatureList scoped_feature_list_;
|
base::test::ScopedFeatureList scoped_feature_list_;
|
||||||
};
|
};
|
||||||
@ -106,79 +134,34 @@ TEST_F(TouchSelectionMagnifierRunnerAshTest, NewContext) {
|
|||||||
EXPECT_FALSE(magnifier_runner->GetCurrentContextForTesting());
|
EXPECT_FALSE(magnifier_runner->GetCurrentContextForTesting());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tests that the magnifier layer is created and destroyed.
|
// Tests that the magnifier and zoom layers are created and destroyed.
|
||||||
TEST_F(TouchSelectionMagnifierRunnerAshTest, Layer) {
|
TEST_F(TouchSelectionMagnifierRunnerAshTest, CreatesAndDestroysLayers) {
|
||||||
TouchSelectionMagnifierRunnerAsh* magnifier_runner = GetMagnifierRunner();
|
TouchSelectionMagnifierRunnerAsh* magnifier_runner = GetMagnifierRunner();
|
||||||
ASSERT_TRUE(magnifier_runner);
|
ASSERT_TRUE(magnifier_runner);
|
||||||
|
|
||||||
magnifier_runner->ShowMagnifier(GetContext(), gfx::PointF(300, 200));
|
magnifier_runner->ShowMagnifier(GetContext(), gfx::PointF(300, 200));
|
||||||
ASSERT_TRUE(magnifier_runner->GetMagnifierLayerForTesting());
|
ASSERT_TRUE(magnifier_runner->GetMagnifierLayerForTesting());
|
||||||
|
ASSERT_TRUE(magnifier_runner->GetZoomLayerForTesting());
|
||||||
|
|
||||||
magnifier_runner->CloseMagnifier();
|
magnifier_runner->CloseMagnifier();
|
||||||
RunPendingMessages();
|
RunPendingMessages();
|
||||||
EXPECT_FALSE(magnifier_runner->GetMagnifierLayerForTesting());
|
EXPECT_FALSE(magnifier_runner->GetMagnifierLayerForTesting());
|
||||||
|
EXPECT_FALSE(magnifier_runner->GetZoomLayerForTesting());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tests that the magnifier layer is positioned with the correct bounds.
|
// Tests that the magnifier bounds are set correctly.
|
||||||
TEST_F(TouchSelectionMagnifierRunnerAshTest, LayerBounds) {
|
TEST_F(TouchSelectionMagnifierRunnerAshTest, CorrectBounds) {
|
||||||
TouchSelectionMagnifierRunnerAsh* magnifier_runner = GetMagnifierRunner();
|
TouchSelectionMagnifierRunnerAsh* magnifier_runner = GetMagnifierRunner();
|
||||||
ASSERT_TRUE(magnifier_runner);
|
ASSERT_TRUE(magnifier_runner);
|
||||||
|
|
||||||
gfx::PointF position(300, 200);
|
gfx::PointF position(300, 200);
|
||||||
magnifier_runner->ShowMagnifier(GetContext(), position);
|
magnifier_runner->ShowMagnifier(GetContext(), position);
|
||||||
const ui::Layer* magnifier_layer =
|
VerifyMagnifierBounds(position);
|
||||||
magnifier_runner->GetMagnifierLayerForTesting();
|
|
||||||
ASSERT_TRUE(magnifier_layer);
|
|
||||||
|
|
||||||
gfx::Rect bounds = magnifier_layer->bounds();
|
|
||||||
EXPECT_EQ(bounds.size(),
|
|
||||||
TouchSelectionMagnifierRunnerAsh::kMagnifierLayerSize);
|
|
||||||
EXPECT_EQ(
|
|
||||||
bounds.CenterPoint(),
|
|
||||||
gfx::Point(
|
|
||||||
position.x(),
|
|
||||||
position.y() +
|
|
||||||
TouchSelectionMagnifierRunnerAsh::kMagnifierVerticalOffset));
|
|
||||||
|
|
||||||
magnifier_runner->CloseMagnifier();
|
|
||||||
RunPendingMessages();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tests that the magnifier layer bounds update correctly.
|
|
||||||
TEST_F(TouchSelectionMagnifierRunnerAshTest, LayerUpdatesBounds) {
|
|
||||||
TouchSelectionMagnifierRunnerAsh* magnifier_runner = GetMagnifierRunner();
|
|
||||||
ASSERT_TRUE(magnifier_runner);
|
|
||||||
|
|
||||||
gfx::PointF position(300, 200);
|
|
||||||
magnifier_runner->ShowMagnifier(GetContext(), position);
|
|
||||||
const ui::Layer* magnifier_layer =
|
|
||||||
magnifier_runner->GetMagnifierLayerForTesting();
|
|
||||||
ASSERT_TRUE(magnifier_layer);
|
|
||||||
|
|
||||||
gfx::Rect bounds = magnifier_layer->bounds();
|
|
||||||
EXPECT_EQ(bounds.size(),
|
|
||||||
TouchSelectionMagnifierRunnerAsh::kMagnifierLayerSize);
|
|
||||||
EXPECT_EQ(
|
|
||||||
bounds.CenterPoint(),
|
|
||||||
gfx::Point(
|
|
||||||
position.x(),
|
|
||||||
position.y() +
|
|
||||||
TouchSelectionMagnifierRunnerAsh::kMagnifierVerticalOffset));
|
|
||||||
|
|
||||||
// Move the magnifier.
|
// Move the magnifier.
|
||||||
position = gfx::PointF(400, 150);
|
position = gfx::PointF(400, 150);
|
||||||
magnifier_runner->ShowMagnifier(GetContext(), position);
|
magnifier_runner->ShowMagnifier(GetContext(), position);
|
||||||
EXPECT_EQ(magnifier_layer, magnifier_runner->GetMagnifierLayerForTesting());
|
VerifyMagnifierBounds(position);
|
||||||
|
|
||||||
bounds = magnifier_layer->bounds();
|
|
||||||
EXPECT_EQ(bounds.size(),
|
|
||||||
TouchSelectionMagnifierRunnerAsh::kMagnifierLayerSize);
|
|
||||||
EXPECT_EQ(
|
|
||||||
bounds.CenterPoint(),
|
|
||||||
gfx::Point(
|
|
||||||
position.x(),
|
|
||||||
position.y() +
|
|
||||||
TouchSelectionMagnifierRunnerAsh::kMagnifierVerticalOffset));
|
|
||||||
|
|
||||||
magnifier_runner->CloseMagnifier();
|
magnifier_runner->CloseMagnifier();
|
||||||
RunPendingMessages();
|
RunPendingMessages();
|
||||||
|
Reference in New Issue
Block a user