| 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 "ui/aura/event_filter.h" | 5 #include "ui/aura/event_filter.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "ui/aura/focus_manager.h" | 9 #include "ui/aura/focus_manager.h" |
| 10 #include "ui/aura/root_window.h" | 10 #include "ui/aura/root_window.h" |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 int mouse_event_count_; | 96 int mouse_event_count_; |
| 97 int touch_event_count_; | 97 int touch_event_count_; |
| 98 ui::EventResult key_event_handling_result_; | 98 ui::EventResult key_event_handling_result_; |
| 99 ui::EventResult mouse_event_handling_result_; | 99 ui::EventResult mouse_event_handling_result_; |
| 100 bool consumes_touch_events_; | 100 bool consumes_touch_events_; |
| 101 | 101 |
| 102 DISALLOW_COPY_AND_ASSIGN(TestEventFilterWindowDelegate); | 102 DISALLOW_COPY_AND_ASSIGN(TestEventFilterWindowDelegate); |
| 103 }; | 103 }; |
| 104 | 104 |
| 105 Window* CreateWindow(int id, Window* parent, WindowDelegate* delegate) { | 105 Window* CreateWindow(int id, Window* parent, WindowDelegate* delegate) { |
| 106 Window* window = | 106 Window* window = new Window( |
| 107 new Window(delegate ? delegate : new test::TestWindowDelegate); | 107 delegate ? delegate : |
| 108 test::TestWindowDelegate::CreateSelfDestroyingDelegate()); |
| 108 window->set_id(id); | 109 window->set_id(id); |
| 109 window->Init(ui::LAYER_TEXTURED); | 110 window->Init(ui::LAYER_TEXTURED); |
| 110 window->SetParent(parent); | 111 window->SetParent(parent); |
| 111 window->SetBounds(gfx::Rect(0, 0, 100, 100)); | 112 window->SetBounds(gfx::Rect(0, 0, 100, 100)); |
| 112 window->Show(); | 113 window->Show(); |
| 113 return window; | 114 return window; |
| 114 } | 115 } |
| 115 | 116 |
| 116 // Creates this hierarchy: | 117 // Creates this hierarchy: |
| 117 // | 118 // |
| 118 // RootWindow (EF) | 119 // RootWindow (EF) |
| 119 // +- w1 (EF) | 120 // +- w1 (EF) |
| 120 // +- w11 | 121 // +- w11 |
| 121 // +- w111 (EF) | 122 // +- w111 (EF) |
| 122 // +- w1111 <-- target window | 123 // +- w1111 <-- target window |
| 123 TEST_F(EventFilterTest, PreHandle) { | 124 TEST_F(EventFilterTest, PreHandle) { |
| 124 scoped_ptr<Window> w1(CreateWindow(1, root_window(), NULL)); | 125 scoped_ptr<Window> w1(CreateWindow(1, root_window(), NULL)); |
| 125 scoped_ptr<Window> w11(CreateWindow(11, w1.get(), NULL)); | 126 scoped_ptr<Window> w11(CreateWindow(11, w1.get(), NULL)); |
| 126 scoped_ptr<Window> w111(CreateWindow(111, w11.get(), NULL)); | 127 scoped_ptr<Window> w111(CreateWindow(111, w11.get(), NULL)); |
| 127 TestEventFilterWindowDelegate* d1111 = new TestEventFilterWindowDelegate; | 128 TestEventFilterWindowDelegate d1111; |
| 128 scoped_ptr<Window> w1111(CreateWindow(1111, w111.get(), d1111)); | 129 scoped_ptr<Window> w1111(CreateWindow(1111, w111.get(), &d1111)); |
| 129 | 130 |
| 130 test::TestEventFilter* root_window_filter = new test::TestEventFilter; | 131 test::TestEventFilter* root_window_filter = new test::TestEventFilter; |
| 131 test::TestEventFilter* w1_filter = new test::TestEventFilter; | 132 test::TestEventFilter* w1_filter = new test::TestEventFilter; |
| 132 test::TestEventFilter* w111_filter = new test::TestEventFilter; | 133 test::TestEventFilter* w111_filter = new test::TestEventFilter; |
| 133 root_window()->SetEventFilter(root_window_filter); | 134 root_window()->SetEventFilter(root_window_filter); |
| 134 w1->SetEventFilter(w1_filter); | 135 w1->SetEventFilter(w1_filter); |
| 135 w111->SetEventFilter(w111_filter); | 136 w111->SetEventFilter(w111_filter); |
| 136 | 137 |
| 137 w1111->GetFocusManager()->SetFocusedWindow(w1111.get(), NULL); | 138 w1111->GetFocusManager()->SetFocusedWindow(w1111.get(), NULL); |
| 138 | 139 |
| 139 // To start with, no one is going to consume any events. All three filters | 140 // To start with, no one is going to consume any events. All three filters |
| 140 // and the w1111's delegate should receive the event. | 141 // and the w1111's delegate should receive the event. |
| 141 test::EventGenerator generator(root_window(), w1111.get()); | 142 test::EventGenerator generator(root_window(), w1111.get()); |
| 142 generator.PressLeftButton(); | 143 generator.PressLeftButton(); |
| 143 ui::KeyEvent key_event(ui::ET_KEY_PRESSED, ui::VKEY_A, 0); | 144 ui::KeyEvent key_event(ui::ET_KEY_PRESSED, ui::VKEY_A, 0); |
| 144 root_window()->AsRootWindowHostDelegate()->OnHostKeyEvent(&key_event); | 145 root_window()->AsRootWindowHostDelegate()->OnHostKeyEvent(&key_event); |
| 145 | 146 |
| 146 // TODO(sadrul): TouchEvent! | 147 // TODO(sadrul): TouchEvent! |
| 147 EXPECT_EQ(1, root_window_filter->key_event_count()); | 148 EXPECT_EQ(1, root_window_filter->key_event_count()); |
| 148 EXPECT_EQ(1, w1_filter->key_event_count()); | 149 EXPECT_EQ(1, w1_filter->key_event_count()); |
| 149 EXPECT_EQ(1, w111_filter->key_event_count()); | 150 EXPECT_EQ(1, w111_filter->key_event_count()); |
| 150 EXPECT_EQ(1, d1111->key_event_count()); | 151 EXPECT_EQ(1, d1111.key_event_count()); |
| 151 EXPECT_EQ(1, root_window_filter->mouse_event_count()); | 152 EXPECT_EQ(1, root_window_filter->mouse_event_count()); |
| 152 EXPECT_EQ(1, w1_filter->mouse_event_count()); | 153 EXPECT_EQ(1, w1_filter->mouse_event_count()); |
| 153 EXPECT_EQ(1, w111_filter->mouse_event_count()); | 154 EXPECT_EQ(1, w111_filter->mouse_event_count()); |
| 154 EXPECT_EQ(1, d1111->mouse_event_count()); | 155 EXPECT_EQ(1, d1111.mouse_event_count()); |
| 155 EXPECT_EQ(0, root_window_filter->touch_event_count()); | 156 EXPECT_EQ(0, root_window_filter->touch_event_count()); |
| 156 EXPECT_EQ(0, w1_filter->touch_event_count()); | 157 EXPECT_EQ(0, w1_filter->touch_event_count()); |
| 157 EXPECT_EQ(0, w111_filter->touch_event_count()); | 158 EXPECT_EQ(0, w111_filter->touch_event_count()); |
| 158 EXPECT_EQ(0, d1111->touch_event_count()); | 159 EXPECT_EQ(0, d1111.touch_event_count()); |
| 159 | 160 |
| 160 d1111->ResetCounts(); | 161 d1111.ResetCounts(); |
| 161 root_window_filter->ResetCounts(); | 162 root_window_filter->ResetCounts(); |
| 162 w1_filter->ResetCounts(); | 163 w1_filter->ResetCounts(); |
| 163 w111_filter->ResetCounts(); | 164 w111_filter->ResetCounts(); |
| 164 | 165 |
| 165 // Now make w1's EF consume the event. | 166 // Now make w1's EF consume the event. |
| 166 w1_filter->set_key_event_handling_result(ui::ER_CONSUMED); | 167 w1_filter->set_key_event_handling_result(ui::ER_CONSUMED); |
| 167 w1_filter->set_mouse_event_handling_result(ui::ER_CONSUMED); | 168 w1_filter->set_mouse_event_handling_result(ui::ER_CONSUMED); |
| 168 | 169 |
| 169 generator.ReleaseLeftButton(); | 170 generator.ReleaseLeftButton(); |
| 170 root_window()->AsRootWindowHostDelegate()->OnHostKeyEvent(&key_event); | 171 root_window()->AsRootWindowHostDelegate()->OnHostKeyEvent(&key_event); |
| 171 | 172 |
| 172 // TODO(sadrul): TouchEvent/GestureEvent! | 173 // TODO(sadrul): TouchEvent/GestureEvent! |
| 173 EXPECT_EQ(1, root_window_filter->key_event_count()); | 174 EXPECT_EQ(1, root_window_filter->key_event_count()); |
| 174 EXPECT_EQ(1, w1_filter->key_event_count()); | 175 EXPECT_EQ(1, w1_filter->key_event_count()); |
| 175 EXPECT_EQ(0, w111_filter->key_event_count()); | 176 EXPECT_EQ(0, w111_filter->key_event_count()); |
| 176 EXPECT_EQ(0, d1111->key_event_count()); | 177 EXPECT_EQ(0, d1111.key_event_count()); |
| 177 EXPECT_EQ(1, root_window_filter->mouse_event_count()); | 178 EXPECT_EQ(1, root_window_filter->mouse_event_count()); |
| 178 EXPECT_EQ(1, w1_filter->mouse_event_count()); | 179 EXPECT_EQ(1, w1_filter->mouse_event_count()); |
| 179 EXPECT_EQ(0, w111_filter->mouse_event_count()); | 180 EXPECT_EQ(0, w111_filter->mouse_event_count()); |
| 180 EXPECT_EQ(0, d1111->mouse_event_count()); | 181 EXPECT_EQ(0, d1111.mouse_event_count()); |
| 181 EXPECT_EQ(0, root_window_filter->touch_event_count()); | 182 EXPECT_EQ(0, root_window_filter->touch_event_count()); |
| 182 EXPECT_EQ(0, w1_filter->touch_event_count()); | 183 EXPECT_EQ(0, w1_filter->touch_event_count()); |
| 183 EXPECT_EQ(0, w111_filter->touch_event_count()); | 184 EXPECT_EQ(0, w111_filter->touch_event_count()); |
| 184 EXPECT_EQ(0, d1111->touch_event_count()); | 185 EXPECT_EQ(0, d1111.touch_event_count()); |
| 185 } | 186 } |
| 186 | 187 |
| 187 // Tests PostHandle* methods for this hierarchy: | 188 // Tests PostHandle* methods for this hierarchy: |
| 188 // RootWindow | 189 // RootWindow |
| 189 // w1 (EF) | 190 // w1 (EF) |
| 190 // w11 <-- target window | 191 // w11 <-- target window |
| 191 TEST_F(EventFilterTest, PostHandle) { | 192 TEST_F(EventFilterTest, PostHandle) { |
| 192 scoped_ptr<Window> w1(CreateWindow(1, root_window(), NULL)); | 193 scoped_ptr<Window> w1(CreateWindow(1, root_window(), NULL)); |
| 193 TestEventFilterWindowDelegate* d11 = new TestEventFilterWindowDelegate; | 194 TestEventFilterWindowDelegate d11; |
| 194 scoped_ptr<Window> w11(CreateWindow(11, w1.get(), d11)); | 195 scoped_ptr<Window> w11(CreateWindow(11, w1.get(), &d11)); |
| 195 | 196 |
| 196 test::TestEventFilter* root_window_filter = new test::TestEventFilter; | 197 test::TestEventFilter root_window_filter; |
| 197 test::TestEventFilter* w1_filter = new test::TestEventFilter; | 198 test::TestEventFilter* w1_filter = new test::TestEventFilter; |
| 198 root_window()->AddPostTargetHandler(root_window_filter); | 199 root_window()->AddPostTargetHandler(&root_window_filter); |
| 199 w1->AddPostTargetHandler(w1_filter); | 200 w1->AddPostTargetHandler(w1_filter); |
| 200 | 201 |
| 201 w1->GetFocusManager()->SetFocusedWindow(w11.get(), NULL); | 202 w1->GetFocusManager()->SetFocusedWindow(w11.get(), NULL); |
| 202 | 203 |
| 203 // TODO(sadrul): TouchEvent/GestureEvent! | 204 // TODO(sadrul): TouchEvent/GestureEvent! |
| 204 | 205 |
| 205 // To start with, no one is going to consume any events. The post- | 206 // To start with, no one is going to consume any events. The post- |
| 206 // event filters and w11's delegate will be notified. | 207 // event filters and w11's delegate will be notified. |
| 207 test::EventGenerator generator(root_window(), w11.get()); | 208 test::EventGenerator generator(root_window(), w11.get()); |
| 208 | 209 |
| 209 d11->set_key_event_handling_result(ui::ER_UNHANDLED); | 210 d11.set_key_event_handling_result(ui::ER_UNHANDLED); |
| 210 d11->set_mouse_event_handling_result(ui::ER_UNHANDLED); | 211 d11.set_mouse_event_handling_result(ui::ER_UNHANDLED); |
| 211 d11->set_consumes_touch_events(false); | 212 d11.set_consumes_touch_events(false); |
| 212 | 213 |
| 213 generator.PressKey(ui::VKEY_A, 0); | 214 generator.PressKey(ui::VKEY_A, 0); |
| 214 generator.PressLeftButton(); | 215 generator.PressLeftButton(); |
| 215 | 216 |
| 216 EXPECT_EQ(1, w1_filter->key_event_count()); | 217 EXPECT_EQ(1, w1_filter->key_event_count()); |
| 217 EXPECT_EQ(1, w1_filter->mouse_event_count()); | 218 EXPECT_EQ(1, w1_filter->mouse_event_count()); |
| 218 EXPECT_EQ(1, root_window_filter->mouse_event_count()); | 219 EXPECT_EQ(1, root_window_filter.mouse_event_count()); |
| 219 EXPECT_EQ(1, d11->key_event_count()); | 220 EXPECT_EQ(1, d11.key_event_count()); |
| 220 EXPECT_EQ(1, d11->mouse_event_count()); | 221 EXPECT_EQ(1, d11.mouse_event_count()); |
| 221 | 222 |
| 222 root_window_filter->ResetCounts(); | 223 root_window_filter.ResetCounts(); |
| 223 w1_filter->ResetCounts(); | 224 w1_filter->ResetCounts(); |
| 224 d11->ResetCounts(); | 225 d11.ResetCounts(); |
| 225 generator.set_flags(0); | 226 generator.set_flags(0); |
| 226 | 227 |
| 227 // Let |w1_filter| handle (but not consume) an event. The root-window's | 228 // Let |w1_filter| handle (but not consume) an event. The root-window's |
| 228 // post-target filter should still receive the event. | 229 // post-target filter should still receive the event. |
| 229 w1_filter->set_mouse_event_handling_result(ui::ER_HANDLED); | 230 w1_filter->set_mouse_event_handling_result(ui::ER_HANDLED); |
| 230 generator.PressLeftButton(); | 231 generator.PressLeftButton(); |
| 231 EXPECT_EQ(1, d11->mouse_event_count()); | 232 EXPECT_EQ(1, d11.mouse_event_count()); |
| 232 EXPECT_EQ(1, w1_filter->mouse_event_count()); | 233 EXPECT_EQ(1, w1_filter->mouse_event_count()); |
| 233 EXPECT_EQ(1, root_window_filter->mouse_event_count()); | 234 EXPECT_EQ(1, root_window_filter.mouse_event_count()); |
| 234 | 235 |
| 235 root_window_filter->ResetCounts(); | 236 root_window_filter.ResetCounts(); |
| 236 w1_filter->ResetCounts(); | 237 w1_filter->ResetCounts(); |
| 237 d11->ResetCounts(); | 238 d11.ResetCounts(); |
| 238 generator.set_flags(0); | 239 generator.set_flags(0); |
| 239 | 240 |
| 240 // Let |w1_filter| consume an event. So the root-window's post-target | 241 // Let |w1_filter| consume an event. So the root-window's post-target |
| 241 // filter should no longer receive the event. | 242 // filter should no longer receive the event. |
| 242 w1_filter->set_mouse_event_handling_result(ui::ER_CONSUMED); | 243 w1_filter->set_mouse_event_handling_result(ui::ER_CONSUMED); |
| 243 generator.PressLeftButton(); | 244 generator.PressLeftButton(); |
| 244 EXPECT_EQ(1, d11->mouse_event_count()); | 245 EXPECT_EQ(1, d11.mouse_event_count()); |
| 245 EXPECT_EQ(1, w1_filter->mouse_event_count()); | 246 EXPECT_EQ(1, w1_filter->mouse_event_count()); |
| 246 EXPECT_EQ(0, root_window_filter->mouse_event_count()); | 247 EXPECT_EQ(0, root_window_filter.mouse_event_count()); |
| 247 | 248 |
| 248 // Now we'll have the delegate handle the events. | 249 // Now we'll have the delegate handle the events. |
| 249 root_window_filter->ResetCounts(); | 250 root_window_filter.ResetCounts(); |
| 250 w1_filter->ResetCounts(); | 251 w1_filter->ResetCounts(); |
| 251 d11->ResetCounts(); | 252 d11.ResetCounts(); |
| 252 generator.set_flags(0); | 253 generator.set_flags(0); |
| 253 | 254 |
| 254 w1_filter->set_mouse_event_handling_result(ui::ER_UNHANDLED); | 255 w1_filter->set_mouse_event_handling_result(ui::ER_UNHANDLED); |
| 255 d11->set_key_event_handling_result(ui::ER_HANDLED); | 256 d11.set_key_event_handling_result(ui::ER_HANDLED); |
| 256 d11->set_mouse_event_handling_result(ui::ER_HANDLED); | 257 d11.set_mouse_event_handling_result(ui::ER_HANDLED); |
| 257 d11->set_consumes_touch_events(true); | 258 d11.set_consumes_touch_events(true); |
| 258 | 259 |
| 259 generator.PressKey(ui::VKEY_A, 0); | 260 generator.PressKey(ui::VKEY_A, 0); |
| 260 generator.PressLeftButton(); | 261 generator.PressLeftButton(); |
| 261 | 262 |
| 262 EXPECT_EQ(1, d11->key_event_count()); | 263 EXPECT_EQ(1, d11.key_event_count()); |
| 263 EXPECT_EQ(1, d11->mouse_event_count()); | 264 EXPECT_EQ(1, d11.mouse_event_count()); |
| 264 // The delegate processed the event. But it should still bubble up to the | 265 // The delegate processed the event. But it should still bubble up to the |
| 265 // post-target filters. | 266 // post-target filters. |
| 266 EXPECT_EQ(1, w1_filter->key_event_count()); | 267 EXPECT_EQ(1, w1_filter->key_event_count()); |
| 267 EXPECT_EQ(1, root_window_filter->key_event_count()); | 268 EXPECT_EQ(1, root_window_filter.key_event_count()); |
| 268 EXPECT_EQ(1, w1_filter->mouse_event_count()); | 269 EXPECT_EQ(1, w1_filter->mouse_event_count()); |
| 269 EXPECT_EQ(1, root_window_filter->mouse_event_count()); | 270 EXPECT_EQ(1, root_window_filter.mouse_event_count()); |
| 270 | 271 |
| 271 // Now we'll have the delegate consume the events. | 272 // Now we'll have the delegate consume the events. |
| 272 root_window_filter->ResetCounts(); | 273 root_window_filter.ResetCounts(); |
| 273 w1_filter->ResetCounts(); | 274 w1_filter->ResetCounts(); |
| 274 d11->ResetCounts(); | 275 d11.ResetCounts(); |
| 275 generator.set_flags(0); | 276 generator.set_flags(0); |
| 276 | 277 |
| 277 d11->set_key_event_handling_result(ui::ER_CONSUMED); | 278 d11.set_key_event_handling_result(ui::ER_CONSUMED); |
| 278 d11->set_mouse_event_handling_result(ui::ER_CONSUMED); | 279 d11.set_mouse_event_handling_result(ui::ER_CONSUMED); |
| 279 d11->set_consumes_touch_events(true); | 280 d11.set_consumes_touch_events(true); |
| 280 | 281 |
| 281 generator.PressKey(ui::VKEY_A, 0); | 282 generator.PressKey(ui::VKEY_A, 0); |
| 282 generator.PressLeftButton(); | 283 generator.PressLeftButton(); |
| 283 | 284 |
| 284 EXPECT_EQ(1, d11->key_event_count()); | 285 EXPECT_EQ(1, d11.key_event_count()); |
| 285 EXPECT_EQ(1, d11->mouse_event_count()); | 286 EXPECT_EQ(1, d11.mouse_event_count()); |
| 286 // The delegate consumed the event. So it should no longer reach the | 287 // The delegate consumed the event. So it should no longer reach the |
| 287 // post-target filters. | 288 // post-target filters. |
| 288 EXPECT_EQ(0, w1_filter->key_event_count()); | 289 EXPECT_EQ(0, w1_filter->key_event_count()); |
| 289 EXPECT_EQ(0, root_window_filter->key_event_count()); | 290 EXPECT_EQ(0, root_window_filter.key_event_count()); |
| 290 EXPECT_EQ(0, w1_filter->mouse_event_count()); | 291 EXPECT_EQ(0, w1_filter->mouse_event_count()); |
| 291 EXPECT_EQ(0, root_window_filter->mouse_event_count()); | 292 EXPECT_EQ(0, root_window_filter.mouse_event_count()); |
| 292 | 293 |
| 293 // Now we'll have the pre-filter methods consume the events. | 294 // Now we'll have the pre-filter methods consume the events. |
| 294 w1->RemovePostTargetHandler(w1_filter); | 295 w1->RemovePostTargetHandler(w1_filter); |
| 295 w1->SetEventFilter(w1_filter); | 296 w1->SetEventFilter(w1_filter); |
| 296 w1_filter->ResetCounts(); | 297 w1_filter->ResetCounts(); |
| 297 d11->ResetCounts(); | 298 d11.ResetCounts(); |
| 298 generator.set_flags(0); | 299 generator.set_flags(0); |
| 299 | 300 |
| 300 d11->set_key_event_handling_result(ui::ER_UNHANDLED); | 301 d11.set_key_event_handling_result(ui::ER_UNHANDLED); |
| 301 d11->set_mouse_event_handling_result(ui::ER_UNHANDLED); | 302 d11.set_mouse_event_handling_result(ui::ER_UNHANDLED); |
| 302 d11->set_consumes_touch_events(false); | 303 d11.set_consumes_touch_events(false); |
| 303 | 304 |
| 304 w1_filter->set_key_event_handling_result(ui::ER_CONSUMED); | 305 w1_filter->set_key_event_handling_result(ui::ER_CONSUMED); |
| 305 w1_filter->set_mouse_event_handling_result(ui::ER_CONSUMED); | 306 w1_filter->set_mouse_event_handling_result(ui::ER_CONSUMED); |
| 306 w1_filter->set_consumes_touch_events(true); | 307 w1_filter->set_consumes_touch_events(true); |
| 307 | 308 |
| 308 generator.PressKey(ui::VKEY_A, 0); | 309 generator.PressKey(ui::VKEY_A, 0); |
| 309 generator.PressLeftButton(); | 310 generator.PressLeftButton(); |
| 310 | 311 |
| 311 EXPECT_EQ(1, w1_filter->key_event_count()); | 312 EXPECT_EQ(1, w1_filter->key_event_count()); |
| 312 EXPECT_EQ(0, d11->key_event_count()); | 313 EXPECT_EQ(0, d11.key_event_count()); |
| 313 EXPECT_EQ(1, w1_filter->mouse_event_count()); | 314 EXPECT_EQ(1, w1_filter->mouse_event_count()); |
| 314 EXPECT_EQ(0, d11->mouse_event_count()); | 315 EXPECT_EQ(0, d11.mouse_event_count()); |
| 315 } | 316 } |
| 316 | 317 |
| 317 } // namespace aura | 318 } // namespace aura |
| OLD | NEW |