Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2186)

Unified Diff: chrome/browser/ui/cocoa/passwords/manage_passwords_bubble_cocoa.mm

Issue 441683002: Add ManagePasswordsBubbleCocoa and unit tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: static Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
+}

Powered by Google App Engine
This is Rietveld 408576698