summaryrefslogtreecommitdiffstats
path: root/chromium/content/browser/web_contents/web_drag_dest_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/web_contents/web_drag_dest_win.cc')
-rw-r--r--chromium/content/browser/web_contents/web_drag_dest_win.cc286
1 files changed, 0 insertions, 286 deletions
diff --git a/chromium/content/browser/web_contents/web_drag_dest_win.cc b/chromium/content/browser/web_contents/web_drag_dest_win.cc
deleted file mode 100644
index e497f860d65..00000000000
--- a/chromium/content/browser/web_contents/web_drag_dest_win.cc
+++ /dev/null
@@ -1,286 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/web_contents/web_drag_dest_win.h"
-
-#include <windows.h>
-#include <shlobj.h>
-
-#include "base/win/win_util.h"
-#include "content/browser/renderer_host/render_view_host_impl.h"
-#include "content/browser/web_contents/web_drag_utils_win.h"
-#include "content/public/browser/web_contents.h"
-#include "content/public/browser/web_contents_delegate.h"
-#include "content/public/browser/web_drag_dest_delegate.h"
-#include "content/public/common/drop_data.h"
-#include "net/base/net_util.h"
-#include "third_party/WebKit/public/web/WebInputEvent.h"
-#include "ui/base/clipboard/clipboard_util_win.h"
-#include "ui/base/dragdrop/os_exchange_data.h"
-#include "ui/base/dragdrop/os_exchange_data_provider_win.h"
-#include "ui/base/window_open_disposition.h"
-#include "ui/gfx/point.h"
-#include "url/gurl.h"
-
-using blink::WebDragOperationNone;
-using blink::WebDragOperationCopy;
-using blink::WebDragOperationLink;
-using blink::WebDragOperationMove;
-using blink::WebDragOperationGeneric;
-
-namespace content {
-namespace {
-
-const unsigned short kHighBitMaskShort = 0x8000;
-
-// A helper method for getting the preferred drop effect.
-DWORD GetPreferredDropEffect(DWORD effect) {
- if (effect & DROPEFFECT_COPY)
- return DROPEFFECT_COPY;
- if (effect & DROPEFFECT_LINK)
- return DROPEFFECT_LINK;
- if (effect & DROPEFFECT_MOVE)
- return DROPEFFECT_MOVE;
- return DROPEFFECT_NONE;
-}
-
-int GetModifierFlags() {
- int modifier_state = 0;
- if (base::win::IsShiftPressed())
- modifier_state |= blink::WebInputEvent::ShiftKey;
- if (base::win::IsCtrlPressed())
- modifier_state |= blink::WebInputEvent::ControlKey;
- if (base::win::IsAltPressed())
- modifier_state |= blink::WebInputEvent::AltKey;
- if (::GetKeyState(VK_LWIN) & kHighBitMaskShort)
- modifier_state |= blink::WebInputEvent::MetaKey;
- if (::GetKeyState(VK_RWIN) & kHighBitMaskShort)
- modifier_state |= blink::WebInputEvent::MetaKey;
- return modifier_state;
-}
-
-// Helper method for converting Window's specific IDataObject to a DropData
-// object.
-void PopulateDropData(IDataObject* data_object, DropData* drop_data) {
- base::string16 url_str;
- if (ui::ClipboardUtil::GetUrl(
- data_object, &url_str, &drop_data->url_title, false)) {
- GURL test_url(url_str);
- if (test_url.is_valid())
- drop_data->url = test_url;
- }
- std::vector<base::string16> filenames;
- ui::ClipboardUtil::GetFilenames(data_object, &filenames);
- for (size_t i = 0; i < filenames.size(); ++i)
- drop_data->filenames.push_back(
- DropData::FileInfo(filenames[i], base::string16()));
- base::string16 text;
- ui::ClipboardUtil::GetPlainText(data_object, &text);
- if (!text.empty()) {
- drop_data->text = base::NullableString16(text, false);
- }
- base::string16 html;
- std::string html_base_url;
- ui::ClipboardUtil::GetHtml(data_object, &html, &html_base_url);
- if (!html.empty()) {
- drop_data->html = base::NullableString16(html, false);
- }
- if (!html_base_url.empty()) {
- drop_data->html_base_url = GURL(html_base_url);
- }
- ui::ClipboardUtil::GetWebCustomData(data_object, &drop_data->custom_data);
-}
-
-} // namespace
-
-// InterstitialDropTarget is like a ui::DropTargetWin implementation that
-// WebDragDest passes through to if an interstitial is showing. Rather than
-// passing messages on to the renderer, we just check to see if there's a link
-// in the drop data and handle links as navigations.
-class InterstitialDropTarget {
- public:
- explicit InterstitialDropTarget(WebContents* web_contents)
- : web_contents_(web_contents) {}
-
- DWORD OnDragEnter(IDataObject* data_object, DWORD effect) {
- return ui::ClipboardUtil::HasUrl(data_object) ?
- GetPreferredDropEffect(effect) : DROPEFFECT_NONE;
- }
-
- DWORD OnDragOver(IDataObject* data_object, DWORD effect) {
- return ui::ClipboardUtil::HasUrl(data_object) ?
- GetPreferredDropEffect(effect) : DROPEFFECT_NONE;
- }
-
- void OnDragLeave(IDataObject* data_object) {
- }
-
- DWORD OnDrop(IDataObject* data_object, DWORD effect) {
- if (!ui::ClipboardUtil::HasUrl(data_object))
- return DROPEFFECT_NONE;
-
- std::wstring url;
- std::wstring title;
- ui::ClipboardUtil::GetUrl(data_object, &url, &title, true);
- OpenURLParams params(GURL(url), Referrer(), CURRENT_TAB,
- PAGE_TRANSITION_AUTO_BOOKMARK, false);
- web_contents_->OpenURL(params);
- return GetPreferredDropEffect(effect);
- }
-
- private:
- WebContents* web_contents_;
-
- DISALLOW_COPY_AND_ASSIGN(InterstitialDropTarget);
-};
-
-WebDragDest::WebDragDest(HWND source_hwnd, WebContents* web_contents)
- : ui::DropTargetWin(source_hwnd),
- web_contents_(web_contents),
- current_rvh_(NULL),
- drag_cursor_(WebDragOperationNone),
- interstitial_drop_target_(new InterstitialDropTarget(web_contents)),
- delegate_(NULL),
- canceled_(false) {
-}
-
-WebDragDest::~WebDragDest() {
-}
-
-DWORD WebDragDest::OnDragEnter(IDataObject* data_object,
- DWORD key_state,
- POINT cursor_position,
- DWORD effects) {
- current_rvh_ = web_contents_->GetRenderViewHost();
-
- // TODO(tc): PopulateDropData can be slow depending on what is in the
- // IDataObject. Maybe we can do this in a background thread.
- scoped_ptr<DropData> drop_data;
- drop_data.reset(new DropData());
- PopulateDropData(data_object, drop_data.get());
-
- if (drop_data->url.is_empty())
- ui::OSExchangeDataProviderWin::GetPlainTextURL(data_object,
- &drop_data->url);
-
- // Give the delegate an opportunity to cancel the drag.
- canceled_ = !web_contents_->GetDelegate()->CanDragEnter(
- web_contents_,
- *drop_data,
- WinDragOpMaskToWebDragOpMask(effects));
- if (canceled_)
- return DROPEFFECT_NONE;
-
- if (delegate_)
- delegate_->DragInitialize(web_contents_);
-
- // Don't pass messages to the renderer if an interstitial page is showing
- // because we don't want the interstitial page to navigate. Instead,
- // pass the messages on to a separate interstitial DropTarget handler.
- if (web_contents_->ShowingInterstitialPage())
- return interstitial_drop_target_->OnDragEnter(data_object, effects);
-
- drop_data_.swap(drop_data);
- drag_cursor_ = WebDragOperationNone;
-
- POINT client_pt = cursor_position;
- ScreenToClient(GetHWND(), &client_pt);
- web_contents_->GetRenderViewHost()->DragTargetDragEnter(*drop_data_,
- gfx::Point(client_pt.x, client_pt.y),
- gfx::Point(cursor_position.x, cursor_position.y),
- WinDragOpMaskToWebDragOpMask(effects),
- GetModifierFlags());
-
- if (delegate_)
- delegate_->OnDragEnter(data_object);
-
- // We lie here and always return a DROPEFFECT because we don't want to
- // wait for the IPC call to return.
- return WebDragOpToWinDragOp(drag_cursor_);
-}
-
-DWORD WebDragDest::OnDragOver(IDataObject* data_object,
- DWORD key_state,
- POINT cursor_position,
- DWORD effects) {
- DCHECK(current_rvh_);
- if (current_rvh_ != web_contents_->GetRenderViewHost())
- OnDragEnter(data_object, key_state, cursor_position, effects);
-
- if (canceled_)
- return DROPEFFECT_NONE;
-
- if (web_contents_->ShowingInterstitialPage())
- return interstitial_drop_target_->OnDragOver(data_object, effects);
-
- POINT client_pt = cursor_position;
- ScreenToClient(GetHWND(), &client_pt);
- web_contents_->GetRenderViewHost()->DragTargetDragOver(
- gfx::Point(client_pt.x, client_pt.y),
- gfx::Point(cursor_position.x, cursor_position.y),
- WinDragOpMaskToWebDragOpMask(effects),
- GetModifierFlags());
-
- if (delegate_)
- delegate_->OnDragOver(data_object);
-
- return WebDragOpToWinDragOp(drag_cursor_);
-}
-
-void WebDragDest::OnDragLeave(IDataObject* data_object) {
- DCHECK(current_rvh_);
- if (current_rvh_ != web_contents_->GetRenderViewHost())
- return;
-
- if (canceled_)
- return;
-
- if (web_contents_->ShowingInterstitialPage()) {
- interstitial_drop_target_->OnDragLeave(data_object);
- } else {
- web_contents_->GetRenderViewHost()->DragTargetDragLeave();
- }
-
- if (delegate_)
- delegate_->OnDragLeave(data_object);
-
- drop_data_.reset();
-}
-
-DWORD WebDragDest::OnDrop(IDataObject* data_object,
- DWORD key_state,
- POINT cursor_position,
- DWORD effect) {
- DCHECK(current_rvh_);
- if (current_rvh_ != web_contents_->GetRenderViewHost())
- OnDragEnter(data_object, key_state, cursor_position, effect);
-
- if (web_contents_->ShowingInterstitialPage())
- interstitial_drop_target_->OnDragOver(data_object, effect);
-
- if (web_contents_->ShowingInterstitialPage())
- return interstitial_drop_target_->OnDrop(data_object, effect);
-
- POINT client_pt = cursor_position;
- ScreenToClient(GetHWND(), &client_pt);
- web_contents_->GetRenderViewHost()->DragTargetDrop(
- gfx::Point(client_pt.x, client_pt.y),
- gfx::Point(cursor_position.x, cursor_position.y),
- GetModifierFlags());
-
- if (delegate_)
- delegate_->OnDrop(data_object);
-
- current_rvh_ = NULL;
-
- // This isn't always correct, but at least it's a close approximation.
- // For now, we always map a move to a copy to prevent potential data loss.
- DWORD drop_effect = WebDragOpToWinDragOp(drag_cursor_);
- DWORD result = drop_effect != DROPEFFECT_MOVE ? drop_effect : DROPEFFECT_COPY;
-
- drop_data_.reset();
- return result;
-}
-
-} // namespace content