| Index: chrome/browser/ui_thread_helpers_mac.mm
 | 
| diff --git a/chrome/browser/ui_thread_helpers_mac.mm b/chrome/browser/ui_thread_helpers_mac.mm
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..d9adc03f9504c7c55b72faeb29989007d04ec305
 | 
| --- /dev/null
 | 
| +++ b/chrome/browser/ui_thread_helpers_mac.mm
 | 
| @@ -0,0 +1,63 @@
 | 
| +// Copyright (c) 2010 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_thread_helpers.h"
 | 
| +
 | 
| +#import <Cocoa/Cocoa.h>
 | 
| +
 | 
| +#include "base/task.h"
 | 
| +#include "chrome/browser/chrome_thread.h"
 | 
| +
 | 
| +// This is a wrapper for running Chrome Task objects from within a native run
 | 
| +// loop.  A typical use case is when Chrome work needs to get done but the main
 | 
| +// message loop is blocked by a nested run loop (like an event tracking one).
 | 
| +// This can run specific tasks in that nested loop.  This owns the task and will
 | 
| +// delete it and itself when done.
 | 
| +@interface UITaskHelperMac : NSObject {
 | 
| + @private
 | 
| +  Task* task_;
 | 
| +}
 | 
| +- (id)initWithTask:(Task*)task;
 | 
| +- (void)runTask;
 | 
| +@end
 | 
| +
 | 
| +@implementation UITaskHelperMac
 | 
| +- (id)initWithTask:(Task*)task {
 | 
| +  if ((self = [super init])) {
 | 
| +    task_ = task;
 | 
| +  }
 | 
| +  return self;
 | 
| +}
 | 
| +
 | 
| +- (void)runTask {
 | 
| +  task_->Run();
 | 
| +  [self autorelease];
 | 
| +}
 | 
| +
 | 
| +- (void)dealloc {
 | 
| +  delete task_;
 | 
| +  [super dealloc];
 | 
| +}
 | 
| +@end
 | 
| +
 | 
| +namespace ui_thread_helpers {
 | 
| +
 | 
| +bool PostTaskWhileRunningMenu(const tracked_objects::Location& from_here,
 | 
| +                              Task* task) {
 | 
| +  // This deletes itself and the task after the task runs.
 | 
| +  UITaskHelperMac* runner = [[UITaskHelperMac alloc] initWithTask:task];
 | 
| +
 | 
| +  // Schedule the selector in multiple modes in case this was called while a
 | 
| +  // menu was not running.
 | 
| +  NSArray* modes = [NSArray arrayWithObjects:NSEventTrackingRunLoopMode,
 | 
| +                                             NSDefaultRunLoopMode,
 | 
| +                                             nil];
 | 
| +  [runner performSelectorOnMainThread:@selector(runTask)
 | 
| +                           withObject:nil
 | 
| +                        waitUntilDone:NO
 | 
| +                                modes:modes];
 | 
| +  return true;
 | 
| +}
 | 
| +
 | 
| +}  // namespace ui_thread_helpers
 | 
| 
 |