summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa/base_view.mm
diff options
context:
space:
mode:
authorstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-29 18:15:33 +0000
committerstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-29 18:15:33 +0000
commitb49ec50466482cdc03d827d6fd53485a3efffd7b (patch)
treebcda012b66d8bb2a4a3399f6848c03b6ac050e4a /chrome/browser/cocoa/base_view.mm
parentc586d02075ee5e4e1d82516a96dd14e2948ce842 (diff)
downloadchromium_src-b49ec50466482cdc03d827d6fd53485a3efffd7b.zip
chromium_src-b49ec50466482cdc03d827d6fd53485a3efffd7b.tar.gz
chromium_src-b49ec50466482cdc03d827d6fd53485a3efffd7b.tar.bz2
Enable mouse enter/exit events for the content area on Mac
Fixes mouse-exit events for plugins touching the edge of the content area; likely also fixes similar bugs in HTML. BUG=33100 TEST=Plugins should receive mouse exit events on edges touching the content area edge. Review URL: http://codereview.chromium.org/1774014 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@45962 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa/base_view.mm')
-rw-r--r--chrome/browser/cocoa/base_view.mm31
1 files changed, 31 insertions, 0 deletions
diff --git a/chrome/browser/cocoa/base_view.mm b/chrome/browser/cocoa/base_view.mm
index e5ed3a2..cee8951 100644
--- a/chrome/browser/cocoa/base_view.mm
+++ b/chrome/browser/cocoa/base_view.mm
@@ -12,6 +12,7 @@
trackingArea_ =
[[NSTrackingArea alloc] initWithRect:frame
options:NSTrackingMouseMoved |
+ NSTrackingMouseEnteredAndExited |
NSTrackingActiveInActiveApp |
NSTrackingInVisibleRect
owner:self
@@ -37,6 +38,7 @@
}
- (void)mouseDown:(NSEvent *)theEvent {
+ dragging_ = YES;
[self mouseEvent:theEvent];
}
@@ -50,6 +52,22 @@
- (void)mouseUp:(NSEvent *)theEvent {
[self mouseEvent:theEvent];
+
+ dragging_ = NO;
+ if (pendingExitEvent_.get()) {
+ NSEvent* exitEvent =
+ [NSEvent enterExitEventWithType:NSMouseExited
+ location:[theEvent locationInWindow]
+ modifierFlags:[theEvent modifierFlags]
+ timestamp:[theEvent timestamp]
+ windowNumber:[theEvent windowNumber]
+ context:[theEvent context]
+ eventNumber:[pendingExitEvent_.get() eventNumber]
+ trackingNumber:[pendingExitEvent_.get() trackingNumber]
+ userData:[pendingExitEvent_.get() userData]];
+ [self mouseEvent:exitEvent];
+ pendingExitEvent_.reset();
+ }
}
- (void)rightMouseUp:(NSEvent *)theEvent {
@@ -77,10 +95,23 @@
}
- (void)mouseEntered:(NSEvent *)theEvent {
+ if (pendingExitEvent_.get()) {
+ pendingExitEvent_.reset();
+ return;
+ }
+
[self mouseEvent:theEvent];
}
- (void)mouseExited:(NSEvent *)theEvent {
+ // The tracking area will send an exit event even during a drag, which isn't
+ // how the event flow for drags should work. This stores the exit event, and
+ // sends it when the drag completes instead.
+ if (dragging_) {
+ pendingExitEvent_.reset([theEvent retain]);
+ return;
+ }
+
[self mouseEvent:theEvent];
}