diff options
author | avi@google.com <avi@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-26 18:05:19 +0000 |
---|---|---|
committer | avi@google.com <avi@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-26 18:05:19 +0000 |
commit | 47e4e1a0e7c75a188c7494643b8cc6258c405452 (patch) | |
tree | 2d1dcd5263f84c98663d4048c5211e762628e4ef /chrome/browser/renderer_host | |
parent | cea3dfdedf95788f9973bcce16fc9446e898af9e (diff) | |
download | chromium_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.h | 13 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_widget_host_view_mac.mm | 58 |
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; |