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