diff options
author | rsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-18 18:36:57 +0000 |
---|---|---|
committer | rsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-18 18:36:57 +0000 |
commit | 0755672a1e8bad7e9efd4b932836ab51a25cca18 (patch) | |
tree | f0a6f0c68c9899e3fe460c870e825ce5e1c1755e /chrome/browser/ui_thread_helpers_mac.mm | |
parent | 9bf103edf104b4e4174a3ba22da9af6816858033 (diff) | |
download | chromium_src-0755672a1e8bad7e9efd4b932836ab51a25cca18.zip chromium_src-0755672a1e8bad7e9efd4b932836ab51a25cca18.tar.gz chromium_src-0755672a1e8bad7e9efd4b932836ab51a25cca18.tar.bz2 |
[Mac] Don't close the Wrench menu after using the zoom buttons if the menu was opened sticky.
This runs the Task that updates the zoom information in the UI thread outside of the
normal MessageLoop and instead runs it on the native run loop.
R=mark
BUG=48679
TEST=Open Wrench menu with a click. Use zoom buttons. Menu stays open and page zooms. Other buttons still close menu.
TEST=Open Wrench menu with click-hold-drag. Hover and release on zoom buttons. Menu closes and page zooms.
Review URL: http://codereview.chromium.org/3183013
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@56566 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/ui_thread_helpers_mac.mm')
-rw-r--r-- | chrome/browser/ui_thread_helpers_mac.mm | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/chrome/browser/ui_thread_helpers_mac.mm b/chrome/browser/ui_thread_helpers_mac.mm new file mode 100644 index 0000000..c6efd3c --- /dev/null +++ b/chrome/browser/ui_thread_helpers_mac.mm @@ -0,0 +1,59 @@ +// 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/scoped_ptr.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 + scoped_ptr<Task> task_; +} +- (id)initWithTask:(Task*)task; +- (void)runTask; +@end + +@implementation UITaskHelperMac +- (id)initWithTask:(Task*)task { + if ((self = [super init])) { + task_.reset(task); + } + return self; +} + +- (void)runTask { + task_->Run(); + [self autorelease]; +} +@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 |