WebCore: Drag and Drop: Windows uses "stop" sign as cursor when dragging
authorbweinstein@apple.com <bweinstein@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 30 Jan 2010 00:00:01 +0000 (00:00 +0000)
committerbweinstein@apple.com <bweinstein@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 30 Jan 2010 00:00:01 +0000 (00:00 +0000)
https://bugs.webkit.org/show_bug.cgi?id=34305
<rdar://problem/7589672>

Reviewed by Adam Roben.

Add a FIXME for the code that needs to be changed to support full
custom cursors.

* page/EventHandler.cpp:
(WebCore::EventHandler::handleDrag):

WebKit/win: Drag and Drop: Windows uses "stop" sign as cursor when dragging
https://bugs.webkit.org/show_bug.cgi?id=34305
<rdar://problem/7589672>

Reviewed by Adam Roben.

Add a preference in WebKit (that defaults to false), for whether or not
we should show the custom cursors during drag and drop. However, this is
currently only used on Windows, and only used to hide the "drop not allowed"
icon inside the WebView is the preference is set to true.

This will be off by default, so no change in behavior.

* Interfaces/IWebPreferencesPrivate.idl: Added new functions.
* Interfaces/WebKit.idl: Touched to force Interfaces build.
* WebDropSource.cpp:
(WebDropSource::GiveFeedback): Implementation of conditional showing cursor
    logic.
* WebPreferenceKeysPrivate.h: Added new preference key.
* WebPreferences.cpp: Added new functions.
(WebPreferences::setCustomDragCursorsEnabled):
(WebPreferences::customDragCursorsEnabled):
* WebPreferences.h: Added new functions.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@54083 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/page/EventHandler.cpp
WebKit/win/ChangeLog
WebKit/win/Interfaces/IWebPreferencesPrivate.idl
WebKit/win/Interfaces/WebKit.idl
WebKit/win/WebDropSource.cpp
WebKit/win/WebPreferenceKeysPrivate.h
WebKit/win/WebPreferences.cpp
WebKit/win/WebPreferences.h

index e3dfaf9..a183c56 100644 (file)
@@ -1,3 +1,17 @@
+2010-01-29  Brian Weinstein  <bweinstein@apple.com>
+
+        Reviewed by Adam Roben.
+
+        Drag and Drop: Windows uses "stop" sign as cursor when dragging
+        https://bugs.webkit.org/show_bug.cgi?id=34305
+        <rdar://problem/7589672>
+
+        Add a FIXME for the code that needs to be changed to support full
+        custom cursors.
+
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::handleDrag):
+
 2010-01-29  Victor Wang  <victorw@chromium.org>
 
         Reviewed by darin@apple.com.
 2010-01-29  Victor Wang  <victorw@chromium.org>
 
         Reviewed by darin@apple.com.
index 9e4d47f..8a77867 100644 (file)
@@ -2292,9 +2292,11 @@ bool EventHandler::handleDrag(const MouseEventWithHitTestResults& event)
         return !mouseDownMayStartSelect() && !m_mouseDownMayStartAutoscroll;
     
     // We are starting a text/image/url drag, so the cursor should be an arrow
         return !mouseDownMayStartSelect() && !m_mouseDownMayStartAutoscroll;
     
     // We are starting a text/image/url drag, so the cursor should be an arrow
-    if (FrameView* view = m_frame->view())
+    if (FrameView* view = m_frame->view()) {
+        // FIXME <rdar://7577595>: Custom cursors aren't supported during drag and drop (default to pointer).
         view->setCursor(pointerCursor());
         view->setCursor(pointerCursor());
-    
+    }
+
     if (!dragHysteresisExceeded(event.event().pos())) 
         return true;
     
     if (!dragHysteresisExceeded(event.event().pos())) 
         return true;
     
index f3a2d05..6cc5d6e 100644 (file)
@@ -1,3 +1,29 @@
+2010-01-29  Brian Weinstein  <bweinstein@apple.com>
+
+        Reviewed by Adam Roben.
+
+        Drag and Drop: Windows uses "stop" sign as cursor when dragging
+        https://bugs.webkit.org/show_bug.cgi?id=34305
+        <rdar://problem/7589672>
+        
+        Add a preference in WebKit (that defaults to false), for whether or not
+        we should show the custom cursors during drag and drop. However, this is
+        currently only used on Windows, and only used to hide the "drop not allowed"
+        icon inside the WebView is the preference is set to true.
+
+        This will be off by default, so no change in behavior.
+
+        * Interfaces/IWebPreferencesPrivate.idl: Added new functions.
+        * Interfaces/WebKit.idl: Touched to force Interfaces build.
+        * WebDropSource.cpp:
+        (WebDropSource::GiveFeedback): Implementation of conditional showing cursor
+            logic.
+        * WebPreferenceKeysPrivate.h: Added new preference key.
+        * WebPreferences.cpp: Added new functions.
+        (WebPreferences::setCustomDragCursorsEnabled):
+        (WebPreferences::customDragCursorsEnabled):
+        * WebPreferences.h: Added new functions.
+
 2010-01-28  Jon Honeycutt  <jhoneycutt@apple.com>
 
         MSAA: Crash when posting a notification for a detached object
 2010-01-28  Jon Honeycutt  <jhoneycutt@apple.com>
 
         MSAA: Crash when posting a notification for a detached object
index cfd8e83..1293fb8 100644 (file)
@@ -94,4 +94,7 @@ interface IWebPreferencesPrivate : IUnknown
 
     HRESULT setAcceleratedCompositingEnabled([in] BOOL);
     HRESULT acceleratedCompositingEnabled([out, retval] BOOL*);
 
     HRESULT setAcceleratedCompositingEnabled([in] BOOL);
     HRESULT acceleratedCompositingEnabled([out, retval] BOOL*);
+
+    HRESULT setCustomDragCursorsEnabled([in] BOOL);
+    HRESULT customDragCursorsEnabled([out, retval] BOOL*);
 }
 }
index 3cd748c..94dc697 100644 (file)
@@ -294,3 +294,4 @@ library WebKit
         [default] interface IWebGeolocationPosition;
     }
 }
         [default] interface IWebGeolocationPosition;
     }
 }
+
index 294c337..8cf0588 100644 (file)
 #include "WebKitDLL.h"
 #include "WebView.h"
 
 #include "WebKitDLL.h"
 #include "WebView.h"
 
+#include <WebCore/Cursor.h>
 #include <WebCore/DragActions.h>
 #include <WebCore/EventHandler.h>
 #include <WebCore/Frame.h>
 #include <WebCore/DragActions.h>
 #include <WebCore/EventHandler.h>
 #include <WebCore/Frame.h>
+#include <WebCore/FrameView.h>
 #include <WebCore/Page.h>
 #include <WebCore/PlatformMouseEvent.h>
 #include <wtf/CurrentTime.h>
 #include <WebCore/Page.h>
 #include <WebCore/PlatformMouseEvent.h>
 #include <wtf/CurrentTime.h>
@@ -112,7 +114,43 @@ STDMETHODIMP WebDropSource::QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyS
     return S_OK;
 }
 
     return S_OK;
 }
 
-STDMETHODIMP WebDropSource::GiveFeedback(DWORD)
+STDMETHODIMP WebDropSource::GiveFeedback(DWORD dwEffect)
 {
 {
-    return DRAGDROP_S_USEDEFAULTCURSORS;
+    BOOL showCustomCursors;
+    if (FAILED(WebPreferences::sharedStandardPreferences()->customDragCursorsEnabled(&showCustomCursors)))
+        return DRAGDROP_S_USEDEFAULTCURSORS;
+
+    // If we don't want to hide the stop icon, let Windows select the cursor.
+    if (!showCustomCursors)
+        return DRAGDROP_S_USEDEFAULTCURSORS;
+
+    // If we are going to show something other than the not allowed arrow, then let Windows
+    // show the cursor.
+    if (dwEffect != DROPEFFECT_NONE)
+        return DRAGDROP_S_USEDEFAULTCURSORS;
+    
+    HWND viewWindow;
+    if (FAILED(m_webView->viewWindow(reinterpret_cast<OLE_HANDLE*>(&viewWindow))))
+        return DRAGDROP_S_USEDEFAULTCURSORS;
+
+    RECT webViewRect;
+    GetWindowRect(viewWindow, &webViewRect);
+
+    POINT cursorPoint;
+    GetCursorPos(&cursorPoint);
+
+    if (!PtInRect(&webViewRect, cursorPoint)) {
+        // If our cursor is outside the bounds of the webView, we want to let Windows select the cursor.
+        return DRAGDROP_S_USEDEFAULTCURSORS;
+    }
+
+    FrameView* view = m_webView->page()->mainFrame()->view();
+    if (!view)
+        return DRAGDROP_S_USEDEFAULTCURSORS;
+
+    // When dragging inside a WebView and the drag is not allowed, don't show the not allowed icon,
+    // instead, show the pointer cursor.   
+    // FIXME <rdar://7577595>: Custom cursors aren't supported during drag and drop (default to pointer).
+    view->setCursor(pointerCursor()); 
+    return S_OK;
 }
 }
index fd70ed2..3b4197c 100644 (file)
 #define WebKitPluginAllowedRunTimePreferenceKey "WebKitPluginAllowedRunTime"
 
 #define WebKitAcceleratedCompositingEnabledPreferenceKey "WebKitAcceleratedCompositingEnabled"
 #define WebKitPluginAllowedRunTimePreferenceKey "WebKitPluginAllowedRunTime"
 
 #define WebKitAcceleratedCompositingEnabledPreferenceKey "WebKitAcceleratedCompositingEnabled"
+
+#define WebKitCustomDragCursorsEnabledPreferenceKey "WebKitCustomDragCursorsEnabled"
index cd982fd..c23f236 100644 (file)
@@ -1374,6 +1374,18 @@ HRESULT WebPreferences::acceleratedCompositingEnabled(BOOL* enabled)
     return S_OK;
 }
 
     return S_OK;
 }
 
+HRESULT WebPreferences::setCustomDragCursorsEnabled(BOOL enabled)
+{
+    setBoolValue(CFSTR(WebKitCustomDragCursorsEnabledPreferenceKey), enabled);
+    return S_OK;
+}
+
+HRESULT WebPreferences::customDragCursorsEnabled(BOOL* enabled)
+{
+    *enabled = boolValueForKey(CFSTR(WebKitCustomDragCursorsEnabledPreferenceKey));
+    return S_OK;
+}
+
 void WebPreferences::willAddToWebView()
 {
     ++m_numWebViews;
 void WebPreferences::willAddToWebView()
 {
     ++m_numWebViews;
index 8d15a06..1631e78 100644 (file)
@@ -387,6 +387,9 @@ public:
     virtual HRESULT STDMETHODCALLTYPE setAcceleratedCompositingEnabled(BOOL);
     virtual HRESULT STDMETHODCALLTYPE acceleratedCompositingEnabled(BOOL*);
 
     virtual HRESULT STDMETHODCALLTYPE setAcceleratedCompositingEnabled(BOOL);
     virtual HRESULT STDMETHODCALLTYPE acceleratedCompositingEnabled(BOOL*);
 
+    virtual HRESULT STDMETHODCALLTYPE setCustomDragCursorsEnabled(BOOL);
+    virtual HRESULT STDMETHODCALLTYPE customDragCursorsEnabled(BOOL*);
+
     // WebPreferences
 
     // This method accesses a different preference key than developerExtrasEnabled.
     // WebPreferences
 
     // This method accesses a different preference key than developerExtrasEnabled.