Chromium Code Reviews| Index: ui/aura/window_targeter_unittest.cc |
| diff --git a/ui/aura/window_targeter_unittest.cc b/ui/aura/window_targeter_unittest.cc |
| index fb84ee49ef740f6091e826cc7925717916da7d58..985426bb608a582657993199e609e437b52ec5d7 100644 |
| --- a/ui/aura/window_targeter_unittest.cc |
| +++ b/ui/aura/window_targeter_unittest.cc |
| @@ -40,6 +40,18 @@ class WindowTargeterTest : public test::AuraTestBase { |
| Window* root_window() { return AuraTestBase::root_window(); } |
| }; |
| +gfx::RectF GetEffectiveVisibleBoundsInRootWindow(Window* window) { |
|
sadrul
2014/02/20 00:58:13
I wonder if aura::Window::GetBoundsInScreen()/GetB
sky
2014/02/20 01:33:01
Seems like it should, right?
sadrul
2014/02/20 04:16:53
I am looking into that at https://codereview.chrom
|
| + gfx::RectF bounds = gfx::Rect(window->bounds().size()); |
| + Window* root = window->GetRootWindow(); |
| + CHECK(window->layer()); |
| + CHECK(root->layer()); |
| + gfx::Transform transform; |
| + if (!window->layer()->GetTargetTransformRelativeTo(root->layer(), &transform)) |
| + return gfx::RectF(); |
| + transform.TransformRect(&bounds); |
| + return bounds; |
| +} |
| + |
| TEST_F(WindowTargeterTest, Basic) { |
| test::TestWindowDelegate delegate; |
| scoped_ptr<Window> window(CreateNormalWindow(1, root_window(), &delegate)); |
| @@ -106,4 +118,48 @@ TEST_F(WindowTargeterTest, ScopedWindowTargeter) { |
| } |
| } |
| +TEST_F(WindowTargeterTest, TargetTransformedWindow) { |
| + root_window()->Show(); |
| + |
| + test::TestWindowDelegate delegate; |
| + scoped_ptr<Window> window(CreateNormalWindow(2, root_window(), &delegate)); |
| + |
| + const gfx::Rect window_bounds(100, 20, 400, 80); |
| + window->SetBounds(window_bounds); |
| + |
| + ui::EventTarget* root_target = root_window(); |
| + ui::EventTargeter* targeter = root_target->GetEventTargeter(); |
| + gfx::Point event_location(490, 50); |
| + { |
| + ui::MouseEvent mouse(ui::ET_MOUSE_MOVED, event_location, event_location, |
| + ui::EF_NONE, ui::EF_NONE); |
| + EXPECT_EQ(window.get(), targeter->FindTargetForEvent(root_target, &mouse)); |
| + } |
| + |
| + // Scale |window| by 50%. This should move it away from underneath |
| + // |event_location|, so an event in that location will not be targeted to it. |
| + gfx::Transform transform; |
| + transform.Scale(0.5, 0.5); |
| + window->SetTransform(transform); |
| + EXPECT_EQ(gfx::RectF(100, 20, 200, 40).ToString(), |
| + GetEffectiveVisibleBoundsInRootWindow(window.get()).ToString()); |
| + { |
| + ui::MouseEvent mouse(ui::ET_MOUSE_MOVED, event_location, event_location, |
| + ui::EF_NONE, ui::EF_NONE); |
| + EXPECT_EQ(root_window(), targeter->FindTargetForEvent(root_target, &mouse)); |
| + } |
| + |
| + transform = gfx::Transform(); |
| + transform.Translate(200, 10); |
| + transform.Scale(0.5, 0.5); |
| + window->SetTransform(transform); |
| + EXPECT_EQ(gfx::RectF(300, 30, 200, 40).ToString(), |
| + GetEffectiveVisibleBoundsInRootWindow(window.get()).ToString()); |
| + { |
| + ui::MouseEvent mouse(ui::ET_MOUSE_MOVED, event_location, event_location, |
| + ui::EF_NONE, ui::EF_NONE); |
| + EXPECT_EQ(window.get(), targeter->FindTargetForEvent(root_target, &mouse)); |
| + } |
| +} |
| + |
| } // namespace aura |