summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-04 21:45:27 +0000
committerrsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-04 21:45:27 +0000
commit0441a657e792402b8dc6675736309b5901603b04 (patch)
tree4855a9aa5acba758da08a0a59170e6149ad1184e
parentf0a9d1b2f35d1a0ae2c532b86fb3fd78b1c5465b (diff)
downloadchromium_src-0441a657e792402b8dc6675736309b5901603b04.zip
chromium_src-0441a657e792402b8dc6675736309b5901603b04.tar.gz
chromium_src-0441a657e792402b8dc6675736309b5901603b04.tar.bz2
[Mac] Apply CrTrackingArea to the two other places where we get |-mouseMoved:| zombie messages.
BUG=48709 TEST=Crash report numbers. Review URL: http://codereview.chromium.org/6612025 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@76976 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.h5
-rw-r--r--chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.mm8
-rw-r--r--chrome/browser/ui/cocoa/toolbar/toolbar_controller.h3
-rw-r--r--chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm4
-rw-r--r--chrome/browser/ui/cocoa/tracking_area.h21
-rw-r--r--chrome/browser/ui/cocoa/tracking_area.mm19
-rw-r--r--chrome/browser/ui/cocoa/tracking_area_unittest.mm28
7 files changed, 79 insertions, 9 deletions
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.h b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.h
index bf7a85a..54b918c 100644
--- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.h
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 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.
@@ -10,6 +10,7 @@
#include "base/scoped_nsobject.h"
#import "chrome/browser/ui/cocoa/bookmarks/bookmark_button.h"
+#import "chrome/browser/ui/cocoa/tracking_area.h"
@class BookmarkBarController;
@class BookmarkBarFolderView;
@@ -118,7 +119,7 @@
BookmarkBarFolderController* folderController_;
// Implement basic menu scrolling through this tracking area.
- scoped_nsobject<NSTrackingArea> scrollTrackingArea_;
+ ScopedCrTrackingArea scrollTrackingArea_;
// Timer to continue scrolling as needed. We own the timer but
// don't release it when done (we invalidate it).
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.mm
index 74a8d22..5f4a182 100644
--- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.mm
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.mm
@@ -959,20 +959,20 @@ struct LayoutMetrics {
- (void)addOrUpdateScrollTracking {
[self removeScrollTracking];
NSView* view = [[self window] contentView];
- scrollTrackingArea_.reset([[NSTrackingArea alloc]
+ scrollTrackingArea_.reset([[CrTrackingArea alloc]
initWithRect:[view bounds]
options:(NSTrackingMouseMoved |
NSTrackingMouseEnteredAndExited |
NSTrackingActiveAlways)
- owner:self
+ proxiedOwner:self
userInfo:nil]);
- [view addTrackingArea:scrollTrackingArea_];
+ [view addTrackingArea:scrollTrackingArea_.get()];
}
// Remove the tracking area associated with scrolling.
- (void)removeScrollTracking {
if (scrollTrackingArea_.get()) {
- [[[self window] contentView] removeTrackingArea:scrollTrackingArea_];
+ [[[self window] contentView] removeTrackingArea:scrollTrackingArea_.get()];
}
scrollTrackingArea_.reset();
}
diff --git a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.h b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.h
index f95a060..1e48658 100644
--- a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.h
+++ b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.h
@@ -11,6 +11,7 @@
#include "base/scoped_ptr.h"
#include "base/scoped_nsobject.h"
#import "chrome/browser/ui/cocoa/command_observer_bridge.h"
+#import "chrome/browser/ui/cocoa/tracking_area.h"
#import "chrome/browser/ui/cocoa/url_drop_target.h"
#import "chrome/browser/ui/cocoa/view_resizer.h"
#include "chrome/browser/prefs/pref_member.h"
@@ -89,7 +90,7 @@ class WrenchMenuModel;
scoped_nsobject<AutocompleteTextField> locationBarRetainer_;
// Tracking area for mouse enter/exit/moved in the toolbar.
- scoped_nsobject<NSTrackingArea> trackingArea_;
+ ScopedCrTrackingArea trackingArea_;
// We retain/release the hover button since interaction with the
// button may make it go away (e.g. delete menu option over a
diff --git a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
index 9e2947e..5828094 100644
--- a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
+++ b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
@@ -286,12 +286,12 @@ class NotificationBridge : public NotificationObserver {
// helps us remember to release it.
locationBarRetainer_.reset([locationBar_ retain]);
trackingArea_.reset(
- [[NSTrackingArea alloc] initWithRect:NSZeroRect // Ignored
+ [[CrTrackingArea alloc] initWithRect:NSZeroRect // Ignored
options:NSTrackingMouseMoved |
NSTrackingInVisibleRect |
NSTrackingMouseEnteredAndExited |
NSTrackingActiveAlways
- owner:self
+ proxiedOwner:self
userInfo:nil]);
NSView* toolbarView = [self view];
[toolbarView addTrackingArea:trackingArea_.get()];
diff --git a/chrome/browser/ui/cocoa/tracking_area.h b/chrome/browser/ui/cocoa/tracking_area.h
index c12c2fd..f63be3a 100644
--- a/chrome/browser/ui/cocoa/tracking_area.h
+++ b/chrome/browser/ui/cocoa/tracking_area.h
@@ -41,4 +41,25 @@
@end
+// Scoper //////////////////////////////////////////////////////////////////////
+
+// Use an instance of this class to call |-clearOwner| on the |tracking_area_|
+// when this goes out of scope.
+class ScopedCrTrackingArea {
+ public:
+ // Takes ownership of |tracking_area| without retaining it.
+ explicit ScopedCrTrackingArea(CrTrackingArea* tracking_area = nil);
+ ~ScopedCrTrackingArea();
+
+ // This will call |scoped_nsobject<>::reset()| to take ownership of the new
+ // tracking area.
+ void reset(CrTrackingArea* tracking_area = nil);
+
+ CrTrackingArea* get() const;
+
+ private:
+ scoped_nsobject<CrTrackingArea> tracking_area_;
+ DISALLOW_COPY_AND_ASSIGN(ScopedCrTrackingArea);
+};
+
#endif // CHROME_BROWSER_UI_COCOA_TRACKING_AREA_H_
diff --git a/chrome/browser/ui/cocoa/tracking_area.mm b/chrome/browser/ui/cocoa/tracking_area.mm
index cd3e9ed..ac638b8 100644
--- a/chrome/browser/ui/cocoa/tracking_area.mm
+++ b/chrome/browser/ui/cocoa/tracking_area.mm
@@ -92,6 +92,7 @@
}
- (void)dealloc {
+ [self clearOwner];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
@@ -114,3 +115,21 @@
}
@end
+
+// Scoper //////////////////////////////////////////////////////////////////////
+
+ScopedCrTrackingArea::ScopedCrTrackingArea(CrTrackingArea* tracking_area)
+ : tracking_area_(tracking_area) {
+}
+
+ScopedCrTrackingArea::~ScopedCrTrackingArea() {
+ [tracking_area_ clearOwner];
+}
+
+void ScopedCrTrackingArea::reset(CrTrackingArea* tracking_area) {
+ tracking_area_.reset(tracking_area);
+}
+
+CrTrackingArea* ScopedCrTrackingArea::get() const {
+ return tracking_area_.get();
+}
diff --git a/chrome/browser/ui/cocoa/tracking_area_unittest.mm b/chrome/browser/ui/cocoa/tracking_area_unittest.mm
index 2ff125d..a812f46 100644
--- a/chrome/browser/ui/cocoa/tracking_area_unittest.mm
+++ b/chrome/browser/ui/cocoa/tracking_area_unittest.mm
@@ -84,3 +84,31 @@ TEST_F(CrTrackingAreaTest, ZombieOwner) {
ObjcEvilDoers::ZombieDisable();
}
+
+TEST_F(CrTrackingAreaTest, ScoperInit) {
+ {
+ ScopedCrTrackingArea scoper([trackingArea_ retain]);
+ [[scoper.get() owner] performMessage];
+ EXPECT_EQ(1U, [owner_ messageCount]);
+ }
+
+ [[trackingArea_ owner] performMessage];
+ EXPECT_EQ(1U, [owner_ messageCount]);
+}
+
+TEST_F(CrTrackingAreaTest, ScoperReset) {
+ {
+ ScopedCrTrackingArea scoper;
+ EXPECT_FALSE(scoper.get());
+
+ scoper.reset([trackingArea_ retain]);
+ [[scoper.get() owner] performMessage];
+ EXPECT_EQ(1U, [owner_ messageCount]);
+
+ [[scoper.get() owner] performMessage];
+ EXPECT_EQ(2U, [owner_ messageCount]);
+ }
+
+ [[trackingArea_ owner] performMessage];
+ EXPECT_EQ(2U, [owner_ messageCount]);
+}