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

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

Issue 2505113002: Drag-and-drop: Target drag messages to specific RenderWidgets. (Closed)
Patch Set: Small fix. Created 4 years, 1 month 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 dc643ee5836a2fa109f292b6e173076f5eef6d16..33eb38197875c695da52cb90e2df86b976af3a48 100644
--- a/content/browser/web_contents/web_contents_view_aura.cc
+++ b/content/browser/web_contents/web_contents_view_aura.cc
@@ -23,6 +23,7 @@
#include "content/browser/renderer_host/render_view_host_factory.h"
#include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
+#include "content/browser/renderer_host/render_widget_host_input_event_router.h"
#include "content/browser/renderer_host/render_widget_host_view_aura.h"
#include "content/browser/web_contents/aura/gesture_nav_simple.h"
#include "content/browser/web_contents/aura/overscroll_navigation_overlay.h"
@@ -513,8 +514,8 @@ WebContentsViewAura::WebContentsViewAura(WebContentsImpl* web_contents,
: web_contents_(web_contents),
delegate_(delegate),
current_drag_op_(blink::WebDragOperationNone),
- drag_dest_delegate_(NULL),
- current_rvh_for_drag_(NULL),
+ drag_dest_delegate_(nullptr),
+ current_rvh_for_drag_(nullptr),
current_overscroll_gesture_(OVERSCROLL_NONE),
completed_overscroll_gesture_(OVERSCROLL_NONE),
navigation_overlay_(nullptr),
@@ -559,10 +560,20 @@ void WebContentsViewAura::EndDrag(blink::WebDragOperationsMask ops) {
aura::client::ScreenPositionClient* screen_position_client =
aura::client::GetScreenPositionClient(window->GetRootWindow());
if (screen_position_client)
- screen_position_client->ConvertPointFromScreen(window, &client_loc);
+ screen_position_client->ConvertPointFromScreen(window, &client_loc);
- web_contents_->DragSourceEndedAt(client_loc.x(), client_loc.y(),
- screen_loc.x(), screen_loc.y(), ops);
+ if (!drag_start_rwh_)
+ return;
+
+ if (drag_start_rwh_.get() ==
+ web_contents_->GetRenderViewHost()->GetWidget()) {
+ web_contents_->DragSourceEndedAt(client_loc.x(), client_loc.x(),
+ screen_loc.x(), screen_loc.y(), ops);
+ }
+
+ // TODO(paulmeyer): In the OOPIF case, should |client_loc| be converted to the
+ // coordinates local to |drag_start_rwh_|? See crbug.com/647249.
+ drag_start_rwh_->DragSourceEndedAt(client_loc, screen_loc, ops);
dcheng 2016/11/20 20:03:46 As mentioned on the Mac CL, we should consolidate
}
void WebContentsViewAura::InstallOverscrollControllerDelegate(
@@ -879,13 +890,16 @@ void WebContentsViewAura::StartDragging(
blink::WebDragOperationsMask operations,
const gfx::ImageSkia& image,
const gfx::Vector2d& image_offset,
- const DragEventSourceInfo& event_info) {
+ const DragEventSourceInfo& event_info,
+ RenderWidgetHostImpl* source_rwh) {
aura::Window* root_window = GetNativeView()->GetRootWindow();
if (!aura::client::GetDragDropClient(root_window)) {
web_contents_->SystemDragEnded();
return;
}
+ drag_start_rwh_ = source_rwh->GetWeakPtr();
+
ui::TouchSelectionController* selection_controller = GetSelectionController();
if (selection_controller)
selection_controller->HideAndDisallowShowingAutomatically();
@@ -1108,18 +1122,17 @@ void WebContentsViewAura::OnMouseEvent(ui::MouseEvent* event) {
////////////////////////////////////////////////////////////////////////////////
// WebContentsViewAura, aura::client::DragDropDelegate implementation:
-// TODO(paulmeyer): The drag-and-drop calls on GetRenderViewHost()->GetWidget()
-// in the following functions will need to be targeted to specific
-// RenderWidgetHosts in order to work with OOPIFs. See crbug.com/647249.
-
void WebContentsViewAura::OnDragEntered(const ui::DropTargetEvent& event) {
+ gfx::Point transformed_pt;
+ current_rwh_for_drag_ =
+ web_contents_->GetInputEventRouter()->GetRenderWidgetHostAtPoint(
+ web_contents_->GetRenderViewHost()->GetWidget()->GetView(),
+ event.location(), &transformed_pt)->GetWeakPtr();
current_rvh_for_drag_ = web_contents_->GetRenderViewHost();
- current_drop_data_.reset(new DropData());
+ current_drop_data_.reset(new DropData());
PrepareDropData(current_drop_data_.get(), event.data());
-
- web_contents_->GetRenderViewHost()->GetWidget()->
- FilterDropData(current_drop_data_.get());
+ current_rwh_for_drag_->FilterDropData(current_drop_data_.get());
blink::WebDragOperationsMask op = ConvertToWeb(event.source_operations());
@@ -1135,8 +1148,8 @@ void WebContentsViewAura::OnDragEntered(const ui::DropTargetEvent& event) {
drag_dest_delegate_->DragInitialize(web_contents_);
gfx::Point screen_pt = display::Screen::GetScreen()->GetCursorScreenPoint();
- web_contents_->GetRenderViewHost()->GetWidget()->DragTargetDragEnter(
- *current_drop_data_, event.location(), screen_pt, op,
+ current_rwh_for_drag_->DragTargetDragEnter(
+ *current_drop_data_, transformed_pt, screen_pt, op,
ConvertAuraEventFlagsToWebInputEventModifiers(event.flags()));
if (drag_dest_delegate_) {
@@ -1146,17 +1159,25 @@ void WebContentsViewAura::OnDragEntered(const ui::DropTargetEvent& event) {
}
int WebContentsViewAura::OnDragUpdated(const ui::DropTargetEvent& event) {
- DCHECK(current_rvh_for_drag_);
- if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost())
+ gfx::Point transformed_pt;
+ RenderWidgetHostImpl* target_rwh =
+ web_contents_->GetInputEventRouter()->GetRenderWidgetHostAtPoint(
+ web_contents_->GetRenderViewHost()->GetWidget()->GetView(),
+ event.location(), &transformed_pt);
+
+ if (target_rwh != current_rwh_for_drag_.get()) {
+ if (current_rwh_for_drag_)
+ current_rwh_for_drag_->DragTargetDragLeave();
OnDragEntered(event);
dcheng 2016/11/20 20:03:46 And similarly, we need to figure out how to do thi
+ }
if (!current_drop_data_)
return ui::DragDropTypes::DRAG_NONE;
blink::WebDragOperationsMask op = ConvertToWeb(event.source_operations());
gfx::Point screen_pt = event.root_location();
- web_contents_->GetRenderViewHost()->GetWidget()->DragTargetDragOver(
- event.location(), screen_pt, op,
+ target_rwh->DragTargetDragOver(
+ transformed_pt, screen_pt, op,
ConvertAuraEventFlagsToWebInputEventModifiers(event.flags()));
if (drag_dest_delegate_)
@@ -1166,14 +1187,16 @@ int WebContentsViewAura::OnDragUpdated(const ui::DropTargetEvent& event) {
}
void WebContentsViewAura::OnDragExited() {
- DCHECK(current_rvh_for_drag_);
- if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost())
+ if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost() ||
+ !current_drop_data_) {
return;
+ }
- if (!current_drop_data_)
- return;
+ if (current_rwh_for_drag_) {
+ current_rwh_for_drag_->DragTargetDragLeave();
+ current_rwh_for_drag_.reset();
+ }
- web_contents_->GetRenderViewHost()->GetWidget()->DragTargetDragLeave();
if (drag_dest_delegate_)
drag_dest_delegate_->OnDragLeave();
@@ -1181,15 +1204,23 @@ void WebContentsViewAura::OnDragExited() {
}
int WebContentsViewAura::OnPerformDrop(const ui::DropTargetEvent& event) {
- DCHECK(current_rvh_for_drag_);
- if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost())
+ gfx::Point transformed_pt;
+ RenderWidgetHostImpl* target_rwh =
+ web_contents_->GetInputEventRouter()->GetRenderWidgetHostAtPoint(
+ web_contents_->GetRenderViewHost()->GetWidget()->GetView(),
+ event.location(), &transformed_pt);
+
+ if (target_rwh != current_rwh_for_drag_.get()) {
+ if (current_rwh_for_drag_)
+ current_rwh_for_drag_->DragTargetDragLeave();
OnDragEntered(event);
+ }
if (!current_drop_data_)
return ui::DragDropTypes::DRAG_NONE;
- web_contents_->GetRenderViewHost()->GetWidget()->DragTargetDrop(
- *current_drop_data_, event.location(),
+ target_rwh->DragTargetDrop(
+ *current_drop_data_, transformed_pt,
display::Screen::GetScreen()->GetCursorScreenPoint(),
ConvertAuraEventFlagsToWebInputEventModifiers(event.flags()));
if (drag_dest_delegate_)
« no previous file with comments | « content/browser/web_contents/web_contents_view_aura.h ('k') | content/browser/web_contents/web_contents_view_child_frame.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698