Index: extensions/shell/browser/shell_native_app_window_mac.mm |
diff --git a/extensions/shell/browser/shell_native_app_window_mac.mm b/extensions/shell/browser/shell_native_app_window_mac.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2b879e89147b3e8263519f3a1a86cc945f70e12c |
--- /dev/null |
+++ b/extensions/shell/browser/shell_native_app_window_mac.mm |
@@ -0,0 +1,120 @@ |
+// 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 "extensions/shell/browser/shell_native_app_window_mac.h" |
+ |
+#import <Cocoa/Cocoa.h> |
+ |
+#include "base/logging.h" |
+#include "base/mac/foundation_util.h" |
+#include "base/strings/sys_string_conversions.h" |
+#include "content/public/browser/web_contents.h" |
+#import "ui/gfx/mac/coordinate_conversion.h" |
+ |
+@implementation ShellNativeAppWindowController |
+ |
+@synthesize appWindow = appWindow_; |
+ |
+- (void)windowWillClose:(NSNotification*)notification { |
+ if (appWindow_) |
+ appWindow_->WindowWillClose(); |
+} |
+ |
+@end |
+ |
+// TODO(yoz): Do we need to handle commands (keyboard shortcuts)? |
+// Do we need need ChromeEventProcessingWindow or UnderlayOpenGLHostingWindow? |
+@interface ShellNSWindow : NSWindow |
+@end |
+ |
+@implementation ShellNSWindow |
+ |
+- (BOOL)_isTitleHidden { |
+ return YES; |
+} |
+ |
+@end |
+ |
+namespace extensions { |
+ |
+ShellNativeAppWindowMac::ShellNativeAppWindowMac( |
+ AppWindow* app_window, |
+ const AppWindow::CreateParams& params) |
+ : ShellNativeAppWindow(app_window, params) { |
+ base::scoped_nsobject<NSWindow> shell_window; |
+ NSUInteger style_mask = NSTitledWindowMask | NSClosableWindowMask; |
+ |
+ NSRect cocoa_bounds = gfx::ScreenRectToNSRect( |
+ params.GetInitialWindowBounds(gfx::Insets())); |
+ |
+ shell_window.reset( |
+ [[ShellNSWindow alloc] initWithContentRect:cocoa_bounds |
+ styleMask:style_mask |
+ backing:NSBackingStoreBuffered |
+ defer:NO]); |
+ [shell_window setReleasedWhenClosed:NO]; |
+ |
+ window_controller_.reset([[ShellNativeAppWindowController alloc] |
+ initWithWindow:shell_window]); |
+ |
+ [[window_controller_ window] setDelegate:window_controller_]; |
+ [window_controller_ setAppWindow:this]; |
+ |
+ NSView* view = app_window->web_contents()->GetNativeView(); |
+ NSView* frameView = [window() contentView]; |
+ [view setFrame:[frameView bounds]]; |
+ [frameView addSubview:view]; |
+} |
+ |
+ShellNativeAppWindowMac::~ShellNativeAppWindowMac() { |
+ [window() setDelegate:nil]; |
+ [window() close]; |
+} |
+ |
+bool ShellNativeAppWindowMac::IsActive() const { |
+ return [window() isKeyWindow]; |
+} |
+ |
+gfx::NativeWindow ShellNativeAppWindowMac::GetNativeWindow() const { |
+ return window(); |
+} |
+ |
+gfx::Rect ShellNativeAppWindowMac::GetBounds() const { |
+ return gfx::ScreenRectFromNSRect([window() frame]); |
+} |
+ |
+void ShellNativeAppWindowMac::Show() { |
+ [window_controller_ showWindow:nil]; |
+} |
+ |
+void ShellNativeAppWindowMac::Hide() { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+void ShellNativeAppWindowMac::Activate() { |
+ // TODO(yoz): Activate in front of other applications. |
+ [[window_controller_ window] makeKeyAndOrderFront:window_controller_]; |
+} |
+ |
+void ShellNativeAppWindowMac::Deactivate() { |
+ // See crbug.com/51364. |
+ NOTIMPLEMENTED(); |
+} |
+ |
+void ShellNativeAppWindowMac::SetBounds(const gfx::Rect& bounds) { |
+ // TODO(yoz): Windows should be fullscreen. |
+ NOTIMPLEMENTED(); |
+} |
+ |
+void ShellNativeAppWindowMac::WindowWillClose() { |
+ [window_controller_ setAppWindow:NULL]; |
+ app_window()->OnNativeWindowChanged(); |
+ app_window()->OnNativeClose(); |
+} |
+ |
+ShellNSWindow* ShellNativeAppWindowMac::window() const { |
+ return base::mac::ObjCCastStrict<ShellNSWindow>([window_controller_ window]); |
+} |
+ |
+} // namespace extensions |