[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

weinig at apple.com weinig at apple.com
Wed Dec 22 11:11:07 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit ee7d02711a1a095f6716a29de471dba810ec7584
Author: weinig at apple.com <weinig at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Jul 14 18:54:34 2010 +0000

    Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
    Make changing Cursors work in WebKit2.
    
    Reviewed by Darin Adler.
    
    WebCore:
    
    - Converted Mac and Windows Cursor implementations to lazily
      create the platform cursor.
    - Add HostWindow function to set the cursor and use it from Widget::setCursor.
    - Rework Windows cursor code to use fewer global variables.
    
    * WebCore.exp.in: Updated
    * loader/EmptyClients.h:
    (WebCore::EmptyChromeClient::setCursor):
    (WebCore::EmptyChromeClient::setLastSetCursorToCurrentCursor):
    Added empty implementations.
    
    * page/Chrome.cpp:
    (WebCore::Chrome::setCursor):
    * page/Chrome.h:
    * page/ChromeClient.h:
    Change existing setCursor() function to take a Cursor instead of a
    PlatformCursorHandle. Added setLastSetCursorToCurrentCursor.
    
    * platform/Cursor.cpp:
    * platform/Cursor.h:
    Added Cursor Type and the option of lazily creating the native cursor
    (used on Mac and Windows for now).
    
    * platform/HostWindow.h:
    Add setCursor.
    
    * platform/mac/CursorMac.mm:
    (WebCore::createCustomCursor): This no longer needs to call determineHotSpot
    as that is done when on construction of the cursor now and the hotSpot passed
    in is correct.
    (WebCore::Cursor::ensurePlatformCursor):
    (WebCore::Cursor::Cursor):
    (WebCore::Cursor::~Cursor):
    (WebCore::Cursor::operator=):
    (WebCore::Cursor::platformCursor):
    Convert to lazily creating the native cursor on the first request and
    storing the type.
    
    * platform/mac/WidgetMac.mm:
    (WebCore::Widget::setCursor):
    Use HostWindow::setCursor to set the cursor. This in turn will call the
    ChromeClient.
    
    * platform/win/CursorWin.cpp:
    (WebCore::createSharedCursor):
    (WebCore::loadSharedCursor):
    (WebCore::loadCursorByName):
    (WebCore::Cursor::ensurePlatformCursor):
    (WebCore::SharedCursor::~SharedCursor):
    (WebCore::Cursor::Cursor):
    (WebCore::Cursor::~Cursor):
    (WebCore::Cursor::operator=):
    (WebCore::Cursor::platformCursor):
    Convert to lazily creating the native cursor on the first request and
    storing the type.
    
    * platform/win/WidgetWin.cpp:
    (WebCore::Widget::setCursor):
    Use HostWindow::setCursor to set the cursor. This in turn will call the
    ChromeClient.
    
    * plugins/win/PluginViewWin.cpp:
    (WebCore::PluginView::handleMouseEvent):
    Use the new setLastSetCursorToCurrentCursor client function to ensure
    the cursor is properly updated when over a plugin.
    
    * platform/chromium/CursorChromium.cpp:
    * platform/efl/CursorEfl.cpp:
    * platform/gtk/CursorGtk.cpp:
    * platform/haiku/CursorHaiku.cpp:
    * platform/wince/CursorWince.cpp:
    * platform/wx/CursorWx.cpp:
    * platform/qt/CursorQt.cpp:
    Change m_impl -> m_platformCursor.
    
    WebKit:
    
    * efl/WebCoreSupport/ChromeClientEfl.cpp:
    (WebCore::ChromeClientEfl::setCursor):
    * efl/WebCoreSupport/ChromeClientEfl.h:
    Change prototype to match new one.
    
    WebKit/chromium:
    
    * src/ChromeClientImpl.h:
    (WebKit::ChromeClientImpl::setCursor):
    Change prototype to match new one.
    
    * src/WebPopupMenuImpl.cpp:
    (WebKit::WebPopupMenuImpl::setCursor):
    * src/WebPopupMenuImpl.h:
    Add empty setCursor function to satisfy the HostWindow interface.
    
    WebKit/gtk:
    
    * WebCoreSupport/ChromeClientGtk.cpp:
    (WebKit::ChromeClient::setCursor):
    * WebCoreSupport/ChromeClientGtk.h:
    Change prototype to match new one.
    
    WebKit/haiku:
    
    * WebCoreSupport/ChromeClientHaiku.cpp:
    (WebCore::ChromeClientHaiku::setCursor):
    * WebCoreSupport/ChromeClientHaiku.h:
    Change prototype to match new one.
    
    WebKit/mac:
    
    * WebCoreSupport/WebChromeClient.h:
    * WebCoreSupport/WebChromeClient.mm:
    (WebChromeClient::setCursor):
    * WebView/WebView.mm:
    Implement cursor changing at the WebKit level for the sake of WebKit2.
    This functionality is being moved from WidgetMac.mm.
    (+[WebView _pointingHandCursor]):
    Update to use platformCursor() instead of impl().
    
    WebKit/qt:
    
    * WebCoreSupport/ChromeClientQt.cpp:
    (WebCore::ChromeClientQt::setCursor):
    * WebCoreSupport/ChromeClientQt.h:
    Change prototype to match new one.
    
    WebKit/win:
    
    * WebCoreSupport/WebChromeClient.cpp:
    (WebChromeClient::setCursor):
    We now need to grab the native cursor out of the WebCore cursor.
    
    (WebChromeClient::setLastSetCursorToCurrentCursor):
    Sets the WebView's "last set cursor" to be the current cursor so that
    the cursor is set correctly for plugins.
    * WebCoreSupport/WebChromeClient.h:
    * WebView.cpp:
    (WebView::WebView):
    (WebView::WebViewWndProc):
    * WebView.h:
    (WebView::setLastCursor):
    Change the "last set cursor" to be stored as a member instead of a global.
    
    WebKit/wx:
    
    * WebKitSupport/ChromeClientWx.cpp:
    (WebCore::ChromeClientWx::setCursor):
    * WebKitSupport/ChromeClientWx.h:
    Change prototype to match new one.
    
    WebKit2:
    
    * Shared/CoreIPCSupport/WebPageProxyMessageKinds.h:
    Add SetCursor message.
    
    * Shared/WebCoreArgumentCoders.h:
    Add encoding/decoding of Cursors. For now we don't support Custom
    cursors.
    
    * UIProcess/API/mac/PageClientImpl.h:
    * UIProcess/API/mac/PageClientImpl.mm:
    (WebKit::PageClientImpl::setCursor):
    * UIProcess/PageClient.h:
    Add pass through functions to get the cursor from the WebPageProxy
    to the WKView.
    
    * UIProcess/API/mac/WKView.mm:
    (-[WKView _setCursor:]):
    * UIProcess/API/mac/WKViewInternal.h:
    Implement changing the cursor.
    
    * UIProcess/WebPageProxy.cpp:
    (WebKit::WebPageProxy::didReceiveMessage):
    (WebKit::WebPageProxy::setCursor):
    * UIProcess/WebPageProxy.h:
    Decode the cursor.
    
    * UIProcess/win/WebView.cpp:
    (WebKit::WebView::wndProc):
    (WebKit::WebView::WebView):
    (WebKit::WebView::onSetCursor):
    (WebKit::WebView::setCursor):
    * UIProcess/win/WebView.h:
    Implement changing the cursor.
    
    * WebProcess/WebCoreSupport/WebChromeClient.cpp:
    (WebKit::WebChromeClient::setCursor):
    (WebKit::WebChromeClient::setLastSetCursorToCurrentCursor):
    * WebProcess/WebCoreSupport/WebChromeClient.h:
    Encode the cursor when setCursor is called.
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@63339 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 528522b..237f701 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,85 @@
+2010-07-14  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Darin Adler.
+
+        Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+        Make changing Cursors work in WebKit2.
+
+        - Converted Mac and Windows Cursor implementations to lazily
+          create the platform cursor.
+        - Add HostWindow function to set the cursor and use it from Widget::setCursor.
+        - Rework Windows cursor code to use fewer global variables.
+
+        * WebCore.exp.in: Updated
+        * loader/EmptyClients.h:
+        (WebCore::EmptyChromeClient::setCursor): 
+        (WebCore::EmptyChromeClient::setLastSetCursorToCurrentCursor):
+        Added empty implementations.
+
+        * page/Chrome.cpp:
+        (WebCore::Chrome::setCursor):
+        * page/Chrome.h:
+        * page/ChromeClient.h:
+        Change existing setCursor() function to take a Cursor instead of a
+        PlatformCursorHandle. Added setLastSetCursorToCurrentCursor.
+
+        * platform/Cursor.cpp:
+        * platform/Cursor.h:
+        Added Cursor Type and the option of lazily creating the native cursor
+        (used on Mac and Windows for now).
+
+        * platform/HostWindow.h:
+        Add setCursor.
+
+        * platform/mac/CursorMac.mm:
+        (WebCore::createCustomCursor): This no longer needs to call determineHotSpot
+        as that is done when on construction of the cursor now and the hotSpot passed
+        in is correct.
+        (WebCore::Cursor::ensurePlatformCursor):
+        (WebCore::Cursor::Cursor):
+        (WebCore::Cursor::~Cursor):
+        (WebCore::Cursor::operator=):
+        (WebCore::Cursor::platformCursor):
+        Convert to lazily creating the native cursor on the first request and
+        storing the type.
+
+        * platform/mac/WidgetMac.mm:
+        (WebCore::Widget::setCursor):
+        Use HostWindow::setCursor to set the cursor. This in turn will call the
+        ChromeClient.
+
+        * platform/win/CursorWin.cpp:
+        (WebCore::createSharedCursor):
+        (WebCore::loadSharedCursor):
+        (WebCore::loadCursorByName):
+        (WebCore::Cursor::ensurePlatformCursor):
+        (WebCore::SharedCursor::~SharedCursor):
+        (WebCore::Cursor::Cursor):
+        (WebCore::Cursor::~Cursor):
+        (WebCore::Cursor::operator=):
+        (WebCore::Cursor::platformCursor):
+        Convert to lazily creating the native cursor on the first request and
+        storing the type.
+
+        * platform/win/WidgetWin.cpp:
+        (WebCore::Widget::setCursor):
+        Use HostWindow::setCursor to set the cursor. This in turn will call the
+        ChromeClient.
+
+        * plugins/win/PluginViewWin.cpp:
+        (WebCore::PluginView::handleMouseEvent):
+        Use the new setLastSetCursorToCurrentCursor client function to ensure
+        the cursor is properly updated when over a plugin.
+
+        * platform/chromium/CursorChromium.cpp:
+        * platform/efl/CursorEfl.cpp:
+        * platform/gtk/CursorGtk.cpp:
+        * platform/haiku/CursorHaiku.cpp:
+        * platform/wince/CursorWince.cpp:
+        * platform/wx/CursorWx.cpp:
+        * platform/qt/CursorQt.cpp:
+        Change m_impl -> m_platformCursor.
+
 2010-07-13  Eric Seidel  <eric at webkit.org>
 
         Reviewed by Adam Barth.
diff --git a/WebCore/WebCore.exp.in b/WebCore/WebCore.exp.in
index d8366f1..83e7d1d 100644
--- a/WebCore/WebCore.exp.in
+++ b/WebCore/WebCore.exp.in
@@ -394,6 +394,7 @@ __ZN7WebCore17DOMImplementation14isTextMIMETypeERKNS_6StringE
 __ZN7WebCore17GlyphPageTreeNode18treeGlyphPageCountEv
 __ZN7WebCore17HTMLPlugInElement11getNPObjectEv
 __ZN7WebCore17HistoryController26saveDocumentAndScrollStateEv
+__ZN7WebCore17nameForCursorTypeENS_6Cursor4TypeE
 __ZN7WebCore18deprecatedParseURLERKNS_6StringE
 __ZN7WebCore18isStartOfParagraphERKNS_15VisiblePositionE
 __ZN7WebCore19AnimationController16resumeAnimationsEPNS_8DocumentE
@@ -541,6 +542,9 @@ __ZN7WebCore5Range6setEndEN3WTF10PassRefPtrINS_4NodeEEEiRi
 __ZN7WebCore5Range8setStartEN3WTF10PassRefPtrINS_4NodeEEEiRi
 __ZN7WebCore5RangeD1Ev
 __ZN7WebCore5cacheEv
+__ZN7WebCore6Cursor8fromTypeENS0_4TypeE
+__ZN7WebCore6CursorD1Ev
+__ZN7WebCore6CursoraSERKS0_
 __ZN7WebCore6Editor10applyStyleEPNS_19CSSStyleDeclarationENS_10EditActionE
 __ZN7WebCore6Editor10insertTextERKNS_6StringEPNS_5EventE
 __ZN7WebCore6Editor13canDHTMLPasteEv
@@ -933,6 +937,7 @@ __ZNK7WebCore5Range19boundaryPointsValidEv
 __ZNK7WebCore5Range9endOffsetERi
 __ZNK7WebCore5Range9firstNodeEv
 __ZNK7WebCore6Chrome12createWindowEPNS_5FrameERKNS_16FrameLoadRequestERKNS_14WindowFeaturesE
+__ZNK7WebCore6Cursor14platformCursorEv
 __ZNK7WebCore6Editor13canEditRichlyEv
 __ZNK7WebCore6Editor16compositionRangeEv
 __ZNK7WebCore6Editor16fontForSelectionERb
diff --git a/WebCore/loader/EmptyClients.h b/WebCore/loader/EmptyClients.h
index e42ee1d..28d195d 100644
--- a/WebCore/loader/EmptyClients.h
+++ b/WebCore/loader/EmptyClients.h
@@ -153,7 +153,7 @@ public:
 
     virtual PassOwnPtr<HTMLParserQuirks> createHTMLParserQuirks() { return 0; }
 
-    virtual bool setCursor(PlatformCursorHandle) { return false; }
+    virtual void setCursor(const Cursor&) { }
 
     virtual void scrollRectIntoView(const IntRect&, const ScrollView*) const {}
 
@@ -166,6 +166,9 @@ public:
     virtual void scheduleCompositingLayerSync() {};
 #endif
 
+#if PLATFORM(WIN)
+    virtual void setLastSetCursorToCurrentCursor() { }
+#endif
 #if ENABLE(TOUCH_EVENTS)
     virtual void needTouchEvents(bool) { }
 #endif
diff --git a/WebCore/page/Chrome.cpp b/WebCore/page/Chrome.cpp
index f2e1d9d..0c66925 100644
--- a/WebCore/page/Chrome.cpp
+++ b/WebCore/page/Chrome.cpp
@@ -426,9 +426,9 @@ void Chrome::chooseIconForFiles(const Vector<String>& filenames, FileChooser* fi
     m_client->chooseIconForFiles(filenames, fileChooser);
 }
 
-bool Chrome::setCursor(PlatformCursorHandle cursor)
+void Chrome::setCursor(const Cursor& cursor)
 {
-    return m_client->setCursor(cursor);
+    m_client->setCursor(cursor);
 }
 
 #if ENABLE(NOTIFICATIONS)
diff --git a/WebCore/page/Chrome.h b/WebCore/page/Chrome.h
index 27bde83..537468a 100644
--- a/WebCore/page/Chrome.h
+++ b/WebCore/page/Chrome.h
@@ -69,6 +69,7 @@ namespace WebCore {
         virtual IntRect windowToScreen(const IntRect&) const;
         virtual PlatformPageClient platformPageClient() const;
         virtual void scrollbarsModeDidChange() const;
+        virtual void setCursor(const Cursor&);
 
         void scrollRectIntoView(const IntRect&) const;
 
@@ -135,8 +136,6 @@ namespace WebCore {
         void runOpenPanel(Frame*, PassRefPtr<FileChooser>);
         void chooseIconForFiles(const Vector<String>&, FileChooser*);
 
-        bool setCursor(PlatformCursorHandle);
-
 #if PLATFORM(MAC)
         void focusNSView(NSView*);
 #endif
diff --git a/WebCore/page/ChromeClient.h b/WebCore/page/ChromeClient.h
index aade75e..795b25c 100644
--- a/WebCore/page/ChromeClient.h
+++ b/WebCore/page/ChromeClient.h
@@ -135,11 +135,13 @@ namespace WebCore {
         virtual IntPoint screenToWindow(const IntPoint&) const = 0;
         virtual IntRect windowToScreen(const IntRect&) const = 0;
         virtual PlatformPageClient platformPageClient() const = 0;
-        virtual void contentsSizeChanged(Frame*, const IntSize&) const = 0;
-        virtual void scrollRectIntoView(const IntRect&, const ScrollView*) const = 0; // Currently only Mac has a non empty implementation.
+        virtual void scrollbarsModeDidChange() const = 0;
+        virtual void setCursor(const Cursor&) = 0;
         // End methods used by HostWindow.
 
-        virtual void scrollbarsModeDidChange() const = 0;
+        virtual void contentsSizeChanged(Frame*, const IntSize&) const = 0;
+        virtual void scrollRectIntoView(const IntRect&, const ScrollView*) const = 0; // Currently only Mac has a non empty implementation.
+       
         virtual bool shouldMissingPluginMessageBeButton() const { return false; }
         virtual void missingPluginButtonClicked(Element*) const { }
         virtual void mouseDidMoveOverElement(const HitTestResult&, unsigned modifierFlags) = 0;
@@ -194,8 +196,6 @@ namespace WebCore {
         // Asynchronous request to load an icon for specified filenames.
         virtual void chooseIconForFiles(const Vector<String>&, FileChooser*) = 0;
 
-        virtual bool setCursor(PlatformCursorHandle) = 0;
-
         // Notification that the given form element has changed. This function
         // will be called frequently, so handling should be very fast.
         virtual void formStateDidChange(const Node*) = 0;
@@ -236,6 +236,10 @@ namespace WebCore {
         virtual void willPopUpMenu(NSMenu *) { }
 #endif
 
+#if PLATFORM(WIN)
+        virtual void setLastSetCursorToCurrentCursor() = 0;
+#endif
+
 #if ENABLE(TOUCH_EVENTS)
         virtual void needTouchEvents(bool) = 0;
 #endif
diff --git a/WebCore/platform/Cursor.cpp b/WebCore/platform/Cursor.cpp
index 794a9dc..3f17ad9 100644
--- a/WebCore/platform/Cursor.cpp
+++ b/WebCore/platform/Cursor.cpp
@@ -46,4 +46,477 @@ IntPoint determineHotSpot(Image* image, const IntPoint& specifiedHotSpot)
     return IntPoint();
 }
 
+const Cursor& Cursor::fromType(Cursor::Type type)
+{
+    switch (type) {
+    case Cursor::Pointer:
+        return pointerCursor();
+    case Cursor::Cross:
+        return crossCursor();
+    case Cursor::Hand:
+        return handCursor();
+    case Cursor::IBeam:
+        return iBeamCursor();
+    case Cursor::Wait:
+        return waitCursor();
+    case Cursor::Help:
+        return helpCursor();
+    case Cursor::EastResize:
+        return eastResizeCursor();
+    case Cursor::NorthResize:
+        return northResizeCursor();
+    case Cursor::NorthEastResize:
+        return northEastResizeCursor();
+    case Cursor::NorthWestResize:
+        return northWestResizeCursor();
+    case Cursor::SouthResize:
+        return southResizeCursor();
+    case Cursor::SouthEastResize:
+        return southEastResizeCursor();
+    case Cursor::SouthWestResize:
+        return southWestResizeCursor();
+    case Cursor::WestResize:
+        return westResizeCursor();
+    case Cursor::NorthSouthResize:
+        return northSouthResizeCursor();
+    case Cursor::EastWestResize:
+        return eastWestResizeCursor();
+    case Cursor::NorthEastSouthWestResize:
+        return northEastSouthWestResizeCursor();
+    case Cursor::NorthWestSouthEastResize:
+        return northWestSouthEastResizeCursor();
+    case Cursor::ColumnResize:
+        return columnResizeCursor();
+    case Cursor::RowResize:
+        return rowResizeCursor();
+    case Cursor::MiddlePanning:
+        return middlePanningCursor();
+    case Cursor::EastPanning:
+        return eastPanningCursor();
+    case Cursor::NorthPanning:
+        return northPanningCursor();
+    case Cursor::NorthEastPanning:
+        return northEastPanningCursor();
+    case Cursor::NorthWestPanning:
+        return northWestPanningCursor();
+    case Cursor::SouthPanning:
+        return southPanningCursor();
+    case Cursor::SouthEastPanning:
+        return southEastPanningCursor();
+    case Cursor::SouthWestPanning:
+        return southWestPanningCursor();
+    case Cursor::WestPanning:
+        return westPanningCursor();
+    case Cursor::Move:
+        return moveCursor();
+    case Cursor::VerticalText:
+        return verticalTextCursor();
+    case Cursor::Cell:
+        return cellCursor();
+    case Cursor::ContextMenu:
+        return contextMenuCursor();
+    case Cursor::Alias:
+        return aliasCursor();
+    case Cursor::Progress:
+        return progressCursor();
+    case Cursor::NoDrop:
+        return noDropCursor();
+    case Cursor::Copy:
+        return copyCursor();
+    case Cursor::None:
+        return noneCursor();
+    case Cursor::NotAllowed:
+        return notAllowedCursor();
+    case Cursor::ZoomIn:
+        return zoomInCursor();
+    case Cursor::ZoomOut:
+        return zoomOutCursor();
+    case Cursor::Grab:
+        return grabCursor();
+    case Cursor::Grabbing:
+        return grabbingCursor();
+    case Cursor::Custom:
+        ASSERT_NOT_REACHED();
+    }
+    return pointerCursor();
+}
+
+const char* nameForCursorType(Cursor::Type type)
+{
+    switch (type) {
+    case Cursor::Pointer:
+        return "Pointer";
+    case Cursor::Cross:
+        return "Cross";
+    case Cursor::Hand:
+        return "Hand";
+    case Cursor::IBeam:
+        return "IBeam";
+    case Cursor::Wait:
+        return "Wait";
+    case Cursor::Help:
+        return "Help";
+    case Cursor::EastResize:
+        return "EastResize";
+    case Cursor::NorthResize:
+        return "NorthResize";
+    case Cursor::NorthEastResize:
+        return "NorthEastResize";
+    case Cursor::NorthWestResize:
+        return "NorthWestResize";
+    case Cursor::SouthResize:
+        return "SouthResize";
+    case Cursor::SouthEastResize:
+        return "SouthEastResize";
+    case Cursor::SouthWestResize:
+        return "SouthWestResize";
+    case Cursor::WestResize:
+        return "WestResize";
+    case Cursor::NorthSouthResize:
+        return "NorthSouthResize";
+    case Cursor::EastWestResize:
+        return "EastWestResize";
+    case Cursor::NorthEastSouthWestResize:
+        return "NorthEastSouthWestResize";
+    case Cursor::NorthWestSouthEastResize:
+        return "NorthWestSouthEastResize";
+    case Cursor::ColumnResize:
+        return "ColumnResize";
+    case Cursor::RowResize:
+        return "RowResize";
+    case Cursor::MiddlePanning:
+        return "MiddlePanning";
+    case Cursor::EastPanning:
+        return "EastPanning";
+    case Cursor::NorthPanning:
+        return "NorthPanning";
+    case Cursor::NorthEastPanning:
+        return "NorthEastPanning";
+    case Cursor::NorthWestPanning:
+        return "NorthWestPanning";
+    case Cursor::SouthPanning:
+        return "SouthPanning";
+    case Cursor::SouthEastPanning:
+        return "SouthEastPanning";
+    case Cursor::SouthWestPanning:
+        return "SouthWestPanning";
+    case Cursor::WestPanning:
+        return "WestPanning";
+    case Cursor::Move:
+        return "Move";
+    case Cursor::VerticalText:
+        return "VerticalText";
+    case Cursor::Cell:
+        return "Cell";
+    case Cursor::ContextMenu:
+        return "ContextMenu";
+    case Cursor::Alias:
+        return "Alias";
+    case Cursor::Progress:
+        return "Progress";
+    case Cursor::NoDrop:
+        return "NoDrop";
+    case Cursor::Copy:
+        return "Copy";
+    case Cursor::None:
+        return "None";
+    case Cursor::NotAllowed:
+        return "NotAllowed";
+    case Cursor::ZoomIn:
+        return "ZoomIn";
+    case Cursor::ZoomOut:
+        return "ZoomOut";
+    case Cursor::Grab:
+        return "Grab";
+    case Cursor::Grabbing:
+        return "Grabbing";
+    case Cursor::Custom:
+        return "Custom";
+    }
+
+    return "ERROR";
+}
+
+#if USE(LAZY_NATIVE_CURSOR)
+
+Cursor::Cursor(Image* image, const IntPoint& hotSpot)
+    : m_type(Custom)
+    , m_image(image)
+    , m_hotSpot(determineHotSpot(image, hotSpot))
+    , m_platformCursor(0)
+{
+}
+
+Cursor::Cursor(Type type)
+    : m_type(type)
+    , m_platformCursor(0)
+{
+}
+
+PlatformCursor Cursor::platformCursor() const
+{
+    ensurePlatformCursor();
+    return m_platformCursor;
+}
+
+const Cursor& pointerCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Pointer));
+    return c;
+}
+
+const Cursor& crossCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Cross));
+    return c;
+}
+
+const Cursor& handCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Hand));
+    return c;
+}
+
+const Cursor& moveCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Move));
+    return c;
+}
+
+const Cursor& verticalTextCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::VerticalText));
+    return c;
+}
+
+const Cursor& cellCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Cell));
+    return c;
+}
+
+const Cursor& contextMenuCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ContextMenu));
+    return c;
+}
+
+const Cursor& aliasCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Alias));
+    return c;
+}
+
+const Cursor& zoomInCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ZoomIn));
+    return c;
+}
+
+const Cursor& zoomOutCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ZoomOut));
+    return c;
+}
+
+const Cursor& copyCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Copy));
+    return c;
+}
+
+const Cursor& noneCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::None));
+    return c;
+}
+
+const Cursor& progressCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Progress));
+    return c;
+}
+
+const Cursor& noDropCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NoDrop));
+    return c;
+}
+
+const Cursor& notAllowedCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NotAllowed));
+    return c;
+}
+
+const Cursor& iBeamCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::IBeam));
+    return c;
+}
+
+const Cursor& waitCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Wait));
+    return c;
+}
+
+const Cursor& helpCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Help));
+    return c;
 }
+
+const Cursor& eastResizeCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastResize));
+    return c;
+}
+
+const Cursor& northResizeCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthResize));
+    return c;
+}
+
+const Cursor& northEastResizeCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastResize));
+    return c;
+}
+
+const Cursor& northWestResizeCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestResize));
+    return c;
+}
+
+const Cursor& southResizeCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthResize));
+    return c;
+}
+
+const Cursor& southEastResizeCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthEastResize));
+    return c;
+}
+
+const Cursor& southWestResizeCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthWestResize));
+    return c;
+}
+
+const Cursor& westResizeCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::WestResize));
+    return c;
+}
+
+const Cursor& northSouthResizeCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthSouthResize));
+    return c;
+}
+
+const Cursor& eastWestResizeCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastWestResize));
+    return c;
+}
+
+const Cursor& northEastSouthWestResizeCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastSouthWestResize));
+    return c;
+}
+
+const Cursor& northWestSouthEastResizeCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestSouthEastResize));
+    return c;
+}
+
+const Cursor& columnResizeCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::ColumnResize));
+    return c;
+}
+
+const Cursor& rowResizeCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::RowResize));
+    return c;
+}
+
+const Cursor& middlePanningCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::MiddlePanning));
+    return c;
+}
+    
+const Cursor& eastPanningCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::EastPanning));
+    return c;
+}
+    
+const Cursor& northPanningCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthPanning));
+    return c;
+}
+    
+const Cursor& northEastPanningCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthEastPanning));
+    return c;
+}
+    
+const Cursor& northWestPanningCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::NorthWestPanning));
+    return c;
+}
+    
+const Cursor& southPanningCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthPanning));
+    return c;
+}
+    
+const Cursor& southEastPanningCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthEastPanning));
+    return c;
+}
+    
+const Cursor& southWestPanningCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::SouthWestPanning));
+    return c;
+}
+    
+const Cursor& westPanningCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::WestPanning));
+    return c;
+}
+
+const Cursor& grabCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Grab));
+    return c;
+}
+
+const Cursor& grabbingCursor()
+{
+    DEFINE_STATIC_LOCAL(Cursor, c, (Cursor::Grabbing));
+    return c;
+}
+
+#endif
+
+} // namespace WebCore
diff --git a/WebCore/platform/Cursor.h b/WebCore/platform/Cursor.h
index 12b1614..98d69b9 100644
--- a/WebCore/platform/Cursor.h
+++ b/WebCore/platform/Cursor.h
@@ -26,12 +26,15 @@
 #ifndef Cursor_h
 #define Cursor_h
 
+#include "Image.h"
+#include "IntPoint.h"
+#include <wtf/RefPtr.h>
+
 #if PLATFORM(WIN)
 typedef struct HICON__* HICON;
 typedef HICON HCURSOR;
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
-#include <wtf/RefPtr.h>
 #elif PLATFORM(GTK)
 typedef struct _GdkCursor GdkCursor;
 #elif PLATFORM(QT)
@@ -59,10 +62,13 @@ typedef struct HICON__ *HICON;
 typedef HICON HCURSOR;
 #endif
 
+#if PLATFORM(WIN) || PLATFORM(MAC)
+#define WTF_USE_LAZY_NATIVE_CURSOR 1
+#endif
+
 namespace WebCore {
 
     class Image;
-    class IntPoint;
 
 #if PLATFORM(WIN)
     class SharedCursor : public RefCounted<SharedCursor> {
@@ -75,55 +81,113 @@ namespace WebCore {
         HCURSOR m_nativeCursor;
     };
     typedef RefPtr<SharedCursor> PlatformCursor;
-    typedef HCURSOR PlatformCursorHandle;
 #elif PLATFORM(MAC)
     typedef NSCursor* PlatformCursor;
-    typedef NSCursor* PlatformCursorHandle;
 #elif PLATFORM(GTK)
     typedef GdkCursor* PlatformCursor;
-    typedef GdkCursor* PlatformCursorHandle;
 #elif PLATFORM(EFL)
     typedef const char* PlatformCursor;
-    typedef const char* PlatformCursorHandle;
 #elif PLATFORM(QT) && !defined(QT_NO_CURSOR)
     typedef QCursor PlatformCursor;
-    typedef QCursor* PlatformCursorHandle;
 #elif PLATFORM(WX)
     typedef wxCursor* PlatformCursor;
-    typedef wxCursor* PlatformCursorHandle;
 #elif PLATFORM(CHROMIUM)
     // See PlatformCursor.h
-    typedef void* PlatformCursorHandle;
 #elif PLATFORM(HAIKU)
     typedef BCursor* PlatformCursor;
-    typedef BCursor* PlatformCursorHandle;
 #else
     typedef void* PlatformCursor;
-    typedef void* PlatformCursorHandle;
 #endif
 
     class Cursor {
     public:
+        enum Type {
+            Pointer,
+            Cross,
+            Hand,
+            IBeam,
+            Wait,
+            Help,
+            EastResize,
+            NorthResize,
+            NorthEastResize,
+            NorthWestResize,
+            SouthResize,
+            SouthEastResize,
+            SouthWestResize,
+            WestResize,
+            NorthSouthResize,
+            EastWestResize,
+            NorthEastSouthWestResize,
+            NorthWestSouthEastResize,
+            ColumnResize,
+            RowResize,
+            MiddlePanning,
+            EastPanning,
+            NorthPanning,
+            NorthEastPanning,
+            NorthWestPanning,
+            SouthPanning,
+            SouthEastPanning,
+            SouthWestPanning,
+            WestPanning,
+            Move,
+            VerticalText,
+            Cell,
+            ContextMenu,
+            Alias,
+            Progress,
+            NoDrop,
+            Copy,
+            None,
+            NotAllowed,
+            ZoomIn,
+            ZoomOut,
+            Grab,
+            Grabbing,
+            Custom
+        };
+
+        static const Cursor& fromType(Cursor::Type);
+
         Cursor()
 #if !PLATFORM(QT) && !PLATFORM(EFL)
-        : m_impl(0)
+            : m_platformCursor(0)
 #endif
-        { }
+        {
+        }
 
         Cursor(Image*, const IntPoint& hotSpot);
         Cursor(const Cursor&);
         ~Cursor();
         Cursor& operator=(const Cursor&);
 
+#if USE(LAZY_NATIVE_CURSOR)
+        Cursor(Type);
+        Type type() const { return m_type; }
+        Image* image() const { return m_image.get(); }
+        const IntPoint& hotSpot() const { return m_hotSpot; }
+        PlatformCursor platformCursor() const;
+#else
         Cursor(PlatformCursor);
-        PlatformCursor impl() const { return m_impl; }
+        PlatformCursor impl() const { return m_platformCursor; }
+#endif
 
      private:
-        PlatformCursor m_impl;
+#if USE(LAZY_NATIVE_CURSOR)
+        void ensurePlatformCursor() const;
+
+        Type m_type;
+        RefPtr<Image> m_image;
+        IntPoint m_hotSpot;
+#endif
+
+        mutable PlatformCursor m_platformCursor;
     };
 
     IntPoint determineHotSpot(Image*, const IntPoint& specifiedHotSpot);
-
+    const char* nameForCursorType(Cursor::Type);
+    
     const Cursor& pointerCursor();
     const Cursor& crossCursor();
     const Cursor& handCursor();
diff --git a/WebCore/platform/HostWindow.h b/WebCore/platform/HostWindow.h
index e7316a7..b0ee653 100644
--- a/WebCore/platform/HostWindow.h
+++ b/WebCore/platform/HostWindow.h
@@ -31,6 +31,8 @@
 
 namespace WebCore {
 
+class Cursor;
+
 class HostWindow : public Noncopyable {
 public:
     virtual ~HostWindow() { }
@@ -56,6 +58,9 @@ public:
     
     // To notify WebKit of scrollbar mode changes.
     virtual void scrollbarsModeDidChange() const = 0;
+
+    // Request that the cursor change.
+    virtual void setCursor(const Cursor&) = 0;
 };
 
 } // namespace WebCore
diff --git a/WebCore/platform/chromium/CursorChromium.cpp b/WebCore/platform/chromium/CursorChromium.cpp
index 16fa634..0119f07 100644
--- a/WebCore/platform/chromium/CursorChromium.cpp
+++ b/WebCore/platform/chromium/CursorChromium.cpp
@@ -34,12 +34,12 @@
 namespace WebCore {
 
 Cursor::Cursor(const Cursor& other)
-    : m_impl(other.m_impl)
+    : m_platformCursor(other.m_platformCursor)
 {
 }
 
 Cursor::Cursor(Image* image, const IntPoint& hotSpot)
-    : m_impl(image, hotSpot)
+    : m_platformCursor(image, hotSpot)
 {
 }
 
@@ -49,12 +49,12 @@ Cursor::~Cursor()
 
 Cursor& Cursor::operator=(const Cursor& other)
 {
-    m_impl = other.m_impl;
+    m_platformCursor = other.m_platformCursor;
     return *this;
 }
 
 Cursor::Cursor(PlatformCursor c)
-    : m_impl(c)
+    : m_platformCursor(c)
 {
 }
 
diff --git a/WebCore/platform/efl/CursorEfl.cpp b/WebCore/platform/efl/CursorEfl.cpp
index c88830e..47141f9 100644
--- a/WebCore/platform/efl/CursorEfl.cpp
+++ b/WebCore/platform/efl/CursorEfl.cpp
@@ -45,33 +45,33 @@ namespace WebCore {
 
 Cursor::Cursor(PlatformCursor p)
 {
-    m_impl = eina_stringshare_add(p);
+    m_platformCursor = eina_stringshare_add(p);
 }
 
 Cursor::Cursor(const Cursor& other)
 {
-    m_impl = eina_stringshare_ref(other.m_impl);
+    m_platformCursor = eina_stringshare_ref(other.m_platformCursor);
 }
 
 Cursor::~Cursor()
 {
-    if (m_impl) {
-        eina_stringshare_del(m_impl);
-        m_impl = 0;
+    if (m_platformCursor) {
+        eina_stringshare_del(m_platformCursor);
+        m_platformCursor = 0;
     }
 }
 
 Cursor::Cursor(Image* image, const IntPoint& hotspot)
-    : m_impl(0)
+    : m_platformCursor(0)
 {
     notImplemented();
 }
 
 Cursor& Cursor::operator=(const Cursor& other)
 {
-    eina_stringshare_ref(other.m_impl);
-    eina_stringshare_del(m_impl);
-    m_impl = other.m_impl;
+    eina_stringshare_ref(other.m_platformCursor);
+    eina_stringshare_del(m_platformCursor);
+    m_platformCursor = other.m_platformCursor;
     return *this;
 }
 
diff --git a/WebCore/platform/gtk/CursorGtk.cpp b/WebCore/platform/gtk/CursorGtk.cpp
index 017e486..a535f0c 100644
--- a/WebCore/platform/gtk/CursorGtk.cpp
+++ b/WebCore/platform/gtk/CursorGtk.cpp
@@ -57,38 +57,38 @@ static GdkCursor* customCursorNew(CustomCursorType cursorType)
 
 
 Cursor::Cursor(const Cursor& other)
-    : m_impl(other.m_impl)
+    : m_platformCursor(other.m_platformCursor)
 {
-    if (m_impl)
-        gdk_cursor_ref(m_impl);
+    if (m_platformCursor)
+        gdk_cursor_ref(m_platformCursor);
 }
 
 Cursor::Cursor(Image* image, const IntPoint& hotSpot)
 {
     IntPoint effectiveHotSpot = determineHotSpot(image, hotSpot);
     GdkPixbuf* pixbuf = image->getGdkPixbuf();
-    m_impl = gdk_cursor_new_from_pixbuf(gdk_display_get_default(), pixbuf, effectiveHotSpot.x(), effectiveHotSpot.y());
+    m_platformCursor = gdk_cursor_new_from_pixbuf(gdk_display_get_default(), pixbuf, effectiveHotSpot.x(), effectiveHotSpot.y());
     g_object_unref(pixbuf);
 }
 
 Cursor::~Cursor()
 {
-    if (m_impl)
-        gdk_cursor_unref(m_impl);
+    if (m_platformCursor)
+        gdk_cursor_unref(m_platformCursor);
 }
 
 Cursor& Cursor::operator=(const Cursor& other)
 {
-    gdk_cursor_ref(other.m_impl);
-    gdk_cursor_unref(m_impl);
-    m_impl = other.m_impl;
+    gdk_cursor_ref(other.m_platformCursor);
+    gdk_cursor_unref(m_platformCursor);
+    m_platformCursor = other.m_platformCursor;
     return *this;
 }
 
 Cursor::Cursor(GdkCursor* c)
-    : m_impl(c)
+    : m_platformCursor(c)
 {
-    m_impl = c;
+    m_platformCursor = c;
 
     // The GdkCursor may be NULL - the default cursor for the window.
     if (c)
diff --git a/WebCore/platform/haiku/CursorHaiku.cpp b/WebCore/platform/haiku/CursorHaiku.cpp
index 21d678a..58833bc 100644
--- a/WebCore/platform/haiku/CursorHaiku.cpp
+++ b/WebCore/platform/haiku/CursorHaiku.cpp
@@ -34,31 +34,31 @@
 namespace WebCore {
 
 Cursor::Cursor(PlatformCursor cursor)
-    : m_impl(cursor)
+    : m_platformCursor(cursor)
 {
 }
 
 Cursor::Cursor(const Cursor& other)
-    : m_impl(0)
+    : m_platformCursor(0)
 {
     *this = other;
 }
 
 Cursor::~Cursor()
 {
-    delete m_impl;
+    delete m_platformCursor;
 }
 
 Cursor::Cursor(Image*, const IntPoint&)
-    : m_impl(0)
+    : m_platformCursor(0)
 {
     notImplemented();
 }
 
 Cursor& Cursor::operator=(const Cursor& other)
 {
-    delete m_impl;
-    m_impl = other.m_impl ? new BCursor(*other.m_impl) : 0;
+    delete m_platformCursor;
+    m_platformCursor = other.m_platformCursor ? new BCursor(*other.m_platformCursor) : 0;
     return *this;
 }
 
diff --git a/WebCore/platform/mac/CursorMac.mm b/WebCore/platform/mac/CursorMac.mm
index 8cd54a1..1b985c5 100644
--- a/WebCore/platform/mac/CursorMac.mm
+++ b/WebCore/platform/mac/CursorMac.mm
@@ -28,8 +28,6 @@
 
 #import "BlockExceptions.h"
 #import "FoundationExtras.h"
-#import "Image.h"
-#import "IntPoint.h"
 #import <wtf/StdLibExtras.h>
 
 @interface WebCoreCursorBundle : NSObject { }
@@ -50,7 +48,7 @@ static NSCursor* createCustomCursor(Image* image, const IntPoint& hotSpot)
     if (!img)
         return 0;
     BEGIN_BLOCK_OBJC_EXCEPTIONS;
-    return [[NSCursor alloc] initWithImage:img hotSpot:determineHotSpot(image, hotSpot)];
+    return [[NSCursor alloc] initWithImage:img hotSpot:hotSpot];
     END_BLOCK_OBJC_EXCEPTIONS;
     return 0;
 }
@@ -76,281 +74,152 @@ static NSCursor* leakNamedCursor(const char* name, int x, int y)
     return nil;
 }
 
-Cursor::Cursor(Image* image, const IntPoint& hotSpot)
-    : m_impl(HardRetainWithNSRelease(createCustomCursor(image, hotSpot)))
-{
+void Cursor::ensurePlatformCursor() const
+{
+    if (m_platformCursor)
+        return;
+
+    switch (m_type) {
+    case Cursor::Pointer:
+        m_platformCursor = HardRetain([NSCursor arrowCursor]);
+        break;
+    case Cursor::Cross:
+        m_platformCursor = HardRetain(leakNamedCursor("crossHairCursor", 11, 11));
+        break;
+    case Cursor::Hand:
+        m_platformCursor = HardRetain(leakNamedCursor("linkCursor", 6, 1));
+        break;
+    case Cursor::IBeam:
+        m_platformCursor = HardRetain([NSCursor IBeamCursor]);
+        break;
+    case Cursor::Wait:
+        m_platformCursor = HardRetain(leakNamedCursor("waitCursor", 7, 7));
+        break;
+    case Cursor::Help:
+        m_platformCursor = HardRetain(leakNamedCursor("helpCursor", 8, 8));
+        break;
+    case Cursor::Move:
+    case Cursor::MiddlePanning:
+        m_platformCursor = HardRetain(leakNamedCursor("moveCursor", 7, 7));
+        break;
+    case Cursor::EastResize:
+    case Cursor::EastPanning:
+        m_platformCursor = HardRetain(leakNamedCursor("eastResizeCursor", 14, 7));
+        break;
+    case Cursor::NorthResize:
+    case Cursor::NorthPanning:
+        m_platformCursor = HardRetain(leakNamedCursor("northResizeCursor", 7, 1));
+        break;
+    case Cursor::NorthEastResize:
+    case Cursor::NorthEastPanning:
+        m_platformCursor = HardRetain(leakNamedCursor("northEastResizeCursor", 14, 1));
+        break;
+    case Cursor::NorthWestResize:
+    case Cursor::NorthWestPanning:
+        m_platformCursor = HardRetain(leakNamedCursor("northWestResizeCursor", 0, 0));
+        break;
+    case Cursor::SouthResize:
+    case Cursor::SouthPanning:
+        m_platformCursor = HardRetain(leakNamedCursor("southResizeCursor", 7, 14));
+        break;
+    case Cursor::SouthEastResize:
+    case Cursor::SouthEastPanning:
+        m_platformCursor = HardRetain(leakNamedCursor("southEastResizeCursor", 14, 14));
+        break;
+    case Cursor::SouthWestResize:
+    case Cursor::SouthWestPanning:
+        m_platformCursor = HardRetain(leakNamedCursor("southWestResizeCursor", 1, 14));
+        break;
+    case Cursor::WestResize:
+        m_platformCursor = HardRetain(leakNamedCursor("westResizeCursor", 1, 7));
+        break;
+    case Cursor::NorthSouthResize:
+        m_platformCursor = HardRetain(leakNamedCursor("northSouthResizeCursor", 7, 7));
+        break;
+    case Cursor::EastWestResize:
+    case Cursor::WestPanning:
+        m_platformCursor = HardRetain(leakNamedCursor("eastWestResizeCursor", 7, 7));
+        break;
+    case Cursor::NorthEastSouthWestResize:
+        m_platformCursor = HardRetain(leakNamedCursor("northEastSouthWestResizeCursor", 7, 7));
+        break;
+    case Cursor::NorthWestSouthEastResize:
+        m_platformCursor = HardRetain(leakNamedCursor("northWestSouthEastResizeCursor", 7, 7));
+        break;
+    case Cursor::ColumnResize:
+        m_platformCursor = [NSCursor resizeLeftRightCursor];
+        break;
+    case Cursor::RowResize:
+        m_platformCursor = [NSCursor resizeUpDownCursor];
+        break;
+    case Cursor::VerticalText:
+        m_platformCursor = HardRetain(leakNamedCursor("verticalTextCursor", 7, 7));
+        break;
+    case Cursor::Cell:
+        m_platformCursor = HardRetain(leakNamedCursor("cellCursor", 7, 7));
+        break;
+    case Cursor::ContextMenu:
+        m_platformCursor = HardRetain(leakNamedCursor("contextMenuCursor", 3, 2));
+        break;
+    case Cursor::Alias:
+        m_platformCursor = HardRetain(leakNamedCursor("aliasCursor", 11, 3));
+        break;
+    case Cursor::Progress:
+        m_platformCursor = HardRetain(leakNamedCursor("progressCursor", 3, 2));
+        break;
+    case Cursor::NoDrop:
+        m_platformCursor = HardRetain(leakNamedCursor("noDropCursor", 3, 1));
+        break;
+    case Cursor::Copy:
+        m_platformCursor = HardRetain(leakNamedCursor("copyCursor", 3, 2));
+        break;
+    case Cursor::None:
+        m_platformCursor = HardRetain(leakNamedCursor("noneCursor", 7, 7));
+        break;
+    case Cursor::NotAllowed:
+        m_platformCursor = HardRetain(leakNamedCursor("notAllowedCursor", 11, 11));
+        break;
+    case Cursor::ZoomIn:
+        m_platformCursor = HardRetain(leakNamedCursor("zoomInCursor", 7, 7));
+        break;
+    case Cursor::ZoomOut:
+        m_platformCursor = HardRetain(leakNamedCursor("zoomOutCursor", 7, 7));
+        break;
+    case Cursor::Grab:
+        m_platformCursor = HardRetain([NSCursor openHandCursor]);
+        break;
+    case Cursor::Grabbing:
+        m_platformCursor = HardRetain([NSCursor closedHandCursor]);
+        break;
+    case Cursor::Custom:
+        m_platformCursor = HardRetainWithNSRelease(createCustomCursor(m_image.get(), m_hotSpot));
+        break;
+    }
 }
 
 Cursor::Cursor(const Cursor& other)
-    : m_impl(HardRetain(other.m_impl))
+    : m_type(other.m_type)
+    , m_image(other.m_image)
+    , m_hotSpot(other.m_hotSpot)
+    , m_platformCursor(HardRetain(other.m_platformCursor))
 {
 }
 
-Cursor::~Cursor()
-{
-    HardRelease(m_impl);
-}
-
 Cursor& Cursor::operator=(const Cursor& other)
 {
-    HardRetain(other.m_impl);
-    HardRelease(m_impl);
-    m_impl = other.m_impl;
-    return *this;
-}
-
-Cursor::Cursor(NSCursor* c)
-    : m_impl(HardRetain(c))
-{
-}
-
-const Cursor& pointerCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, ([NSCursor arrowCursor]));
-    return c;
-}
-
-const Cursor& crossCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("crossHairCursor", 11, 11)));
-    return c;
-}
-
-const Cursor& handCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("linkCursor", 6, 1)));
-    return c;
-}
-
-const Cursor& moveCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("moveCursor", 7, 7)));
-    return c;
-}
-
-const Cursor& verticalTextCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("verticalTextCursor", 7, 7)));
-    return c;
-}
-
-const Cursor& cellCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("cellCursor", 7, 7)));
-    return c;
-}
-
-const Cursor& contextMenuCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("contextMenuCursor", 3, 2)));
-    return c;
-}
-
-const Cursor& aliasCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("aliasCursor", 11, 3)));
-    return c;
-}
-
-const Cursor& zoomInCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("zoomInCursor", 7, 7)));
-    return c;
-}
-
-const Cursor& zoomOutCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("zoomOutCursor", 7, 7)));
-    return c;
-}
-
-const Cursor& copyCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("copyCursor", 3, 2)));
-    return c;
-}
-
-const Cursor& noneCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("noneCursor", 7, 7)));
-    return c;
-}
-
-const Cursor& progressCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("progressCursor", 3, 2)));
-    return c;
-}
-
-const Cursor& noDropCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("noDropCursor", 3, 1)));
-    return c;
-}
-
-const Cursor& notAllowedCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("notAllowedCursor", 11, 11)));
-    return c;
-}
-
-const Cursor& iBeamCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, ([NSCursor IBeamCursor]));
-    return c;
-}
-
-const Cursor& waitCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("waitCursor", 7, 7)));
-    return c;
-}
-
-const Cursor& helpCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("helpCursor", 8, 8)));
-    return c;
-}
-
-const Cursor& eastResizeCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("eastResizeCursor", 14, 7)));
-    return c;
-}
-
-const Cursor& northResizeCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("northResizeCursor", 7, 1)));
-    return c;
-}
-
-const Cursor& northEastResizeCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("northEastResizeCursor", 14, 1)));
-    return c;
-}
-
-const Cursor& northWestResizeCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("northWestResizeCursor", 0, 0)));
-    return c;
-}
-
-const Cursor& southResizeCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("southResizeCursor", 7, 14)));
-    return c;
-}
-
-const Cursor& southEastResizeCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("southEastResizeCursor", 14, 14)));
-    return c;
-}
-
-const Cursor& southWestResizeCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("southWestResizeCursor", 1, 14)));
-    return c;
-}
-
-const Cursor& westResizeCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("westResizeCursor", 1, 7)));
-    return c;
-}
-
-const Cursor& northSouthResizeCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("northSouthResizeCursor", 7, 7)));
-    return c;
-}
-
-const Cursor& eastWestResizeCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("eastWestResizeCursor", 7, 7)));
-    return c;
-}
-
-const Cursor& northEastSouthWestResizeCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("northEastSouthWestResizeCursor", 7, 7)));
-    return c;
-}
+    m_type = other.m_type;
+    m_image = other.m_image;
+    m_hotSpot = other.m_hotSpot;
 
-const Cursor& northWestSouthEastResizeCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, (leakNamedCursor("northWestSouthEastResizeCursor", 7, 7)));
-    return c;
-}
-
-const Cursor& columnResizeCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, ([NSCursor resizeLeftRightCursor]));
-    return c;
-}
-
-const Cursor& rowResizeCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, ([NSCursor resizeUpDownCursor]));
-    return c;
-}
-
-const Cursor& middlePanningCursor()
-{
-    return moveCursor();
-}
-    
-const Cursor& eastPanningCursor()
-{
-    return eastResizeCursor();
-}
-    
-const Cursor& northPanningCursor()
-{
-    return northResizeCursor();
-}
-    
-const Cursor& northEastPanningCursor()
-{
-    return northEastResizeCursor();
-}
-    
-const Cursor& northWestPanningCursor()
-{
-    return northWestResizeCursor();
-}
-    
-const Cursor& southPanningCursor()
-{
-    return southResizeCursor();
-}
-    
-const Cursor& southEastPanningCursor()
-{
-    return southEastResizeCursor();
-}
-    
-const Cursor& southWestPanningCursor()
-{
-    return southWestResizeCursor();
-}
-    
-const Cursor& westPanningCursor()
-{
-    return westResizeCursor();
-}
-
-const Cursor& grabCursor()
-{
-    DEFINE_STATIC_LOCAL(Cursor, c, ([NSCursor openHandCursor]));
-    return c;
+    HardRetain(other.m_platformCursor);
+    HardRelease(m_platformCursor);
+    m_platformCursor = other.m_platformCursor;
+    return *this;
 }
 
-const Cursor& grabbingCursor()
+Cursor::~Cursor()
 {
-    DEFINE_STATIC_LOCAL(Cursor, c, ([NSCursor closedHandCursor]));
-    return c;
+    HardRelease(m_platformCursor);
 }
 
-}
+} // namespace WebCore
diff --git a/WebCore/platform/mac/WidgetMac.mm b/WebCore/platform/mac/WidgetMac.mm
index 37c9e9f..2598591 100644
--- a/WebCore/platform/mac/WidgetMac.mm
+++ b/WebCore/platform/mac/WidgetMac.mm
@@ -123,11 +123,12 @@ void Widget::setFocus(bool focused)
     END_BLOCK_OBJC_EXCEPTIONS;
 }
 
- void Widget::setCursor(const Cursor& cursor)
- {
-    if ([NSCursor currentCursor] == cursor.impl())
+void Widget::setCursor(const Cursor& cursor)
+{
+    ScrollView* view = root();
+    if (!view)
         return;
-    [cursor.impl() set];
+    view->hostWindow()->setCursor(cursor);
 }
 
 void Widget::show()
diff --git a/WebCore/platform/qt/CursorQt.cpp b/WebCore/platform/qt/CursorQt.cpp
index 2e495e7..6017daa 100644
--- a/WebCore/platform/qt/CursorQt.cpp
+++ b/WebCore/platform/qt/CursorQt.cpp
@@ -44,12 +44,12 @@
 namespace WebCore {
 
 Cursor::Cursor(PlatformCursor p)
-    : m_impl(p)
+    : m_platformCursor(p)
 {
 }
 
 Cursor::Cursor(const Cursor& other)
-    : m_impl(other.m_impl)
+    : m_platformCursor(other.m_platformCursor)
 {
 }
 
@@ -61,13 +61,13 @@ Cursor::Cursor(Image* image, const IntPoint& hotSpot)
 {
 #ifndef QT_NO_CURSOR
     IntPoint effectiveHotSpot = determineHotSpot(image, hotSpot);
-    m_impl = QCursor(*(image->nativeImageForCurrentFrame()), effectiveHotSpot.x(), effectiveHotSpot.y());
+    m_platformCursor = QCursor(*(image->nativeImageForCurrentFrame()), effectiveHotSpot.x(), effectiveHotSpot.y());
 #endif
 }
 
 Cursor& Cursor::operator=(const Cursor& other)
 {
-    m_impl = other.m_impl;
+    m_platformCursor = other.m_platformCursor;
     return *this;
 }
 
diff --git a/WebCore/platform/win/CursorWin.cpp b/WebCore/platform/win/CursorWin.cpp
index 22a535d..2dd1452 100644
--- a/WebCore/platform/win/CursorWin.cpp
+++ b/WebCore/platform/win/CursorWin.cpp
@@ -39,11 +39,6 @@
 
 namespace WebCore {
 
-Cursor::Cursor(const Cursor& other)
-    : m_impl(other.m_impl)
-{
-}
-
 static inline bool supportsAlphaCursors() 
 {
     OSVERSIONINFO osinfo = {0};
@@ -52,8 +47,10 @@ static inline bool supportsAlphaCursors()
     return osinfo.dwMajorVersion > 5 || (osinfo.dwMajorVersion == 5 && osinfo.dwMinorVersion > 0);
 }
 
-Cursor::Cursor(Image* img, const IntPoint& hotSpot)
+static PassRefPtr<SharedCursor> createSharedCursor(Image* img, const IntPoint& hotSpot)
 {
+    RefPtr<SharedCursor> impl;
+
     IntPoint effectiveHotSpot = determineHotSpot(img, hotSpot);
     static bool doAlpha = supportsAlphaCursors();
     BitmapInfo cursorImage = BitmapInfo::create(IntSize(img->width(), img->height()));
@@ -80,7 +77,7 @@ Cursor::Cursor(Image* img, const IntPoint& hotSpot)
         ii.hbmMask = hMask.get();
         ii.hbmColor = hCursor.get();
 
-        m_impl = SharedCursor::create(CreateIconIndirect(&ii));
+        impl = SharedCursor::create(CreateIconIndirect(&ii));
     } else {
         // Platform doesn't support alpha blended cursors, so we need
         // to create the mask manually
@@ -115,303 +112,183 @@ Cursor::Cursor(Image* img, const IntPoint& hotSpot)
         icon.yHotspot = effectiveHotSpot.y();
         icon.hbmMask = andMask.get();
         icon.hbmColor = xorMask.get();
-        m_impl = SharedCursor::create(CreateIconIndirect(&icon));
+        impl = SharedCursor::create(CreateIconIndirect(&icon));
 
         DeleteDC(xorMaskDC);
         DeleteDC(andMaskDC);
     }
     DeleteDC(workingDC);
     ReleaseDC(0, dc);
-}
 
-Cursor::~Cursor()
-{
+    return impl.release();
 }
 
-Cursor& Cursor::operator=(const Cursor& other)
-{
-    m_impl = other.m_impl;
-    return *this;
-}
-
-Cursor::Cursor(PlatformCursor c)
-    : m_impl(c)
+static PassRefPtr<SharedCursor> loadSharedCursor(HINSTANCE hInstance, LPCTSTR lpCursorName)
 {
+    return SharedCursor::create(::LoadCursor(hInstance, lpCursorName));
 }
 
-static Cursor loadCursorByName(char* name, int x, int y) 
+static PassRefPtr<SharedCursor> loadCursorByName(char* name, int x, int y)
 {
     IntPoint hotSpot(x, y);
-    Cursor c;
     RefPtr<Image> cursorImage(Image::loadPlatformResource(name));
-    if (cursorImage && !cursorImage->isNull()) 
-        c = Cursor(cursorImage.get(), hotSpot);
-    else
-        c = pointerCursor();
-    return c;
-}
-
-static PassRefPtr<SharedCursor> loadSharedCursor(HINSTANCE hInstance, LPCTSTR lpCursorName)
-{
-    return SharedCursor::create(LoadCursor(hInstance, lpCursorName));
-}
-
-const Cursor& pointerCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_ARROW);
-    return c;
-}
-
-const Cursor& crossCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_CROSS);
-    return c;
-}
-
-const Cursor& handCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_HAND);
-    return c;
-}
-
-const Cursor& iBeamCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_IBEAM);
-    return c;
-}
-
-const Cursor& waitCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_WAIT);
-    return c;
-}
-
-const Cursor& helpCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_HELP);
-    return c;
-}
-
-const Cursor& eastResizeCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_SIZEWE);
-    return c;
-}
-
-const Cursor& northResizeCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_SIZENS);
-    return c;
-}
-
-const Cursor& northEastResizeCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_SIZENESW);
-    return c;
-}
-
-const Cursor& northWestResizeCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_SIZENWSE);
-    return c;
-}
-
-const Cursor& southResizeCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_SIZENS);
-    return c;
-}
-
-const Cursor& southEastResizeCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_SIZENWSE);
-    return c;
-}
-
-const Cursor& southWestResizeCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_SIZENESW);
-    return c;
-}
-
-const Cursor& westResizeCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_SIZEWE);
-    return c;
-}
-
-const Cursor& northSouthResizeCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_SIZENS);
-    return c;
-}
-
-const Cursor& eastWestResizeCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_SIZEWE);
-    return c;
-}
-
-const Cursor& northEastSouthWestResizeCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_SIZENESW);
-    return c;
-}
-
-const Cursor& northWestSouthEastResizeCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_SIZENWSE);
-    return c;
-}
-
-const Cursor& columnResizeCursor()
-{
-    // FIXME: Windows does not have a standard column resize cursor <rdar://problem/5018591>
-    static Cursor c = loadSharedCursor(0, IDC_SIZEWE);
-    return c;
-}
-
-const Cursor& rowResizeCursor()
-{
-    // FIXME: Windows does not have a standard row resize cursor <rdar://problem/5018591>
-    static Cursor c = loadSharedCursor(0, IDC_SIZENS);
-    return c;
-}
-
-const Cursor& middlePanningCursor()
-{
-    static const Cursor c = loadCursorByName("panIcon", 8, 8);
-    return c;
-}
-
-const Cursor& eastPanningCursor()
-{
-    static const Cursor c = loadCursorByName("panEastCursor", 7, 7);
-    return c;
-}
-
-const Cursor& northPanningCursor()
-{
-    static const Cursor c = loadCursorByName("panNorthCursor", 7, 7);
-    return c;
-}
-
-const Cursor& northEastPanningCursor()
-{
-    static const Cursor c = loadCursorByName("panNorthEastCursor", 7, 7);
-    return c;
-}
-
-const Cursor& northWestPanningCursor()
-{
-    static const Cursor c = loadCursorByName("panNorthWestCursor", 7, 7);
-    return c;
-}
-
-const Cursor& southPanningCursor()
-{
-    static const Cursor c = loadCursorByName("panSouthCursor", 7, 7);
-    return c;
-}
-
-const Cursor& southEastPanningCursor()
-{
-    static const Cursor c = loadCursorByName("panSouthEastCursor", 7, 7);
-    return c;
-}
-
-const Cursor& southWestPanningCursor()
-{
-    static const Cursor c = loadCursorByName("panSouthWestCursor", 7, 7);
-    return c;
-}
-
-const Cursor& westPanningCursor()
-{
-    static const Cursor c = loadCursorByName("panWestCursor", 7, 7);
-    return c;
-}
-
-const Cursor& moveCursor() 
-{
-    static Cursor c = loadSharedCursor(0, IDC_SIZEALL);
-    return c;
-}
-
-const Cursor& verticalTextCursor()
-{
-    static const Cursor c = loadCursorByName("verticalTextCursor", 7, 7);
-    return c;
-}
-
-const Cursor& cellCursor()
-{
-    return pointerCursor();
-}
-
-const Cursor& contextMenuCursor()
-{
-    return pointerCursor();
-}
-
-const Cursor& aliasCursor()
-{
-    return pointerCursor();
-}
-
-const Cursor& progressCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_APPSTARTING);
-    return c;
-}
-
-const Cursor& noDropCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_NO);
-    return c;
-}
-
-const Cursor& copyCursor()
-{
-    return pointerCursor();
-}
-
-const Cursor& noneCursor()
-{
-    return pointerCursor();
-}
-
-const Cursor& notAllowedCursor()
-{
-    static Cursor c = loadSharedCursor(0, IDC_NO);
-    return c;
-}
-
-const Cursor& zoomInCursor()
-{
-    static const Cursor c = loadCursorByName("zoomInCursor", 7, 7);
-    return c;
+    if (cursorImage && !cursorImage->isNull())
+        return createSharedCursor(cursorImage.get(), hotSpot);
+    return loadSharedCursor(0, IDC_ARROW);
+}
+
+void Cursor::ensurePlatformCursor() const
+{
+    if (m_platformCursor)
+        return;
+
+    switch (m_type) {
+    case Cursor::Pointer:
+    case Cursor::Cell:
+    case Cursor::ContextMenu:
+    case Cursor::Alias:
+    case Cursor::Copy:
+    case Cursor::None:
+    case Cursor::Grab:
+    case Cursor::Grabbing:
+        m_platformCursor = loadSharedCursor(0, IDC_ARROW);
+        break;
+    case Cursor::Cross:
+        m_platformCursor = loadSharedCursor(0, IDC_CROSS);
+        break;
+    case Cursor::Hand:
+        m_platformCursor = loadSharedCursor(0, IDC_HAND);
+        break;
+    case Cursor::IBeam:
+        m_platformCursor = loadSharedCursor(0, IDC_IBEAM);
+        break;
+    case Cursor::Wait:
+        m_platformCursor = loadSharedCursor(0, IDC_WAIT);
+        break;
+    case Cursor::Help:
+        m_platformCursor = loadSharedCursor(0, IDC_HELP);
+        break;
+    case Cursor::Move:
+        m_platformCursor = loadSharedCursor(0, IDC_SIZEALL);
+        break;
+    case Cursor::MiddlePanning:
+        m_platformCursor = loadCursorByName("panIcon", 8, 8);
+        break;
+    case Cursor::EastResize:
+        m_platformCursor = loadSharedCursor(0, IDC_SIZEWE);
+        break;
+    case Cursor::EastPanning:
+        m_platformCursor = loadCursorByName("panEastCursor", 7, 7);
+        break;
+    case Cursor::NorthResize:
+        m_platformCursor = loadSharedCursor(0, IDC_SIZENS);
+        break;
+    case Cursor::NorthPanning:
+        m_platformCursor = loadCursorByName("panNorthCursor", 7, 7);
+        break;
+    case Cursor::NorthEastResize:
+        m_platformCursor = loadSharedCursor(0, IDC_SIZENESW);
+        break;
+    case Cursor::NorthEastPanning:
+        m_platformCursor = loadCursorByName("panNorthEastCursor", 7, 7);
+        break;
+    case Cursor::NorthWestResize:
+        m_platformCursor = loadSharedCursor(0, IDC_SIZENWSE);
+        break;
+    case Cursor::NorthWestPanning:
+        m_platformCursor = loadCursorByName("panNorthWestCursor", 7, 7);
+        break;
+    case Cursor::SouthResize:
+        m_platformCursor = loadSharedCursor(0, IDC_SIZENS);
+        break;
+    case Cursor::SouthPanning:
+        m_platformCursor = loadCursorByName("panSouthCursor", 7, 7);
+        break;
+    case Cursor::SouthEastResize:
+        m_platformCursor = loadSharedCursor(0, IDC_SIZENWSE);
+        break;
+    case Cursor::SouthEastPanning:
+        m_platformCursor = loadCursorByName("panSouthEastCursor", 7, 7);
+        break;
+    case Cursor::SouthWestResize:
+        m_platformCursor = loadSharedCursor(0, IDC_SIZENESW);
+        break;
+    case Cursor::SouthWestPanning:
+        m_platformCursor = loadCursorByName("panSouthWestCursor", 7, 7);
+        break;
+    case Cursor::WestResize:
+        m_platformCursor = loadSharedCursor(0, IDC_SIZEWE);
+        break;
+    case Cursor::NorthSouthResize:
+        m_platformCursor = loadSharedCursor(0, IDC_SIZENS);
+        break;
+    case Cursor::EastWestResize:
+        m_platformCursor = loadSharedCursor(0, IDC_SIZEWE);
+        break;
+    case Cursor::WestPanning:
+        m_platformCursor = loadCursorByName("panWestCursor", 7, 7);
+        break;
+    case Cursor::NorthEastSouthWestResize:
+        m_platformCursor = loadSharedCursor(0, IDC_SIZENESW);
+        break;
+    case Cursor::NorthWestSouthEastResize:
+        m_platformCursor = loadSharedCursor(0, IDC_SIZENWSE);
+        break;
+    case Cursor::ColumnResize:
+        // FIXME: Windows does not have a standard column resize cursor <rdar://problem/5018591>
+        m_platformCursor = loadSharedCursor(0, IDC_SIZEWE);
+        break;
+    case Cursor::RowResize:
+        // FIXME: Windows does not have a standard row resize cursor <rdar://problem/5018591>
+        m_platformCursor = loadSharedCursor(0, IDC_SIZENS);
+        break;
+    case Cursor::VerticalText:
+        m_platformCursor = loadCursorByName("verticalTextCursor", 7, 7);
+        break;
+    case Cursor::Progress:
+        m_platformCursor = loadSharedCursor(0, IDC_APPSTARTING);
+        break;
+    case Cursor::NoDrop:
+        break;
+    case Cursor::NotAllowed:
+        m_platformCursor = loadSharedCursor(0, IDC_NO);
+        break;
+    case Cursor::ZoomIn:
+        m_platformCursor = loadCursorByName("zoomInCursor", 7, 7);
+        break;
+    case Cursor::ZoomOut:
+        m_platformCursor = loadCursorByName("zoomOutCursor", 7, 7);
+        break;
+    case Cursor::Custom:
+        m_platformCursor = createSharedCursor(m_image.get(), m_hotSpot);
+        break;
+    }
 }
 
-const Cursor& zoomOutCursor()
+SharedCursor::~SharedCursor()
 {
-    static const Cursor c = loadCursorByName("zoomOutCursor", 7, 7);
-    return c;
+    DestroyIcon(m_nativeCursor);
 }
 
-const Cursor& grabCursor()
+Cursor::Cursor(const Cursor& other)
+    : m_type(other.m_type)
+    , m_image(other.m_image)
+    , m_hotSpot(other.m_hotSpot)
+    , m_platformCursor(other.m_platformCursor)
 {
-    return pointerCursor();
 }
 
-const Cursor& grabbingCursor()
+Cursor& Cursor::operator=(const Cursor& other)
 {
-    return pointerCursor();
+    m_type = other.m_type;
+    m_image = other.m_image;
+    m_hotSpot = other.m_hotSpot;
+    m_platformCursor = other.m_platformCursor;
+    return *this;
 }
 
-SharedCursor::~SharedCursor()
+Cursor::~Cursor()
 {
-    DestroyIcon(m_nativeCursor);
 }
 
-}
+} // namespace WebCore
diff --git a/WebCore/platform/win/WidgetWin.cpp b/WebCore/platform/win/WidgetWin.cpp
index 607c0d8..416260b 100644
--- a/WebCore/platform/win/WidgetWin.cpp
+++ b/WebCore/platform/win/WidgetWin.cpp
@@ -59,7 +59,6 @@ void Widget::hide()
 {
 }
 
-HCURSOR lastSetCursor = 0;
 bool ignoreNextSetCursor = false;
 
 void Widget::setCursor(const Cursor& cursor)
@@ -71,30 +70,10 @@ void Widget::setCursor(const Cursor& cursor)
         return;
     }
 
-    if (!cursor.impl()->nativeCursor())
-        return;
-
-    lastSetCursor = cursor.impl()->nativeCursor();
-
     ScrollView* view = root();
-    if (!view || !view->isFrameView()) {
-        SetCursor(lastSetCursor);
-        return;
-    }
-
-    Frame* frame = static_cast<FrameView*>(view)->frame();
-    if (!frame) {
-        SetCursor(lastSetCursor);
+    if (!view)
         return;
-    }
-
-    Page* page = frame->page();
-    if (!page) {
-        SetCursor(lastSetCursor);
-        return;
-    }
-
-    page->chrome()->setCursor(lastSetCursor);
+    view->hostWindow()->setCursor(cursor);
 }
 
 void Widget::paint(GraphicsContext*, const IntRect&)
diff --git a/WebCore/platform/wince/CursorWince.cpp b/WebCore/platform/wince/CursorWince.cpp
index e35f1f9..d7dcfb4 100644
--- a/WebCore/platform/wince/CursorWince.cpp
+++ b/WebCore/platform/wince/CursorWince.cpp
@@ -38,12 +38,12 @@ static const Cursor& getCursor(CursorType type)
 }
 
 Cursor::Cursor(const Cursor& other)
-: m_impl(other.m_impl)
+: m_platformCursor(other.m_platformCursor)
 {
 }
 
 Cursor::Cursor(Image* img, const IntPoint& hotspot)
-: m_impl(CursorNone)
+: m_platformCursor(CursorNone)
 {
 }
 
@@ -53,12 +53,12 @@ Cursor::~Cursor()
 
 Cursor& Cursor::operator=(const Cursor& other)
 {
-    m_impl = other.m_impl;
+    m_platformCursor = other.m_platformCursor;
     return *this;
 }
 
 Cursor::Cursor(PlatformCursor c)
-: m_impl(c)
+: m_platformCursor(c)
 {
 }
 
diff --git a/WebCore/platform/wx/CursorWx.cpp b/WebCore/platform/wx/CursorWx.cpp
index ed7f86b..dd61f1e 100644
--- a/WebCore/platform/wx/CursorWx.cpp
+++ b/WebCore/platform/wx/CursorWx.cpp
@@ -34,15 +34,15 @@
 namespace WebCore {
 
 Cursor::Cursor(const Cursor& other)
-    : m_impl(other.m_impl)
+    : m_platformCursor(other.m_platformCursor)
 {
 }
 
 Cursor::Cursor(Image* image, const IntPoint&) 
 {
-    m_impl = 0;
+    m_platformCursor = 0;
     // FIXME: figure out why the below code causes a crash  
-    //m_impl = new wxCursor( image->getWxBitmap()->ConvertToImage() );
+    //m_platformCursor = new wxCursor( image->getWxBitmap()->ConvertToImage() );
 }
 
 Cursor::~Cursor()
@@ -51,12 +51,12 @@ Cursor::~Cursor()
 
 Cursor& Cursor::operator=(const Cursor& other)
 {
-    m_impl = other.m_impl;
+    m_platformCursor = other.m_platformCursor;
     return *this;
 }
 
 Cursor::Cursor(wxCursor* c)
-    : m_impl(c)
+    : m_platformCursor(c)
 {
 }
 
diff --git a/WebCore/plugins/win/PluginViewWin.cpp b/WebCore/plugins/win/PluginViewWin.cpp
index 1765939..8dbb04b 100644
--- a/WebCore/plugins/win/PluginViewWin.cpp
+++ b/WebCore/plugins/win/PluginViewWin.cpp
@@ -30,6 +30,8 @@
 
 #include "BitmapImage.h"
 #include "Bridge.h"
+#include "Chrome.h"
+#include "ChromeClient.h"
 #include "Document.h"
 #include "DocumentLoader.h"
 #include "Element.h"
@@ -656,7 +658,6 @@ void PluginView::handleKeyboardEvent(KeyboardEvent* event)
 }
 
 #if !OS(WINCE)
-extern HCURSOR lastSetCursor;
 extern bool ignoreNextSetCursor;
 #endif
 
@@ -727,7 +728,8 @@ void PluginView::handleMouseEvent(MouseEvent* event)
     // Currently, Widget::setCursor is always called after this function in EventHandler.cpp
     // and since we don't want that we set ignoreNextSetCursor to true here to prevent that.
     ignoreNextSetCursor = true;
-    lastSetCursor = ::GetCursor();
+    if (Page* page = m_parentFrame->page())
+        page->chrome()->client()->setLastSetCursorToCurrentCursor();    
 #endif
 }
 
diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index 2867fc1..bc7a747 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,15 @@
+2010-07-14  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Darin Adler.
+
+        Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+        Make changing Cursors work in WebKit2.
+
+        * efl/WebCoreSupport/ChromeClientEfl.cpp:
+        (WebCore::ChromeClientEfl::setCursor):
+        * efl/WebCoreSupport/ChromeClientEfl.h:
+        Change prototype to match new one.
+
 2010-07-14  Lucas De Marchi  <lucas.demarchi at profusion.mobi>
 
         Reviewed by Antonio Gomes.
diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index 4dfa580..b0ff7c5 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,19 @@
+2010-07-14  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Darin Adler.
+
+        Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+        Make changing Cursors work in WebKit2.
+
+        * src/ChromeClientImpl.h:
+        (WebKit::ChromeClientImpl::setCursor):
+        Change prototype to match new one.
+
+        * src/WebPopupMenuImpl.cpp:
+        (WebKit::WebPopupMenuImpl::setCursor):
+        * src/WebPopupMenuImpl.h:
+        Add empty setCursor function to satisfy the HostWindow interface.
+
 2010-07-13  Alexey Proskuryakov  <ap at apple.com>
 
         Reviewed by Darin Adler.
diff --git a/WebKit/chromium/src/ChromeClientImpl.h b/WebKit/chromium/src/ChromeClientImpl.h
index 84355c3..fa3dbca 100644
--- a/WebKit/chromium/src/ChromeClientImpl.h
+++ b/WebKit/chromium/src/ChromeClientImpl.h
@@ -126,7 +126,7 @@ public:
     virtual void cancelGeolocationPermissionRequestForFrame(WebCore::Frame*, WebCore::Geolocation*);
     virtual void runOpenPanel(WebCore::Frame*, PassRefPtr<WebCore::FileChooser>);
     virtual void chooseIconForFiles(const Vector<WebCore::String>&, WebCore::FileChooser*);
-    virtual bool setCursor(WebCore::PlatformCursorHandle) { return false; }
+    virtual void setCursor(const WebCore::Cursor&) { }
     virtual void formStateDidChange(const WebCore::Node*);
     virtual PassOwnPtr<WebCore::HTMLParserQuirks> createHTMLParserQuirks() { return 0; }
 #if ENABLE(TOUCH_EVENTS)
diff --git a/WebKit/chromium/src/WebPopupMenuImpl.cpp b/WebKit/chromium/src/WebPopupMenuImpl.cpp
index 2abdc62..886cb3e 100644
--- a/WebKit/chromium/src/WebPopupMenuImpl.cpp
+++ b/WebKit/chromium/src/WebPopupMenuImpl.cpp
@@ -318,6 +318,10 @@ void WebPopupMenuImpl::scrollbarsModeDidChange() const
     // Nothing to be done since we have no concept of different scrollbar modes.
 }
 
+void WebPopupMenuImpl::setCursor(const Cursor&)
+{
+}
+
 //-----------------------------------------------------------------------------
 // WebCore::FramelessScrollViewClient
 
diff --git a/WebKit/chromium/src/WebPopupMenuImpl.h b/WebKit/chromium/src/WebPopupMenuImpl.h
index 4f5c2de..edbb4ab 100644
--- a/WebKit/chromium/src/WebPopupMenuImpl.h
+++ b/WebKit/chromium/src/WebPopupMenuImpl.h
@@ -110,6 +110,7 @@ public:
     virtual PlatformPageClient platformPageClient() const { return 0; }
     virtual void scrollRectIntoView(const WebCore::IntRect&, const WebCore::ScrollView*) const;
     virtual void scrollbarsModeDidChange() const;
+    virtual void setCursor(const WebCore::Cursor&);
 
     // WebCore::FramelessScrollViewClient methods:
     virtual void popupClosed(WebCore::FramelessScrollView*);
diff --git a/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp b/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp
index 342654a..4b01b75 100644
--- a/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp
+++ b/WebKit/efl/WebCoreSupport/ChromeClientEfl.cpp
@@ -437,10 +437,9 @@ void ChromeClientEfl::formStateDidChange(const Node*)
     notImplemented();
 }
 
-bool ChromeClientEfl::setCursor(PlatformCursorHandle)
+void ChromeClientEfl::setCursor(const Cursor&)
 {
     notImplemented();
-    return false;
 }
 
 void ChromeClientEfl::requestGeolocationPermissionForFrame(Frame*, Geolocation*)
diff --git a/WebKit/efl/WebCoreSupport/ChromeClientEfl.h b/WebKit/efl/WebCoreSupport/ChromeClientEfl.h
index 45bda59..ce8abd1 100644
--- a/WebKit/efl/WebCoreSupport/ChromeClientEfl.h
+++ b/WebKit/efl/WebCoreSupport/ChromeClientEfl.h
@@ -119,7 +119,7 @@ public:
 
     virtual PassOwnPtr<HTMLParserQuirks> createHTMLParserQuirks() { return 0; }
 
-    virtual bool setCursor(PlatformCursorHandle);
+    virtual void setCursor(const Cursor&);
 
     virtual void scrollRectIntoView(const IntRect&, const ScrollView*) const {}
 
diff --git a/WebKit/gtk/ChangeLog b/WebKit/gtk/ChangeLog
index cddfac8..a1c1e5a 100644
--- a/WebKit/gtk/ChangeLog
+++ b/WebKit/gtk/ChangeLog
@@ -1,3 +1,15 @@
+2010-07-14  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Darin Adler.
+
+        Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+        Make changing Cursors work in WebKit2.
+
+        * WebCoreSupport/ChromeClientGtk.cpp:
+        (WebKit::ChromeClient::setCursor):
+        * WebCoreSupport/ChromeClientGtk.h:
+        Change prototype to match new one.
+
 2010-07-12  Martin Robinson  <mrobinson at igalia.com>
 
         Reviewed by Gustavo Noronha Silva.
diff --git a/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp b/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp
index bb469c5..88440ba 100644
--- a/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp
+++ b/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp
@@ -591,10 +591,9 @@ void ChromeClient::chooseIconForFiles(const Vector<WebCore::String>& filenames,
     chooser->iconLoaded(Icon::createIconForFiles(filenames));
 }
 
-bool ChromeClient::setCursor(PlatformCursorHandle)
+void ChromeClient::setCursor(const Cursor&)
 {
     notImplemented();
-    return false;
 }
 
 void ChromeClient::requestGeolocationPermissionForFrame(Frame* frame, Geolocation* geolocation)
diff --git a/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h b/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h
index 46d015e..ce5c5a7 100644
--- a/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h
+++ b/WebKit/gtk/WebCoreSupport/ChromeClientGtk.h
@@ -116,7 +116,7 @@ namespace WebKit {
 
         virtual PassOwnPtr<WebCore::HTMLParserQuirks> createHTMLParserQuirks() { return 0; }
 
-        virtual bool setCursor(WebCore::PlatformCursorHandle);
+        virtual void setCursor(const WebCore::Cursor&);
 
         virtual void scrollRectIntoView(const WebCore::IntRect&, const WebCore::ScrollView*) const {}
         virtual void requestGeolocationPermissionForFrame(WebCore::Frame*, WebCore::Geolocation*);
diff --git a/WebKit/haiku/ChangeLog b/WebKit/haiku/ChangeLog
index d71c5e4..fe3b6a1 100644
--- a/WebKit/haiku/ChangeLog
+++ b/WebKit/haiku/ChangeLog
@@ -1,3 +1,15 @@
+2010-07-14  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Darin Adler.
+
+        Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+        Make changing Cursors work in WebKit2.
+
+        * WebCoreSupport/ChromeClientHaiku.cpp:
+        (WebCore::ChromeClientHaiku::setCursor):
+        * WebCoreSupport/ChromeClientHaiku.h:
+        Change prototype to match new one.
+
 2010-06-14  Ilya Tikhonovsky  <loislo at chromium.org>
 
         Reviewed by Pavel Feldman.
diff --git a/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.cpp b/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.cpp
index 2cf5c31..d18b84d 100644
--- a/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.cpp
+++ b/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.cpp
@@ -362,10 +362,9 @@ void ChromeClientHaiku::chooseIconForFiles(const Vector<String>& filenames, File
     chooser->iconLoaded(Icon::createIconForFiles(filenames));
 }
 
-bool ChromeClientHaiku::setCursor(PlatformCursorHandle)
+void ChromeClientHaiku::setCursor(const Cursor&)
 {
     notImplemented();
-    return false;
 }
 
 // Notification that the given form element has changed. This function
diff --git a/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.h b/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.h
index d5a372b..963e72f 100644
--- a/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.h
+++ b/WebKit/haiku/WebCoreSupport/ChromeClientHaiku.h
@@ -140,7 +140,7 @@ namespace WebCore {
         void runOpenPanel(Frame*, PassRefPtr<FileChooser>);
         void chooseIconForFiles(const Vector<String>&, FileChooser*);
 
-        bool setCursor(PlatformCursorHandle);
+        void setCursor(const Cursor&);
 
         // Notification that the given form element has changed. This function
         // will be called frequently, so handling should be very fast.
diff --git a/WebKit/mac/ChangeLog b/WebKit/mac/ChangeLog
index c368b96..ad51c92 100644
--- a/WebKit/mac/ChangeLog
+++ b/WebKit/mac/ChangeLog
@@ -1,3 +1,19 @@
+2010-07-14  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Darin Adler.
+
+        Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+        Make changing Cursors work in WebKit2.
+
+        * WebCoreSupport/WebChromeClient.h:
+        * WebCoreSupport/WebChromeClient.mm:
+        (WebChromeClient::setCursor):
+        * WebView/WebView.mm:
+        Implement cursor changing at the WebKit level for the sake of WebKit2.
+        This functionality is being moved from WidgetMac.mm.
+        (+[WebView _pointingHandCursor]):
+        Update to use platformCursor() instead of impl().
+
 2010-07-13  Simon Fraser  <simon.fraser at apple.com>
 
         Fix Tiger build.
diff --git a/WebKit/mac/WebCoreSupport/WebChromeClient.h b/WebKit/mac/WebCoreSupport/WebChromeClient.h
index ea59c4d..707d080 100644
--- a/WebKit/mac/WebCoreSupport/WebChromeClient.h
+++ b/WebKit/mac/WebCoreSupport/WebChromeClient.h
@@ -127,7 +127,7 @@ public:
     virtual void runOpenPanel(WebCore::Frame*, PassRefPtr<WebCore::FileChooser>);
     virtual void chooseIconForFiles(const Vector<WebCore::String>&, WebCore::FileChooser*);
 
-    virtual bool setCursor(WebCore::PlatformCursorHandle) { return false; }
+    virtual void setCursor(const WebCore::Cursor&);
 
     virtual WebCore::FloatRect customHighlightRect(WebCore::Node*, const WebCore::AtomicString& type,
         const WebCore::FloatRect& lineRect);
diff --git a/WebKit/mac/WebCoreSupport/WebChromeClient.mm b/WebKit/mac/WebCoreSupport/WebChromeClient.mm
index 3bf310a..eb56240 100644
--- a/WebKit/mac/WebCoreSupport/WebChromeClient.mm
+++ b/WebKit/mac/WebCoreSupport/WebChromeClient.mm
@@ -48,6 +48,7 @@
 #import <Foundation/Foundation.h>
 #import <WebCore/BlockExceptions.h>
 #import <WebCore/Console.h>
+#import <WebCore/Cursor.h>
 #import <WebCore/Element.h>
 #import <WebCore/FileChooser.h>
 #import <WebCore/FloatRect.h>
@@ -659,6 +660,14 @@ void WebChromeClient::chooseIconForFiles(const Vector<String>& filenames, FileCh
     chooser->iconLoaded(Icon::createIconForFiles(filenames));
 }
 
+void WebChromeClient::setCursor(const WebCore::Cursor& cursor)
+{
+    NSCursor *platformCursor = cursor.platformCursor();
+    if ([NSCursor currentCursor] == platformCursor)
+        return;
+    [platformCursor set];
+}
+
 KeyboardUIMode WebChromeClient::keyboardUIMode()
 {
     BEGIN_BLOCK_OBJC_EXCEPTIONS;
diff --git a/WebKit/mac/WebView/WebView.mm b/WebKit/mac/WebView/WebView.mm
index 3a59116..6881072 100644
--- a/WebKit/mac/WebView/WebView.mm
+++ b/WebKit/mac/WebView/WebView.mm
@@ -2220,7 +2220,7 @@ static inline IMP getMethod(id o, SEL s)
 
 + (NSCursor *)_pointingHandCursor
 {
-    return handCursor().impl();
+    return handCursor().platformCursor();
 }
 
 - (BOOL)_postsAcceleratedCompositingNotifications
diff --git a/WebKit/qt/ChangeLog b/WebKit/qt/ChangeLog
index 160240f..006b6a7 100644
--- a/WebKit/qt/ChangeLog
+++ b/WebKit/qt/ChangeLog
@@ -1,3 +1,15 @@
+2010-07-14  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Darin Adler.
+
+        Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+        Make changing Cursors work in WebKit2.
+
+        * WebCoreSupport/ChromeClientQt.cpp:
+        (WebCore::ChromeClientQt::setCursor):
+        * WebCoreSupport/ChromeClientQt.h:
+        Change prototype to match new one.
+
 2010-07-07  Tor Arne Vestbø  <tor.arne.vestbo at nokia.com>
 
         Reviewed by Darin Adler.
diff --git a/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp b/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp
index faec705..2c64a78 100644
--- a/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp
+++ b/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp
@@ -529,10 +529,9 @@ void ChromeClientQt::chooseIconForFiles(const Vector<String>& filenames, FileCho
     chooser->iconLoaded(Icon::createIconForFiles(filenames));
 }
 
-bool ChromeClientQt::setCursor(PlatformCursorHandle)
+void ChromeClientQt::setCursor(const Cursor&)
 {
     notImplemented();
-    return false;
 }
 
 void ChromeClientQt::requestGeolocationPermissionForFrame(Frame* frame, Geolocation* geolocation)
diff --git a/WebKit/qt/WebCoreSupport/ChromeClientQt.h b/WebKit/qt/WebCoreSupport/ChromeClientQt.h
index 4b55eb2..70b4a25 100644
--- a/WebKit/qt/WebCoreSupport/ChromeClientQt.h
+++ b/WebKit/qt/WebCoreSupport/ChromeClientQt.h
@@ -161,7 +161,7 @@ namespace WebCore {
 
         virtual PassOwnPtr<HTMLParserQuirks> createHTMLParserQuirks() { return 0; }
 
-        virtual bool setCursor(PlatformCursorHandle);
+        virtual void setCursor(const Cursor&);
 
         virtual void scrollRectIntoView(const IntRect&, const ScrollView*) const {}
 
diff --git a/WebKit/win/ChangeLog b/WebKit/win/ChangeLog
index b4f9301..9d0703c 100644
--- a/WebKit/win/ChangeLog
+++ b/WebKit/win/ChangeLog
@@ -1,3 +1,25 @@
+2010-07-14  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Darin Adler.
+
+        Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+        Make changing Cursors work in WebKit2.
+
+        * WebCoreSupport/WebChromeClient.cpp:
+        (WebChromeClient::setCursor):
+        We now need to grab the native cursor out of the WebCore cursor.
+
+        (WebChromeClient::setLastSetCursorToCurrentCursor):
+        Sets the WebView's "last set cursor" to be the current cursor so that
+        the cursor is set correctly for plugins.
+        * WebCoreSupport/WebChromeClient.h:
+        * WebView.cpp:
+        (WebView::WebView):
+        (WebView::WebViewWndProc):
+        * WebView.h:
+        (WebView::setLastCursor):
+        Change the "last set cursor" to be stored as a member instead of a global.
+
 2010-07-13  Steve Falkenburg  <sfalken at apple.com>
 
         Windows build fix.
diff --git a/WebKit/win/WebCoreSupport/WebChromeClient.cpp b/WebKit/win/WebCoreSupport/WebChromeClient.cpp
index 42e5cc4..73532a6 100644
--- a/WebKit/win/WebCoreSupport/WebChromeClient.cpp
+++ b/WebKit/win/WebCoreSupport/WebChromeClient.cpp
@@ -782,21 +782,28 @@ void WebChromeClient::chooseIconForFiles(const Vector<WebCore::String>& filename
     chooser->iconLoaded(Icon::createIconForFiles(filenames));
 }
 
-bool WebChromeClient::setCursor(PlatformCursorHandle cursor)
+void WebChromeClient::setCursor(const Cursor& cursor)
 {
-    if (!cursor)
-        return false;
+    HCURSOR platformCursor = cursor.platformCursor()->nativeCursor();
+    if (!platformCursor)
+        return;
 
     if (COMPtr<IWebUIDelegate> delegate = uiDelegate()) {
         COMPtr<IWebUIDelegatePrivate> delegatePrivate(Query, delegate);
         if (delegatePrivate) {
-            if (SUCCEEDED(delegatePrivate->webViewSetCursor(m_webView, reinterpret_cast<OLE_HANDLE>(cursor))))
-                return true;
+            if (SUCCEEDED(delegatePrivate->webViewSetCursor(m_webView, reinterpret_cast<OLE_HANDLE>(platformCursor))))
+                return;
         }
     }
 
-    ::SetCursor(cursor);
-    return true;
+    m_webView->setLastCursor(platformCursor);
+    ::SetCursor(platformCursor);
+    return;
+}
+
+void WebChromeClient::setLastSetCursorToCurrentCursor()
+{
+    m_webView->setLastCursor(::GetCursor());
 }
 
 void WebChromeClient::requestGeolocationPermissionForFrame(Frame* frame, Geolocation* geolocation)
diff --git a/WebKit/win/WebCoreSupport/WebChromeClient.h b/WebKit/win/WebCoreSupport/WebChromeClient.h
index c890af0..e7845a9 100644
--- a/WebKit/win/WebCoreSupport/WebChromeClient.h
+++ b/WebKit/win/WebCoreSupport/WebChromeClient.h
@@ -130,7 +130,8 @@ public:
     virtual void runOpenPanel(WebCore::Frame*, PassRefPtr<WebCore::FileChooser>);
     virtual void chooseIconForFiles(const Vector<WebCore::String>&, WebCore::FileChooser*);
 
-    virtual bool setCursor(WebCore::PlatformCursorHandle cursor);
+    virtual void setCursor(const WebCore::Cursor&);
+    virtual void setLastSetCursorToCurrentCursor();
 
     WebView* webView() const { return m_webView; }
 
diff --git a/WebKit/win/WebView.cpp b/WebKit/win/WebView.cpp
index b5c4fa8..a24944d 100644
--- a/WebKit/win/WebView.cpp
+++ b/WebKit/win/WebView.cpp
@@ -344,6 +344,7 @@ WebView::WebView()
     , m_isAcceleratedCompositing(false)
 #endif
     , m_nextDisplayIsSynchronous(false)
+    , m_lastSetCursor(0)
 {
     JSC::initializeThreading();
     WTF::initializeMainThread();
@@ -1972,10 +1973,6 @@ bool WebView::registerWebViewWindowClass()
     return !!RegisterClassEx(&wcex);
 }
 
-namespace WebCore {
-    extern HCURSOR lastSetCursor;
-}
-
 static HWND findTopLevelParent(HWND window)
 {
     if (!window)
@@ -2250,10 +2247,8 @@ LRESULT CALLBACK WebView::WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam,
             }
             break;
         case WM_SETCURSOR:
-            if (handled = webView->page()->chrome()->setCursor(lastSetCursor))
-                break;
-
-            __fallthrough;
+            handled = ::SetCursor(webView->m_lastSetCursor);
+            break;
         case WM_VSCROLL:
             handled = webView->verticalScroll(wParam, lParam);
             break;
diff --git a/WebKit/win/WebView.h b/WebKit/win/WebView.h
index 514f376..2ab9795 100644
--- a/WebKit/win/WebView.h
+++ b/WebKit/win/WebView.h
@@ -903,6 +903,8 @@ public:
     void enterFullscreenForNode(WebCore::Node*);
     void exitFullscreen();
 
+    void setLastCursor(HCURSOR cursor) { m_lastSetCursor = cursor; }
+
 private:
     void setZoomMultiplier(float multiplier, bool isTextOnly);
     float zoomMultiplier(bool isTextOnly);
@@ -1042,6 +1044,8 @@ protected:
 #endif
 
     bool m_nextDisplayIsSynchronous;
+
+    HCURSOR m_lastSetCursor;
 };
 
 #endif
diff --git a/WebKit/wx/ChangeLog b/WebKit/wx/ChangeLog
index 9d89858..f14e87c 100644
--- a/WebKit/wx/ChangeLog
+++ b/WebKit/wx/ChangeLog
@@ -1,3 +1,15 @@
+2010-07-14  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Darin Adler.
+
+        Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+        Make changing Cursors work in WebKit2.
+
+        * WebKitSupport/ChromeClientWx.cpp:
+        (WebCore::ChromeClientWx::setCursor):
+        * WebKitSupport/ChromeClientWx.h:
+        Change prototype to match new one.
+
 2010-07-07  Kevin Ollivier  <kevino at theolliviers.com>
 
         [wx] Build fix after change in Page constructor.
diff --git a/WebKit/wx/WebKitSupport/ChromeClientWx.cpp b/WebKit/wx/WebKitSupport/ChromeClientWx.cpp
index a19644d..d81a20c 100644
--- a/WebKit/wx/WebKitSupport/ChromeClientWx.cpp
+++ b/WebKit/wx/WebKitSupport/ChromeClientWx.cpp
@@ -447,10 +447,9 @@ void ChromeClientWx::chooseIconForFiles(const Vector<String>& filenames, FileCho
     chooser->iconLoaded(Icon::createIconForFiles(filenames));
 }
 
-bool ChromeClientWx::setCursor(PlatformCursorHandle)
+void ChromeClientWx::setCursor(const Cursor&)
 {
     notImplemented();
-    return false;
 }
 
 void ChromeClientWx::requestGeolocationPermissionForFrame(Frame*, Geolocation*)
diff --git a/WebKit/wx/WebKitSupport/ChromeClientWx.h b/WebKit/wx/WebKitSupport/ChromeClientWx.h
index b900f3e..4b156ed 100644
--- a/WebKit/wx/WebKitSupport/ChromeClientWx.h
+++ b/WebKit/wx/WebKitSupport/ChromeClientWx.h
@@ -134,7 +134,7 @@ public:
 
     virtual PassOwnPtr<HTMLParserQuirks> createHTMLParserQuirks() { return 0; }
 
-    virtual bool setCursor(PlatformCursorHandle);
+    virtual void setCursor(const Cursor&);
 
     virtual void scrollRectIntoView(const IntRect&, const ScrollView*) const {}
 
diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index fa96df4..4119181 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,49 @@
+2010-07-14  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Darin Adler.
+
+        Patch for https://bugs.webkit.org/show_bug.cgi?id=42232
+        Make changing Cursors work in WebKit2.
+
+        * Shared/CoreIPCSupport/WebPageProxyMessageKinds.h:
+        Add SetCursor message.
+
+        * Shared/WebCoreArgumentCoders.h:
+        Add encoding/decoding of Cursors. For now we don't support Custom
+        cursors.
+
+        * UIProcess/API/mac/PageClientImpl.h:
+        * UIProcess/API/mac/PageClientImpl.mm:
+        (WebKit::PageClientImpl::setCursor):
+        * UIProcess/PageClient.h:
+        Add pass through functions to get the cursor from the WebPageProxy
+        to the WKView.
+
+        * UIProcess/API/mac/WKView.mm:
+        (-[WKView _setCursor:]):
+        * UIProcess/API/mac/WKViewInternal.h:
+        Implement changing the cursor.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::didReceiveMessage):
+        (WebKit::WebPageProxy::setCursor):
+        * UIProcess/WebPageProxy.h:
+        Decode the cursor.
+
+        * UIProcess/win/WebView.cpp:
+        (WebKit::WebView::wndProc):
+        (WebKit::WebView::WebView):
+        (WebKit::WebView::onSetCursor):
+        (WebKit::WebView::setCursor):
+        * UIProcess/win/WebView.h:
+        Implement changing the cursor.
+
+        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+        (WebKit::WebChromeClient::setCursor):
+        (WebKit::WebChromeClient::setLastSetCursorToCurrentCursor):
+        * WebProcess/WebCoreSupport/WebChromeClient.h:
+        Encode the cursor when setCursor is called.
+
 2010-07-13  Anders Carlsson  <andersca at apple.com>
 
         Reviewed by Sam Weinig.
diff --git a/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h b/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h
index 4ed4442..2c95624 100644
--- a/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h
+++ b/WebKit2/Shared/CoreIPCSupport/WebPageProxyMessageKinds.h
@@ -63,6 +63,7 @@ enum Kind {
     DidStartProgress,
     DidStartProvisionalLoadForFrame,
     DidUpdateHistoryTitle,
+    SetCursor,
     SetToolTip,
     TakeFocus,
     
diff --git a/WebKit2/Shared/WebCoreArgumentCoders.h b/WebKit2/Shared/WebCoreArgumentCoders.h
index 723be6f..89dd5f9 100644
--- a/WebKit2/Shared/WebCoreArgumentCoders.h
+++ b/WebKit2/Shared/WebCoreArgumentCoders.h
@@ -30,6 +30,7 @@
 #include "ArgumentDecoder.h"
 #include "ArgumentEncoder.h"
 #include "Arguments.h"
+#include <WebCore/Cursor.h>
 #include <WebCore/FloatRect.h>
 #include <WebCore/IntRect.h>
 #include <WebCore/PlatformString.h>
@@ -110,6 +111,30 @@ template<> struct ArgumentCoder<WebCore::PluginInfo> {
     }
 };
 
+template<> struct ArgumentCoder<WebCore::Cursor> {
+    static void encode(ArgumentEncoder* encoder, const WebCore::Cursor& cursor)
+    {
+        // FIXME: Support custom cursors.
+        if (cursor.type() == WebCore::Cursor::Custom)
+            encoder->encode(static_cast<uint32_t>(WebCore::Cursor::Pointer));
+        else
+            encoder->encode(static_cast<uint32_t>(cursor.type()));
+    }
+    
+    static bool decode(ArgumentDecoder* decoder, WebCore::Cursor& cursor)
+    {
+        uint32_t typeInt;
+        if (!decoder->decode(typeInt))
+            return false;
+
+        WebCore::Cursor::Type type = static_cast<WebCore::Cursor::Type>(typeInt);
+        ASSERT(type != WebCore::Cursor::Custom);
+
+        cursor = WebCore::Cursor::fromType(type);
+        return true;
+    }
+};
+
 } // namespace CoreIPC
 
 #endif // WebCoreArgumentCoders_h
diff --git a/WebKit2/UIProcess/API/mac/PageClientImpl.h b/WebKit2/UIProcess/API/mac/PageClientImpl.h
index a9f1dfd..65ba0df 100644
--- a/WebKit2/UIProcess/API/mac/PageClientImpl.h
+++ b/WebKit2/UIProcess/API/mac/PageClientImpl.h
@@ -46,7 +46,8 @@ private:
     virtual void processDidRevive();
     virtual void takeFocus(bool direction);
     virtual void toolTipChanged(const WebCore::String& oldToolTip, const WebCore::String& newToolTip);
-    
+    virtual void setCursor(const WebCore::Cursor&);
+
     WKView* m_wkView;
 };
 
diff --git a/WebKit2/UIProcess/API/mac/PageClientImpl.mm b/WebKit2/UIProcess/API/mac/PageClientImpl.mm
index ff6daca..24cb721 100644
--- a/WebKit2/UIProcess/API/mac/PageClientImpl.mm
+++ b/WebKit2/UIProcess/API/mac/PageClientImpl.mm
@@ -28,6 +28,7 @@
 #import "WKAPICast.h"
 #import "WKStringCF.h"
 #import "WKViewInternal.h"
+#import <WebCore/Cursor.h>
 #import <WebCore/FoundationExtras.h>
 #import <WebCore/PlatformString.h>
 
@@ -69,4 +70,9 @@ void PageClientImpl::toolTipChanged(const String& oldToolTip, const String& newT
     [m_wkView _toolTipChangedFrom:nsStringFromWebCoreString(oldToolTip) to:nsStringFromWebCoreString(newToolTip)];
 }
 
+void PageClientImpl::setCursor(const WebCore::Cursor& cursor)
+{
+    [m_wkView _setCursor:cursor.platformCursor()];
+}
+
 } // namespace WebKit
diff --git a/WebKit2/UIProcess/API/mac/WKView.mm b/WebKit2/UIProcess/API/mac/WKView.mm
index 78c9a5e..2a9e0cd 100644
--- a/WebKit2/UIProcess/API/mac/WKView.mm
+++ b/WebKit2/UIProcess/API/mac/WKView.mm
@@ -319,6 +319,12 @@ static bool isViewVisible(NSView *view)
         [[self window] selectKeyViewPrecedingView:self];
 }
 
+- (void)_setCursor:(NSCursor *)cursor
+{
+    if ([NSCursor currentCursor] == cursor)
+        return;
+    [cursor set];
+}
 
 // Any non-zero value will do, but using something recognizable might help us debug some day.
 #define TRACKING_RECT_TAG 0xBADFACE
diff --git a/WebKit2/UIProcess/API/mac/WKViewInternal.h b/WebKit2/UIProcess/API/mac/WKViewInternal.h
index 4067cdc..1e882af 100644
--- a/WebKit2/UIProcess/API/mac/WKViewInternal.h
+++ b/WebKit2/UIProcess/API/mac/WKViewInternal.h
@@ -30,6 +30,7 @@
 - (void)_processDidRevive;
 - (void)_takeFocus:(BOOL)direction;
 - (void)_toolTipChangedFrom:(NSString *)oldToolTip to:(NSString *)newToolTip;
+- (void)_setCursor:(NSCursor *)cursor;
 
 #if USE(ACCELERATED_COMPOSITING)
 - (void)_startAcceleratedCompositing:(CALayer *)rootLayer;
diff --git a/WebKit2/UIProcess/PageClient.h b/WebKit2/UIProcess/PageClient.h
index 3178835..0dbd20e 100644
--- a/WebKit2/UIProcess/PageClient.h
+++ b/WebKit2/UIProcess/PageClient.h
@@ -28,6 +28,7 @@
 
 namespace WebCore {
     class String;
+    class Cursor;
 }
 
 namespace WebKit {
@@ -41,6 +42,8 @@ public:
 
     virtual void takeFocus(bool direction) = 0;
     virtual void toolTipChanged(const WebCore::String&, const WebCore::String&) = 0;
+
+    virtual void setCursor(const WebCore::Cursor&) = 0;
 };
 
 } // namespace WebKit
diff --git a/WebKit2/UIProcess/WebPageProxy.cpp b/WebKit2/UIProcess/WebPageProxy.cpp
index dfe54f0..4070dcb 100644
--- a/WebKit2/UIProcess/WebPageProxy.cpp
+++ b/WebKit2/UIProcess/WebPageProxy.cpp
@@ -531,6 +531,13 @@ void WebPageProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::M
             setToolTip(toolTip);
             break;
         }
+        case WebPageProxyMessage::SetCursor: {
+            Cursor cursor;
+            if (!arguments.decode(cursor))
+                return;
+            setCursor(cursor);
+            break;
+        }
         case WebPageProxyMessage::ShowPage: {
             showPage();
             break;
@@ -843,6 +850,11 @@ void WebPageProxy::setToolTip(const String& toolTip)
     m_pageClient->toolTipChanged(oldToolTip, m_toolTip);
 }
 
+void WebPageProxy::setCursor(const WebCore::Cursor& cursor)
+{
+    m_pageClient->setCursor(cursor);
+}
+
 void WebPageProxy::didReceiveEvent(WebEvent::Type type)
 {
     switch (type) {
diff --git a/WebKit2/UIProcess/WebPageProxy.h b/WebKit2/UIProcess/WebPageProxy.h
index 7527ce9..ca88206 100644
--- a/WebKit2/UIProcess/WebPageProxy.h
+++ b/WebKit2/UIProcess/WebPageProxy.h
@@ -52,6 +52,7 @@ namespace CoreIPC {
 
 namespace WebCore {
     class IntSize;
+    class Cursor;
 }
 
 struct WKContextStatistics;
@@ -190,11 +191,13 @@ private:
 
     void takeFocus(bool direction);
     void setToolTip(const WebCore::String&);
+    void setCursor(const WebCore::Cursor&);
 
     void didReceiveEvent(WebEvent::Type);
     void didRunJavaScriptInMainFrame(const WebCore::String&, uint64_t);
     void didGetRenderTreeExternalRepresentation(const WebCore::String&, uint64_t);
 
+
 #if PLATFORM(WIN)
     PageClient* m_pageClient;
 #else
diff --git a/WebKit2/UIProcess/win/WebView.cpp b/WebKit2/UIProcess/win/WebView.cpp
index b0c481a..7d9e85b 100644
--- a/WebKit2/UIProcess/win/WebView.cpp
+++ b/WebKit2/UIProcess/win/WebView.cpp
@@ -129,6 +129,9 @@ LRESULT WebView::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
         case WM_SHOWWINDOW:
             lResult = onShowWindowEvent(hWnd, message, wParam, lParam, handled);
             break;
+        case WM_SETCURSOR:
+            lResult = onSetCursor(hWnd, message, wParam, lParam, handled);
+            break;
         default:
             handled = false;
             break;
@@ -170,6 +173,7 @@ WebView::WebView(RECT rect, WebPageNamespace* pageNamespace, HWND hostWindow)
     , m_hostWindow(hostWindow)
     , m_topLevelParentWindow(0)
     , m_toolTipWindow(0)
+    , m_lastCursorSet(0)
     , m_trackingMouseLeave(false)
     , m_isBeingDestroyed(false)
 {
@@ -408,6 +412,12 @@ LRESULT WebView::onShowWindowEvent(HWND hWnd, UINT message, WPARAM wParam, LPARA
     return 0;
 }
 
+LRESULT WebView::onSetCursor(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, bool& handled)
+{
+    handled = ::SetCursor(m_lastCursorSet);
+    return 0;
+}
+
 bool WebView::isActive()
 {
     HWND activeWindow = ::GetActiveWindow();
@@ -533,6 +543,16 @@ void WebView::toolTipChanged(const String&, const String& newToolTip)
     ::SendMessage(m_toolTipWindow, TTM_ACTIVATE, !newToolTip.isEmpty(), 0);
 }
 
+void WebView::setCursor(const WebCore::Cursor& cursor)
+{
+    HCURSOR platformCursor = cursor.platformCursor()->nativeCursor();
+    if (!platformCursor)
+        return;
+
+    m_lastCursorSet = platformCursor;
+    ::SetCursor(platformCursor);
+}
+
 // WebCore::WindowMessageListener
 
 void WebView::windowReceivedMessage(HWND, UINT message, WPARAM wParam, LPARAM)
diff --git a/WebKit2/UIProcess/win/WebView.h b/WebKit2/UIProcess/win/WebView.h
index 9e7a962..120280d 100644
--- a/WebKit2/UIProcess/win/WebView.h
+++ b/WebKit2/UIProcess/win/WebView.h
@@ -76,6 +76,7 @@ private:
     LRESULT onKillFocusEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
     LRESULT onTimerEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
     LRESULT onShowWindowEvent(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
+    LRESULT onSetCursor(HWND hWnd, UINT message, WPARAM, LPARAM, bool& handled);
 
     bool isActive();
     void updateActiveState();
@@ -93,6 +94,7 @@ private:
     virtual void processDidRevive();
     virtual void takeFocus(bool direction);
     virtual void toolTipChanged(const WebCore::String&, const WebCore::String&);
+    virtual void setCursor(const WebCore::Cursor&);
 
     // WebCore::WindowMessageListener
     virtual void windowReceivedMessage(HWND, UINT message, WPARAM, LPARAM);
@@ -103,6 +105,8 @@ private:
     HWND m_topLevelParentWindow;
     HWND m_toolTipWindow;
 
+    HCURSOR m_lastCursorSet;
+
     bool m_trackingMouseLeave;
     bool m_isBeingDestroyed;
 
diff --git a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
index 9fb5ba7..26ad000 100644
--- a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
+++ b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp
@@ -416,10 +416,9 @@ void WebChromeClient::chooseIconForFiles(const Vector<String>&, FileChooser*)
     notImplemented();
 }
 
-bool WebChromeClient::setCursor(PlatformCursorHandle)
+void WebChromeClient::setCursor(const Cursor& cursor)
 {
-    notImplemented();
-    return false;
+    WebProcess::shared().connection()->send(WebPageProxyMessage::SetCursor, m_page->pageID(), CoreIPC::In(cursor));
 }
 
 void WebChromeClient::formStateDidChange(const Node*)
@@ -477,4 +476,11 @@ void WebChromeClient::needTouchEvents(bool)
 }
 #endif
 
+#if PLATFORM(WIN)
+void WebChromeClient::setLastSetCursorToCurrentCursor()
+{
+}
+#endif
+
+
 } // namespace WebKit
diff --git a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h
index c992716..dd487b4 100644
--- a/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h
+++ b/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h
@@ -151,7 +151,7 @@ private:
     virtual void runOpenPanel(WebCore::Frame*, PassRefPtr<WebCore::FileChooser>);
     virtual void chooseIconForFiles(const Vector<WebCore::String>&, WebCore::FileChooser*);
 
-    virtual bool setCursor(WebCore::PlatformCursorHandle);
+    virtual void setCursor(const WebCore::Cursor&);
     
     // Notification that the given form element has changed. This function
     // will be called frequently, so handling should be very fast.
@@ -175,7 +175,11 @@ private:
 #if ENABLE(TOUCH_EVENTS)
     virtual void needTouchEvents(bool);
 #endif
-    
+
+#if PLATFORM(WIN)
+    virtual void setLastSetCursorToCurrentCursor();
+#endif
+
     WebCore::String m_cachedToolTip;
     WebPage* m_page;
 };

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list