summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa
diff options
context:
space:
mode:
authorrsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-29 19:54:08 +0000
committerrsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-29 19:54:08 +0000
commit69b658508564a113318d473cb396cf7e2aa59081 (patch)
treea72e30e47dd6ce366dbab303ee6df016dcacd594 /chrome/browser/cocoa
parentd485fa5b5162b4d279d1a8098d16bb45492d9784 (diff)
downloadchromium_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.h29
-rw-r--r--chrome/browser/cocoa/task_helpers.mm57
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