Chromium Code Reviews| 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_) |