Index: chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.mm |
diff --git a/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.mm b/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d1128ab63e571fb568518f3550d579cba1d4c850 |
--- /dev/null |
+++ b/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.mm |
@@ -0,0 +1,117 @@ |
+// Copyright 2013 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/extensions/windowed_install_dialog_controller.h" |
+ |
+#import "base/mac/sdk_forward_declarations.h" |
+#include "base/message_loop/message_loop.h" |
+#include "base/strings/sys_string_conversions.h" |
+#import "chrome/browser/ui/cocoa/extensions/extension_install_view_controller.h" |
+#include "ui/base/cocoa/window_size_constants.h" |
+ |
+@interface WindowedInstallController |
+ : NSWindowController<NSWindowDelegate> { |
+ @private |
+ base::scoped_nsobject<ExtensionInstallViewController> installViewController_; |
+ WindowedInstallDialogController* dialogController_; // Weak. Owns us. |
+} |
+ |
+@property(readonly, nonatomic) ExtensionInstallViewController* viewController; |
+ |
+- (id)initWithNavigator:(content::PageNavigator*)navigator |
+ delegate:(WindowedInstallDialogController*)delegate |
+ prompt:(const ExtensionInstallPrompt::Prompt&)prompt; |
+ |
+@end |
+ |
+WindowedInstallDialogController::WindowedInstallDialogController( |
+ const ExtensionInstallPrompt::ShowParams& show_params, |
+ ExtensionInstallPrompt::Delegate* delegate, |
+ const ExtensionInstallPrompt::Prompt& prompt) |
+ : delegate_(delegate) { |
+ install_controller_.reset([[WindowedInstallController alloc] |
+ initWithNavigator:show_params.navigator |
+ delegate:this |
+ prompt:prompt]); |
+ [[install_controller_ window] makeKeyAndOrderFront:nil]; |
+} |
+ |
+WindowedInstallDialogController::~WindowedInstallDialogController() { |
+ DCHECK(!install_controller_); |
+ DCHECK(!delegate_); |
+} |
+ |
+void WindowedInstallDialogController::OnWindowClosing() { |
+ install_controller_.reset(); |
+ if (delegate_) { |
+ delegate_->InstallUIAbort(false); |
+ delegate_ = NULL; |
+ } |
+ base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
+} |
+ |
+ExtensionInstallViewController* |
+WindowedInstallDialogController::GetViewController() { |
+ return [install_controller_ viewController]; |
+} |
+ |
+void WindowedInstallDialogController::InstallUIProceed() { |
+ delegate_->InstallUIProceed(); |
+ delegate_ = NULL; |
+ [[install_controller_ window] close]; |
+} |
+ |
+void WindowedInstallDialogController::InstallUIAbort(bool user_initiated) { |
+ delegate_->InstallUIAbort(user_initiated); |
+ delegate_ = NULL; |
+ [[install_controller_ window] close]; |
+} |
+ |
+@implementation WindowedInstallController |
+ |
+- (id)initWithNavigator:(content::PageNavigator*)navigator |
+ delegate:(WindowedInstallDialogController*)delegate |
+ prompt:(const ExtensionInstallPrompt::Prompt&)prompt { |
+ base::scoped_nsobject<NSWindow> controlledPanel( |
+ [[NSPanel alloc] initWithContentRect:ui::kWindowSizeDeterminedLater |
+ styleMask:NSTitledWindowMask |
+ backing:NSBackingStoreBuffered |
+ defer:NO]); |
+ if ((self = [super initWithWindow:controlledPanel])) { |
+ dialogController_ = delegate; |
+ installViewController_.reset([[ExtensionInstallViewController alloc] |
+ initWithNavigator:navigator |
+ delegate:delegate |
+ prompt:prompt]); |
+ NSWindow* window = [self window]; |
+ |
+ // Ensure the window does not display behind the app launcher window, and is |
+ // otherwise hard to lose behind other windows (since it is not modal). |
+ [window setLevel:NSDockWindowLevel]; |
+ |
+ // Animate the window when ordered in, the same way as an NSAlert. |
+ if ([window respondsToSelector:@selector(setAnimationBehavior:)]) |
+ [window setAnimationBehavior:NSWindowAnimationBehaviorAlertPanel]; |
+ |
+ [window setTitle:base::SysUTF16ToNSString(prompt.GetDialogTitle())]; |
+ NSRect viewFrame = [[installViewController_ view] frame]; |
+ [window setFrame:[window frameRectForContentRect:viewFrame] |
+ display:NO]; |
+ [window setContentView:[installViewController_ view]]; |
+ [window setDelegate:self]; |
+ [window center]; |
+ } |
+ return self; |
+} |
+ |
+- (ExtensionInstallViewController*)viewController { |
+ return installViewController_; |
+} |
+ |
+- (void)windowWillClose:(NSNotification*)notification { |
+ [[self window] setDelegate:nil]; |
+ dialogController_->OnWindowClosing(); |
+} |
+ |
+@end |