Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Side by Side Diff: ui/views/widget/widget_unittest.cc

Issue 542323002: Convert ui::GestureEvent coordinates during targeting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: mutate event location during targeting Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« ui/events/event_processor.cc ('K') | « ui/views/widget/root_view.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 ConvertPointToView(View* view, const gfx::Point& p) {
sadrul 2014/09/07 05:33:47 FromWidgetToView?
tdanderson 2014/09/08 17:21:08 Done.
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
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(ConvertPointToView(v1, location_in_root));
2429 EXPECT_EQ(gfx::Point(75, 55), location_in_v1);
2430 gfx::Point location_in_v2(ConvertPointToView(v2, location_in_root));
2431 EXPECT_EQ(gfx::Point(25, 35), location_in_v2);
2432 gfx::Point location_in_v3(ConvertPointToView(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
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
OLDNEW
« ui/events/event_processor.cc ('K') | « ui/views/widget/root_view.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698