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

Side by Side Diff: views/view_unittest.cc

Issue 3192002: Added entry points to view/View to dispatch and process TouchEvents. (Closed) Base URL: git://codf21.jail.google.com/chromium.git
Patch Set: final changes Created 10 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
« no previous file with comments | « views/view.cc ('k') | views/views.gyp » ('j') | 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 <map> 5 #include <map>
6 6
7 #include "app/clipboard/clipboard.h" 7 #include "app/clipboard/clipboard.h"
8 #include "app/keyboard_codes.h" 8 #include "app/keyboard_codes.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/string_util.h" 10 #include "base/string_util.h"
11 #include "base/utf_string_conversions.h" 11 #include "base/utf_string_conversions.h"
12 #include "gfx/canvas_skia.h" 12 #include "gfx/canvas_skia.h"
13 #include "gfx/path.h" 13 #include "gfx/path.h"
14 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "views/background.h" 15 #include "views/background.h"
16 #include "views/controls/button/checkbox.h" 16 #include "views/controls/button/checkbox.h"
17 #if defined(OS_WIN)
18 #include "views/controls/button/native_button_win.h"
19 #endif
20 #include "views/controls/native/native_view_host.h" 17 #include "views/controls/native/native_view_host.h"
21 #include "views/controls/scroll_view.h" 18 #include "views/controls/scroll_view.h"
22 #include "views/controls/textfield/textfield.h" 19 #include "views/controls/textfield/textfield.h"
23 #include "views/event.h" 20 #include "views/event.h"
24 #include "views/focus/accelerator_handler.h" 21 #include "views/focus/accelerator_handler.h"
25 #include "views/focus/view_storage.h" 22 #include "views/focus/view_storage.h"
26 #include "views/view.h" 23 #include "views/view.h"
27 #include "views/views_delegate.h" 24 #include "views/views_delegate.h"
28 #include "views/widget/root_view.h" 25 #include "views/widget/root_view.h"
26 #include "views/window/dialog_delegate.h"
27 #include "views/window/window.h"
28
29 #if defined(OS_WIN) 29 #if defined(OS_WIN)
30 #include "views/widget/widget_win.h" 30 #include "views/widget/widget_win.h"
31 #include "views/controls/button/native_button_win.h"
31 #elif defined(OS_LINUX) 32 #elif defined(OS_LINUX)
32 #include "views/widget/widget_gtk.h" 33 #include "views/widget/widget_gtk.h"
33 #include "views/window/window_gtk.h" 34 #include "views/window/window_gtk.h"
34 #endif 35 #endif
35 #include "views/window/dialog_delegate.h" 36 #if defined(TOUCH_UI)
36 #include "views/window/window.h" 37 #include "views/touchui/gesture_manager.h"
38 #endif
37 39
38 using namespace views; 40 using namespace views;
39 41
40 namespace { 42 namespace {
41 43
42 class ViewTest : public testing::Test { 44 class ViewTest : public testing::Test {
43 public: 45 public:
44 ViewTest() { 46 ViewTest() {
45 #if defined(OS_WIN) 47 #if defined(OS_WIN)
46 OleInitialize(NULL); 48 OleInitialize(NULL);
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 150
149 virtual ~TestView() {} 151 virtual ~TestView() {}
150 152
151 // Reset all test state 153 // Reset all test state
152 void Reset() { 154 void Reset() {
153 did_change_bounds_ = false; 155 did_change_bounds_ = false;
154 child_added_ = false; 156 child_added_ = false;
155 child_removed_ = false; 157 child_removed_ = false;
156 last_mouse_event_type_ = 0; 158 last_mouse_event_type_ = 0;
157 location_.SetPoint(0, 0); 159 location_.SetPoint(0, 0);
160 #if defined(TOUCH_UI)
161 last_touch_event_type_ = 0;
162 last_touch_event_was_handled_ = false;
163 #endif
158 last_clip_.setEmpty(); 164 last_clip_.setEmpty();
159 accelerator_count_map_.clear(); 165 accelerator_count_map_.clear();
160 } 166 }
161 167
162 virtual void DidChangeBounds(const gfx::Rect& previous, 168 virtual void DidChangeBounds(const gfx::Rect& previous,
163 const gfx::Rect& current); 169 const gfx::Rect& current);
164 virtual void ViewHierarchyChanged(bool is_add, View *parent, View *child); 170 virtual void ViewHierarchyChanged(bool is_add, View *parent, View *child);
165 virtual bool OnMousePressed(const MouseEvent& event); 171 virtual bool OnMousePressed(const MouseEvent& event);
166 virtual bool OnMouseDragged(const MouseEvent& event); 172 virtual bool OnMouseDragged(const MouseEvent& event);
167 virtual void OnMouseReleased(const MouseEvent& event, bool canceled); 173 virtual void OnMouseReleased(const MouseEvent& event, bool canceled);
174 #if defined(TOUCH_UI)
175 virtual bool OnTouchEvent(const TouchEvent& event);
176 #endif
168 virtual void Paint(gfx::Canvas* canvas); 177 virtual void Paint(gfx::Canvas* canvas);
169 virtual bool AcceleratorPressed(const Accelerator& accelerator); 178 virtual bool AcceleratorPressed(const Accelerator& accelerator);
170 179
171 // DidChangeBounds test 180 // DidChangeBounds test
172 bool did_change_bounds_; 181 bool did_change_bounds_;
173 gfx::Rect previous_bounds_; 182 gfx::Rect previous_bounds_;
174 gfx::Rect new_bounds_; 183 gfx::Rect new_bounds_;
175 184
176 // AddRemoveNotifications test 185 // AddRemoveNotifications test
177 bool child_added_; 186 bool child_added_;
178 bool child_removed_; 187 bool child_removed_;
179 View* parent_; 188 View* parent_;
180 View* child_; 189 View* child_;
181 190
182 // MouseEvent 191 // MouseEvent
183 int last_mouse_event_type_; 192 int last_mouse_event_type_;
184 gfx::Point location_; 193 gfx::Point location_;
185 194
195 #if defined(TOUCH_UI)
196 // TouchEvent
197 int last_touch_event_type_;
198 bool last_touch_event_was_handled_;
199 #endif
200
186 // Painting 201 // Painting
187 SkRect last_clip_; 202 SkRect last_clip_;
188 203
189 // Accelerators 204 // Accelerators
190 std::map<Accelerator, int> accelerator_count_map_; 205 std::map<Accelerator, int> accelerator_count_map_;
191 }; 206 };
192 207
208 #if defined(TOUCH_UI)
209 // Mock instance of the GestureManager for testing.
210 class MockGestureManager : public GestureManager {
211 public:
212 // Reset all test state
213 void Reset() {
214 last_touch_event_ = 0;
215 last_view_ = NULL;
216 previously_handled_flag_ = false;
217 }
218
219 bool previously_handled_flag_;
220 bool ProcessTouchEventForGesture(const TouchEvent& event,
221 View* source,
222 bool previouslyHandled);
223 MockGestureManager();
224
225 int last_touch_event_;
226 View *last_view_;
227
228 DISALLOW_COPY_AND_ASSIGN(MockGestureManager);
229 };
230
231 #endif
232
193 //////////////////////////////////////////////////////////////////////////////// 233 ////////////////////////////////////////////////////////////////////////////////
194 // DidChangeBounds 234 // DidChangeBounds
195 //////////////////////////////////////////////////////////////////////////////// 235 ////////////////////////////////////////////////////////////////////////////////
196 236
197 void TestView::DidChangeBounds(const gfx::Rect& previous, 237 void TestView::DidChangeBounds(const gfx::Rect& previous,
198 const gfx::Rect& current) { 238 const gfx::Rect& current) {
199 did_change_bounds_ = true; 239 did_change_bounds_ = true;
200 previous_bounds_ = previous; 240 previous_bounds_ = previous;
201 new_bounds_ = current; 241 new_bounds_ = current;
202 } 242 }
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 root->OnMouseDragged(released); 416 root->OnMouseDragged(released);
377 EXPECT_EQ(v2->last_mouse_event_type_, Event::ET_MOUSE_RELEASED); 417 EXPECT_EQ(v2->last_mouse_event_type_, Event::ET_MOUSE_RELEASED);
378 EXPECT_EQ(v2->location_.x(), -100); 418 EXPECT_EQ(v2->location_.x(), -100);
379 EXPECT_EQ(v2->location_.y(), -100); 419 EXPECT_EQ(v2->location_.y(), -100);
380 // Make sure v1 did not receive the event 420 // Make sure v1 did not receive the event
381 EXPECT_EQ(v1->last_mouse_event_type_, 0); 421 EXPECT_EQ(v1->last_mouse_event_type_, 0);
382 422
383 window->CloseNow(); 423 window->CloseNow();
384 } 424 }
385 425
426 #if defined(TOUCH_UI)
427 ////////////////////////////////////////////////////////////////////////////////
428 // TouchEvent
429 ////////////////////////////////////////////////////////////////////////////////
430 bool MockGestureManager::ProcessTouchEventForGesture(
431 const TouchEvent& event,
432 View* source,
433 bool previouslyHandled) {
434 last_touch_event_ = event.GetType();
435 last_view_ = source;
436 previously_handled_flag_ = previouslyHandled;
437 return true;
438 }
439
440 MockGestureManager::MockGestureManager() {
441 }
442
443 bool TestView::OnTouchEvent(const TouchEvent& event) {
444 last_touch_event_type_ = event.GetType();
445 location_.SetPoint(event.x(), event.y());
446 return last_touch_event_was_handled_;
447 }
448
449 TEST_F(ViewTest, TouchEvent) {
450 MockGestureManager* gm = new MockGestureManager();
451
452 TestView* v1 = new TestView();
453 v1->SetBounds(0, 0, 300, 300);
454
455 TestView* v2 = new TestView();
456 v2->SetBounds(100, 100, 100, 100);
457
458 scoped_ptr<Widget> window(CreateWidget());
459 #if defined(OS_WIN)
460 // This code would need to be here when we support
461 // touch on windows?
462 WidgetWin* window_win = static_cast<WidgetWin*>(window.get());
463 window_win->set_delete_on_destroy(false);
464 window_win->set_window_style(WS_OVERLAPPEDWINDOW);
465 window_win->Init(NULL, gfx::Rect(50, 50, 650, 650));
466 #endif
467 RootView* root = window->GetRootView();
468
469 root->AddChildView(v1);
470 root->SetGestureManager(gm);
471 v1->AddChildView(v2);
472
473 v1->Reset();
474 v2->Reset();
475 gm->Reset();
476
477 TouchEvent pressed(Event::ET_TOUCH_PRESSED,
478 110,
479 120,
480 0, /* no flags */
481 0 /* first finger touch */);
482 v2->last_touch_event_was_handled_ = true;
483 root->OnTouchEvent(pressed);
484
485 EXPECT_EQ(v2->last_touch_event_type_, Event::ET_TOUCH_PRESSED);
486 EXPECT_EQ(v2->location_.x(), 10);
487 EXPECT_EQ(v2->location_.y(), 20);
488 // Make sure v1 did not receive the event
489 EXPECT_EQ(v1->last_touch_event_type_, 0);
490
491 EXPECT_EQ(gm->last_touch_event_, Event::ET_TOUCH_PRESSED);
492 EXPECT_EQ(gm->last_view_, root);
493 EXPECT_EQ(gm->previously_handled_flag_, true);
494
495 // Drag event out of bounds. Should still go to v2
496 v1->Reset();
497 v2->Reset();
498 TouchEvent dragged(Event::ET_TOUCH_MOVED,
499 50,
500 40,
501 0, /* no flags */
502 0 /* first finger touch */);
503 root->OnTouchEvent(dragged);
504 EXPECT_EQ(v2->last_touch_event_type_, Event::ET_TOUCH_MOVED);
505 EXPECT_EQ(v2->location_.x(), -50);
506 EXPECT_EQ(v2->location_.y(), -60);
507 // Make sure v1 did not receive the event
508 EXPECT_EQ(v1->last_touch_event_type_, 0);
509
510 EXPECT_EQ(gm->last_touch_event_, Event::ET_TOUCH_MOVED);
511 EXPECT_EQ(gm->last_view_, root);
512 EXPECT_EQ(gm->previously_handled_flag_, true);
513
514 // Releasted event out of bounds. Should still go to v2
515 v1->Reset();
516 v2->Reset();
517 TouchEvent released(Event::ET_TOUCH_RELEASED, 0, 0, 0, 0 /* first finger */);
518 v2->last_touch_event_was_handled_ = true;
519 root->OnTouchEvent(released);
520 EXPECT_EQ(v2->last_touch_event_type_, Event::ET_TOUCH_RELEASED);
521 EXPECT_EQ(v2->location_.x(), -100);
522 EXPECT_EQ(v2->location_.y(), -100);
523 // Make sure v1 did not receive the event
524 EXPECT_EQ(v1->last_touch_event_type_, 0);
525
526 EXPECT_EQ(gm->last_touch_event_, Event::ET_TOUCH_RELEASED);
527 EXPECT_EQ(gm->last_view_, root);
528 EXPECT_EQ(gm->previously_handled_flag_, true);
529
530 window->CloseNow();
531 }
532 #endif
533
386 //////////////////////////////////////////////////////////////////////////////// 534 ////////////////////////////////////////////////////////////////////////////////
387 // Painting 535 // Painting
388 //////////////////////////////////////////////////////////////////////////////// 536 ////////////////////////////////////////////////////////////////////////////////
389 537
390 void TestView::Paint(gfx::Canvas* canvas) { 538 void TestView::Paint(gfx::Canvas* canvas) {
391 canvas->AsCanvasSkia()->getClipBounds(&last_clip_); 539 canvas->AsCanvasSkia()->getClipBounds(&last_clip_);
392 } 540 }
393 541
394 void CheckRect(const SkRect& check_rect, const SkRect& target_rect) { 542 void CheckRect(const SkRect& check_rect, const SkRect& target_rect) {
395 EXPECT_EQ(target_rect.fLeft, check_rect.fLeft); 543 EXPECT_EQ(target_rect.fLeft, check_rect.fLeft);
(...skipping 949 matching lines...) Expand 10 before | Expand all | Expand 10 after
1345 #endif 1493 #endif
1346 } 1494 }
1347 1495
1348 TEST_F(ViewTest, ChangeNativeViewHierarchyChangeHierarchy) { 1496 TEST_F(ViewTest, ChangeNativeViewHierarchyChangeHierarchy) {
1349 // TODO(georgey): Fix the test for Linux 1497 // TODO(georgey): Fix the test for Linux
1350 #if defined(OS_WIN) 1498 #if defined(OS_WIN)
1351 TestChangeNativeViewHierarchy test(this); 1499 TestChangeNativeViewHierarchy test(this);
1352 test.CheckChangingHierarhy(); 1500 test.CheckChangingHierarhy();
1353 #endif 1501 #endif
1354 } 1502 }
OLDNEW
« no previous file with comments | « views/view.cc ('k') | views/views.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698