diff options
author | rohitrao@chromium.org <rohitrao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-05 16:22:54 +0000 |
---|---|---|
committer | rohitrao@chromium.org <rohitrao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-05 16:22:54 +0000 |
commit | 3264774f72062f95a5328e65efd0dc5075fec691 (patch) | |
tree | 5a168a6eea40a4421873dbdc3fa9bfe530dfc5cf | |
parent | 33f39d5985daafddf49ad68be2e1c4c03baad06c (diff) | |
download | chromium_src-3264774f72062f95a5328e65efd0dc5075fec691.zip chromium_src-3264774f72062f95a5328e65efd0dc5075fec691.tar.gz chromium_src-3264774f72062f95a5328e65efd0dc5075fec691.tar.bz2 |
[Mac] Lock open the fullscreen overlay when browsing bookmark folders.
BUG=37271
TEST=Go fullscreen. Open a folder on the bookmarkbar and hover over one of its subentries. Overlay should not scroll back up.
Review URL: http://codereview.chromium.org/669086
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@40740 0039d316-1c4b-4281-b951-d872f2087c98
5 files changed, 88 insertions, 2 deletions
diff --git a/chrome/browser/cocoa/bookmark_bar_controller.mm b/chrome/browser/cocoa/bookmark_bar_controller.mm index 9bbf8c8..0e96495 100644 --- a/chrome/browser/cocoa/bookmark_bar_controller.mm +++ b/chrome/browser/cocoa/bookmark_bar_controller.mm @@ -25,6 +25,7 @@ #import "chrome/browser/cocoa/bookmark_menu.h" #import "chrome/browser/cocoa/bookmark_menu_cocoa_controller.h" #import "chrome/browser/cocoa/bookmark_name_folder_controller.h" +#import "chrome/browser/cocoa/browser_window_controller.h" #import "chrome/browser/cocoa/event_utils.h" #import "chrome/browser/cocoa/menu_button.h" #import "chrome/browser/cocoa/themed_window.h" @@ -897,6 +898,27 @@ static BOOL ValueInRangeInclusive(CGFloat low, CGFloat value, CGFloat high) { return browser_->profile()->GetThemeProvider(); } +- (void)childFolderWillShow:(id<BookmarkButtonControllerProtocol>)child { + // Lock bar visibility, forcing the overlay to stay open when in fullscreen + // mode. + BrowserWindowController* browserController = + [BrowserWindowController browserWindowControllerForView:[self view]]; + [browserController lockBarVisibilityForOwner:child + withAnimation:NO + delay:NO]; +} + +- (void)childFolderWillClose:(id<BookmarkButtonControllerProtocol>)child { + // Release bar visibility, allowing the overlay to close if in fullscreen + // mode. + BrowserWindowController* browserController = + [BrowserWindowController browserWindowControllerForView:[self view]]; + [browserController releaseBarVisibilityForOwner:child + withAnimation:NO + delay:NO]; +} + + // Enable or disable items. We are the menu delegate for both the bar // and for bookmark folder buttons. - (BOOL)validateUserInterfaceItem:(id)item { diff --git a/chrome/browser/cocoa/bookmark_bar_folder_controller.mm b/chrome/browser/cocoa/bookmark_bar_folder_controller.mm index 7dedb21..f000750c 100644 --- a/chrome/browser/cocoa/bookmark_bar_folder_controller.mm +++ b/chrome/browser/cocoa/bookmark_bar_folder_controller.mm @@ -11,7 +11,7 @@ #import "chrome/browser/cocoa/bookmark_bar_controller.h" // namespace bookmarks #import "chrome/browser/cocoa/bookmark_bar_folder_view.h" #import "chrome/browser/cocoa/bookmark_button_cell.h" - +#import "chrome/browser/cocoa/browser_window_controller.h" @interface BookmarkBarFolderController(Private) - (void)configureWindow; @@ -52,6 +52,13 @@ [super dealloc]; } +// Overriden from NSWindowController to call childFolderWillShow: before showing +// the window. +- (void)showWindow:(id)sender { + [parentController_ childFolderWillShow:self]; + [super showWindow:sender]; +} + // Update theme information for all our buttons. - (void)updateTheme:(ThemeProvider*)themeProvider { if (!themeProvider) @@ -224,6 +231,14 @@ return [parentController_ themeProvider]; } +- (void)childFolderWillShow:(id<BookmarkButtonControllerProtocol>)child { + // Do nothing. +} + +- (void)childFolderWillClose:(id<BookmarkButtonControllerProtocol>)child { + // Do nothing. +} + // Recursively close all bookmark folders. - (void)closeAllBookmarkFolders { // Closing the top level implicitly closes all children. @@ -255,6 +270,7 @@ // Delegate callback. - (void)windowWillClose:(NSNotification*)notification { + [parentController_ childFolderWillClose:self]; [[self parentWindow] removeChildWindow:[self window]]; [self closeBookmarkFolder:self]; [self autorelease]; diff --git a/chrome/browser/cocoa/bookmark_bar_folder_controller_unittest.mm b/chrome/browser/cocoa/bookmark_bar_folder_controller_unittest.mm index 1b94292..59d7465 100644 --- a/chrome/browser/cocoa/bookmark_bar_folder_controller_unittest.mm +++ b/chrome/browser/cocoa/bookmark_bar_folder_controller_unittest.mm @@ -13,6 +13,27 @@ #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" +@interface BookmarkBarFolderControllerPong : BookmarkBarFolderController { + BOOL childFolderWillShow_; + BOOL childFolderWillClose_; +} +@property(readonly) BOOL childFolderWillShow; +@property(readonly) BOOL childFolderWillClose; +@end + +@implementation BookmarkBarFolderControllerPong +@synthesize childFolderWillShow = childFolderWillShow_; +@synthesize childFolderWillClose = childFolderWillClose_; + +- (void)childFolderWillShow:(id<BookmarkButtonControllerProtocol>)child { + childFolderWillShow_ = YES; +} + +- (void)childFolderWillClose:(id<BookmarkButtonControllerProtocol>)child { + childFolderWillClose_ = YES; +} +@end + class BookmarkBarFolderControllerTest : public CocoaTest { public: BrowserTestHelper helper_; @@ -50,7 +71,7 @@ class BookmarkBarFolderControllerTest : public CocoaTest { BookmarkBarFolderController* SimpleBookmarkBarFolderController() { BookmarkButton* parentButton = [[parentBarController_ buttons] objectAtIndex:0]; - return [[BookmarkBarFolderController alloc] + return [[BookmarkBarFolderControllerPong alloc] initWithParentButton:parentButton parentController:parentBarController_]; } @@ -196,6 +217,20 @@ TEST_F(BookmarkBarFolderControllerTest, OpenFolder) { EXPECT_FALSE([bbfc folderController]); } +TEST_F(BookmarkBarFolderControllerTest, ChildFolderCallbacks) { + scoped_nsobject<BookmarkBarFolderControllerPong> bbfc; + bbfc.reset(SimpleBookmarkBarFolderController()); + EXPECT_TRUE(bbfc.get()); + + EXPECT_FALSE([bbfc childFolderWillShow]); + [bbfc openBookmarkFolderFromButton:[[bbfc buttons] objectAtIndex:0]]; + EXPECT_TRUE([bbfc childFolderWillShow]); + + EXPECT_FALSE([bbfc childFolderWillClose]); + [bbfc closeBookmarkFolder:nil]; + EXPECT_TRUE([bbfc childFolderWillClose]); +} + // TODO(jrg): draggingEntered: and draggingExited: trigger timers so // they are hard to test. Factor out "fire timers" into routines // which can be overridden to fire immediately to make behavior diff --git a/chrome/browser/cocoa/bookmark_bar_folder_view_unittest.mm b/chrome/browser/cocoa/bookmark_bar_folder_view_unittest.mm index 514c3b9..a549538 100644 --- a/chrome/browser/cocoa/bookmark_bar_folder_view_unittest.mm +++ b/chrome/browser/cocoa/bookmark_bar_folder_view_unittest.mm @@ -91,6 +91,12 @@ return nil; } +- (void)childFolderWillShow:(id<BookmarkButtonControllerProtocol>)child { +} + +- (void)childFolderWillClose:(id<BookmarkButtonControllerProtocol>)child { +} + @end namespace { diff --git a/chrome/browser/cocoa/bookmark_button.h b/chrome/browser/cocoa/bookmark_button.h index 3144247..304a07d 100644 --- a/chrome/browser/cocoa/bookmark_button.h +++ b/chrome/browser/cocoa/bookmark_button.h @@ -8,6 +8,7 @@ @class BookmarkButton; class BookmarkModel; class BookmarkNode; +@class BrowserWindowController; class ThemeProvider; // Protocol for a BookmarkButton's delegate, responsible for doing @@ -79,6 +80,12 @@ class ThemeProvider; // Return the theme provider associated with this browser window. - (ThemeProvider*)themeProvider; +// Called just before a child folder puts itself on screen. +- (void)childFolderWillShow:(id<BookmarkButtonControllerProtocol>)child; + +// Called just before a child folder closes. +- (void)childFolderWillClose:(id<BookmarkButtonControllerProtocol>)child; + @end // @protocol BookmarkButtonControllerProtocol |