1// Copyright (c) 2011 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.
4
5#include "chrome/browser/ui/cocoa/run_loop_testing.h"
6
7#import <Foundation/Foundation.h>
8
9#include "base/mac/scoped_nsobject.h"
10#include "base/memory/scoped_ptr.h"
11#include "base/message_loop/message_pump_mac.h"
12
13// This class is scheduled with a delayed selector to quit the message pump.
14@interface CocoaQuitTask : NSObject {
15 @private
16  base::MessagePumpNSRunLoop* pump_;
17}
18- (id)initWithMessagePump:(base::MessagePumpNSRunLoop*)pump;
19- (void)doQuit;
20@end
21
22@implementation CocoaQuitTask
23- (id)initWithMessagePump:(base::MessagePumpNSRunLoop*)pump {
24  if ((self = [super init])) {
25    pump_ = pump;
26  }
27  return self;
28}
29
30- (void)doQuit {
31  pump_->Quit();
32}
33@end
34
35////////////////////////////////////////////////////////////////////////////////
36
37namespace chrome {
38namespace testing {
39
40void NSRunLoopRunAllPending() {
41  scoped_ptr<base::MessagePumpNSRunLoop> message_pump(
42      new base::MessagePumpNSRunLoop);
43
44  // Put a delayed selector on the queue. All other pending delayed selectors
45  // will run before this, after which the internal loop can end.
46  base::scoped_nsobject<CocoaQuitTask> quit_task(
47      [[CocoaQuitTask alloc] initWithMessagePump:message_pump.get()]);
48
49  [quit_task performSelector:@selector(doQuit)
50                  withObject:nil
51                  afterDelay:0];
52
53  // Spin the internal loop, running it until the quit task is pumped. Pass NULL
54  // because there is no delegate MessageLoop; only the Cocoa work queues will
55  // be pumped.
56  message_pump->Run(NULL);
57}
58
59}  // namespace testing
60}  // namespace chrome
61