| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/views/view_targeter.h" | 5 #include "ui/views/view_targeter.h" |
| 6 | 6 |
| 7 #include "ui/events/event_targeter.h" | 7 #include "ui/events/event_targeter.h" |
| 8 #include "ui/events/event_utils.h" | 8 #include "ui/events/event_utils.h" |
| 9 #include "ui/gfx/path.h" | 9 #include "ui/gfx/path.h" |
| 10 #include "ui/views/masked_targeter_delegate.h" | 10 #include "ui/views/masked_targeter_delegate.h" |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 grandchild->SetBounds(0, 0, 5, 5); | 256 grandchild->SetBounds(0, 0, 5, 5); |
| 257 | 257 |
| 258 widget.SetContentsView(content); | 258 widget.SetContentsView(content); |
| 259 content->AddChildView(child); | 259 content->AddChildView(child); |
| 260 child->AddChildView(grandchild); | 260 child->AddChildView(grandchild); |
| 261 | 261 |
| 262 internal::RootView* root_view = | 262 internal::RootView* root_view = |
| 263 static_cast<internal::RootView*>(widget.GetRootView()); | 263 static_cast<internal::RootView*>(widget.GetRootView()); |
| 264 ui::EventTargeter* targeter = root_view->targeter(); | 264 ui::EventTargeter* targeter = root_view->targeter(); |
| 265 | 265 |
| 266 // Define a GESTURE_TAP and a GESTURE_SCROLL_BEGIN. | 266 // Define some gesture events for testing. |
| 267 gfx::Rect bounding_box(gfx::Point(46, 46), gfx::Size(8, 8)); | 267 gfx::Rect bounding_box(gfx::Point(46, 46), gfx::Size(8, 8)); |
| 268 gfx::Point center_point(bounding_box.CenterPoint()); | 268 gfx::Point center_point(bounding_box.CenterPoint()); |
| 269 ui::GestureEventDetails details(ui::ET_GESTURE_TAP, 0.0f, 0.0f); | 269 ui::GestureEventDetails details(ui::ET_GESTURE_TAP, 0.0f, 0.0f); |
| 270 details.set_bounding_box(bounding_box); | 270 details.set_bounding_box(bounding_box); |
| 271 GestureEventForTest tap(details, center_point.x(), center_point.y()); | 271 GestureEventForTest tap(details, center_point.x(), center_point.y()); |
| 272 details = ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN, 0.0f, 0.0f); | 272 details = ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN, 0.0f, 0.0f); |
| 273 details.set_bounding_box(bounding_box); | 273 details.set_bounding_box(bounding_box); |
| 274 GestureEventForTest scroll_begin(details, center_point.x(), center_point.y()); | 274 GestureEventForTest scroll_begin(details, center_point.x(), center_point.y()); |
| 275 details = ui::GestureEventDetails(ui::ET_GESTURE_END, 0.0f, 0.0f); |
| 276 details.set_bounding_box(bounding_box); |
| 277 GestureEventForTest end(details, center_point.x(), center_point.y()); |
| 275 | 278 |
| 276 // Assume that the view currently handling gestures has been set as | 279 // Assume that the view currently handling gestures has been set as |
| 277 // |grandchild| by a previous gesture event. Thus subsequent gesture events | 280 // |grandchild| by a previous gesture event. Thus subsequent TAP and |
| 278 // should be initially targeted to |grandchild|, and re-targeting should | 281 // SCROLL_BEGIN events should be initially targeted to |grandchild|, and |
| 279 // be prohibited for all gesture event types except for GESTURE_SCROLL_BEGIN | 282 // re-targeting should be prohibited for TAP but permitted for |
| 280 // (which should be re-targeted to the parent of |grandchild|). | 283 // GESTURE_SCROLL_BEGIN (which should be re-targeted to the parent of |
| 284 // |grandchild|). |
| 281 SetAllowGestureEventRetargeting(root_view, false); | 285 SetAllowGestureEventRetargeting(root_view, false); |
| 282 SetGestureHandler(root_view, grandchild); | 286 SetGestureHandler(root_view, grandchild); |
| 283 EXPECT_EQ(grandchild, targeter->FindTargetForEvent(root_view, &tap)); | 287 EXPECT_EQ(grandchild, targeter->FindTargetForEvent(root_view, &tap)); |
| 284 EXPECT_EQ(NULL, targeter->FindNextBestTarget(grandchild, &tap)); | 288 EXPECT_EQ(NULL, targeter->FindNextBestTarget(grandchild, &tap)); |
| 285 EXPECT_EQ(grandchild, targeter->FindTargetForEvent(root_view, &scroll_begin)); | 289 EXPECT_EQ(grandchild, targeter->FindTargetForEvent(root_view, &scroll_begin)); |
| 286 EXPECT_EQ(child, targeter->FindNextBestTarget(grandchild, &scroll_begin)); | 290 EXPECT_EQ(child, targeter->FindNextBestTarget(grandchild, &scroll_begin)); |
| 287 | 291 |
| 292 // GESTURE_END events should be targeted to the existing gesture handler, |
| 293 // but re-targeting should be prohibited. |
| 294 EXPECT_EQ(grandchild, targeter->FindTargetForEvent(root_view, &end)); |
| 295 EXPECT_EQ(NULL, targeter->FindNextBestTarget(grandchild, &tap)); |
| 296 |
| 288 // Assume that the view currently handling gestures is still set as | 297 // Assume that the view currently handling gestures is still set as |
| 289 // |grandchild|, but this was not done by a previous gesture. Thus we are | 298 // |grandchild|, but this was not done by a previous gesture. Thus we are |
| 290 // in the process of finding the View to which subsequent gestures will be | 299 // in the process of finding the View to which subsequent gestures will be |
| 291 // dispatched, so all gesture events should be re-targeted up the ancestor | 300 // dispatched, so TAP and SCROLL_BEGIN events should be re-targeted up |
| 292 // chain. | 301 // the ancestor chain. |
| 293 SetAllowGestureEventRetargeting(root_view, true); | 302 SetAllowGestureEventRetargeting(root_view, true); |
| 294 EXPECT_EQ(child, targeter->FindNextBestTarget(grandchild, &tap)); | 303 EXPECT_EQ(child, targeter->FindNextBestTarget(grandchild, &tap)); |
| 295 EXPECT_EQ(child, targeter->FindNextBestTarget(grandchild, &scroll_begin)); | 304 EXPECT_EQ(child, targeter->FindNextBestTarget(grandchild, &scroll_begin)); |
| 296 | 305 |
| 306 // GESTURE_END events are not permitted to be re-targeted up the ancestor |
| 307 // chain; they are only ever targeted in the case where the gesture handler |
| 308 // was established by a previous gesture. |
| 309 EXPECT_EQ(NULL, targeter->FindNextBestTarget(grandchild, &end)); |
| 310 |
| 297 // Assume that the default gesture handler was set by the previous gesture, | 311 // Assume that the default gesture handler was set by the previous gesture, |
| 298 // but that this handler is currently NULL. No gesture events should be | 312 // but that this handler is currently NULL. No gesture events should be |
| 299 // re-targeted in this case (regardless of the view that is passed in to | 313 // re-targeted in this case (regardless of the view that is passed in to |
| 300 // FindNextBestTarget() as the previous target). | 314 // FindNextBestTarget() as the previous target). |
| 301 SetGestureHandler(root_view, NULL); | 315 SetGestureHandler(root_view, NULL); |
| 302 SetAllowGestureEventRetargeting(root_view, false); | 316 SetAllowGestureEventRetargeting(root_view, false); |
| 303 EXPECT_EQ(NULL, targeter->FindNextBestTarget(child, &tap)); | 317 EXPECT_EQ(NULL, targeter->FindNextBestTarget(child, &tap)); |
| 304 EXPECT_EQ(NULL, targeter->FindNextBestTarget(NULL, &tap)); | 318 EXPECT_EQ(NULL, targeter->FindNextBestTarget(NULL, &tap)); |
| 305 EXPECT_EQ(NULL, targeter->FindNextBestTarget(content, &scroll_begin)); | 319 EXPECT_EQ(NULL, targeter->FindNextBestTarget(content, &scroll_begin)); |
| 320 EXPECT_EQ(NULL, targeter->FindNextBestTarget(content, &end)); |
| 306 | 321 |
| 307 // If no default gesture handler is currently set, targeting should be | 322 // If no default gesture handler is currently set, targeting should be |
| 308 // performed using the location of the gesture event. | 323 // performed using the location of the gesture event for a TAP and a |
| 324 // SCROLL_BEGIN. |
| 309 SetAllowGestureEventRetargeting(root_view, true); | 325 SetAllowGestureEventRetargeting(root_view, true); |
| 310 EXPECT_EQ(grandchild, targeter->FindTargetForEvent(root_view, &tap)); | 326 EXPECT_EQ(grandchild, targeter->FindTargetForEvent(root_view, &tap)); |
| 311 EXPECT_EQ(grandchild, targeter->FindTargetForEvent(root_view, &scroll_begin)); | 327 EXPECT_EQ(grandchild, targeter->FindTargetForEvent(root_view, &scroll_begin)); |
| 328 |
| 329 // If no default gesture handler is currently set, GESTURE_END events |
| 330 // should never be targeted or re-targeted to any View. |
| 331 EXPECT_EQ(NULL, targeter->FindTargetForEvent(root_view, &end)); |
| 332 EXPECT_EQ(NULL, targeter->FindNextBestTarget(NULL, &end)); |
| 333 EXPECT_EQ(NULL, targeter->FindNextBestTarget(child, &end)); |
| 312 } | 334 } |
| 313 | 335 |
| 314 // Tests that the functions ViewTargeterDelegate::DoesIntersectRect() | 336 // Tests that the functions ViewTargeterDelegate::DoesIntersectRect() |
| 315 // and MaskedTargeterDelegate::DoesIntersectRect() work as intended when | 337 // and MaskedTargeterDelegate::DoesIntersectRect() work as intended when |
| 316 // called on views which are derived from ViewTargeterDelegate. | 338 // called on views which are derived from ViewTargeterDelegate. |
| 317 // Also verifies that ViewTargeterDelegate::DoesIntersectRect() can | 339 // Also verifies that ViewTargeterDelegate::DoesIntersectRect() can |
| 318 // be called from the ViewTargeter installed on RootView. | 340 // be called from the ViewTargeter installed on RootView. |
| 319 TEST_F(ViewTargeterTest, DoesIntersectRect) { | 341 TEST_F(ViewTargeterTest, DoesIntersectRect) { |
| 320 Widget widget; | 342 Widget widget; |
| 321 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); | 343 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 EXPECT_EQ(v1, root_view->GetTooltipHandlerForPoint(v1_origin)); | 461 EXPECT_EQ(v1, root_view->GetTooltipHandlerForPoint(v1_origin)); |
| 440 EXPECT_EQ(root_view, root_view->GetTooltipHandlerForPoint(v2_origin)); | 462 EXPECT_EQ(root_view, root_view->GetTooltipHandlerForPoint(v2_origin)); |
| 441 | 463 |
| 442 EXPECT_FALSE(v1->GetTooltipHandlerForPoint(v2_origin)); | 464 EXPECT_FALSE(v1->GetTooltipHandlerForPoint(v2_origin)); |
| 443 | 465 |
| 444 widget->CloseNow(); | 466 widget->CloseNow(); |
| 445 } | 467 } |
| 446 | 468 |
| 447 } // namespace test | 469 } // namespace test |
| 448 } // namespace views | 470 } // namespace views |
| OLD | NEW |