| Index: chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm
|
| diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm
|
| index c540d72f54bb2f4701b877e084dc905253b913eb..21182459cf3a4fa82514570d59fa30c43b1c45dc 100644
|
| --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm
|
| +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm
|
| @@ -33,6 +33,7 @@
|
| #import "chrome/browser/ui/cocoa/bookmarks/bookmark_editor_controller.h"
|
| #import "chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.h"
|
| #import "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.h"
|
| +#import "chrome/browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.h"
|
| #import "chrome/browser/ui/cocoa/bookmarks/bookmark_name_folder_controller.h"
|
| #import "chrome/browser/ui/cocoa/browser_window_controller.h"
|
| #import "chrome/browser/ui/cocoa/menu_button.h"
|
| @@ -173,6 +174,9 @@ void RecordAppLaunch(Profile* profile, GURL url) {
|
| - (BookmarkButton*)buttonForNode:(const BookmarkNode*)node
|
| xOffset:(int*)xOffset;
|
|
|
| +// Find a parent whose button is visible on the bookmark bar.
|
| +- (BookmarkButton*)bookmarkButtonToPulseForNode:(const BookmarkNode*)node;
|
| +
|
| // Puts stuff into the final state without animating, stopping a running
|
| // animation if necessary.
|
| - (void)finalizeState;
|
| @@ -283,10 +287,6 @@ void RecordAppLaunch(Profile* profile, GURL url) {
|
| selector:@selector(themeDidChangeNotification:)
|
| name:kBrowserThemeDidChangeNotification
|
| object:nil];
|
| - [defaultCenter addObserver:self
|
| - selector:@selector(pulseBookmarkNotification:)
|
| - name:bookmark_button::kPulseBookmarkButtonNotification
|
| - object:nil];
|
|
|
| contextMenuController_.reset(
|
| [[BookmarkContextMenuCocoaController alloc]
|
| @@ -308,45 +308,61 @@ void RecordAppLaunch(Profile* profile, GURL url) {
|
| return contextMenuController_.get();
|
| }
|
|
|
| -- (void)pulseBookmarkNotification:(NSNotification*)notification {
|
| - NSDictionary* dict = [notification userInfo];
|
| - const BookmarkNode* node = NULL;
|
| - NSValue *value = [dict objectForKey:bookmark_button::kBookmarkKey];
|
| - DCHECK(value);
|
| - if (value)
|
| - node = static_cast<const BookmarkNode*>([value pointerValue]);
|
| - NSNumber* number = [dict objectForKey:bookmark_button::kBookmarkPulseFlagKey];
|
| - DCHECK(number);
|
| - BOOL doPulse = number ? [number boolValue] : NO;
|
| -
|
| - // 3 cases:
|
| - // button on the bar: flash it
|
| - // button in "other bookmarks" folder: flash other bookmarks
|
| - // button in "off the side" folder: flash the chevron
|
| - for (BookmarkButton* button in [self buttons]) {
|
| - if ([button bookmarkNode] == node) {
|
| - [button setIsContinuousPulsing:doPulse];
|
| - return;
|
| +- (BookmarkButton*)bookmarkButtonToPulseForNode:(const BookmarkNode*)node {
|
| + // Find the closest parent that is visible on the bar.
|
| + while (node) {
|
| + // Check if we've reached one of the special buttons. Otherwise, if the next
|
| + // parent is the boomark bar, find the corresponding button.
|
| + if ([managedBookmarksButton_ bookmarkNode] == node)
|
| + return managedBookmarksButton_;
|
| +
|
| + if ([supervisedBookmarksButton_ bookmarkNode] == node)
|
| + return supervisedBookmarksButton_;
|
| +
|
| + if ([otherBookmarksButton_ bookmarkNode] == node)
|
| + return otherBookmarksButton_;
|
| +
|
| + if ([offTheSideButton_ bookmarkNode] == node)
|
| + return offTheSideButton_;
|
| +
|
| + if (node->parent() == bookmarkModel_->bookmark_bar_node()) {
|
| + for (BookmarkButton* button in [self buttons]) {
|
| + if ([button bookmarkNode] == node) {
|
| + [button setIsContinuousPulsing:YES];
|
| + return button;
|
| + }
|
| + }
|
| }
|
| +
|
| + node = node->parent();
|
| }
|
| - if ([managedBookmarksButton_ bookmarkNode] == node) {
|
| - [managedBookmarksButton_ setIsContinuousPulsing:doPulse];
|
| - return;
|
| - }
|
| - if ([supervisedBookmarksButton_ bookmarkNode] == node) {
|
| - [supervisedBookmarksButton_ setIsContinuousPulsing:doPulse];
|
| - return;
|
| - }
|
| - if ([otherBookmarksButton_ bookmarkNode] == node) {
|
| - [otherBookmarksButton_ setIsContinuousPulsing:doPulse];
|
| + NOTREACHED();
|
| + return nil;
|
| +}
|
| +
|
| +- (void)startPulsingBookmarkNode:(const BookmarkNode*)node {
|
| + [self stopPulsingBookmarkNode];
|
| +
|
| + pulsingButton_ = [self bookmarkButtonToPulseForNode:node];
|
| + if (!pulsingButton_)
|
| return;
|
| - }
|
| - if (node->parent() == bookmarkModel_->bookmark_bar_node()) {
|
| - [offTheSideButton_ setIsContinuousPulsing:doPulse];
|
| +
|
| + [pulsingButton_ setIsContinuousPulsing:YES];
|
| + pulsingBookmarkObserver_.reset(
|
| + new BookmarkModelObserverForCocoa(bookmarkModel_, ^() {
|
| + // Stop pulsing if anything happened to the node.
|
| + [self stopPulsingBookmarkNode];
|
| + }));
|
| + pulsingBookmarkObserver_->StartObservingNode(node);
|
| +}
|
| +
|
| +- (void)stopPulsingBookmarkNode {
|
| + if (!pulsingButton_)
|
| return;
|
| - }
|
|
|
| - NOTREACHED() << "no bookmark button found to pulse!";
|
| + [pulsingButton_ setIsContinuousPulsing:NO];
|
| + pulsingButton_ = nil;
|
| + pulsingBookmarkObserver_.reset();
|
| }
|
|
|
| - (void)dealloc {
|
| @@ -1763,6 +1779,7 @@ void RecordAppLaunch(Profile* profile, GURL url) {
|
| // Delete all buttons (bookmarks, chevron, "other bookmarks") from the
|
| // bookmark bar; reset knowledge of bookmarks.
|
| - (void)clearBookmarkBar {
|
| + [self stopPulsingBookmarkNode];
|
| for (BookmarkButton* button in buttons_.get()) {
|
| [button setDelegate:nil];
|
| [button removeFromSuperview];
|
|
|