summaryrefslogtreecommitdiffstats
path: root/chrome/browser/renderer_host
diff options
context:
space:
mode:
authoravi@google.com <avi@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-26 18:05:19 +0000
committeravi@google.com <avi@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-26 18:05:19 +0000
commit47e4e1a0e7c75a188c7494643b8cc6258c405452 (patch)
tree2d1dcd5263f84c98663d4048c5211e762628e4ef /chrome/browser/renderer_host
parentcea3dfdedf95788f9973bcce16fc9446e898af9e (diff)
downloadchromium_src-47e4e1a0e7c75a188c7494643b8cc6258c405452.zip
chromium_src-47e4e1a0e7c75a188c7494643b8cc6258c405452.tar.gz
chromium_src-47e4e1a0e7c75a188c7494643b8cc6258c405452.tar.bz2
Enable child RWHVs on the Mac.
http://crbug.com/8824 Review URL: http://codereview.chromium.org/45040 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@12573 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/renderer_host')
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac.h13
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac.mm58
2 files changed, 63 insertions, 8 deletions
diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.h b/chrome/browser/renderer_host/render_widget_host_view_mac.h
index fef0336..0a0dd3d 100644
--- a/chrome/browser/renderer_host/render_widget_host_view_mac.h
+++ b/chrome/browser/renderer_host/render_widget_host_view_mac.h
@@ -7,6 +7,7 @@
#import <Cocoa/Cocoa.h>
+#include "base/task.h"
#include "base/time.h"
#include "chrome/browser/cocoa/base_view.h"
#include "chrome/browser/renderer_host/render_widget_host_view.h"
@@ -22,8 +23,13 @@ class RenderWidgetHostViewMac;
@interface RenderWidgetHostViewCocoa : BaseView {
@private
RenderWidgetHostViewMac* renderWidgetHostView_;
+ BOOL canBeKeyView_;
+ BOOL closeOnDeactivate_;
}
+- (void)setCanBeKeyView:(BOOL)can;
+- (void)setCloseOnDeactivate:(BOOL)b;
+
@end
///////////////////////////////////////////////////////////////////////////////
@@ -53,7 +59,7 @@ class RenderWidgetHostViewMac : public RenderWidgetHostView {
base::TimeTicks& whiteout_start_time() { return whiteout_start_time_; }
- gfx::NativeView native_view() const { return cocoa_view_; }
+ RenderWidgetHostViewCocoa* native_view() const { return cocoa_view_; }
// Implementation of RenderWidgetHostView:
virtual void InitAsPopup(RenderWidgetHostView* parent_host_view,
@@ -82,6 +88,8 @@ class RenderWidgetHostViewMac : public RenderWidgetHostView {
virtual void SetTooltipText(const std::wstring& tooltip_text);
virtual BackingStore* AllocBackingStore(const gfx::Size& size);
+ void KillSelf();
+
private:
// Shuts down the render_widget_host_. This is a separate function so we can
// invoke it from the message loop.
@@ -109,6 +117,9 @@ class RenderWidgetHostViewMac : public RenderWidgetHostView {
// The text to be shown in the tooltip, supplied by the renderer.
std::wstring tooltip_text_;
+ // Factory used to safely scope delayed calls to ShutdownHost().
+ ScopedRunnableMethodFactory<RenderWidgetHostViewMac> shutdown_factory_;
+
// The time at which this view started displaying white pixels as a result of
// not having anything to paint (empty backing store from renderer). This
// value returns true for is_null() if we are not recording whiteout times.
diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.mm b/chrome/browser/renderer_host/render_widget_host_view_mac.mm
index 0111baf..f726958 100644
--- a/chrome/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/chrome/browser/renderer_host/render_widget_host_view_mac.mm
@@ -39,7 +39,8 @@ RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget(
RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget)
: render_widget_host_(widget),
is_loading_(false),
- is_hidden_(false) {
+ is_hidden_(false),
+ shutdown_factory_(this) {
cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc]
initWithRenderWidgetHostViewMac:this] autorelease];
render_widget_host_->set_view(this);
@@ -54,7 +55,26 @@ RenderWidgetHostViewMac::~RenderWidgetHostViewMac() {
void RenderWidgetHostViewMac::InitAsPopup(
RenderWidgetHostView* parent_host_view,
const gfx::Rect& pos) {
- NOTIMPLEMENTED();
+ [parent_host_view->GetPluginNativeView() addSubview:cocoa_view_];
+ [cocoa_view_ setCloseOnDeactivate:YES];
+ [cocoa_view_ setCanBeKeyView:activatable_ ? YES : NO];
+
+ // TODO(avi):Why the hell are these screen coordinates? The Windows code calls
+ // ::MoveWindow() which indicates they should be local, but when running it I
+ // get global ones instead!
+
+ NSPoint global_origin = NSPointFromCGPoint(pos.origin().ToCGPoint());
+ global_origin.y = [[[cocoa_view_ window] screen] frame].size.height -
+ pos.height() - global_origin.y;
+ NSPoint window_origin =
+ [[cocoa_view_ window] convertScreenToBase:global_origin];
+ NSPoint view_origin =
+ [cocoa_view_ convertPoint:window_origin fromView:nil];
+ NSRect initial_frame = NSMakeRect(view_origin.x,
+ view_origin.y,
+ pos.width(),
+ pos.height());
+ [cocoa_view_ setFrame:initial_frame];
}
RenderWidgetHost* RenderWidgetHostViewMac::GetRenderWidgetHost() const {
@@ -97,9 +117,7 @@ void RenderWidgetHostViewMac::SetSize(const gfx::Size& size) {
}
gfx::NativeView RenderWidgetHostViewMac::GetPluginNativeView() {
- // All plugin stuff is TBD. TODO(avi,awalker): fill in
- // http://crbug.com/8192
- return nil;
+ return native_view();
}
void RenderWidgetHostViewMac::MovePluginWindows(
@@ -227,7 +245,17 @@ BackingStore* RenderWidgetHostViewMac::AllocBackingStore(
return new BackingStore(size);
}
+void RenderWidgetHostViewMac::KillSelf() {
+ if (shutdown_factory_.empty()) {
+ [cocoa_view_ setHidden:YES];
+ MessageLoop::current()->PostTask(FROM_HERE,
+ shutdown_factory_.NewRunnableMethod(
+ &RenderWidgetHostViewMac::ShutdownHost));
+ }
+}
+
void RenderWidgetHostViewMac::ShutdownHost() {
+ shutdown_factory_.RevokeAll();
render_widget_host_->Shutdown();
// Do not touch any members at this point, |this| has been deleted.
}
@@ -241,6 +269,8 @@ void RenderWidgetHostViewMac::ShutdownHost() {
self = [super initWithFrame:NSZeroRect];
if (self != nil) {
renderWidgetHostView_ = r;
+ canBeKeyView_ = YES;
+ closeOnDeactivate_ = NO;
}
return self;
}
@@ -251,12 +281,23 @@ void RenderWidgetHostViewMac::ShutdownHost() {
[super dealloc];
}
+- (void)setCanBeKeyView:(BOOL)can {
+ canBeKeyView_ = can;
+}
+
+- (void)setCloseOnDeactivate:(BOOL)b {
+ closeOnDeactivate_ = b;
+}
+
- (void)mouseEvent:(NSEvent *)theEvent {
WebMouseEvent event(theEvent, self);
renderWidgetHostView_->render_widget_host()->ForwardMouseEvent(event);
}
- (void)keyEvent:(NSEvent *)theEvent {
+ // TODO(avi): Possibly kill self? See RenderWidgetHostViewWin::OnKeyEvent and
+ // http://b/issue?id=1192881 .
+
NativeWebKeyboardEvent event(theEvent);
renderWidgetHostView_->render_widget_host()->ForwardKeyboardEvent(event);
}
@@ -339,11 +380,11 @@ void RenderWidgetHostViewMac::ShutdownHost() {
}
- (BOOL)canBecomeKeyView {
- return YES; // TODO(avi): be smarter
+ return canBeKeyView_;
}
- (BOOL)acceptsFirstResponder {
- return YES; // TODO(avi): be smarter
+ return canBeKeyView_;
}
- (BOOL)becomeFirstResponder {
@@ -353,6 +394,9 @@ void RenderWidgetHostViewMac::ShutdownHost() {
}
- (BOOL)resignFirstResponder {
+ if (closeOnDeactivate_)
+ renderWidgetHostView_->KillSelf();
+
renderWidgetHostView_->render_widget_host()->Blur();
return YES;