2012-04-03 03:34:16 +02:00
|
|
|
// Copyright (c) 2012 The Chromium Embedded Framework Authors.
|
|
|
|
// Portions copyright (c) 2011 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.
|
|
|
|
|
|
|
|
#include "libcef/browser/browser_host_impl.h"
|
|
|
|
|
|
|
|
#import <Cocoa/Cocoa.h>
|
|
|
|
|
2012-06-07 19:38:12 +02:00
|
|
|
#include "content/public/browser/native_web_keyboard_event.h"
|
2012-04-03 03:34:16 +02:00
|
|
|
#include "content/public/browser/web_contents_view.h"
|
2012-04-04 20:18:09 +02:00
|
|
|
#import "ui/base/cocoa/underlay_opengl_hosting_window.h"
|
2012-04-03 03:34:16 +02:00
|
|
|
#include "ui/gfx/rect.h"
|
|
|
|
|
|
|
|
|
|
|
|
// Wrapper NSView for the native view. Necessary to destroy the browser when
|
|
|
|
// the view is deleted.
|
|
|
|
@interface CefBrowserHostView : NSView {
|
|
|
|
@private
|
|
|
|
CefBrowserHostImpl* browser_; // weak
|
|
|
|
}
|
|
|
|
|
|
|
|
@property (nonatomic, assign) CefBrowserHostImpl* browser;
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
@implementation CefBrowserHostView
|
|
|
|
|
|
|
|
@synthesize browser = browser_;
|
|
|
|
|
|
|
|
- (void) dealloc {
|
|
|
|
if (browser_) {
|
|
|
|
browser_->DestroyBrowser();
|
|
|
|
browser_->Release();
|
|
|
|
}
|
|
|
|
|
|
|
|
[super dealloc];
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
|
|
bool CefBrowserHostImpl::PlatformViewText(const std::string& text) {
|
|
|
|
NOTIMPLEMENTED();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool CefBrowserHostImpl::PlatformCreateWindow() {
|
|
|
|
NSWindow* newWnd = nil;
|
|
|
|
|
|
|
|
NSView* parentView = window_info_.parent_view;
|
|
|
|
NSRect contentRect = {{window_info_.x, window_info_.y},
|
|
|
|
{window_info_.width, window_info_.height}};
|
|
|
|
if (parentView == nil) {
|
|
|
|
// Create a new window.
|
|
|
|
NSRect screen_rect = [[NSScreen mainScreen] visibleFrame];
|
|
|
|
NSRect window_rect = {{window_info_.x,
|
|
|
|
screen_rect.size.height - window_info_.y},
|
|
|
|
{window_info_.width, window_info_.height}};
|
|
|
|
if (window_rect.size.width == 0)
|
|
|
|
window_rect.size.width = 750;
|
|
|
|
if (window_rect.size.height == 0)
|
|
|
|
window_rect.size.height = 750;
|
|
|
|
|
|
|
|
contentRect.origin.x = 0;
|
|
|
|
contentRect.origin.y = 0;
|
|
|
|
contentRect.size.width = window_rect.size.width;
|
|
|
|
contentRect.size.height = window_rect.size.height;
|
|
|
|
|
2012-04-04 20:18:09 +02:00
|
|
|
newWnd = [[UnderlayOpenGLHostingWindow alloc]
|
2012-04-03 03:34:16 +02:00
|
|
|
initWithContentRect:window_rect
|
|
|
|
styleMask:(NSTitledWindowMask |
|
|
|
|
NSClosableWindowMask |
|
|
|
|
NSMiniaturizableWindowMask |
|
|
|
|
NSResizableWindowMask |
|
|
|
|
NSUnifiedTitleAndToolbarWindowMask )
|
|
|
|
backing:NSBackingStoreBuffered
|
|
|
|
defer:NO];
|
|
|
|
parentView = [newWnd contentView];
|
|
|
|
window_info_.parent_view = parentView;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add a reference that will be released in the dealloc handler.
|
|
|
|
AddRef();
|
|
|
|
|
|
|
|
// Create the browser view.
|
|
|
|
CefBrowserHostView* browser_view =
|
|
|
|
[[CefBrowserHostView alloc] initWithFrame:contentRect];
|
|
|
|
browser_view.browser = this;
|
|
|
|
[parentView addSubview:browser_view];
|
|
|
|
[browser_view setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
|
|
|
|
[browser_view setNeedsDisplay:YES];
|
|
|
|
[browser_view release];
|
|
|
|
|
|
|
|
// Parent the TabContents to the browser view.
|
|
|
|
const NSRect bounds = [browser_view bounds];
|
2012-04-04 20:18:09 +02:00
|
|
|
NSView* native_view = web_contents_->GetView()->GetNativeView();
|
2012-04-03 03:34:16 +02:00
|
|
|
[browser_view addSubview:native_view];
|
|
|
|
[native_view setFrame:bounds];
|
|
|
|
[native_view setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
|
|
|
|
[native_view setNeedsDisplay:YES];
|
|
|
|
|
|
|
|
window_info_.view = browser_view;
|
|
|
|
|
|
|
|
if (newWnd != nil && !window_info_.hidden) {
|
|
|
|
// Show the window.
|
|
|
|
[newWnd makeKeyAndOrderFront: nil];
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CefBrowserHostImpl::PlatformCloseWindow() {
|
|
|
|
if (window_info_.view != nil) {
|
|
|
|
[[window_info_.view window] performSelector:@selector(performClose:)
|
|
|
|
withObject:nil
|
|
|
|
afterDelay:0];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CefBrowserHostImpl::PlatformSizeTo(int width, int height) {
|
|
|
|
// Not needed; subviews are bound.
|
|
|
|
}
|
|
|
|
|
|
|
|
CefWindowHandle CefBrowserHostImpl::PlatformGetWindowHandle() {
|
|
|
|
return window_info_.view;
|
|
|
|
}
|
2012-06-07 19:38:12 +02:00
|
|
|
|
|
|
|
void CefBrowserHostImpl::PlatformHandleKeyboardEvent(
|
|
|
|
const content::NativeWebKeyboardEvent& event) {
|
|
|
|
// Give the top level menu equivalents a chance to handle the event.
|
|
|
|
if ([event.os_event type] == NSKeyDown)
|
|
|
|
[[NSApp mainMenu] performKeyEquivalent:event.os_event];
|
|
|
|
}
|