Index: chrome/browser/ui/cocoa/passwords/manage_passwords_bubble_cocoa.mm |
diff --git a/chrome/browser/ui/cocoa/passwords/manage_passwords_bubble_cocoa.mm b/chrome/browser/ui/cocoa/passwords/manage_passwords_bubble_cocoa.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..54771cb6040e073dbfb8cc03a5eee371f0cd23a3 |
--- /dev/null |
+++ b/chrome/browser/ui/cocoa/passwords/manage_passwords_bubble_cocoa.mm |
@@ -0,0 +1,98 @@ |
+// Copyright 2014 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. |
+ |
+#import "chrome/browser/ui/cocoa/passwords/manage_passwords_bubble_cocoa.h" |
+ |
+#include "base/mac/scoped_block.h" |
+#include "chrome/browser/ui/browser_dialogs.h" |
+#include "chrome/browser/ui/browser_finder.h" |
+#import "chrome/browser/ui/cocoa/passwords/manage_passwords_bubble_controller.h" |
+#include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" |
+#include "content/public/browser/web_contents.h" |
+ |
+typedef void (^Callback)(void); |
+ |
+@interface ManagePasswordsBubbleCocoaNotificationBridge : NSObject { |
+ base::mac::ScopedBlock<Callback> callback_; |
+} |
+- (id)initWithCallback:(Callback)callback; |
+- (void)onClose; |
+@end |
+ |
+@implementation ManagePasswordsBubbleCocoaNotificationBridge |
+- (id)initWithCallback:(Callback)callback { |
+ if ((self = [super init])) { |
+ callback_.reset(callback, base::scoped_policy::RETAIN); |
+ } |
+ return self; |
+} |
+- (void)onClose { |
+ callback_.get()(); |
+} |
+@end |
+ |
+// static |
+ManagePasswordsBubbleCocoa* ManagePasswordsBubbleCocoa::bubble_ = NULL; |
+ |
+ManagePasswordsBubbleCocoa::ManagePasswordsBubbleCocoa( |
+ content::WebContents* webContents, |
+ DisplayReason displayReason) |
+ : ManagePasswordsBubble(webContents, displayReason), |
+ closing_(false), |
+ controller_(nil), |
+ webContents_(webContents), |
+ bridge_(nil) { |
+} |
+ |
+ManagePasswordsBubbleCocoa::~ManagePasswordsBubbleCocoa() { |
+ [[NSNotificationCenter defaultCenter] removeObserver:bridge_]; |
+ // Clear the global instance pointer. |
+ bubble_ = NULL; |
+} |
+ |
+void ManagePasswordsBubbleCocoa::Show() { |
+ // Create and show the bubble. |
+ NSView* browserView = webContents_->GetNativeView(); |
+ DCHECK(browserView); |
+ NSWindow* browserWindow = [browserView window]; |
+ DCHECK(browserWindow); |
+ controller_ = [[ManagePasswordsBubbleController alloc] |
+ initWithParentWindow:browserWindow |
+ model:model()]; |
+ [controller_ showWindow:nil]; |
+ |
+ // Listen for close notification to perform cleanup: the window isn't |
+ // necessarily closed by calling Close(). Use a block instead of directly |
+ // calling OnClose from the bridge so that we don't need to expose OnClose |
+ // in the public API of ManagePasswordsBubbleCocoa. |
+ bridge_.reset([[ManagePasswordsBubbleCocoaNotificationBridge alloc] |
+ initWithCallback:^{ |
+ OnClose(); |
+ }]); |
+ [[NSNotificationCenter defaultCenter] |
+ addObserver:bridge_ |
+ selector:@selector(onClose) |
+ name:NSWindowWillCloseNotification |
+ object:[controller_ window]]; |
+} |
+ |
+void ManagePasswordsBubbleCocoa::Close() { |
+ if (!closing_) { |
+ closing_ = true; |
+ [controller_ close]; |
+ } |
+} |
+ |
+void ManagePasswordsBubbleCocoa::OnClose() { |
+ delete this; |
+} |
+ |
+// static |
+void ManagePasswordsBubbleCocoa::ShowBubble(content::WebContents* webContents, |
+ DisplayReason displayReason) { |
+ if (bubble_) |
+ return; |
+ bubble_ = new ManagePasswordsBubbleCocoa(webContents, displayReason); |
+ bubble_->Show(); |
+} |