Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2408)

Unified Diff: content/browser/web_contents/web_contents_view_aura.cc

Issue 2655463015: Correctly set dragLeave and dragEnd coords for OOPIF drag and drop (Closed)
Patch Set: Added checks for null RWH on drag end Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/web_contents/web_contents_view_aura.cc
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc
index ab629389b8f6571681c4223d935dbad5d5bcc4a0..b9e17baec4a63ef759a4d82e1e21f39dfcdcbba1 100644
--- a/content/browser/web_contents/web_contents_view_aura.cc
+++ b/content/browser/web_contents/web_contents_view_aura.cc
@@ -582,10 +582,28 @@ void WebContentsViewAura::EndDrag(RenderWidgetHost* source_rwh,
if (screen_position_client)
screen_position_client->ConvertPointFromScreen(window, &client_loc);
- // TODO(paulmeyer): In the OOPIF case, should |client_loc| be converted to the
- // coordinates local to |source_rwh|? See crbug.com/647249.
- web_contents_->DragSourceEndedAt(client_loc.x(), client_loc.y(),
- screen_loc.x(), screen_loc.y(), ops,
+ // |client_loc| and |screen_loc| are in the root coordinate space, for
+ // non-root RenderWidgetHosts they need to be transformed.
+ gfx::Point transformed_point = client_loc;
+ gfx::Point transformed_screen_point = screen_loc;
+ if (source_rwh && web_contents_->GetRenderWidgetHostView()) {
+ static_cast<RenderWidgetHostViewBase*>(
+ web_contents_->GetRenderWidgetHostView())
+ ->TransformPointToCoordSpaceForView(
+ client_loc,
+ static_cast<RenderWidgetHostViewBase*>(source_rwh->GetView()),
+ &transformed_point);
+ static_cast<RenderWidgetHostViewBase*>(
+ web_contents_->GetRenderWidgetHostView())
+ ->TransformPointToCoordSpaceForView(
+ screen_loc,
+ static_cast<RenderWidgetHostViewBase*>(source_rwh->GetView()),
+ &transformed_screen_point);
+ }
+
+ web_contents_->DragSourceEndedAt(transformed_point.x(), transformed_point.y(),
+ transformed_screen_point.x(),
+ transformed_screen_point.y(), ops,
source_rwh);
web_contents_->SystemDragEnded(source_rwh);
@@ -1208,9 +1226,26 @@ int WebContentsViewAura::OnDragUpdated(const ui::DropTargetEvent& event) {
if (!IsValidDragTarget(target_rwh))
return ui::DragDropTypes::DRAG_NONE;
+ gfx::Point screen_pt = event.root_location();
if (target_rwh != current_rwh_for_drag_.get()) {
- if (current_rwh_for_drag_)
- current_rwh_for_drag_->DragTargetDragLeave();
+ if (current_rwh_for_drag_) {
+ gfx::Point transformed_leave_point = event.location();
+ gfx::Point transformed_screen_point = screen_pt;
+ static_cast<RenderWidgetHostViewBase*>(
+ web_contents_->GetRenderWidgetHostView())
+ ->TransformPointToCoordSpaceForView(
+ event.location(), static_cast<RenderWidgetHostViewBase*>(
+ current_rwh_for_drag_->GetView()),
+ &transformed_leave_point);
+ static_cast<RenderWidgetHostViewBase*>(
+ web_contents_->GetRenderWidgetHostView())
+ ->TransformPointToCoordSpaceForView(
+ screen_pt, static_cast<RenderWidgetHostViewBase*>(
+ current_rwh_for_drag_->GetView()),
+ &transformed_screen_point);
+ current_rwh_for_drag_->DragTargetDragLeave(transformed_leave_point,
+ transformed_screen_point);
+ }
OnDragEntered(event);
}
@@ -1218,7 +1253,6 @@ int WebContentsViewAura::OnDragUpdated(const ui::DropTargetEvent& event) {
return ui::DragDropTypes::DRAG_NONE;
blink::WebDragOperationsMask op = ConvertToWeb(event.source_operations());
- gfx::Point screen_pt = event.root_location();
target_rwh->DragTargetDragOver(
transformed_pt, screen_pt, op,
ConvertAuraEventFlagsToWebInputEventModifiers(event.flags()));
@@ -1237,7 +1271,7 @@ void WebContentsViewAura::OnDragExited() {
}
if (current_rwh_for_drag_) {
- current_rwh_for_drag_->DragTargetDragLeave();
+ current_rwh_for_drag_->DragTargetDragLeave(gfx::Point(), gfx::Point());
current_rwh_for_drag_.reset();
}
@@ -1257,9 +1291,10 @@ int WebContentsViewAura::OnPerformDrop(const ui::DropTargetEvent& event) {
if (!IsValidDragTarget(target_rwh))
return ui::DragDropTypes::DRAG_NONE;
+ gfx::Point screen_pt = display::Screen::GetScreen()->GetCursorScreenPoint();
if (target_rwh != current_rwh_for_drag_.get()) {
if (current_rwh_for_drag_)
- current_rwh_for_drag_->DragTargetDragLeave();
+ current_rwh_for_drag_->DragTargetDragLeave(transformed_pt, screen_pt);
OnDragEntered(event);
}
« no previous file with comments | « content/browser/web_contents/web_contents_view_android.cc ('k') | content/browser/web_contents/web_drag_dest_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698