- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / cocoa / run_loop_testing.mm
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
37 namespace chrome {
38 namespace testing {
39
40 void 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