OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <algorithm> | 5 #include <algorithm> |
6 #include <set> | 6 #include <set> |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 #include "ui/views/window/dialog_delegate.h" | 32 #include "ui/views/window/dialog_delegate.h" |
33 #include "ui/views/window/native_frame_view.h" | 33 #include "ui/views/window/native_frame_view.h" |
34 | 34 |
35 #if defined(OS_WIN) | 35 #if defined(OS_WIN) |
36 #include "ui/views/win/hwnd_util.h" | 36 #include "ui/views/win/hwnd_util.h" |
37 #endif | 37 #endif |
38 | 38 |
39 namespace views { | 39 namespace views { |
40 namespace test { | 40 namespace test { |
41 | 41 |
| 42 namespace { |
| 43 |
| 44 // TODO(tdanderson): This utility function is used in different unittest |
| 45 // files. Move to a common location to avoid |
| 46 // repeated code. |
| 47 gfx::Point ConvertPointFromWidgetToView(View* view, const gfx::Point& p) { |
| 48 gfx::Point tmp(p); |
| 49 View::ConvertPointToTarget(view->GetWidget()->GetRootView(), view, &tmp); |
| 50 return tmp; |
| 51 } |
| 52 |
| 53 } // namespace |
| 54 |
42 // A view that keeps track of the events it receives, optionally consuming them. | 55 // A view that keeps track of the events it receives, optionally consuming them. |
43 class EventCountView : public View { | 56 class EventCountView : public View { |
44 public: | 57 public: |
45 // Whether to call SetHandled() on events as they are received. For some event | 58 // Whether to call SetHandled() on events as they are received. For some event |
46 // types, this will allow EventCountView to receives future events in the | 59 // types, this will allow EventCountView to receives future events in the |
47 // event sequence, such as a drag. | 60 // event sequence, such as a drag. |
48 enum HandleMode { | 61 enum HandleMode { |
49 PROPAGATE_EVENTS, | 62 PROPAGATE_EVENTS, |
50 CONSUME_EVENTS | 63 CONSUME_EVENTS |
51 }; | 64 }; |
(...skipping 2290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2342 EXPECT_EQ(1, v1->GetEventCount(ui::ET_GESTURE_END)); | 2355 EXPECT_EQ(1, v1->GetEventCount(ui::ET_GESTURE_END)); |
2343 EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_END)); | 2356 EXPECT_EQ(0, v2->GetEventCount(ui::ET_GESTURE_END)); |
2344 EXPECT_EQ(0, v3->GetEventCount(ui::ET_GESTURE_END)); | 2357 EXPECT_EQ(0, v3->GetEventCount(ui::ET_GESTURE_END)); |
2345 EXPECT_EQ(0, v4->GetEventCount(ui::ET_GESTURE_END)); | 2358 EXPECT_EQ(0, v4->GetEventCount(ui::ET_GESTURE_END)); |
2346 EXPECT_EQ(NULL, GetGestureHandler(root_view)); | 2359 EXPECT_EQ(NULL, GetGestureHandler(root_view)); |
2347 EXPECT_TRUE(end.handled()); | 2360 EXPECT_TRUE(end.handled()); |
2348 | 2361 |
2349 widget->Close(); | 2362 widget->Close(); |
2350 } | 2363 } |
2351 | 2364 |
| 2365 // A class used in WidgetTest.GestureEventLocationWhileBubbling to verify |
| 2366 // that when a gesture event bubbles up a View hierarchy, the location |
| 2367 // of a gesture event seen by each View is in the local coordinate space |
| 2368 // of that View. |
| 2369 class GestureLocationView : public EventCountView { |
| 2370 public: |
| 2371 GestureLocationView() {} |
| 2372 virtual ~GestureLocationView() {} |
| 2373 |
| 2374 void set_expected_location(gfx::Point expected_location) { |
| 2375 expected_location_ = expected_location; |
| 2376 } |
| 2377 |
| 2378 // EventCountView: |
| 2379 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { |
| 2380 EventCountView::OnGestureEvent(event); |
| 2381 |
| 2382 // Verify that the location of |event| is in the local coordinate |
| 2383 // space of |this|. |
| 2384 EXPECT_EQ(expected_location_, event->location()); |
| 2385 } |
| 2386 |
| 2387 private: |
| 2388 // The expected location of a gesture event dispatched to |this|. |
| 2389 gfx::Point expected_location_; |
| 2390 |
| 2391 DISALLOW_COPY_AND_ASSIGN(GestureLocationView); |
| 2392 }; |
| 2393 |
| 2394 // Verifies that the location of a gesture event is always in the local |
| 2395 // coordinate space of the View receiving the event while bubbling. |
| 2396 TEST_F(WidgetTest, GestureEventLocationWhileBubbling) { |
| 2397 Widget* widget = CreateTopLevelNativeWidget(); |
| 2398 widget->SetBounds(gfx::Rect(0, 0, 300, 300)); |
| 2399 |
| 2400 // Define a hierarchy of three views (coordinates shown below are in the |
| 2401 // coordinate space of the root view, but the coordinates used for |
| 2402 // SetBounds() are in their parent coordinate space). |
| 2403 // v1 (50, 50, 150, 150) |
| 2404 // v2 (100, 70, 50, 80) |
| 2405 // v3 (120, 100, 10, 10) |
| 2406 GestureLocationView* v1 = new GestureLocationView(); |
| 2407 v1->SetBounds(50, 50, 150, 150); |
| 2408 GestureLocationView* v2 = new GestureLocationView(); |
| 2409 v2->SetBounds(50, 20, 50, 80); |
| 2410 GestureLocationView* v3 = new GestureLocationView(); |
| 2411 v3->SetBounds(20, 30, 10, 10); |
| 2412 internal::RootView* root_view = |
| 2413 static_cast<internal::RootView*>(widget->GetRootView()); |
| 2414 root_view->AddChildView(v1); |
| 2415 v1->AddChildView(v2); |
| 2416 v2->AddChildView(v3); |
| 2417 |
| 2418 widget->Show(); |
| 2419 |
| 2420 // Define a GESTURE_TAP event located at (125, 105) in root view coordinates. |
| 2421 // This event is contained within all of |v1|, |v2|, and |v3|. |
| 2422 gfx::Point location_in_root(125, 105); |
| 2423 GestureEventForTest tap( |
| 2424 ui::ET_GESTURE_TAP, location_in_root.x(), location_in_root.y()); |
| 2425 |
| 2426 // Calculate the location of the event in the local coordinate spaces |
| 2427 // of each of the views. |
| 2428 gfx::Point location_in_v1(ConvertPointFromWidgetToView(v1, location_in_root)); |
| 2429 EXPECT_EQ(gfx::Point(75, 55), location_in_v1); |
| 2430 gfx::Point location_in_v2(ConvertPointFromWidgetToView(v2, location_in_root)); |
| 2431 EXPECT_EQ(gfx::Point(25, 35), location_in_v2); |
| 2432 gfx::Point location_in_v3(ConvertPointFromWidgetToView(v3, location_in_root)); |
| 2433 EXPECT_EQ(gfx::Point(5, 5), location_in_v3); |
| 2434 |
| 2435 // Dispatch the event. When each view receives the event, its location should |
| 2436 // be in the local coordinate space of that view (see the check made by |
| 2437 // GestureLocationView). After dispatch is complete the event's location |
| 2438 // should be in the root coordinate space. |
| 2439 v1->set_expected_location(location_in_v1); |
| 2440 v2->set_expected_location(location_in_v2); |
| 2441 v3->set_expected_location(location_in_v3); |
| 2442 widget->OnGestureEvent(&tap); |
| 2443 EXPECT_EQ(location_in_root, tap.location()); |
| 2444 |
| 2445 // Verify that each view did in fact see the event. |
| 2446 EventCountView* view1 = v1; |
| 2447 EventCountView* view2 = v2; |
| 2448 EventCountView* view3 = v3; |
| 2449 EXPECT_EQ(1, view1->GetEventCount(ui::ET_GESTURE_TAP)); |
| 2450 EXPECT_EQ(1, view2->GetEventCount(ui::ET_GESTURE_TAP)); |
| 2451 EXPECT_EQ(1, view3->GetEventCount(ui::ET_GESTURE_TAP)); |
| 2452 |
| 2453 widget->Close(); |
| 2454 } |
| 2455 |
2352 // Verifies that disabled views are permitted to be set as the default gesture | 2456 // Verifies that disabled views are permitted to be set as the default gesture |
2353 // handler in RootView. Also verifies that gesture events targeted to a disabled | 2457 // handler in RootView. Also verifies that gesture events targeted to a disabled |
2354 // view are not actually dispatched to the view, but are still marked as | 2458 // view are not actually dispatched to the view, but are still marked as |
2355 // handled. | 2459 // handled. |
2356 TEST_F(WidgetTest, DisabledGestureEventTarget) { | 2460 TEST_F(WidgetTest, DisabledGestureEventTarget) { |
2357 Widget* widget = CreateTopLevelNativeWidget(); | 2461 Widget* widget = CreateTopLevelNativeWidget(); |
2358 widget->SetBounds(gfx::Rect(0, 0, 300, 300)); | 2462 widget->SetBounds(gfx::Rect(0, 0, 300, 300)); |
2359 | 2463 |
2360 // Define a hierarchy of four views (coordinates are in | 2464 // Define a hierarchy of four views (coordinates are in |
2361 // their parent coordinate space). | 2465 // their parent coordinate space). |
(...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3089 EXPECT_EQ(3, view->GetEventCount(ui::ET_MOUSE_PRESSED)); | 3193 EXPECT_EQ(3, view->GetEventCount(ui::ET_MOUSE_PRESSED)); |
3090 EXPECT_EQ(3, view->GetEventCount(ui::ET_MOUSE_RELEASED)); | 3194 EXPECT_EQ(3, view->GetEventCount(ui::ET_MOUSE_RELEASED)); |
3091 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_DRAGGED)); | 3195 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_DRAGGED)); |
3092 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, view->last_flags()); | 3196 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, view->last_flags()); |
3093 | 3197 |
3094 widget->CloseNow(); | 3198 widget->CloseNow(); |
3095 } | 3199 } |
3096 | 3200 |
3097 } // namespace test | 3201 } // namespace test |
3098 } // namespace views | 3202 } // namespace views |
OLD | NEW |