| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ui/cocoa/run_loop_testing.h" |
| |
| #import <Foundation/Foundation.h> |
| |
| #include "base/mac/scoped_nsobject.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/message_loop/message_pump_mac.h" |
| |
| // This class is scheduled with a delayed selector to quit the message pump. |
| @interface CocoaQuitTask : NSObject { |
| @private |
| base::MessagePumpNSRunLoop* pump_; |
| } |
| - (id)initWithMessagePump:(base::MessagePumpNSRunLoop*)pump; |
| - (void)doQuit; |
| @end |
| |
| @implementation CocoaQuitTask |
| - (id)initWithMessagePump:(base::MessagePumpNSRunLoop*)pump { |
| if ((self = [super init])) { |
| pump_ = pump; |
| } |
| return self; |
| } |
| |
| - (void)doQuit { |
| pump_->Quit(); |
| } |
| @end |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| namespace chrome { |
| namespace testing { |
| |
| void NSRunLoopRunAllPending() { |
| scoped_ptr<base::MessagePumpNSRunLoop> message_pump( |
| new base::MessagePumpNSRunLoop); |
| |
| // Put a delayed selector on the queue. All other pending delayed selectors |
| // will run before this, after which the internal loop can end. |
| base::scoped_nsobject<CocoaQuitTask> quit_task( |
| [[CocoaQuitTask alloc] initWithMessagePump:message_pump.get()]); |
| |
| [quit_task performSelector:@selector(doQuit) |
| withObject:nil |
| afterDelay:0]; |
| |
| // Spin the internal loop, running it until the quit task is pumped. Pass NULL |
| // because there is no delegate MessageLoop; only the Cocoa work queues will |
| // be pumped. |
| message_pump->Run(NULL); |
| } |
| |
| } // namespace testing |
| } // namespace chrome |