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 709ea5dd5d1cbccdfe063040cbdc20419c3638c7..fa90e5e4b55a878e9a3b49667a6e762e121d2cb4 100644 |
| --- a/content/browser/web_contents/web_contents_view_aura.cc |
| +++ b/content/browser/web_contents/web_contents_view_aura.cc |
| @@ -6,6 +6,7 @@ |
| #include <stddef.h> |
| #include <stdint.h> |
| +#include <utility> |
|
Charlie Reis
2016/12/14 18:06:50
Might not need this if we use GlobalRoutingID.
|
| #include "base/auto_reset.h" |
| #include "base/command_line.h" |
| @@ -400,6 +401,10 @@ int ConvertAuraEventFlagsToWebInputEventModifiers(int aura_event_flags) { |
| return web_input_event_modifiers; |
| } |
| +std::pair<int, int> GetRenderViewHostID(RenderViewHost* rvh) { |
| + return std::make_pair(rvh->GetProcess()->GetID(), rvh->GetRoutingID()); |
| +} |
| + |
| } // namespace |
| class WebContentsViewAura::WindowObserver |
| @@ -515,7 +520,9 @@ WebContentsViewAura::WebContentsViewAura(WebContentsImpl* web_contents, |
| delegate_(delegate), |
| current_drag_op_(blink::WebDragOperationNone), |
| drag_dest_delegate_(nullptr), |
| - current_rvh_for_drag_(nullptr), |
| + current_rvh_for_drag_(-1, -1), |
|
lfg
2016/12/14 16:10:09
You should use kInvalidUniqueID for invalid proces
|
| + drag_source_rph_(-1), |
| + drag_source_rvh_(-1, -1), |
| current_overscroll_gesture_(OVERSCROLL_NONE), |
| completed_overscroll_gesture_(OVERSCROLL_NONE), |
| navigation_overlay_(nullptr), |
| @@ -552,6 +559,9 @@ void WebContentsViewAura::SizeChangedCommon(const gfx::Size& size) { |
| void WebContentsViewAura::EndDrag(RenderWidgetHost* source_rwh, |
| blink::WebDragOperationsMask ops) { |
| + drag_source_rph_ = -1; |
|
lfg
2016/12/14 16:10:09
kInvalidUniqueID
|
| + drag_source_rvh_ = std::make_pair(-1, -1); |
|
lfg
2016/12/14 16:10:09
kInvalidUniqueID, MSG_ROUTING_NONE.
|
| + |
| if (!web_contents_) |
| return; |
| @@ -563,8 +573,8 @@ 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 |drag_start_rwh_|? See crbug.com/647249. |
| + // 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, |
| source_rwh); |
| @@ -629,6 +639,13 @@ gfx::NativeView WebContentsViewAura::GetRenderWidgetHostViewParent() const { |
| return window_.get(); |
| } |
| +bool WebContentsViewAura::ValidDragTarget( |
| + RenderWidgetHostImpl* target_rwh) const { |
| + return target_rwh->GetProcess()->GetID() == drag_source_rph_ || |
|
Charlie Reis
2016/12/14 18:06:50
Please put a comment explaining what this is tryin
Charlie Reis
2016/12/14 18:36:36
I think you missed this comment, which I think is
paulmeyer
2016/12/14 18:53:18
Oh sorry, I meant to reply that the comment is alr
|
| + GetRenderViewHostID(web_contents_->GetRenderViewHost()) != |
| + drag_source_rvh_; |
| +} |
| + |
| //////////////////////////////////////////////////////////////////////////////// |
| // WebContentsViewAura, WebContentsView implementation: |
| @@ -907,6 +924,9 @@ void WebContentsViewAura::StartDragging( |
| base::WeakPtr<RenderWidgetHostImpl> source_rwh_weak_ptr = |
| source_rwh->GetWeakPtr(); |
| + drag_source_rph_ = source_rwh->GetProcess()->GetID(); |
| + drag_source_rvh_ = GetRenderViewHostID(web_contents_->GetRenderViewHost()); |
| + |
| ui::TouchSelectionController* selection_controller = GetSelectionController(); |
| if (selection_controller) |
| selection_controller->HideAndDisallowShowingAutomatically(); |
| @@ -1130,12 +1150,17 @@ void WebContentsViewAura::OnMouseEvent(ui::MouseEvent* event) { |
| void WebContentsViewAura::OnDragEntered(const ui::DropTargetEvent& event) { |
| gfx::Point transformed_pt; |
| - current_rwh_for_drag_ = |
| + RenderWidgetHostImpl* target_rwh = |
| web_contents_->GetInputEventRouter()->GetRenderWidgetHostAtPoint( |
| web_contents_->GetRenderViewHost()->GetWidget()->GetView(), |
| - event.location(), &transformed_pt)->GetWeakPtr(); |
| - current_rvh_for_drag_ = web_contents_->GetRenderViewHost(); |
| + event.location(), &transformed_pt); |
| + |
| + if (!ValidDragTarget(target_rwh)) |
| + return; |
| + current_rwh_for_drag_ = target_rwh->GetWeakPtr(); |
| + current_rvh_for_drag_ = |
| + GetRenderViewHostID(web_contents_->GetRenderViewHost()); |
| current_drop_data_.reset(new DropData()); |
| PrepareDropData(current_drop_data_.get(), event.data()); |
| current_rwh_for_drag_->FilterDropData(current_drop_data_.get()); |
| @@ -1171,6 +1196,9 @@ int WebContentsViewAura::OnDragUpdated(const ui::DropTargetEvent& event) { |
| web_contents_->GetRenderViewHost()->GetWidget()->GetView(), |
| event.location(), &transformed_pt); |
| + if (!ValidDragTarget(target_rwh)) |
| + return ui::DragDropTypes::DRAG_NONE; |
| + |
| if (target_rwh != current_rwh_for_drag_.get()) { |
| if (current_rwh_for_drag_) |
| current_rwh_for_drag_->DragTargetDragLeave(); |
| @@ -1193,7 +1221,8 @@ int WebContentsViewAura::OnDragUpdated(const ui::DropTargetEvent& event) { |
| } |
| void WebContentsViewAura::OnDragExited() { |
| - if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost() || |
| + if (current_rvh_for_drag_ != |
| + GetRenderViewHostID(web_contents_->GetRenderViewHost()) || |
| !current_drop_data_) { |
| return; |
| } |
| @@ -1216,6 +1245,9 @@ int WebContentsViewAura::OnPerformDrop(const ui::DropTargetEvent& event) { |
| web_contents_->GetRenderViewHost()->GetWidget()->GetView(), |
| event.location(), &transformed_pt); |
| + if (!ValidDragTarget(target_rwh)) |
| + return ui::DragDropTypes::DRAG_NONE; |
| + |
| if (target_rwh != current_rwh_for_drag_.get()) { |
| if (current_rwh_for_drag_) |
| current_rwh_for_drag_->DragTargetDragLeave(); |