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..6a6356ba665ba927725d92f45e66edd168c4c5d1 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" |
@@ -283,10 +284,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 +305,59 @@ 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*)bookmarkButtonForNode:(const BookmarkNode*)node { |
tapted
2015/08/25 01:13:20
declare this in BookmarkBarController(Private)? -
jackhou1
2015/08/25 04:32:29
Added declaration. The order is pretty inconsisten
tapted
2015/08/25 05:46:34
Acknowledged.
|
+ // Find the closest parent that is visible on the bar. |
+ BookmarkButton* result = nil; |
tapted
2015/08/25 01:13:20
I think it's more chromeystyle to omit `result` --
jackhou1
2015/08/25 04:32:29
Done.
|
+ while (node && !result) { |
+ // 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 |
+ if (node->parent() == bookmarkModel_->bookmark_bar_node()) { |
+ for (BookmarkButton* button in [self buttons]) { |
+ if ([button bookmarkNode] == node) { |
+ [button setIsContinuousPulsing:YES]; |
+ result = button; |
+ } |
+ } |
+ } else if ([managedBookmarksButton_ bookmarkNode] == node) { |
tapted
2015/08/25 01:13:20
a thought: would the managedBookmarksButton_'s par
jackhou1
2015/08/25 04:32:29
I don't think so, since it works with the otherBoo
|
+ result = managedBookmarksButton_; |
+ } else if ([supervisedBookmarksButton_ bookmarkNode] == node) { |
+ result = supervisedBookmarksButton_; |
+ } else if ([otherBookmarksButton_ bookmarkNode] == node) { |
+ result = otherBookmarksButton_; |
+ } else if (node->parent() == bookmarkModel_->bookmark_bar_node()) { |
+ result = offTheSideButton_; |
} |
+ 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]; |
+ return result; |
+} |
+ |
+- (void)startPulsingBookmarkNode:(const BookmarkNode*)node { |
+ if (pulsingButton_) |
tapted
2015/08/25 01:13:20
Here maybe just start with
pulsingBookmarkObserve
jackhou1
2015/08/25 04:32:29
As per previous comment, I'd prefer keep |pulsingB
|
+ [self stopPulsingBookmarkNode]; |
+ |
+ pulsingButton_ = [self bookmarkButtonForNode:node]; |
+ if (!pulsingButton_) |
return; |
- } |
- if (node->parent() == bookmarkModel_->bookmark_bar_node()) { |
- [offTheSideButton_ setIsContinuousPulsing:doPulse]; |
+ |
+ [pulsingButton_ setIsContinuousPulsing:YES]; |
+ pulsingBookmarkObserver_.reset( |
+ new BookmarkModelObserverForCocoa(bookmarkModel_, ^(BOOL) { |
+ // 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 +1774,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]; |
@@ -2322,6 +2334,7 @@ static BOOL ValueInRangeInclusive(CGFloat low, CGFloat value, CGFloat high) { |
id<BookmarkButtonControllerProtocol> parentController = |
[self controllerForNode:oldParent]; |
[parentController removeButton:index animate:YES]; |
+ |
// If we go from 1 --> 0 bookmarks we may need to show the |
// "bookmarks go here" text container. |
[self showOrHideNoItemContainerForNode:model->bookmark_bar_node()]; |