diff options
author | rsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-29 19:54:08 +0000 |
---|---|---|
committer | rsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-29 19:54:08 +0000 |
commit | 69b658508564a113318d473cb396cf7e2aa59081 (patch) | |
tree | a72e30e47dd6ce366dbab303ee6df016dcacd594 /chrome/browser/cocoa | |
parent | d485fa5b5162b4d279d1a8098d16bb45492d9784 (diff) | |
download | chromium_src-69b658508564a113318d473cb396cf7e2aa59081.zip chromium_src-69b658508564a113318d473cb396cf7e2aa59081.tar.gz chromium_src-69b658508564a113318d473cb396cf7e2aa59081.tar.bz2 |
Remove chrome/browser/ui_thread_helpers.h because it's only used on Mac.
Move the Mac implementation to chrome/browser/cocoa/task_helpers.h.
BUG=none
TEST=no change
Review URL: http://codereview.chromium.org/5360005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@67576 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa')
-rw-r--r-- | chrome/browser/cocoa/task_helpers.h | 29 | ||||
-rw-r--r-- | chrome/browser/cocoa/task_helpers.mm | 57 |
2 files changed, 86 insertions, 0 deletions
diff --git a/chrome/browser/cocoa/task_helpers.h b/chrome/browser/cocoa/task_helpers.h new file mode 100644 index 0000000..ecc40f3 --- /dev/null +++ b/chrome/browser/cocoa/task_helpers.h @@ -0,0 +1,29 @@ +// 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. + +#ifndef CHROME_BROWSER_COCOA_TASK_HELPERS_H_ +#define CHROME_BROWSER_COCOA_TASK_HELPERS_H_ +#pragma once + +class Task; + +namespace tracked_objects { +class Location; +} // namespace tracked_objects + +namespace cocoa_utils { + +// This can be used in place of BrowserThread::PostTask(BrowserThread::UI, ...). +// The purpose of this function is to be able to execute Task work alongside +// native work when a MessageLoop is blocked by a nested run loop. This function +// will run the Task in both NSEventTrackingRunLoopMode and NSDefaultRunLoopMode +// for the purpose of executing work while a menu is open. See +// http://crbug.com/48679 for the full rationale. +bool PostTaskInEventTrackingRunLoopMode( + const tracked_objects::Location& from_here, + Task* task); + +} // namespace cocoa_utils + +#endif // CHROME_BROWSER_COCOA_TASK_HELPERS_H_ diff --git a/chrome/browser/cocoa/task_helpers.mm b/chrome/browser/cocoa/task_helpers.mm new file mode 100644 index 0000000..7cc458b --- /dev/null +++ b/chrome/browser/cocoa/task_helpers.mm @@ -0,0 +1,57 @@ +// 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/cocoa/task_helpers.h" + +#import <Cocoa/Cocoa.h> + +#include "base/scoped_ptr.h" +#include "base/task.h" + +// This is a wrapper for running Task objects from within a native run loop. +// This can run specific tasks in that nested loop. This owns the task and will +// delete it and itself when done. +@interface NativeTaskRunner : NSObject { + @private + scoped_ptr<Task> task_; +} +- (id)initWithTask:(Task*)task; +- (void)runTask; +@end + +@implementation NativeTaskRunner +- (id)initWithTask:(Task*)task { + if ((self = [super init])) { + task_.reset(task); + } + return self; +} + +- (void)runTask { + task_->Run(); + [self autorelease]; +} +@end + +namespace cocoa_utils { + +bool PostTaskInEventTrackingRunLoopMode( + const tracked_objects::Location& from_here, + Task* task) { + // This deletes itself and the task after the task runs. + NativeTaskRunner* runner = [[NativeTaskRunner 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 cocoa_utils |