summaryrefslogtreecommitdiffstats
path: root/content/browser
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser')
-rw-r--r--content/browser/browser_plugin/browser_plugin_embedder.cc4
-rw-r--r--content/browser/browser_plugin/browser_plugin_embedder.h4
-rw-r--r--content/browser/browser_plugin/browser_plugin_guest.cc43
-rw-r--r--content/browser/browser_plugin/browser_plugin_guest.h2
-rw-r--r--content/browser/browser_plugin/browser_plugin_guest_manager.cc15
-rw-r--r--content/browser/browser_plugin/browser_plugin_guest_manager.h4
-rw-r--r--content/browser/browser_plugin/test_browser_plugin_guest.cc4
-rw-r--r--content/browser/renderer_host/render_widget_host_delegate.h3
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.cc2
-rw-r--r--content/browser/renderer_host/render_widget_host_view_guest.cc10
-rw-r--r--content/browser/web_contents/web_contents_impl.cc5
-rw-r--r--content/browser/web_contents/web_contents_impl.h1
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