| 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
|
|
|