Index: ui/aura/window_targeter_unittest.cc |
=================================================================== |
--- ui/aura/window_targeter_unittest.cc (revision 253296) |
+++ ui/aura/window_targeter_unittest.cc (working copy) |
@@ -40,6 +40,18 @@ |
Window* root_window() { return AuraTestBase::root_window(); } |
}; |
+gfx::RectF GetEffectiveVisibleBoundsInRootWindow(Window* window) { |
+ 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, 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 |