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 61