blob: 351cbb9b1490eb243941e3b0aa45863c8e84fc5d [file] [log] [blame]
// Copyright (c) 2012 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 "chrome/browser/ui/cocoa/extensions/extension_view_mac.h"
#import <Cocoa/Cocoa.h>
#include "base/mac/foundation_util.h"
#include "chrome/browser/extensions/extension_view_host.h"
#import "chrome/browser/ui/cocoa/chrome_event_processing_window.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/web_contents.h"
#include "extensions/browser/extension_host.h"
#include "extensions/common/view_type.h"
// The minimum/maximum dimensions of the popup.
const CGFloat ExtensionViewMac::kMinWidth = 25.0;
const CGFloat ExtensionViewMac::kMinHeight = 25.0;
const CGFloat ExtensionViewMac::kMaxWidth = 800.0;
const CGFloat ExtensionViewMac::kMaxHeight = 600.0;
ExtensionViewMac::ExtensionViewMac(extensions::ExtensionHost* extension_host,
Browser* browser)
: browser_(browser),
extension_host_(extension_host),
container_(NULL) {
DCHECK(extension_host_);
[GetNativeView() setHidden:YES];
}
ExtensionViewMac::~ExtensionViewMac() {
}
void ExtensionViewMac::WindowFrameChanged() {
if (render_view_host()->GetView())
render_view_host()->GetView()->WindowFrameChanged();
}
void ExtensionViewMac::Init() {
CreateWidgetHostView();
}
Browser* ExtensionViewMac::GetBrowser() {
return browser_;
}
gfx::NativeView ExtensionViewMac::GetNativeView() {
return extension_host_->host_contents()->GetNativeView();
}
void ExtensionViewMac::ResizeDueToAutoResize(const gfx::Size& new_size) {
if (container_)
container_->OnExtensionSizeChanged(this, new_size);
}
void ExtensionViewMac::RenderViewCreated() {
extensions::ViewType host_type = extension_host_->extension_host_type();
if (host_type == extensions::VIEW_TYPE_EXTENSION_POPUP) {
gfx::Size min_size(ExtensionViewMac::kMinWidth,
ExtensionViewMac::kMinHeight);
gfx::Size max_size(ExtensionViewMac::kMaxWidth,
ExtensionViewMac::kMaxHeight);
render_view_host()->EnableAutoResize(min_size, max_size);
}
}
void ExtensionViewMac::HandleKeyboardEvent(
content::WebContents* source,
const content::NativeWebKeyboardEvent& event) {
if (event.skip_in_browser ||
event.type == content::NativeWebKeyboardEvent::Char ||
extension_host_->extension_host_type() !=
extensions::VIEW_TYPE_EXTENSION_POPUP)
return;
ChromeEventProcessingWindow* event_window =
base::mac::ObjCCastStrict<ChromeEventProcessingWindow>(
[GetNativeView() window]);
[event_window redispatchKeyEvent:event.os_event];
}
void ExtensionViewMac::DidStopLoading() {
ShowIfCompletelyLoaded();
}
content::RenderViewHost* ExtensionViewMac::render_view_host() const {
return extension_host_->render_view_host();
}
void ExtensionViewMac::CreateWidgetHostView() {
extension_host_->CreateRenderViewSoon();
}
void ExtensionViewMac::ShowIfCompletelyLoaded() {
// We wait to show the ExtensionView until it has loaded, and the view has
// actually been created. These can happen in different orders.
if (extension_host_->did_stop_loading()) {
[GetNativeView() setHidden:NO];
if (container_)
container_->OnExtensionViewDidShow(this);
}
}
namespace extensions {
// static
scoped_ptr<ExtensionView> ExtensionViewHost::CreateExtensionView(
ExtensionViewHost* host,
Browser* browser) {
scoped_ptr<ExtensionViewMac> view(new ExtensionViewMac(host, browser));
return view.PassAs<ExtensionView>();
}
} // namespace extensions