| Index: base/message_loop/message_loop_test.cc
|
| diff --git a/base/message_loop/message_loop_test.cc b/base/message_loop/message_loop_test.cc
|
| index c0e6481c4209b785a9bfee60800b63b5f73080d1..0f1e924518cbdcb78d1bc46924d66dcc874d6139 100644
|
| --- a/base/message_loop/message_loop_test.cc
|
| +++ b/base/message_loop/message_loop_test.cc
|
| @@ -378,6 +378,66 @@ void RunTest_Nesting(MessagePumpFactory factory) {
|
| EXPECT_EQ(depth, 0);
|
| }
|
|
|
| +// A NestingObserver that tracks the number of nested message loop starts it
|
| +// has seen.
|
| +class TestNestingObserver : public MessageLoop::NestingObserver {
|
| + public:
|
| + TestNestingObserver() {}
|
| + ~TestNestingObserver() override {}
|
| +
|
| + int begin_nested_loop_count() const { return begin_nested_loop_count_; }
|
| +
|
| + // MessageLoop::NestingObserver:
|
| + void OnBeginNestedMessageLoop() override { begin_nested_loop_count_++; }
|
| +
|
| + private:
|
| + int begin_nested_loop_count_ = 0;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestNestingObserver);
|
| +};
|
| +
|
| +void ExpectOneBeginNestedLoop(TestNestingObserver* observer) {
|
| + EXPECT_EQ(1, observer->begin_nested_loop_count());
|
| +}
|
| +
|
| +// Starts a nested message loop.
|
| +void RunNestedLoop(TestNestingObserver* observer,
|
| + const Closure& quit_outer_loop) {
|
| + // The nested loop hasn't started yet.
|
| + EXPECT_EQ(0, observer->begin_nested_loop_count());
|
| +
|
| + MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current());
|
| + RunLoop nested_loop;
|
| + // Verify that by the time the first task is run the observer has seen the
|
| + // message loop begin.
|
| + MessageLoop::current()->PostTask(FROM_HERE,
|
| + Bind(&ExpectOneBeginNestedLoop, observer));
|
| + MessageLoop::current()->PostTask(FROM_HERE, nested_loop.QuitClosure());
|
| + nested_loop.Run();
|
| +
|
| + // Quitting message loops doesn't change the begin count.
|
| + EXPECT_EQ(1, observer->begin_nested_loop_count());
|
| +
|
| + quit_outer_loop.Run();
|
| +}
|
| +
|
| +// Tests that a NestingObserver is notified when a nested message loop begins.
|
| +void RunTest_NestingObserver(MessagePumpFactory factory) {
|
| + std::unique_ptr<MessagePump> pump(factory());
|
| + MessageLoop outer_loop(std::move(pump));
|
| +
|
| + // Observe the outer loop for nested message loops beginning.
|
| + TestNestingObserver nesting_observer;
|
| + outer_loop.AddNestingObserver(&nesting_observer);
|
| +
|
| + // Post a task that runs a nested message loop.
|
| + outer_loop.PostTask(FROM_HERE, Bind(&RunNestedLoop, &nesting_observer,
|
| + outer_loop.QuitWhenIdleClosure()));
|
| + outer_loop.Run();
|
| +
|
| + outer_loop.RemoveNestingObserver(&nesting_observer);
|
| +}
|
| +
|
| enum TaskType {
|
| MESSAGEBOX,
|
| ENDDIALOG,
|
|
|