Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2329)

Unified Diff: webkit/glue/webview_impl.cc

Issue 174364: Plumb the DragOperation through all the layers between the platform DnD code ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/glue/webview_impl.h ('k') | webkit/tools/layout_tests/test_expectations.txt » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/glue/webview_impl.cc
===================================================================
--- webkit/glue/webview_impl.cc (revision 25321)
+++ webkit/glue/webview_impl.cc (working copy)
@@ -101,6 +101,10 @@
using WebKit::WebCompositionCommandConfirm;
using WebKit::WebCompositionCommandDiscard;
using WebKit::WebDragData;
+using WebKit::WebDragOperation;
+using WebKit::WebDragOperationCopy;
+using WebKit::WebDragOperationNone;
+using WebKit::WebDragOperationsMask;
using WebKit::WebFrame;
using WebKit::WebInputEvent;
using WebKit::WebKeyboardEvent;
@@ -133,10 +137,19 @@
// one page group.
static const char* kPageGroupName = "default";
-// The webcore drag operation type when something is trying to be dropped on
-// the webview. These values are taken from Apple's windows port.
-static const WebCore::DragOperation kDropTargetOperation =
- static_cast<WebCore::DragOperation>(DragOperationCopy | DragOperationLink);
+// Ensure that the WebKit::WebDragOperation enum values stay in sync with
+// the original WebCore::DragOperation constants.
+#define COMPILE_ASSERT_MATCHING_ENUM(webcore_name) \
+ COMPILE_ASSERT(int(WebCore::webcore_name) == int(WebKit::Web##webcore_name),\
+ dummy##webcore_name)
+COMPILE_ASSERT_MATCHING_ENUM(DragOperationNone);
+COMPILE_ASSERT_MATCHING_ENUM(DragOperationCopy);
+COMPILE_ASSERT_MATCHING_ENUM(DragOperationLink);
+COMPILE_ASSERT_MATCHING_ENUM(DragOperationGeneric);
+COMPILE_ASSERT_MATCHING_ENUM(DragOperationPrivate);
+COMPILE_ASSERT_MATCHING_ENUM(DragOperationMove);
+COMPILE_ASSERT_MATCHING_ENUM(DragOperationDelete);
+COMPILE_ASSERT_MATCHING_ENUM(DragOperationEvery);
// AutocompletePopupMenuClient
class AutocompletePopupMenuClient : public WebCore::PopupMenuClient {
@@ -379,7 +392,8 @@
drag_target_dispatch_(false),
drag_identity_(0),
drop_effect_(DROP_EFFECT_DEFAULT),
- drop_accept_(false),
+ operations_allowed_(WebKit::WebDragOperationNone),
+ drag_operation_(WebKit::WebDragOperationNone),
autocomplete_popup_showing_(false),
is_transparent_(false) {
// WebKit/win/WebView.cpp does the same thing, except they call the
@@ -1499,24 +1513,16 @@
page_->inspectorController()->showPanel(InspectorController::ConsolePanel);
}
-void WebViewImpl::DragSourceCancelledAt(
- const WebPoint& client_point,
- const WebPoint& screen_point) {
- PlatformMouseEvent pme(webkit_glue::WebPointToIntPoint(client_point),
- webkit_glue::WebPointToIntPoint(screen_point),
- NoButton, MouseEventMoved, 0, false, false, false,
- false, 0);
- page_->mainFrame()->eventHandler()->dragSourceEndedAt(pme, DragOperationNone);
-}
-
void WebViewImpl::DragSourceEndedAt(
const WebPoint& client_point,
- const WebPoint& screen_point) {
+ const WebPoint& screen_point,
+ WebDragOperation operation) {
PlatformMouseEvent pme(webkit_glue::WebPointToIntPoint(client_point),
webkit_glue::WebPointToIntPoint(screen_point),
LeftButton, MouseEventMoved, 0, false, false, false,
false, 0);
- page_->mainFrame()->eventHandler()->dragSourceEndedAt(pme, DragOperationCopy);
+ page_->mainFrame()->eventHandler()->dragSourceEndedAt(pme,
+ static_cast<WebCore::DragOperation>(operation));
}
void WebViewImpl::DragSourceMovedTo(
@@ -1538,52 +1544,70 @@
}
}
-bool WebViewImpl::DragTargetDragEnter(
+WebDragOperation WebViewImpl::DragTargetDragEnter(
const WebDragData& web_drag_data,
int identity,
const WebPoint& client_point,
- const WebPoint& screen_point) {
+ const WebPoint& screen_point,
+ WebDragOperation operations_allowed) {
DCHECK(!current_drag_data_.get());
current_drag_data_ =
webkit_glue::WebDragDataToChromiumDataObject(web_drag_data);
drag_identity_ = identity;
+ operations_allowed_ = operations_allowed;
DragData drag_data(
current_drag_data_.get(),
webkit_glue::WebPointToIntPoint(client_point),
webkit_glue::WebPointToIntPoint(screen_point),
- kDropTargetOperation);
+ static_cast<WebCore::DragOperation>(operations_allowed));
drop_effect_ = DROP_EFFECT_DEFAULT;
drag_target_dispatch_ = true;
DragOperation effect = page_->dragController()->dragEntered(&drag_data);
+ // Mask the operation against the drag source's allowed operations.
+ if ((effect & drag_data.draggingSourceOperationMask()) != effect) {
+ effect = DragOperationNone;
+ }
drag_target_dispatch_ = false;
if (drop_effect_ != DROP_EFFECT_DEFAULT)
- return drop_accept_ = (drop_effect_ != DROP_EFFECT_NONE);
- return drop_accept_ = (effect != DragOperationNone);
+ drag_operation_ = (drop_effect_ != DROP_EFFECT_NONE) ?
+ WebDragOperationCopy : WebDragOperationNone;
+ else
+ drag_operation_ = static_cast<WebDragOperation>(effect);
+ return drag_operation_;
}
-bool WebViewImpl::DragTargetDragOver(
+WebDragOperation WebViewImpl::DragTargetDragOver(
const WebPoint& client_point,
- const WebPoint& screen_point) {
+ const WebPoint& screen_point,
+ WebDragOperation operations_allowed) {
DCHECK(current_drag_data_.get());
+ operations_allowed_ = operations_allowed;
DragData drag_data(
current_drag_data_.get(),
webkit_glue::WebPointToIntPoint(client_point),
webkit_glue::WebPointToIntPoint(screen_point),
- kDropTargetOperation);
+ static_cast<WebCore::DragOperation>(operations_allowed));
drop_effect_ = DROP_EFFECT_DEFAULT;
drag_target_dispatch_ = true;
DragOperation effect = page_->dragController()->dragUpdated(&drag_data);
+ // Mask the operation against the drag source's allowed operations.
+ if ((effect & drag_data.draggingSourceOperationMask()) != effect) {
+ effect = DragOperationNone;
+ }
drag_target_dispatch_ = false;
if (drop_effect_ != DROP_EFFECT_DEFAULT)
- return drop_accept_ = (drop_effect_ != DROP_EFFECT_NONE);
- return drop_accept_ = (effect != DragOperationNone);
+ drag_operation_ = (drop_effect_ != DROP_EFFECT_NONE) ?
+ WebDragOperationCopy : WebDragOperationNone;
+ else
+ drag_operation_ = static_cast<WebDragOperation>(effect);
+ return drag_operation_;
}
void WebViewImpl::DragTargetDragLeave() {
@@ -1593,7 +1617,7 @@
current_drag_data_.get(),
IntPoint(),
IntPoint(),
- kDropTargetOperation);
+ static_cast<WebCore::DragOperation>(operations_allowed_));
drag_target_dispatch_ = true;
page_->dragController()->dragExited(&drag_data);
@@ -1601,7 +1625,7 @@
current_drag_data_ = NULL;
drop_effect_ = DROP_EFFECT_DEFAULT;
- drop_accept_ = false;
+ drag_operation_ = WebDragOperationNone;
drag_identity_ = 0;
}
@@ -1615,9 +1639,9 @@
// flight, or else delayed by javascript processing in this webview. If a
// drop happens before our IPC reply has reached the browser process, then
// the browser forwards the drop to this webview. So only allow a drop to
- // proceed if our webview drop_accept_ state is true.
+ // proceed if our webview drag_operation_ state is not DragOperationNone.
- if (!drop_accept_) { // IPC RACE CONDITION: do not allow this drop.
+ if (drag_operation_ == WebDragOperationNone) { // IPC RACE CONDITION: do not allow this drop.
DragTargetDragLeave();
return;
}
@@ -1626,7 +1650,7 @@
current_drag_data_.get(),
webkit_glue::WebPointToIntPoint(client_point),
webkit_glue::WebPointToIntPoint(screen_point),
- kDropTargetOperation);
+ static_cast<WebCore::DragOperation>(operations_allowed_));
drag_target_dispatch_ = true;
page_->dragController()->performDrag(&drag_data);
@@ -1634,7 +1658,7 @@
current_drag_data_ = NULL;
drop_effect_ = DROP_EFFECT_DEFAULT;
- drop_accept_ = false;
+ drag_operation_ = WebDragOperationNone;
drag_identity_ = 0;
}
@@ -1799,11 +1823,13 @@
observed_new_navigation_ = false;
}
-void WebViewImpl::StartDragging(const WebDragData& drag_data) {
+void WebViewImpl::StartDragging(WebPoint event_pos,
+ const WebDragData& drag_data,
+ WebDragOperationsMask mask) {
if (delegate_) {
DCHECK(!doing_drag_and_drop_);
doing_drag_and_drop_ = true;
- delegate_->StartDragging(this, drag_data);
+ delegate_->StartDragging(this, event_pos, drag_data, mask);
}
}
« no previous file with comments | « webkit/glue/webview_impl.h ('k') | webkit/tools/layout_tests/test_expectations.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698