Index: chrome/browser/ui/cocoa/browser_window_controller.mm |
diff --git a/chrome/browser/ui/cocoa/browser_window_controller.mm b/chrome/browser/ui/cocoa/browser_window_controller.mm |
index b86492f79da7f30b1b6dd650a603f6e73c7dfe09..c7e7bfc91a9a42357f603372dbd3765bf415d584 100644 |
--- a/chrome/browser/ui/cocoa/browser_window_controller.mm |
+++ b/chrome/browser/ui/cocoa/browser_window_controller.mm |
@@ -30,11 +30,13 @@ |
#include "chrome/browser/themes/theme_service.h" |
#include "chrome/browser/themes/theme_service_factory.h" |
#include "chrome/browser/translate/chrome_translate_client.h" |
+#include "chrome/browser/ui/bookmarks/bookmark_bubble_observer.h" |
#include "chrome/browser/ui/bookmarks/bookmark_editor.h" |
#include "chrome/browser/ui/bookmarks/bookmark_utils.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_command_controller.h" |
#include "chrome/browser/ui/browser_commands.h" |
+#include "chrome/browser/ui/browser_dialogs.h" |
#include "chrome/browser/ui/browser_instant_controller.h" |
#include "chrome/browser/ui/browser_list.h" |
#include "chrome/browser/ui/browser_window_state.h" |
@@ -95,6 +97,7 @@ |
#import "ui/base/cocoa/nsview_additions.h" |
#include "ui/base/l10n/l10n_util.h" |
#include "ui/base/l10n/l10n_util_mac.h" |
+#import "ui/gfx/mac/coordinate_conversion.h" |
#include "ui/gfx/mac/scoped_cocoa_disable_screen_updates.h" |
using bookmarks::BookmarkModel; |
@@ -182,6 +185,49 @@ using content::Referrer; |
using content::RenderWidgetHostView; |
using content::WebContents; |
+@interface BrowserWindowController () |
+// Declared for ViewsBookmarkBubbleObserver. |
+- (void)viewsBookmarkBubbleClosed; |
+@end |
+ |
+namespace { |
+ |
+// Manages toolbar visibility locking and bookmark button pulsing. |
+class ViewsBookmarkBubbleObserver : public bookmarks::BookmarkBubbleObserver { |
tapted
2015/08/21 07:19:18
This doesn't feel right in this file, but I haven'
jackhou1
2015/08/24 08:22:04
I decided to pull all the non-Views parts out to a
|
+ public: |
+ explicit ViewsBookmarkBubbleObserver(BrowserWindowController* controller) |
+ : controller_(controller), lockOwner_([[NSObject alloc] init]) {} |
+ ~ViewsBookmarkBubbleObserver() override {} |
+ |
+ // bookmarks::BookmarkBubbleObserver. |
+ void OnBookmarkBubbleShown(const BookmarkNode* node) override { |
+ [controller_ lockBarVisibilityForOwner:lockOwner_ |
+ withAnimation:NO |
+ delay:NO]; |
+ pulsingBookmarkNode_ = |
+ [[controller_ bookmarkBarController] startPulsingBookmarkNode:node]; |
+ } |
+ |
+ void OnBookmarkBubbleHidden() override { |
+ [controller_ releaseBarVisibilityForOwner:lockOwner_ |
+ withAnimation:YES |
+ delay:NO]; |
+ [[controller_ bookmarkBarController] |
+ stopPulsingBookmarkNode:pulsingBookmarkNode_]; |
+ pulsingBookmarkNode_ = nullptr; |
+ [controller_ viewsBookmarkBubbleClosed]; |
+ } |
+ |
+ private: |
+ BrowserWindowController* controller_; // Weak, owns us. |
+ const BookmarkNode* pulsingBookmarkNode_ = nullptr; |
+ base::scoped_nsobject<NSObject> lockOwner_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ViewsBookmarkBubbleObserver); |
+}; |
+ |
+} // namespace |
+ |
@interface NSWindow (NSPrivateApis) |
// Note: These functions are private, use -[NSObject respondsToSelector:] |
// before calling them. |
@@ -1766,6 +1812,19 @@ using content::WebContents; |
// Show the bookmark bubble (e.g. user just clicked on the STAR). |
- (void)showBookmarkBubbleForURL:(const GURL&)url |
alreadyBookmarked:(BOOL)alreadyMarked { |
+ if (chrome::ToolkitViewsDialogsEnabled()) { |
+ if (viewsBookmarkBubbleObserver_.get()) |
+ return; |
+ |
+ viewsBookmarkBubbleObserver_.reset(new ViewsBookmarkBubbleObserver(self)); |
+ chrome::ShowBookmarkBubbleViewsAtPoint( |
+ gfx::ScreenPointFromNSPoint( |
+ [[self window] convertBaseToScreen:[self bookmarkBubblePoint]]), |
+ [[self window] contentView], viewsBookmarkBubbleObserver_.get(), |
+ browser_.get(), url, alreadyMarked); |
+ return; |
tapted
2015/08/21 07:19:18
DCHECK(viewsBookmarkBubbleObserver_) ?
jackhou1
2015/08/24 08:22:04
Done. Is this to ensure it's not closed immediatel
tapted
2015/08/25 03:10:16
oops - missed a question. I guess that's part of i
|
+ } |
+ |
if (!bookmarkBubbleController_) { |
BookmarkModel* model = |
BookmarkModelFactory::GetForProfile(browser_->profile()); |
@@ -1798,6 +1857,10 @@ using content::WebContents; |
bookmarkBubbleController_ = nil; |
} |
+- (void)viewsBookmarkBubbleClosed { |
+ viewsBookmarkBubbleObserver_.reset(); |
+} |
+ |
// Handle the editBookmarkNode: action sent from bookmark bubble controllers. |
- (void)editBookmarkNode:(id)sender { |
BOOL responds = [sender respondsToSelector:@selector(node)]; |