summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/cocoa/extension_view_mac.mm
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/cocoa/extension_view_mac.mm')
-rw-r--r--chrome/browser/ui/cocoa/extension_view_mac.mm112
1 files changed, 112 insertions, 0 deletions
diff --git a/chrome/browser/ui/cocoa/extension_view_mac.mm b/chrome/browser/ui/cocoa/extension_view_mac.mm
new file mode 100644
index 0000000..d3a10e7
--- /dev/null
+++ b/chrome/browser/ui/cocoa/extension_view_mac.mm
@@ -0,0 +1,112 @@
+// Copyright (c) 2010 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/extension_view_mac.h"
+
+#include "chrome/browser/extensions/extension_host.h"
+#include "chrome/browser/renderer_host/render_view_host.h"
+#include "chrome/browser/renderer_host/render_widget_host_view_mac.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(ExtensionHost* extension_host,
+ Browser* browser)
+ : is_toolstrip_(true),
+ browser_(browser),
+ extension_host_(extension_host),
+ render_widget_host_view_(NULL) {
+ DCHECK(extension_host_);
+}
+
+ExtensionViewMac::~ExtensionViewMac() {
+ if (render_widget_host_view_)
+ [render_widget_host_view_->native_view() release];
+}
+
+void ExtensionViewMac::Init() {
+ CreateWidgetHostView();
+}
+
+gfx::NativeView ExtensionViewMac::native_view() {
+ DCHECK(render_widget_host_view_);
+ return render_widget_host_view_->native_view();
+}
+
+RenderViewHost* ExtensionViewMac::render_view_host() const {
+ return extension_host_->render_view_host();
+}
+
+void ExtensionViewMac::SetBackground(const SkBitmap& background) {
+ DCHECK(render_widget_host_view_);
+ if (render_view_host()->IsRenderViewLive()) {
+ render_widget_host_view_->SetBackground(background);
+ } else {
+ pending_background_ = background;
+ }
+}
+
+void ExtensionViewMac::UpdatePreferredSize(const gfx::Size& new_size) {
+ // TODO(thakis, erikkay): Windows does some tricks to resize the extension
+ // view not before it's visible. Do something similar here.
+
+ // No need to use CA here, our caller calls us repeatedly to animate the
+ // resizing.
+ NSView* view = native_view();
+ NSRect frame = [view frame];
+ frame.size.width = new_size.width();
+ frame.size.height = new_size.height();
+
+ // On first display of some extensions, this function is called with zero
+ // width after the correct size has been set. Bail if zero is seen, assuming
+ // that an extension's view doesn't want any dimensions to ever be zero.
+ // TODO(andybons): Verify this assumption and look into WebCore's
+ // |contentesPreferredWidth| to see why this is occurring.
+ if (NSIsEmptyRect(frame))
+ return;
+
+ DCHECK([view isKindOfClass:[RenderWidgetHostViewCocoa class]]);
+ RenderWidgetHostViewCocoa* hostView = (RenderWidgetHostViewCocoa*)view;
+
+ // RenderWidgetHostViewCocoa overrides setFrame but not setFrameSize.
+ // We need to defer the update back to the RenderWidgetHost so we don't
+ // get the flickering effect on 10.5 of http://crbug.com/31970
+ [hostView setFrameWithDeferredUpdate:frame];
+ [hostView setNeedsDisplay:YES];
+}
+
+void ExtensionViewMac::RenderViewCreated() {
+ // Do not allow webkit to draw scroll bars on views smaller than
+ // the largest size view allowed. The view will be resized to make
+ // scroll bars unnecessary. Scroll bars change the height of the
+ // view, so not drawing them is necessary to avoid infinite resizing.
+ gfx::Size largest_popup_size(
+ CGSizeMake(ExtensionViewMac::kMaxWidth, ExtensionViewMac::kMaxHeight));
+ extension_host_->DisableScrollbarsForSmallWindows(largest_popup_size);
+
+ if (!pending_background_.empty() && render_view_host()->view()) {
+ render_widget_host_view_->SetBackground(pending_background_);
+ pending_background_.reset();
+ }
+}
+
+void ExtensionViewMac::WindowFrameChanged() {
+ if (render_widget_host_view_)
+ render_widget_host_view_->WindowFrameChanged();
+}
+
+void ExtensionViewMac::CreateWidgetHostView() {
+ DCHECK(!render_widget_host_view_);
+ render_widget_host_view_ = new RenderWidgetHostViewMac(render_view_host());
+
+ // The RenderWidgetHostViewMac is owned by its native view, which is created
+ // in an autoreleased state. retain it, so that it doesn't immediately
+ // disappear.
+ [render_widget_host_view_->native_view() retain];
+
+ extension_host_->CreateRenderViewSoon(render_widget_host_view_);
+}