summaryrefslogtreecommitdiffstats
path: root/content/browser
diff options
context:
space:
mode:
authorkenrb <kenrb@chromium.org>2016-01-26 07:57:52 -0800
committerCommit bot <commit-bot@chromium.org>2016-01-26 15:59:12 +0000
commit015b5b5829406934f9863c73f931815ae5007e8f (patch)
tree873c69f58b119bdc94216f631eaf9d582b295979 /content/browser
parentf1edf87bbb67bc31fa9d280736753132fd81f103 (diff)
downloadchromium_src-015b5b5829406934f9863c73f931815ae5007e8f.zip
chromium_src-015b5b5829406934f9863c73f931815ae5007e8f.tar.gz
chromium_src-015b5b5829406934f9863c73f931815ae5007e8f.tar.bz2
Position autofill popup widgets correctly under --site-per-process
When a AutofillHostMsg_QueryFormFieldAutofill message is sent from an out-of-process iframe, its screen coordinates are relative to the subframe's rect and not the top-level frame's viewport. This CL exposes a facility in the content API to perform the necessary transformation, particularly: - it promotes GetView() from RenderFrameHostImpl to RenderFrameHost, so the RenderWidgetHostView becomes available to the embedder, and - it promotes TransformPointToRootCoordSpace from RenderWidgetHostViewBase to RenderWidgetHostView, so that chrome/ or components/ code that directly receives coordinates from a renderer process can ensure they properly transformed Finally, it causes the ContentAutofillDriver to use the exposed methods to transform received autofill popup coordinates in order for them to display in the correct position. BUG=554119 CQ_INCLUDE_TRYBOTS=tryserver.chromium.linux:linux_site_isolation Review URL: https://codereview.chromium.org/1526263003 Cr-Commit-Position: refs/heads/master@{#371519}
Diffstat (limited to 'content/browser')
-rw-r--r--content/browser/frame_host/cross_process_frame_connector.cc10
-rw-r--r--content/browser/frame_host/cross_process_frame_connector.h5
-rw-r--r--content/browser/frame_host/render_frame_host_impl.cc6
-rw-r--r--content/browser/frame_host/render_frame_host_impl.h4
-rw-r--r--content/browser/frame_host/render_widget_host_view_child_frame.cc11
-rw-r--r--content/browser/frame_host/render_widget_host_view_child_frame.h3
-rw-r--r--content/browser/renderer_host/render_widget_host_view_base.cc14
-rw-r--r--content/browser/renderer_host/render_widget_host_view_base.h15
8 files changed, 32 insertions, 36 deletions
diff --git a/content/browser/frame_host/cross_process_frame_connector.cc b/content/browser/frame_host/cross_process_frame_connector.cc
index 1d8b23c..fef7ff7 100644
--- a/content/browser/frame_host/cross_process_frame_connector.cc
+++ b/content/browser/frame_host/cross_process_frame_connector.cc
@@ -172,15 +172,15 @@ void CrossProcessFrameConnector::UpdateCursor(const WebCursor& cursor) {
root_view->UpdateCursor(cursor);
}
-void CrossProcessFrameConnector::TransformPointToRootCoordSpace(
+gfx::Point CrossProcessFrameConnector::TransformPointToRootCoordSpace(
const gfx::Point& point,
- cc::SurfaceId surface_id,
- gfx::Point* transformed_point) {
+ cc::SurfaceId surface_id) {
+ gfx::Point transformed_point = point;
RenderWidgetHostViewBase* root_view = GetRootRenderWidgetHostView();
- *transformed_point = point;
if (root_view)
root_view->TransformPointToLocalCoordSpace(point, surface_id,
- transformed_point);
+ &transformed_point);
+ return transformed_point;
}
bool CrossProcessFrameConnector::HasFocus() {
diff --git a/content/browser/frame_host/cross_process_frame_connector.h b/content/browser/frame_host/cross_process_frame_connector.h
index 6f31ec60..6ad56a2 100644
--- a/content/browser/frame_host/cross_process_frame_connector.h
+++ b/content/browser/frame_host/cross_process_frame_connector.h
@@ -101,9 +101,8 @@ class CONTENT_EXPORT CrossProcessFrameConnector {
float device_scale_factor() const { return device_scale_factor_; }
void GetScreenInfo(blink::WebScreenInfo* results);
void UpdateCursor(const WebCursor& cursor);
- void TransformPointToRootCoordSpace(const gfx::Point& point,
- cc::SurfaceId surface_id,
- gfx::Point* transformed_point);
+ gfx::Point TransformPointToRootCoordSpace(const gfx::Point& point,
+ cc::SurfaceId surface_id);
// Determines whether the root RenderWidgetHostView (and thus the current
// page) has focus.
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index b63e42f..4759476 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1327,9 +1327,9 @@ void RenderFrameHostImpl::OnContextMenu(const ContextMenuParams& params) {
// It is necessary to transform the coordinates to account for nested
// RenderWidgetHosts, such as with out-of-process iframes.
gfx::Point original_point(validated_params.x, validated_params.y);
- gfx::Point transformed_point = original_point;
- static_cast<RenderWidgetHostViewBase*>(GetView())
- ->TransformPointToRootCoordSpace(original_point, &transformed_point);
+ gfx::Point transformed_point =
+ static_cast<RenderWidgetHostViewBase*>(GetView())
+ ->TransformPointToRootCoordSpace(original_point);
validated_params.x = transformed_point.x();
validated_params.y = transformed_point.y();
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index abd5d53..61c61a3 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -168,6 +168,7 @@ class CONTENT_EXPORT RenderFrameHostImpl
void InsertVisualStateCallback(
const VisualStateCallback& callback) override;
bool IsRenderFrameLive() override;
+ RenderWidgetHostView* GetView() override;
#if defined(OS_ANDROID)
void ActivateNearestFindResult(int request_id, float x, float y) override;
void RequestFindMatchRects(int current_version) override;
@@ -251,9 +252,6 @@ class CONTENT_EXPORT RenderFrameHostImpl
// pointer to the RenderViewHost (which inherits RenderWidgetHost).
RenderWidgetHostImpl* GetRenderWidgetHost();
- // This returns the RenderWidgetHostView that can be used to control
- // focus and visibility for this frame.
- RenderWidgetHostView* GetView();
// This function is called when this is a swapped out RenderFrameHost that
// lives in the same process as the parent frame. The
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.cc b/content/browser/frame_host/render_widget_host_view_child_frame.cc
index 98119d1..10a0681 100644
--- a/content/browser/frame_host/render_widget_host_view_child_frame.cc
+++ b/content/browser/frame_host/render_widget_host_view_child_frame.cc
@@ -381,15 +381,12 @@ void RenderWidgetHostViewChildFrame::ProcessMouseWheelEvent(
host_->ForwardWheelEvent(event);
}
-void RenderWidgetHostViewChildFrame::TransformPointToRootCoordSpace(
- const gfx::Point& point,
- gfx::Point* transformed_point) {
- *transformed_point = point;
+gfx::Point RenderWidgetHostViewChildFrame::TransformPointToRootCoordSpace(
+ const gfx::Point& point) {
if (!frame_connector_ || !use_surfaces_)
- return;
+ return point;
- frame_connector_->TransformPointToRootCoordSpace(point, surface_id_,
- transformed_point);
+ return frame_connector_->TransformPointToRootCoordSpace(point, surface_id_);
}
#if defined(OS_MACOSX)
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.h b/content/browser/frame_host/render_widget_host_view_child_frame.h
index 4bacd21..c77b216 100644
--- a/content/browser/frame_host/render_widget_host_view_child_frame.h
+++ b/content/browser/frame_host/render_widget_host_view_child_frame.h
@@ -128,8 +128,7 @@ class CONTENT_EXPORT RenderWidgetHostViewChildFrame
void ProcessKeyboardEvent(const NativeWebKeyboardEvent& event) override;
void ProcessMouseEvent(const blink::WebMouseEvent& event) override;
void ProcessMouseWheelEvent(const blink::WebMouseWheelEvent& event) override;
- void TransformPointToRootCoordSpace(const gfx::Point& point,
- gfx::Point* transformed_point) override;
+ gfx::Point TransformPointToRootCoordSpace(const gfx::Point& point) override;
#if defined(OS_MACOSX)
// RenderWidgetHostView implementation.
diff --git a/content/browser/renderer_host/render_widget_host_view_base.cc b/content/browser/renderer_host/render_widget_host_view_base.cc
index a2a0884..3bd1ffc 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.cc
+++ b/content/browser/renderer_host/render_widget_host_view_base.cc
@@ -14,6 +14,7 @@
#include "content/common/content_switches_internal.h"
#include "content/public/browser/render_widget_host_view_frame_subscriber.h"
#include "ui/gfx/display.h"
+#include "ui/gfx/geometry/point_conversions.h"
#include "ui/gfx/geometry/size_conversions.h"
#include "ui/gfx/geometry/size_f.h"
#include "ui/gfx/screen.h"
@@ -682,10 +683,15 @@ uint32_t RenderWidgetHostViewBase::SurfaceIdNamespaceAtPoint(
return 0;
}
-void RenderWidgetHostViewBase::TransformPointToRootCoordSpace(
- const gfx::Point& point,
- gfx::Point* transformed_point) {
- *transformed_point = point;
+gfx::Point RenderWidgetHostViewBase::TransformPointToRootCoordSpace(
+ const gfx::Point& point) {
+ return point;
+}
+
+gfx::PointF RenderWidgetHostViewBase::TransformPointToRootCoordSpaceF(
+ const gfx::PointF& point) {
+ return gfx::PointF(TransformPointToRootCoordSpace(
+ gfx::ToRoundedPoint(point)));
}
void RenderWidgetHostViewBase::TransformPointToLocalCoordSpace(
diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h
index d714137..fa223b8 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.h
+++ b/content/browser/renderer_host/render_widget_host_view_base.h
@@ -88,6 +88,12 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView,
scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) override;
void EndFrameSubscription() override;
+ // This only needs to be overridden by RenderWidgetHostViewBase subclasses
+ // that handle content embedded within other RenderWidgetHostViews.
+ gfx::Point TransformPointToRootCoordSpace(const gfx::Point& point) override;
+ gfx::PointF TransformPointToRootCoordSpaceF(
+ const gfx::PointF& point) override;
+
// IPC::Listener implementation:
bool OnMessageReceived(const IPC::Message& msg) override;
@@ -204,15 +210,6 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView,
virtual void ProcessTouchEvent(const blink::WebTouchEvent& event,
const ui::LatencyInfo& latency) {}
- // If a RenderWidgetHost is dealing with points that are transformed from the
- // root frame for a page (i.e. because its content is contained within
- // that of another RenderWidgetHost), this provides a facility to convert
- // a point from its own coordinate space to that of the root frame.
- // This only needs to be overriden by RenderWidgetHostView subclasses
- // that handle content embedded within other RenderWidgetHostViews.
- virtual void TransformPointToRootCoordSpace(const gfx::Point& point,
- gfx::Point* transformed_point);
-
// Transform a point that is in the coordinate space of a Surface that is
// embedded within the RenderWidgetHostViewBase's Surface to the
// coordinate space of the embedding Surface. Typically this means that a