diff options
Diffstat (limited to 'content/browser')
12 files changed, 81 insertions, 16 deletions
diff --git a/content/browser/browser_plugin/browser_plugin_embedder.cc b/content/browser/browser_plugin/browser_plugin_embedder.cc index 12de8ef..ba8b10a 100644 --- a/content/browser/browser_plugin/browser_plugin_embedder.cc +++ b/content/browser/browser_plugin/browser_plugin_embedder.cc @@ -75,6 +75,10 @@ void BrowserPluginEmbedder::GetRenderViewHostAtPosition( ++next_get_render_view_request_id_; } +void BrowserPluginEmbedder::DidSendScreenRects(RenderWidgetHostImpl* rwh) { + GetBrowserPluginGuestManager()->DidSendScreenRects(web_contents(), rwh); +} + void BrowserPluginEmbedder::RenderViewGone(base::TerminationStatus status) { CleanUp(); } diff --git a/content/browser/browser_plugin/browser_plugin_embedder.h b/content/browser/browser_plugin/browser_plugin_embedder.h index 1b6c8b2..3dbb3f3 100644 --- a/content/browser/browser_plugin/browser_plugin_embedder.h +++ b/content/browser/browser_plugin/browser_plugin_embedder.h @@ -33,6 +33,7 @@ namespace content { class BrowserPluginGuest; class BrowserPluginGuestManager; class BrowserPluginHostFactory; +class RenderWidgetHostImpl; class WebContentsImpl; class CONTENT_EXPORT BrowserPluginEmbedder : public WebContentsObserver { @@ -49,6 +50,9 @@ class CONTENT_EXPORT BrowserPluginEmbedder : public WebContentsObserver { int y, const WebContents::GetRenderViewHostCallback& callback); + // Called when embedder's |rwh| has sent screen rects to renderer. + void DidSendScreenRects(RenderWidgetHostImpl* rwh); + // Overrides factory for testing. Default (NULL) value indicates regular // (non-test) environment. static void set_factory_for_testing(BrowserPluginHostFactory* factory) { diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc index ea8ce65..d1c6caa 100644 --- a/content/browser/browser_plugin/browser_plugin_guest.cc +++ b/content/browser/browser_plugin/browser_plugin_guest.cc @@ -356,6 +356,7 @@ bool BrowserPluginGuest::OnMessageReceivedFromEmbedder( IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_Stop, OnStop) IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_TerminateGuest, OnTerminateGuest) IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_UnlockMouse_ACK, OnUnlockMouseAck) + IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_UpdateGeometry, OnUpdateGeometry) IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_UpdateRect_ACK, OnUpdateRectACK) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() @@ -367,6 +368,8 @@ void BrowserPluginGuest::Initialize( const BrowserPluginHostMsg_Attach_Params& params) { focused_ = params.focused; guest_visible_ = params.visible; + guest_window_rect_ = params.resize_guest_params.view_rect; + if (!params.name.empty()) name_ = params.name; auto_size_enabled_ = params.auto_size_params.enable; @@ -472,6 +475,13 @@ void BrowserPluginGuest::UpdateVisibility() { OnSetVisibility(instance_id_, visible()); } +// screen. +gfx::Rect BrowserPluginGuest::ToGuestRect(const gfx::Rect& bounds) { + gfx::Rect guest_rect(bounds); + guest_rect.Offset(guest_window_rect_.OffsetFromOrigin()); + return guest_rect; +} + void BrowserPluginGuest::Observe(int type, const NotificationSource& source, const NotificationDetails& details) { @@ -667,7 +677,7 @@ void BrowserPluginGuest::SetDamageBuffer( DCHECK(*static_cast<unsigned int*>(damage_buffer_->memory()) == 0xdeadbeef); damage_buffer_sequence_id_ = params.damage_buffer_sequence_id; damage_buffer_size_ = params.damage_buffer_size; - damage_view_size_ = params.view_size; + damage_view_size_ = params.view_rect.size(); damage_buffer_scale_factor_ = params.scale_factor; } @@ -972,6 +982,7 @@ bool BrowserPluginGuest::ShouldForwardToBrowserPluginGuest( case BrowserPluginHostMsg_Stop::ID: case BrowserPluginHostMsg_TerminateGuest::ID: case BrowserPluginHostMsg_UnlockMouse_ACK::ID: + case BrowserPluginHostMsg_UpdateGeometry::ID: case BrowserPluginHostMsg_UpdateRect_ACK::ID: return true; default: @@ -1251,16 +1262,16 @@ void BrowserPluginGuest::OnResizeGuest( // Invalid damage buffer means we are in HW compositing mode, // so just resize the WebContents and repaint if needed. if (!base::SharedMemory::IsHandleValid(params.damage_buffer_handle)) { - if (!params.view_size.IsEmpty()) - GetWebContents()->GetView()->SizeContents(params.view_size); + if (!params.view_rect.size().IsEmpty()) + GetWebContents()->GetView()->SizeContents(params.view_rect.size()); if (params.repaint) - Send(new ViewMsg_Repaint(routing_id(), params.view_size)); + Send(new ViewMsg_Repaint(routing_id(), params.view_rect.size())); return; } SetDamageBuffer(params); - GetWebContents()->GetView()->SizeContents(params.view_size); + GetWebContents()->GetView()->SizeContents(params.view_rect.size()); if (params.repaint) - Send(new ViewMsg_Repaint(routing_id(), params.view_size)); + Send(new ViewMsg_Repaint(routing_id(), params.view_rect.size())); } void BrowserPluginGuest::OnSetFocus(int instance_id, bool focused) { @@ -1304,7 +1315,7 @@ void BrowserPluginGuest::OnSetSize( Send(new ViewMsg_Repaint(routing_id(), max_auto_size_)); } else if (!auto_size_enabled_ && old_auto_size_enabled) { GetWebContents()->GetRenderViewHost()->DisableAutoResize( - resize_guest_params.view_size); + resize_guest_params.view_rect.size()); } OnResizeGuest(instance_id_, resize_guest_params); } @@ -1386,6 +1397,17 @@ void BrowserPluginGuest::OnUpdateRectACK( OnSetSize(instance_id_, auto_size_params, resize_guest_params); } +void BrowserPluginGuest::OnUpdateGeometry(int instance_id, + const gfx::Rect& view_rect) { + // The plugin has moved within the embedder without resizing or the + // embedder/container's view rect changing. + guest_window_rect_ = view_rect; + RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( + GetWebContents()->GetRenderViewHost()); + if (rvh) + rvh->SendScreenRects(); +} + void BrowserPluginGuest::OnHasTouchEventHandlers(bool accept) { SendMessageToEmbedder( new BrowserPluginMsg_ShouldAcceptTouchEvents(instance_id(), accept)); @@ -1415,9 +1437,7 @@ void BrowserPluginGuest::OnShowPopup( void BrowserPluginGuest::OnShowWidget(int route_id, const gfx::Rect& initial_pos) { - gfx::Rect screen_pos(initial_pos); - screen_pos.Offset(guest_screen_rect_.OffsetFromOrigin()); - GetWebContents()->ShowCreatedWidget(route_id, screen_pos); + GetWebContents()->ShowCreatedWidget(route_id, initial_pos); } void BrowserPluginGuest::OnTakeFocus(bool reverse) { @@ -1482,8 +1502,7 @@ void BrowserPluginGuest::OnUpdateRect( // The scaling change can happen due to asynchronous updates of the DPI on a // resolution change. if (((auto_size_enabled_ && InAutoSizeBounds(params.view_size)) || - (params.view_size.width() == damage_view_size().width() && - params.view_size.height() == damage_view_size().height())) && + (params.view_size == damage_view_size())) && params.scale_factor == damage_buffer_scale_factor()) { TransportDIB* dib = GetWebContents()->GetRenderProcessHost()-> GetTransportDIB(params.bitmap); diff --git a/content/browser/browser_plugin/browser_plugin_guest.h b/content/browser/browser_plugin/browser_plugin_guest.h index 155d9f3..a298922 100644 --- a/content/browser/browser_plugin/browser_plugin_guest.h +++ b/content/browser/browser_plugin/browser_plugin_guest.h @@ -254,6 +254,7 @@ class CONTENT_EXPORT BrowserPluginGuest // Returns whether BrowserPluginGuest is interested in receiving the given // |message|. static bool ShouldForwardToBrowserPluginGuest(const IPC::Message& message); + gfx::Rect ToGuestRect(const gfx::Rect& rect); void DragSourceEndedAt(int client_x, int client_y, int screen_x, int screen_y, WebKit::WebDragOperation operation); @@ -391,6 +392,7 @@ class CONTENT_EXPORT BrowserPluginGuest void OnTerminateGuest(int instance_id); void OnUnlockMouse(); void OnUnlockMouseAck(int instance_id); + void OnUpdateGeometry(int instance_id, const gfx::Rect& view_rect); void OnUpdateRectACK( int instance_id, const BrowserPluginHostMsg_AutoSize_Params& auto_size_params, diff --git a/content/browser/browser_plugin/browser_plugin_guest_manager.cc b/content/browser/browser_plugin/browser_plugin_guest_manager.cc index 081f332..1a33e9a 100644 --- a/content/browser/browser_plugin/browser_plugin_guest_manager.cc +++ b/content/browser/browser_plugin/browser_plugin_guest_manager.cc @@ -230,4 +230,19 @@ void BrowserPluginGuestManager::OnUnhandledSwapBuffersACK( sync_point); } +void BrowserPluginGuestManager::DidSendScreenRects( + WebContents* embedder_web_contents, RenderWidgetHostImpl* rwh) { + // TODO(lazyboy): Generalize iterating over guest instances and performing + // actions on the guests. + for (GuestInstanceMap::iterator it = + guest_web_contents_by_instance_id_.begin(); + it != guest_web_contents_by_instance_id_.end(); ++it) { + BrowserPluginGuest* guest = it->second->GetBrowserPluginGuest(); + if (embedder_web_contents == guest->embedder_web_contents()) { + static_cast<RenderViewHostImpl*>( + guest->GetWebContents()->GetRenderViewHost())->SendScreenRects(); + } + } +} + } // namespace content diff --git a/content/browser/browser_plugin/browser_plugin_guest_manager.h b/content/browser/browser_plugin/browser_plugin_guest_manager.h index 4e1ba28..f915362 100644 --- a/content/browser/browser_plugin/browser_plugin_guest_manager.h +++ b/content/browser/browser_plugin/browser_plugin_guest_manager.h @@ -31,6 +31,7 @@ namespace content { class BrowserPluginGuest; class BrowserPluginHostFactory; class RenderProcessHostImpl; +class RenderWidgetHostImpl; class SiteInstance; class WebContents; class WebContentsImpl; @@ -79,6 +80,9 @@ class CONTENT_EXPORT BrowserPluginGuestManager : bool CanEmbedderAccessInstanceIDMaybeKill(int embedder_render_process_id, int instance_id) const; + void DidSendScreenRects(WebContents* embedder_web_contents, + RenderWidgetHostImpl* rwh); + void OnMessageReceived(const IPC::Message& message, int render_process_id); private: diff --git a/content/browser/browser_plugin/test_browser_plugin_guest.cc b/content/browser/browser_plugin/test_browser_plugin_guest.cc index 083ea5a..5205752 100644 --- a/content/browser/browser_plugin/test_browser_plugin_guest.cc +++ b/content/browser/browser_plugin/test_browser_plugin_guest.cc @@ -265,10 +265,10 @@ void TestBrowserPluginGuest::OnStop(int instance_id) { void TestBrowserPluginGuest::SetDamageBuffer( const BrowserPluginHostMsg_ResizeGuest_Params& params) { ++damage_buffer_call_count_; - last_damage_buffer_size_ = params.view_size; + last_damage_buffer_size_ = params.view_rect.size(); if (waiting_for_damage_buffer_with_size_ && - expected_damage_buffer_size_ == params.view_size && + expected_damage_buffer_size_ == params.view_rect.size() && damage_buffer_message_loop_runner_) { damage_buffer_message_loop_runner_->Quit(); waiting_for_damage_buffer_with_size_ = false; diff --git a/content/browser/renderer_host/render_widget_host_delegate.h b/content/browser/renderer_host/render_widget_host_delegate.h index fa41727..9e8d36e 100644 --- a/content/browser/renderer_host/render_widget_host_delegate.h +++ b/content/browser/renderer_host/render_widget_host_delegate.h @@ -46,6 +46,9 @@ class CONTENT_EXPORT RenderWidgetHostDelegate { // Returns true if the |event| was handled. virtual bool PreHandleWheelEvent(const WebKit::WebMouseWheelEvent& event); + // Notifies that screen rects were sent to renderer process. + virtual void DidSendScreenRects(RenderWidgetHostImpl* rwh) {} + #if defined(OS_WIN) && defined(USE_AURA) // Returns the widget's parent's NativeViewAccessible. virtual gfx::NativeViewAccessible GetParentNativeViewAccessible(); diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 5c09f18..87d8aa0 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc @@ -318,6 +318,8 @@ void RenderWidgetHostImpl::SendScreenRects() { last_window_screen_rect_ = view_->GetBoundsInRootWindow(); Send(new ViewMsg_UpdateScreenRects( GetRoutingID(), last_view_screen_rect_, last_window_screen_rect_)); + if (delegate_) + delegate_->DidSendScreenRects(this); waiting_for_screen_rects_ack_ = true; } diff --git a/content/browser/renderer_host/render_widget_host_view_guest.cc b/content/browser/renderer_host/render_widget_host_view_guest.cc index 6f02367..2e00453 100644 --- a/content/browser/renderer_host/render_widget_host_view_guest.cc +++ b/content/browser/renderer_host/render_widget_host_view_guest.cc @@ -81,7 +81,8 @@ void RenderWidgetHostViewGuest::SetSize(const gfx::Size& size) { } gfx::Rect RenderWidgetHostViewGuest::GetBoundsInRootWindow() { - return gfx::Rect(size_); + // We do not have any root window specific parts in this view. + return GetViewBounds(); } gfx::GLSurfaceHandle RenderWidgetHostViewGuest::GetCompositingSurface() { @@ -125,7 +126,12 @@ bool RenderWidgetHostViewGuest::IsShowing() { } gfx::Rect RenderWidgetHostViewGuest::GetViewBounds() const { - return gfx::Rect(size_); + gfx::Rect embedder_bounds = static_cast<RenderWidgetHostViewPort*>( + guest_->GetEmbedderRenderWidgetHostView())->GetViewBounds(); + gfx::Rect shifted_rect = guest_->ToGuestRect(embedder_bounds); + shifted_rect.set_width(size_.width()); + shifted_rect.set_height(size_.height()); + return shifted_rect; } void RenderWidgetHostViewGuest::RenderViewGone(base::TerminationStatus status, diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 4969576..d8e4d6e2 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -1596,6 +1596,11 @@ void WebContentsImpl::RequestMediaAccessPermission( callback.Run(MediaStreamDevices(), scoped_ptr<MediaStreamUI>()); } +void WebContentsImpl::DidSendScreenRects(RenderWidgetHostImpl* rwh) { + if (browser_plugin_embedder_) + browser_plugin_embedder_->DidSendScreenRects(rwh); +} + void WebContentsImpl::UpdatePreferredSize(const gfx::Size& pref_size) { preferred_size_ = pref_size; if (delegate_) diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 3cca074..529b363 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h @@ -448,6 +448,7 @@ class CONTENT_EXPORT WebContentsImpl const NativeWebKeyboardEvent& event) OVERRIDE; virtual bool PreHandleWheelEvent( const WebKit::WebMouseWheelEvent& event) OVERRIDE; + virtual void DidSendScreenRects(RenderWidgetHostImpl* rwh) OVERRIDE; #if defined(OS_WIN) && defined(USE_AURA) virtual gfx::NativeViewAccessible GetParentNativeViewAccessible() OVERRIDE; #endif |