diff options
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]); +} |