From c30a6232df03e1efbd9f3b226777b07e087a1122 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 12 Oct 2020 14:27:29 +0200 Subject: BASELINE: Update Chromium to 85.0.4183.140 Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057 Reviewed-by: Allan Sandfeld Jensen --- chromium/components/exo/data_device.cc | 71 ++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 16 deletions(-) (limited to 'chromium/components/exo/data_device.cc') diff --git a/chromium/components/exo/data_device.cc b/chromium/components/exo/data_device.cc index e93d7352196..4682130192f 100644 --- a/chromium/components/exo/data_device.cc +++ b/chromium/components/exo/data_device.cc @@ -4,6 +4,7 @@ #include "components/exo/data_device.h" +#include "base/run_loop.h" #include "components/exo/data_device_delegate.h" #include "components/exo/data_offer.h" #include "components/exo/data_source.h" @@ -16,10 +17,34 @@ namespace exo { +namespace { + +constexpr base::TimeDelta kDataOfferDestructionTimeout = + base::TimeDelta::FromMilliseconds(1000); + +ui::DragDropTypes::DragOperation DndActionToDragOperation( + DndAction dnd_action) { + switch (dnd_action) { + case DndAction::kMove: + return ui::DragDropTypes::DRAG_MOVE; + case DndAction::kCopy: + return ui::DragDropTypes::DRAG_COPY; + case DndAction::kAsk: + return ui::DragDropTypes::DRAG_LINK; + case DndAction::kNone: + return ui::DragDropTypes::DRAG_NONE; + } +} + +} // namespace + DataDevice::DataDevice(DataDeviceDelegate* delegate, Seat* seat, FileHelper* file_helper) - : delegate_(delegate), seat_(seat), file_helper_(file_helper) { + : delegate_(delegate), + seat_(seat), + file_helper_(file_helper), + drop_succeeded_(false) { WMHelper::GetInstance()->AddDragDropObserver(this); ui::ClipboardMonitor::GetInstance()->AddObserver(this); @@ -44,8 +69,7 @@ void DataDevice::StartDrag(DataSource* source, seat_->StartDrag(source, origin, icon, event_source); } -void DataDevice::SetSelection(DataSource* source, uint32_t serial) { - // TODO(hirono): Check if serial is valid. crbug.com/746111 +void DataDevice::SetSelection(DataSource* source) { seat_->SetSelection(source); } @@ -83,16 +107,7 @@ int DataDevice::OnDragUpdated(const ui::DropTargetEvent& event) { // TODO(hirono): dnd_action() here may not be updated. Chrome needs to provide // a way to update DND action asynchronously. - switch (data_offer_->get()->dnd_action()) { - case DndAction::kMove: - return ui::DragDropTypes::DRAG_MOVE; - case DndAction::kCopy: - return ui::DragDropTypes::DRAG_COPY; - case DndAction::kAsk: - return ui::DragDropTypes::DRAG_LINK; - case DndAction::kNone: - return ui::DragDropTypes::DRAG_NONE; - } + return DndActionToDragOperation(data_offer_->get()->dnd_action()); } void DataDevice::OnDragExited() { @@ -107,9 +122,29 @@ int DataDevice::OnPerformDrop(const ui::DropTargetEvent& event) { if (!data_offer_) return ui::DragDropTypes::DRAG_NONE; + DndAction dnd_action = data_offer_->get()->dnd_action(); + delegate_->OnDrop(); - data_offer_.reset(); - return ui::DragDropTypes::DRAG_NONE; + + // TODO(tetsui): Avoid using nested loop by adding asynchronous callback to + // aura::client::DragDropDelegate. + base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed); + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, run_loop.QuitClosure(), kDataOfferDestructionTimeout); + quit_closure_ = run_loop.QuitClosure(); + run_loop.Run(); + + if (quit_closure_) { + // DataOffer not destroyed by the client until the timeout. + quit_closure_.Reset(); + data_offer_.reset(); + drop_succeeded_ = false; + } + + if (!drop_succeeded_) + return ui::DragDropTypes::DRAG_NONE; + + return DndActionToDragOperation(dnd_action); } void DataDevice::OnClipboardDataChanged() { @@ -140,8 +175,12 @@ void DataDevice::OnSurfaceFocusing(Surface* surface) { void DataDevice::OnSurfaceFocused(Surface* surface) {} void DataDevice::OnDataOfferDestroying(DataOffer* data_offer) { - if (data_offer_ && data_offer_->get() == data_offer) + if (data_offer_ && data_offer_->get() == data_offer) { + drop_succeeded_ = data_offer_->get()->finished(); + if (quit_closure_) + std::move(quit_closure_).Run(); data_offer_.reset(); + } } void DataDevice::OnSurfaceDestroying(Surface* surface) { -- cgit v1.2.1