1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/aura/root_window.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/aura/env.h"
#include "ui/aura/event.h"
#include "ui/aura/test/aura_test_base.h"
#include "ui/aura/test/test_window_delegate.h"
#include "ui/aura/test/test_windows.h"
#include "ui/base/hit_test.h"
#include "ui/gfx/point.h"
#include "ui/gfx/rect.h"
namespace aura {
namespace {
// A delegate that always returns a non-client component for hit tests.
class NonClientDelegate : public test::TestWindowDelegate {
public:
NonClientDelegate()
: non_client_count_(0),
mouse_event_count_(0),
mouse_event_flags_(0x0) {
}
virtual ~NonClientDelegate() {}
int non_client_count() const { return non_client_count_; }
gfx::Point non_client_location() const { return non_client_location_; }
int mouse_event_count() const { return mouse_event_count_; }
gfx::Point mouse_event_location() const { return mouse_event_location_; }
int mouse_event_flags() const { return mouse_event_flags_; }
virtual int GetNonClientComponent(const gfx::Point& location) const OVERRIDE {
NonClientDelegate* self = const_cast<NonClientDelegate*>(this);
self->non_client_count_++;
self->non_client_location_ = location;
return HTTOPLEFT;
}
virtual bool OnMouseEvent(MouseEvent* event) OVERRIDE {
mouse_event_count_++;
mouse_event_location_ = event->location();
mouse_event_flags_ = event->flags();
return true;
}
private:
int non_client_count_;
gfx::Point non_client_location_;
int mouse_event_count_;
gfx::Point mouse_event_location_;
int mouse_event_flags_;
};
} // namespace
typedef test::AuraTestBase RootWindowTest;
TEST_F(RootWindowTest, DispatchMouseEvent) {
// Create two non-overlapping windows so we don't have to worry about which
// is on top.
scoped_ptr<NonClientDelegate> delegate1(new NonClientDelegate());
scoped_ptr<NonClientDelegate> delegate2(new NonClientDelegate());
const int kWindowWidth = 123;
const int kWindowHeight = 45;
gfx::Rect bounds1(100, 200, kWindowWidth, kWindowHeight);
gfx::Rect bounds2(300, 400, kWindowWidth, kWindowHeight);
scoped_ptr<aura::Window> window1(CreateTestWindowWithDelegate(
delegate1.get(), -1234, bounds1, NULL));
scoped_ptr<aura::Window> window2(CreateTestWindowWithDelegate(
delegate2.get(), -5678, bounds2, NULL));
// Send a mouse event to window1.
gfx::Point point(101, 201);
MouseEvent event1(
ui::ET_MOUSE_PRESSED, point, point, ui::EF_LEFT_MOUSE_BUTTON);
root_window()->DispatchMouseEvent(&event1);
// Event was tested for non-client area for the target window.
EXPECT_EQ(1, delegate1->non_client_count());
EXPECT_EQ(0, delegate2->non_client_count());
// The non-client component test was in local coordinates.
EXPECT_EQ(gfx::Point(1, 1), delegate1->non_client_location());
// Mouse event was received by target window.
EXPECT_EQ(1, delegate1->mouse_event_count());
EXPECT_EQ(0, delegate2->mouse_event_count());
// Event was in local coordinates.
EXPECT_EQ(gfx::Point(1, 1), delegate1->mouse_event_location());
// Non-client flag was set.
EXPECT_TRUE(delegate1->mouse_event_flags() & ui::EF_IS_NON_CLIENT);
}
// Check that we correctly track the state of the mouse buttons in response to
// button press and release events.
TEST_F(RootWindowTest, MouseButtonState) {
EXPECT_FALSE(Env::GetInstance()->is_mouse_button_down());
gfx::Point location;
scoped_ptr<MouseEvent> event;
// Press the left button.
event.reset(new MouseEvent(
ui::ET_MOUSE_PRESSED,
location,
location,
ui::EF_LEFT_MOUSE_BUTTON));
root_window()->DispatchMouseEvent(event.get());
EXPECT_TRUE(Env::GetInstance()->is_mouse_button_down());
// Additionally press the right.
event.reset(new MouseEvent(
ui::ET_MOUSE_PRESSED,
location,
location,
ui::EF_LEFT_MOUSE_BUTTON | ui::EF_RIGHT_MOUSE_BUTTON));
root_window()->DispatchMouseEvent(event.get());
EXPECT_TRUE(Env::GetInstance()->is_mouse_button_down());
// Release the left button.
event.reset(new MouseEvent(
ui::ET_MOUSE_RELEASED,
location,
location,
ui::EF_RIGHT_MOUSE_BUTTON));
root_window()->DispatchMouseEvent(event.get());
EXPECT_TRUE(Env::GetInstance()->is_mouse_button_down());
// Release the right button. We should ignore the Shift-is-down flag.
event.reset(new MouseEvent(
ui::ET_MOUSE_RELEASED,
location,
location,
ui::EF_SHIFT_DOWN));
root_window()->DispatchMouseEvent(event.get());
EXPECT_FALSE(Env::GetInstance()->is_mouse_button_down());
// Press the middle button.
event.reset(new MouseEvent(
ui::ET_MOUSE_PRESSED,
location,
location,
ui::EF_MIDDLE_MOUSE_BUTTON));
root_window()->DispatchMouseEvent(event.get());
EXPECT_TRUE(Env::GetInstance()->is_mouse_button_down());
}
TEST_F(RootWindowTest, TranslatedEvent) {
scoped_ptr<Window> w1(test::CreateTestWindowWithDelegate(NULL, 1,
gfx::Rect(50, 50, 100, 100), NULL));
gfx::Point origin(100, 100);
MouseEvent root(ui::ET_MOUSE_PRESSED, origin, origin, 0);
EXPECT_EQ("100,100", root.location().ToString());
EXPECT_EQ("100,100", root.root_location().ToString());
MouseEvent translated_event(
root, root_window(), w1.get(),
ui::ET_MOUSE_ENTERED, root.flags());
EXPECT_EQ("50,50", translated_event.location().ToString());
EXPECT_EQ("100,100", translated_event.root_location().ToString());
}
} // namespace aura
|