| Index: ui/base/dragdrop/os_exchange_data_provider_win.cc
|
| diff --git a/ui/base/dragdrop/os_exchange_data_provider_win.cc b/ui/base/dragdrop/os_exchange_data_provider_win.cc
|
| index 152808341783312f1e436fc2b41a4a825567ff13..7ee89f28c14c223d6c6e33aeaf2bcabd69d8b09f 100644
|
| --- a/ui/base/dragdrop/os_exchange_data_provider_win.cc
|
| +++ b/ui/base/dragdrop/os_exchange_data_provider_win.cc
|
| @@ -490,8 +490,10 @@ bool OSExchangeDataProviderWin::HasCustomFormat(CLIPFORMAT format) const {
|
|
|
| void OSExchangeDataProviderWin::SetDownloadFileInfo(
|
| const OSExchangeData::DownloadFileInfo& download) {
|
| - // If the filename is not provided, set stoarge to NULL to indicate that
|
| + // If the filename is not provided, set storage to NULL to indicate that
|
| // the delay rendering will be used.
|
| + // TODO(dcheng): Is it actually possible for filename to be empty here? I
|
| + // think we always synthesize one in WebContentsDragWin.
|
| STGMEDIUM* storage = NULL;
|
| if (!download.filename.empty())
|
| storage = GetStorageForFileName(download.filename);
|
| @@ -503,6 +505,10 @@ void OSExchangeDataProviderWin::SetDownloadFileInfo(
|
| data_->contents_.push_back(info);
|
| }
|
|
|
| +void OSExchangeDataProviderWin::SetInDragLoop(bool in_drag_loop) {
|
| + data_->set_in_drag_loop(in_drag_loop);
|
| +}
|
| +
|
| #if defined(USE_AURA)
|
|
|
| void OSExchangeDataProviderWin::SetDragImage(
|
| @@ -598,6 +604,7 @@ static void DuplicateMedium(CLIPFORMAT source_clipformat,
|
|
|
| DataObjectImpl::DataObjectImpl()
|
| : is_aborting_(false),
|
| + in_drag_loop_(false),
|
| in_async_mode_(false),
|
| async_operation_started_(false),
|
| observer_(NULL) {
|
| @@ -674,34 +681,19 @@ HRESULT DataObjectImpl::GetData(FORMATETC* format_etc, STGMEDIUM* medium) {
|
| if ((*iter)->medium) {
|
| DuplicateMedium((*iter)->format_etc.cfFormat, (*iter)->medium, medium);
|
| } else {
|
| - // Check if the left button is down.
|
| - bool is_left_button_down = (GetKeyState(VK_LBUTTON) & 0x8000) != 0;
|
| + // Fail all GetData() attempts for DownloadURL data if the drag and drop
|
| + // operation is still in progress.
|
| + if (in_drag_loop_)
|
| + return DV_E_FORMATETC;
|
|
|
| bool wait_for_data = false;
|
| - if ((*iter)->in_delay_rendering) {
|
| - // Make sure the left button is up. Sometimes the drop target, like
|
| - // Shell, might be too aggresive in calling GetData when the left
|
| - // button is not released.
|
| - if (is_left_button_down)
|
| - return DV_E_FORMATETC;
|
|
|
| - // In async mode, we do not want to start waiting for the data before
|
| - // the async operation is started. This is because we want to postpone
|
| - // until Shell kicks off a background thread to do the work so that
|
| - // we do not block the UI thread.
|
| - if (!in_async_mode_ || async_operation_started_)
|
| - wait_for_data = true;
|
| - } else {
|
| - // If the left button is up and the target has not requested the data
|
| - // yet, it probably means that the target does not support delay-
|
| - // rendering. So instead, we wait for the data.
|
| - if (is_left_button_down) {
|
| - (*iter)->in_delay_rendering = true;
|
| - memset(medium, 0, sizeof(STGMEDIUM));
|
| - } else {
|
| - wait_for_data = true;
|
| - }
|
| - }
|
| + // In async mode, we do not want to start waiting for the data before
|
| + // the async operation is started. This is because we want to postpone
|
| + // until Shell kicks off a background thread to do the work so that
|
| + // we do not block the UI thread.
|
| + if (!in_async_mode_ || async_operation_started_)
|
| + wait_for_data = true;
|
|
|
| if (!wait_for_data)
|
| return DV_E_FORMATETC;
|
| @@ -769,6 +761,8 @@ HRESULT DataObjectImpl::SetData(
|
| info->medium->tymed = format_etc->tymed;
|
| info->owns_medium = !!should_release;
|
| // Make newly added data appear first.
|
| + // TODO(dcheng): Make various setters agree whether elements should be
|
| + // prioritized from front to back or back to front.
|
| contents_.insert(contents_.begin(), info);
|
|
|
| return S_OK;
|
|
|