1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/events/platform/platform_event_source.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/memory/scoped_vector.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/run_loop.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 #include "ui/events/platform/platform_event_dispatcher.h"
14 #include "ui/events/platform/platform_event_observer.h"
15 #include "ui/events/platform/scoped_event_dispatcher.h"
21 scoped_ptr
<PlatformEvent
> CreatePlatformEvent() {
22 scoped_ptr
<PlatformEvent
> event(new PlatformEvent());
23 memset(event
.get(), 0, sizeof(PlatformEvent
));
28 void DestroyScopedPtr(scoped_ptr
<T
> object
) {}
30 void RemoveDispatcher(PlatformEventDispatcher
* dispatcher
) {
31 PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(dispatcher
);
34 void RemoveDispatchers(PlatformEventDispatcher
* first
,
35 PlatformEventDispatcher
* second
) {
36 PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(first
);
37 PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(second
);
40 void AddDispatcher(PlatformEventDispatcher
* dispatcher
) {
41 PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(dispatcher
);
46 class TestPlatformEventSource
: public PlatformEventSource
{
48 TestPlatformEventSource()
49 : stop_stream_(false) {
51 virtual ~TestPlatformEventSource() {}
53 uint32_t Dispatch(const PlatformEvent
& event
) { return DispatchEvent(event
); }
55 // Dispatches the stream of events, and returns the number of events that are
56 // dispatched before it is requested to stop.
57 size_t DispatchEventStream(const ScopedVector
<PlatformEvent
>& events
) {
59 for (size_t count
= 0; count
< events
.size(); ++count
) {
60 DispatchEvent(*events
[count
]);
67 // PlatformEventSource:
68 virtual void StopCurrentEventStream() override
{
74 DISALLOW_COPY_AND_ASSIGN(TestPlatformEventSource
);
77 class TestPlatformEventDispatcher
: public PlatformEventDispatcher
{
79 TestPlatformEventDispatcher(int id
, std::vector
<int>* list
)
82 post_dispatch_action_(POST_DISPATCH_NONE
),
84 PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
86 virtual ~TestPlatformEventDispatcher() {
87 PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
90 void set_post_dispatch_action(uint32_t action
) {
91 post_dispatch_action_
= action
;
95 // PlatformEventDispatcher:
96 virtual bool CanDispatchEvent(const PlatformEvent
& event
) override
{
100 virtual uint32_t DispatchEvent(const PlatformEvent
& event
) override
{
101 list_
->push_back(id_
);
102 return post_dispatch_action_
;
107 std::vector
<int>* list_
;
108 uint32_t post_dispatch_action_
;
111 DISALLOW_COPY_AND_ASSIGN(TestPlatformEventDispatcher
);
114 class TestPlatformEventObserver
: public PlatformEventObserver
{
116 TestPlatformEventObserver(int id
, std::vector
<int>* list
)
117 : id_(id
), list_(list
) {
118 PlatformEventSource::GetInstance()->AddPlatformEventObserver(this);
120 virtual ~TestPlatformEventObserver() {
121 PlatformEventSource::GetInstance()->RemovePlatformEventObserver(this);
125 // PlatformEventObserver:
126 virtual void WillProcessEvent(const PlatformEvent
& event
) override
{
127 list_
->push_back(id_
);
130 virtual void DidProcessEvent(const PlatformEvent
& event
) override
{}
134 std::vector
<int>* list_
;
136 DISALLOW_COPY_AND_ASSIGN(TestPlatformEventObserver
);
139 class PlatformEventTest
: public testing::Test
{
141 PlatformEventTest() {}
142 virtual ~PlatformEventTest() {}
144 TestPlatformEventSource
* source() { return source_
.get(); }
148 virtual void SetUp() override
{
149 source_
.reset(new TestPlatformEventSource());
153 scoped_ptr
<TestPlatformEventSource
> source_
;
155 DISALLOW_COPY_AND_ASSIGN(PlatformEventTest
);
158 // Tests that a dispatcher receives an event.
159 TEST_F(PlatformEventTest
, DispatcherBasic
) {
160 std::vector
<int> list_dispatcher
;
161 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
162 source()->Dispatch(*event
);
163 EXPECT_EQ(0u, list_dispatcher
.size());
165 TestPlatformEventDispatcher
dispatcher(1, &list_dispatcher
);
167 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
168 source()->Dispatch(*event
);
169 ASSERT_EQ(1u, list_dispatcher
.size());
170 EXPECT_EQ(1, list_dispatcher
[0]);
173 list_dispatcher
.clear();
174 event
= CreatePlatformEvent();
175 source()->Dispatch(*event
);
176 EXPECT_EQ(0u, list_dispatcher
.size());
179 // Tests that dispatchers receive events in the correct order.
180 TEST_F(PlatformEventTest
, DispatcherOrder
) {
181 std::vector
<int> list_dispatcher
;
182 int sequence
[] = {21, 3, 6, 45};
183 ScopedVector
<TestPlatformEventDispatcher
> dispatchers
;
184 for (size_t i
= 0; i
< arraysize(sequence
); ++i
) {
185 dispatchers
.push_back(
186 new TestPlatformEventDispatcher(sequence
[i
], &list_dispatcher
));
188 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
189 source()->Dispatch(*event
);
190 ASSERT_EQ(arraysize(sequence
), list_dispatcher
.size());
191 EXPECT_EQ(std::vector
<int>(sequence
, sequence
+ arraysize(sequence
)),
195 // Tests that if a dispatcher consumes the event, the subsequent dispatchers do
196 // not receive the event.
197 TEST_F(PlatformEventTest
, DispatcherConsumesEventToStopDispatch
) {
198 std::vector
<int> list_dispatcher
;
199 TestPlatformEventDispatcher
first(12, &list_dispatcher
);
200 TestPlatformEventDispatcher
second(23, &list_dispatcher
);
202 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
203 source()->Dispatch(*event
);
204 ASSERT_EQ(2u, list_dispatcher
.size());
205 EXPECT_EQ(12, list_dispatcher
[0]);
206 EXPECT_EQ(23, list_dispatcher
[1]);
207 list_dispatcher
.clear();
209 first
.set_post_dispatch_action(POST_DISPATCH_STOP_PROPAGATION
);
210 event
= CreatePlatformEvent();
211 source()->Dispatch(*event
);
212 ASSERT_EQ(1u, list_dispatcher
.size());
213 EXPECT_EQ(12, list_dispatcher
[0]);
216 // Tests that observers receive events.
217 TEST_F(PlatformEventTest
, ObserverBasic
) {
218 std::vector
<int> list_observer
;
219 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
220 source()->Dispatch(*event
);
221 EXPECT_EQ(0u, list_observer
.size());
223 TestPlatformEventObserver
observer(31, &list_observer
);
225 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
226 source()->Dispatch(*event
);
227 ASSERT_EQ(1u, list_observer
.size());
228 EXPECT_EQ(31, list_observer
[0]);
231 list_observer
.clear();
232 event
= CreatePlatformEvent();
233 source()->Dispatch(*event
);
234 EXPECT_EQ(0u, list_observer
.size());
237 // Tests that observers receive events in the correct order.
238 TEST_F(PlatformEventTest
, ObserverOrder
) {
239 std::vector
<int> list_observer
;
240 const int sequence
[] = {21, 3, 6, 45};
241 ScopedVector
<TestPlatformEventObserver
> observers
;
242 for (size_t i
= 0; i
< arraysize(sequence
); ++i
) {
244 new TestPlatformEventObserver(sequence
[i
], &list_observer
));
246 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
247 source()->Dispatch(*event
);
248 ASSERT_EQ(arraysize(sequence
), list_observer
.size());
249 EXPECT_EQ(std::vector
<int>(sequence
, sequence
+ arraysize(sequence
)),
253 // Tests that observers and dispatchers receive events in the correct order.
254 TEST_F(PlatformEventTest
, DispatcherAndObserverOrder
) {
255 std::vector
<int> list
;
256 TestPlatformEventDispatcher
first_d(12, &list
);
257 TestPlatformEventObserver
first_o(10, &list
);
258 TestPlatformEventDispatcher
second_d(23, &list
);
259 TestPlatformEventObserver
second_o(20, &list
);
260 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
261 source()->Dispatch(*event
);
262 const int expected
[] = {10, 20, 12, 23};
263 EXPECT_EQ(std::vector
<int>(expected
, expected
+ arraysize(expected
)), list
);
266 // Tests that an overridden dispatcher receives events before the default
268 TEST_F(PlatformEventTest
, OverriddenDispatcherBasic
) {
269 std::vector
<int> list
;
270 TestPlatformEventDispatcher
dispatcher(10, &list
);
271 TestPlatformEventObserver
observer(15, &list
);
272 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
273 source()->Dispatch(*event
);
274 ASSERT_EQ(2u, list
.size());
275 EXPECT_EQ(15, list
[0]);
276 EXPECT_EQ(10, list
[1]);
279 TestPlatformEventDispatcher
overriding_dispatcher(20, &list
);
280 source()->RemovePlatformEventDispatcher(&overriding_dispatcher
);
281 scoped_ptr
<ScopedEventDispatcher
> handle
=
282 source()->OverrideDispatcher(&overriding_dispatcher
);
283 source()->Dispatch(*event
);
284 ASSERT_EQ(2u, list
.size());
285 EXPECT_EQ(15, list
[0]);
286 EXPECT_EQ(20, list
[1]);
289 // Tests that an overridden dispatcher can request that the default dispatchers
290 // can dispatch the events.
291 TEST_F(PlatformEventTest
, OverriddenDispatcherInvokeDefaultDispatcher
) {
292 std::vector
<int> list
;
293 TestPlatformEventDispatcher
dispatcher(10, &list
);
294 TestPlatformEventObserver
observer(15, &list
);
295 TestPlatformEventDispatcher
overriding_dispatcher(20, &list
);
296 source()->RemovePlatformEventDispatcher(&overriding_dispatcher
);
297 scoped_ptr
<ScopedEventDispatcher
> handle
=
298 source()->OverrideDispatcher(&overriding_dispatcher
);
299 overriding_dispatcher
.set_post_dispatch_action(POST_DISPATCH_PERFORM_DEFAULT
);
301 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
302 source()->Dispatch(*event
);
303 // First the observer, then the overriding dispatcher, then the default
305 ASSERT_EQ(3u, list
.size());
306 EXPECT_EQ(15, list
[0]);
307 EXPECT_EQ(20, list
[1]);
308 EXPECT_EQ(10, list
[2]);
311 // Install a second overriding dispatcher.
312 TestPlatformEventDispatcher
second_overriding(50, &list
);
313 source()->RemovePlatformEventDispatcher(&second_overriding
);
314 scoped_ptr
<ScopedEventDispatcher
> second_override_handle
=
315 source()->OverrideDispatcher(&second_overriding
);
316 source()->Dispatch(*event
);
317 ASSERT_EQ(2u, list
.size());
318 EXPECT_EQ(15, list
[0]);
319 EXPECT_EQ(50, list
[1]);
322 second_overriding
.set_post_dispatch_action(POST_DISPATCH_PERFORM_DEFAULT
);
323 source()->Dispatch(*event
);
324 // First the observer, then the second overriding dispatcher, then the default
326 ASSERT_EQ(3u, list
.size());
327 EXPECT_EQ(15, list
[0]);
328 EXPECT_EQ(50, list
[1]);
329 EXPECT_EQ(10, list
[2]);
332 // Runs a callback during an event dispatch.
333 class RunCallbackDuringDispatch
: public TestPlatformEventDispatcher
{
335 RunCallbackDuringDispatch(int id
, std::vector
<int>* list
)
336 : TestPlatformEventDispatcher(id
, list
) {}
337 virtual ~RunCallbackDuringDispatch() {}
339 void set_callback(const base::Closure
& callback
) {
340 callback_
= callback
;
344 // PlatformEventDispatcher:
345 virtual uint32_t DispatchEvent(const PlatformEvent
& event
) override
{
346 if (!callback_
.is_null())
348 return TestPlatformEventDispatcher::DispatchEvent(event
);
352 base::Closure callback_
;
354 DISALLOW_COPY_AND_ASSIGN(RunCallbackDuringDispatch
);
357 // Test that if a dispatcher removes another dispatcher that is later in the
358 // dispatcher list during dispatching an event, then event dispatching still
359 // continues correctly.
360 TEST_F(PlatformEventTest
, DispatcherRemovesNextDispatcherDuringDispatch
) {
361 std::vector
<int> list
;
362 TestPlatformEventDispatcher
first(10, &list
);
363 RunCallbackDuringDispatch
second(15, &list
);
364 TestPlatformEventDispatcher
third(20, &list
);
365 TestPlatformEventDispatcher
fourth(30, &list
);
367 second
.set_callback(base::Bind(&RemoveDispatcher
, base::Unretained(&third
)));
369 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
370 source()->Dispatch(*event
);
371 // |second| removes |third| from the dispatcher list during dispatch. So the
372 // event should only reach |first|, |second|, and |fourth|.
373 ASSERT_EQ(3u, list
.size());
374 EXPECT_EQ(10, list
[0]);
375 EXPECT_EQ(15, list
[1]);
376 EXPECT_EQ(30, list
[2]);
379 // Tests that if a dispatcher removes itself from the dispatcher list during
380 // dispatching an event, then event dispatching continues correctly.
381 TEST_F(PlatformEventTest
, DispatcherRemovesSelfDuringDispatch
) {
382 std::vector
<int> list
;
383 TestPlatformEventDispatcher
first(10, &list
);
384 RunCallbackDuringDispatch
second(15, &list
);
385 TestPlatformEventDispatcher
third(20, &list
);
387 second
.set_callback(base::Bind(&RemoveDispatcher
, base::Unretained(&second
)));
389 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
390 source()->Dispatch(*event
);
391 // |second| removes itself from the dispatcher list during dispatch. So the
392 // event should reach all three dispatchers in the list.
393 ASSERT_EQ(3u, list
.size());
394 EXPECT_EQ(10, list
[0]);
395 EXPECT_EQ(15, list
[1]);
396 EXPECT_EQ(20, list
[2]);
399 // Tests that if a dispatcher removes itself from the dispatcher list during
400 // dispatching an event, and this dispatcher is last in the dispatcher-list,
401 // then event dispatching ends correctly.
402 TEST_F(PlatformEventTest
, DispatcherRemovesSelfDuringDispatchLast
) {
403 std::vector
<int> list
;
404 TestPlatformEventDispatcher
first(10, &list
);
405 RunCallbackDuringDispatch
second(15, &list
);
407 second
.set_callback(base::Bind(&RemoveDispatcher
, base::Unretained(&second
)));
409 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
410 source()->Dispatch(*event
);
411 // |second| removes itself during dispatch. So both dispatchers will have
412 // received the event.
413 ASSERT_EQ(2u, list
.size());
414 EXPECT_EQ(10, list
[0]);
415 EXPECT_EQ(15, list
[1]);
418 // Tests that if a dispatcher removes a single dispatcher that comes before it
419 // in the dispatcher list, then dispatch continues correctly.
420 TEST_F(PlatformEventTest
, DispatcherRemovesPrevDispatcherDuringDispatch
) {
421 std::vector
<int> list
;
422 TestPlatformEventDispatcher
first(10, &list
);
423 RunCallbackDuringDispatch
second(15, &list
);
424 TestPlatformEventDispatcher
third(20, &list
);
426 second
.set_callback(base::Bind(&RemoveDispatcher
, base::Unretained(&first
)));
428 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
429 source()->Dispatch(*event
);
430 // |second| removes |first| from the dispatcher list during dispatch. The
431 // event should reach all three dispatchers.
432 ASSERT_EQ(3u, list
.size());
433 EXPECT_EQ(10, list
[0]);
434 EXPECT_EQ(15, list
[1]);
435 EXPECT_EQ(20, list
[2]);
438 // Tests that if a dispatcher removes multiple dispatchers that comes before it
439 // in the dispatcher list, then dispatch continues correctly.
440 TEST_F(PlatformEventTest
, DispatcherRemovesPrevDispatchersDuringDispatch
) {
441 std::vector
<int> list
;
442 TestPlatformEventDispatcher
first(10, &list
);
443 TestPlatformEventDispatcher
second(12, &list
);
444 RunCallbackDuringDispatch
third(15, &list
);
445 TestPlatformEventDispatcher
fourth(20, &list
);
447 third
.set_callback(base::Bind(&RemoveDispatchers
,
448 base::Unretained(&first
),
449 base::Unretained(&second
)));
451 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
452 source()->Dispatch(*event
);
453 // |third| removes |first| and |second| from the dispatcher list during
454 // dispatch. The event should reach all three dispatchers.
455 ASSERT_EQ(4u, list
.size());
456 EXPECT_EQ(10, list
[0]);
457 EXPECT_EQ(12, list
[1]);
458 EXPECT_EQ(15, list
[2]);
459 EXPECT_EQ(20, list
[3]);
462 // Tests that adding a dispatcher during dispatching an event receives that
464 TEST_F(PlatformEventTest
, DispatcherAddedDuringDispatchReceivesEvent
) {
465 std::vector
<int> list
;
466 TestPlatformEventDispatcher
first(10, &list
);
467 RunCallbackDuringDispatch
second(15, &list
);
468 TestPlatformEventDispatcher
third(20, &list
);
469 TestPlatformEventDispatcher
fourth(30, &list
);
470 RemoveDispatchers(&third
, &fourth
);
472 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
473 source()->Dispatch(*event
);
474 ASSERT_EQ(2u, list
.size());
475 EXPECT_EQ(10, list
[0]);
476 EXPECT_EQ(15, list
[1]);
478 second
.set_callback(base::Bind(&AddDispatcher
, base::Unretained(&third
)));
480 source()->Dispatch(*event
);
481 ASSERT_EQ(3u, list
.size());
482 EXPECT_EQ(10, list
[0]);
483 EXPECT_EQ(15, list
[1]);
484 EXPECT_EQ(20, list
[2]);
486 second
.set_callback(base::Bind(&AddDispatcher
, base::Unretained(&fourth
)));
488 source()->Dispatch(*event
);
489 ASSERT_EQ(4u, list
.size());
490 EXPECT_EQ(10, list
[0]);
491 EXPECT_EQ(15, list
[1]);
492 EXPECT_EQ(20, list
[2]);
493 EXPECT_EQ(30, list
[3]);
496 // Provides mechanism for running tests from inside an active message-loop.
497 class PlatformEventTestWithMessageLoop
: public PlatformEventTest
{
499 PlatformEventTestWithMessageLoop() {}
500 virtual ~PlatformEventTestWithMessageLoop() {}
503 message_loop_
.PostTask(
505 base::Bind(&PlatformEventTestWithMessageLoop::RunTest
,
506 base::Unretained(this)));
513 message_loop_
.Quit();
516 virtual void RunTestImpl() = 0;
519 base::MessageLoopForUI message_loop_
;
521 DISALLOW_COPY_AND_ASSIGN(PlatformEventTestWithMessageLoop
);
524 #define RUN_TEST_IN_MESSAGE_LOOP(name) \
525 TEST_F(name, Run) { Run(); }
527 // Tests that a ScopedEventDispatcher restores the previous dispatcher when
529 class ScopedDispatcherRestoresAfterDestroy
530 : public PlatformEventTestWithMessageLoop
{
532 // PlatformEventTestWithMessageLoop:
533 virtual void RunTestImpl() override
{
534 std::vector
<int> list
;
535 TestPlatformEventDispatcher
dispatcher(10, &list
);
536 TestPlatformEventObserver
observer(15, &list
);
538 TestPlatformEventDispatcher
first_overriding(20, &list
);
539 source()->RemovePlatformEventDispatcher(&first_overriding
);
540 scoped_ptr
<ScopedEventDispatcher
> first_override_handle
=
541 source()->OverrideDispatcher(&first_overriding
);
543 // Install a second overriding dispatcher.
544 TestPlatformEventDispatcher
second_overriding(50, &list
);
545 source()->RemovePlatformEventDispatcher(&second_overriding
);
546 scoped_ptr
<ScopedEventDispatcher
> second_override_handle
=
547 source()->OverrideDispatcher(&second_overriding
);
549 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
550 source()->Dispatch(*event
);
551 ASSERT_EQ(2u, list
.size());
552 EXPECT_EQ(15, list
[0]);
553 EXPECT_EQ(50, list
[1]);
556 second_override_handle
.reset();
557 source()->Dispatch(*event
);
558 ASSERT_EQ(2u, list
.size());
559 EXPECT_EQ(15, list
[0]);
560 EXPECT_EQ(20, list
[1]);
564 RUN_TEST_IN_MESSAGE_LOOP(ScopedDispatcherRestoresAfterDestroy
)
566 // This dispatcher destroys the handle to the ScopedEventDispatcher when
567 // dispatching an event.
568 class DestroyScopedHandleDispatcher
: public TestPlatformEventDispatcher
{
570 DestroyScopedHandleDispatcher(int id
, std::vector
<int>* list
)
571 : TestPlatformEventDispatcher(id
, list
) {}
572 virtual ~DestroyScopedHandleDispatcher() {}
574 void SetScopedHandle(scoped_ptr
<ScopedEventDispatcher
> handler
) {
575 handler_
= handler
.Pass();
578 void set_callback(const base::Closure
& callback
) {
579 callback_
= callback
;
583 // PlatformEventDispatcher:
584 virtual bool CanDispatchEvent(const PlatformEvent
& event
) override
{
588 virtual uint32_t DispatchEvent(const PlatformEvent
& event
) override
{
590 uint32_t action
= TestPlatformEventDispatcher::DispatchEvent(event
);
591 if (!callback_
.is_null()) {
593 callback_
= base::Closure();
598 scoped_ptr
<ScopedEventDispatcher
> handler_
;
599 base::Closure callback_
;
601 DISALLOW_COPY_AND_ASSIGN(DestroyScopedHandleDispatcher
);
604 // Tests that resetting an overridden dispatcher causes the nested message-loop
605 // iteration to stop and the rest of the events are dispatched in the next
607 class DestroyedNestedOverriddenDispatcherQuitsNestedLoopIteration
608 : public PlatformEventTestWithMessageLoop
{
610 void NestedTask(std::vector
<int>* list
,
611 TestPlatformEventDispatcher
* dispatcher
) {
612 ScopedVector
<PlatformEvent
> events
;
613 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
614 events
.push_back(event
.release());
615 event
= CreatePlatformEvent();
616 events
.push_back(event
.release());
618 // Attempt to dispatch a couple of events. Dispatching the first event will
619 // have terminated the ScopedEventDispatcher object, which will terminate
620 // the current iteration of the message-loop.
621 size_t count
= source()->DispatchEventStream(events
);
622 EXPECT_EQ(1u, count
);
623 ASSERT_EQ(2u, list
->size());
624 EXPECT_EQ(15, (*list
)[0]);
625 EXPECT_EQ(20, (*list
)[1]);
628 ASSERT_LT(count
, events
.size());
629 events
.erase(events
.begin(), events
.begin() + count
);
631 count
= source()->DispatchEventStream(events
);
632 EXPECT_EQ(1u, count
);
633 ASSERT_EQ(2u, list
->size());
634 EXPECT_EQ(15, (*list
)[0]);
635 EXPECT_EQ(10, (*list
)[1]);
638 // Terminate the message-loop.
639 base::MessageLoopForUI::current()->QuitNow();
642 // PlatformEventTestWithMessageLoop:
643 virtual void RunTestImpl() override
{
644 std::vector
<int> list
;
645 TestPlatformEventDispatcher
dispatcher(10, &list
);
646 TestPlatformEventObserver
observer(15, &list
);
648 DestroyScopedHandleDispatcher
overriding(20, &list
);
649 source()->RemovePlatformEventDispatcher(&overriding
);
650 scoped_ptr
<ScopedEventDispatcher
> override_handle
=
651 source()->OverrideDispatcher(&overriding
);
653 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
654 source()->Dispatch(*event
);
655 ASSERT_EQ(2u, list
.size());
656 EXPECT_EQ(15, list
[0]);
657 EXPECT_EQ(20, list
[1]);
660 overriding
.SetScopedHandle(override_handle
.Pass());
661 base::RunLoop run_loop
;
662 base::MessageLoopForUI
* loop
= base::MessageLoopForUI::current();
663 base::MessageLoopForUI::ScopedNestableTaskAllower
allow_nested(loop
);
667 &DestroyedNestedOverriddenDispatcherQuitsNestedLoopIteration::
669 base::Unretained(this),
670 base::Unretained(&list
),
671 base::Unretained(&overriding
)));
674 // Dispatching the event should now reach the default dispatcher.
675 source()->Dispatch(*event
);
676 ASSERT_EQ(2u, list
.size());
677 EXPECT_EQ(15, list
[0]);
678 EXPECT_EQ(10, list
[1]);
682 RUN_TEST_IN_MESSAGE_LOOP(
683 DestroyedNestedOverriddenDispatcherQuitsNestedLoopIteration
)
685 // Tests that resetting an overridden dispatcher, and installing another
686 // overridden dispatcher before the nested message-loop completely unwinds
687 // function correctly.
688 class ConsecutiveOverriddenDispatcherInTheSameMessageLoopIteration
689 : public PlatformEventTestWithMessageLoop
{
691 void NestedTask(scoped_ptr
<ScopedEventDispatcher
> dispatch_handle
,
692 std::vector
<int>* list
) {
693 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
694 source()->Dispatch(*event
);
695 ASSERT_EQ(2u, list
->size());
696 EXPECT_EQ(15, (*list
)[0]);
697 EXPECT_EQ(20, (*list
)[1]);
700 // Reset the override dispatcher. This should restore the default
702 dispatch_handle
.reset();
703 source()->Dispatch(*event
);
704 ASSERT_EQ(2u, list
->size());
705 EXPECT_EQ(15, (*list
)[0]);
706 EXPECT_EQ(10, (*list
)[1]);
709 // Install another override-dispatcher.
710 DestroyScopedHandleDispatcher
second_overriding(70, list
);
711 source()->RemovePlatformEventDispatcher(&second_overriding
);
712 scoped_ptr
<ScopedEventDispatcher
> second_override_handle
=
713 source()->OverrideDispatcher(&second_overriding
);
715 source()->Dispatch(*event
);
716 ASSERT_EQ(2u, list
->size());
717 EXPECT_EQ(15, (*list
)[0]);
718 EXPECT_EQ(70, (*list
)[1]);
721 second_overriding
.SetScopedHandle(second_override_handle
.Pass());
722 second_overriding
.set_post_dispatch_action(POST_DISPATCH_NONE
);
723 base::RunLoop run_loop
;
724 second_overriding
.set_callback(run_loop
.QuitClosure());
725 base::MessageLoopForUI
* loop
= base::MessageLoopForUI::current();
726 base::MessageLoopForUI::ScopedNestableTaskAllower
allow_nested(loop
);
729 base::Bind(base::IgnoreResult(&TestPlatformEventSource::Dispatch
),
730 base::Unretained(source()),
733 ASSERT_EQ(2u, list
->size());
734 EXPECT_EQ(15, (*list
)[0]);
735 EXPECT_EQ(70, (*list
)[1]);
738 // Terminate the message-loop.
739 base::MessageLoopForUI::current()->QuitNow();
742 // PlatformEventTestWithMessageLoop:
743 virtual void RunTestImpl() override
{
744 std::vector
<int> list
;
745 TestPlatformEventDispatcher
dispatcher(10, &list
);
746 TestPlatformEventObserver
observer(15, &list
);
748 TestPlatformEventDispatcher
overriding(20, &list
);
749 source()->RemovePlatformEventDispatcher(&overriding
);
750 scoped_ptr
<ScopedEventDispatcher
> override_handle
=
751 source()->OverrideDispatcher(&overriding
);
753 scoped_ptr
<PlatformEvent
> event(CreatePlatformEvent());
754 source()->Dispatch(*event
);
755 ASSERT_EQ(2u, list
.size());
756 EXPECT_EQ(15, list
[0]);
757 EXPECT_EQ(20, list
[1]);
760 // Start a nested message-loop, and destroy |override_handle| in the nested
761 // loop. That should terminate the nested loop, restore the previous
762 // dispatchers, and return control to this function.
763 base::RunLoop run_loop
;
764 base::MessageLoopForUI
* loop
= base::MessageLoopForUI::current();
765 base::MessageLoopForUI::ScopedNestableTaskAllower
allow_nested(loop
);
769 &ConsecutiveOverriddenDispatcherInTheSameMessageLoopIteration::
771 base::Unretained(this),
772 base::Passed(&override_handle
),
773 base::Unretained(&list
)));
776 // Dispatching the event should now reach the default dispatcher.
777 source()->Dispatch(*event
);
778 ASSERT_EQ(2u, list
.size());
779 EXPECT_EQ(15, list
[0]);
780 EXPECT_EQ(10, list
[1]);
784 RUN_TEST_IN_MESSAGE_LOOP(
785 ConsecutiveOverriddenDispatcherInTheSameMessageLoopIteration
)