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

andersca at apple.com andersca at apple.com
Wed Dec 22 11:28:27 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 702db813381b370166bc9dd2934921e415273b3f
Author: andersca at apple.com <andersca at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Jul 26 21:15:27 2010 +0000

    Handle mouseenter/mouseleave + focus events
    https://bugs.webkit.org/show_bug.cgi?id=42997
    
    Reviewed by Sam Weinig.
    
    * WebProcess/Plugins/Netscape/NetscapePlugin.cpp:
    (WebKit::NetscapePlugin::handleMouseEnterEvent):
    Call platformHandleMouseEnterEvent.
    
    (WebKit::NetscapePlugin::handleMouseLeaveEvent):
    Call platformHandleMouseExitEvent.
    
    (WebKit::NetscapePlugin::setFocus):
    Call platformSetFocus.
    
    * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm:
    (WebKit::fillInCocoaEventFromMouseEvent):
    Factor out code that fills in an NPCocoaEvent from a WebMouseEvent.
    
    (WebKit::initializeMouseEvent):
    Call fillInCocoaEventFromMouseEvent.
    
    (WebKit::NetscapePlugin::platformHandleMouseEnterEvent):
    Send an NPCocoaEventMouseEntered event.
    
    (WebKit::NetscapePlugin::platformHandleMouseLeaveEvent):
    Send an NPCocoaEventMouseExited event.
    
    (WebKit::NetscapePlugin::platformSetFocus):
    Send an NPCocoaEventFocusChanged.
    
    * WebProcess/Plugins/Plugin.h:
    * WebProcess/Plugins/PluginView.cpp:
    (WebKit::PluginView::handleEvent):
    Dispatch mouse enter and mouse leave events. Call focusPluginElement on mousedown.
    
    (WebKit::PluginView::focusPluginElement):
    Focus the plug-in's containing frame and its element.
    
    (WebKit::PluginView::setFocus):
    Call Plugin::setFocus.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@64073 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index c4d88fa..0299e33 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,47 @@
+2010-07-26  Anders Carlsson  <andersca at apple.com>
+
+        Reviewed by Sam Weinig.
+
+        Handle mouseenter/mouseleave + focus events
+        https://bugs.webkit.org/show_bug.cgi?id=42997
+
+        * WebProcess/Plugins/Netscape/NetscapePlugin.cpp:
+        (WebKit::NetscapePlugin::handleMouseEnterEvent):
+        Call platformHandleMouseEnterEvent.
+        
+        (WebKit::NetscapePlugin::handleMouseLeaveEvent):
+        Call platformHandleMouseExitEvent.
+
+        (WebKit::NetscapePlugin::setFocus):
+        Call platformSetFocus.
+
+        * WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm:
+        (WebKit::fillInCocoaEventFromMouseEvent):
+        Factor out code that fills in an NPCocoaEvent from a WebMouseEvent.
+
+        (WebKit::initializeMouseEvent):
+        Call fillInCocoaEventFromMouseEvent.
+        
+        (WebKit::NetscapePlugin::platformHandleMouseEnterEvent):
+        Send an NPCocoaEventMouseEntered event.
+    
+        (WebKit::NetscapePlugin::platformHandleMouseLeaveEvent):
+        Send an NPCocoaEventMouseExited event.
+
+        (WebKit::NetscapePlugin::platformSetFocus):
+        Send an NPCocoaEventFocusChanged.
+
+        * WebProcess/Plugins/Plugin.h:
+        * WebProcess/Plugins/PluginView.cpp:
+        (WebKit::PluginView::handleEvent):
+        Dispatch mouse enter and mouse leave events. Call focusPluginElement on mousedown.
+
+        (WebKit::PluginView::focusPluginElement):
+        Focus the plug-in's containing frame and its element.
+
+        (WebKit::PluginView::setFocus):
+        Call Plugin::setFocus.
+
 2010-07-26  Brady Eidson  <beidson at apple.com>
 
         Reviewed by Sam Weinig.
diff --git a/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp b/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp
index 8b24b9d..b026eee 100644
--- a/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp
+++ b/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp
@@ -423,6 +423,21 @@ bool NetscapePlugin::handleWheelEvent(const WebWheelEvent& wheelEvent)
     return platformHandleWheelEvent(wheelEvent);
 }
 
+bool NetscapePlugin::handleMouseEnterEvent(const WebMouseEvent& mouseEvent)
+{
+    return platformHandleMouseEnterEvent(mouseEvent);
+}
+
+bool NetscapePlugin::handleMouseLeaveEvent(const WebMouseEvent& mouseEvent)
+{
+    return platformHandleMouseLeaveEvent(mouseEvent);
+}
+
+void NetscapePlugin::setFocus(bool hasFocus)
+{
+    platformSetFocus(hasFocus);
+}
+
 PluginController* NetscapePlugin::controller()
 {
     return m_pluginController;
diff --git a/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h b/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h
index 7dd52f5..a3be906 100644
--- a/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h
+++ b/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h
@@ -94,6 +94,9 @@ private:
 
     bool platformHandleMouseEvent(const WebMouseEvent&);
     bool platformHandleWheelEvent(const WebWheelEvent&);
+    bool platformHandleMouseEnterEvent(const WebMouseEvent&);
+    bool platformHandleMouseLeaveEvent(const WebMouseEvent&);
+    void platformSetFocus(bool);
 
     // Plugin
     virtual bool initialize(PluginController*, const Parameters&);
@@ -110,6 +113,9 @@ private:
     virtual void streamDidFail(uint64_t streamID, bool wasCancelled);
     virtual bool handleMouseEvent(const WebMouseEvent&);
     virtual bool handleWheelEvent(const WebWheelEvent&);
+    virtual bool handleMouseEnterEvent(const WebMouseEvent&);
+    virtual bool handleMouseLeaveEvent(const WebMouseEvent&);
+    virtual void setFocus(bool);
 
     virtual PluginController* controller();
 
@@ -151,16 +157,20 @@ inline void NetscapePlugin::platformPaint(WebCore::GraphicsContext*, const WebCo
 {
 }
 
-bool NetscapePlugin::platformHandleMouseEvent(const WebMouseEvent&)
+inline bool NetscapePlugin::platformHandleMouseEvent(const WebMouseEvent&)
 {
     return false;
 }
 
-bool NetscapePlugin::platformHandleWheelEvent(const WebWheelEvent&)
+inline bool NetscapePlugin::platformHandleWheelEvent(const WebWheelEvent&)
 {
     return false;
 }
 
+inline void NetscapePlugin::platformSetFocus(bool)
+{
+}
+    
 #endif
 
 } // namespace WebKit
diff --git a/WebKit2/WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm b/WebKit2/WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm
index c49c93c..0ada8ac 100644
--- a/WebKit2/WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm
+++ b/WebKit2/WebProcess/Plugins/Netscape/mac/NetscapePluginMac.mm
@@ -179,6 +179,18 @@ static int32_t buttonNumber(WebMouseEvent::Button button)
     return -1;
 }
 
+static void fillInCocoaEventFromMouseEvent(NPCocoaEvent& event, const WebMouseEvent& mouseEvent, const WebCore::IntPoint& pluginLocation)
+{
+    event.data.mouse.modifierFlags = modifierFlags(mouseEvent);
+    event.data.mouse.pluginX = mouseEvent.positionX() - pluginLocation.x();
+    event.data.mouse.pluginY = mouseEvent.positionY() - pluginLocation.y();
+    event.data.mouse.buttonNumber = buttonNumber(mouseEvent.button());
+    event.data.mouse.clickCount = mouseEvent.clickCount();
+    event.data.mouse.deltaX = mouseEvent.deltaX();
+    event.data.mouse.deltaY = mouseEvent.deltaY();
+    event.data.mouse.deltaZ = mouseEvent.deltaZ();
+}
+    
 static NPCocoaEvent initializeMouseEvent(const WebMouseEvent& mouseEvent, const WebCore::IntPoint& pluginLocation)
 {
     NPCocoaEventType eventType;
@@ -202,15 +214,7 @@ static NPCocoaEvent initializeMouseEvent(const WebMouseEvent& mouseEvent, const
     }
 
     NPCocoaEvent event = initializeEvent(eventType);
-    
-    event.data.mouse.modifierFlags = modifierFlags(mouseEvent);
-    event.data.mouse.pluginX = mouseEvent.positionX() - pluginLocation.x();
-    event.data.mouse.pluginY = mouseEvent.positionY() - pluginLocation.y();
-    event.data.mouse.buttonNumber = buttonNumber(mouseEvent.button());
-    event.data.mouse.clickCount = mouseEvent.clickCount();
-    event.data.mouse.deltaX = mouseEvent.deltaX();
-    event.data.mouse.deltaY = mouseEvent.deltaY();
-    event.data.mouse.deltaZ = mouseEvent.deltaZ();
+    fillInCocoaEventFromMouseEvent(event, mouseEvent, pluginLocation);
 
     return event;
 }
@@ -226,7 +230,7 @@ bool NetscapePlugin::platformHandleMouseEvent(const WebMouseEvent& mouseEvent)
         default:
             ASSERT_NOT_REACHED();
     }
-    
+
     return false;
 }
 
@@ -244,7 +248,23 @@ bool NetscapePlugin::platformHandleWheelEvent(const WebWheelEvent& wheelEvent)
             event.data.mouse.deltaX = wheelEvent.deltaX();
             event.data.mouse.deltaY = wheelEvent.deltaY();
             event.data.mouse.deltaZ = 0;
+            return NPP_HandleEvent(&event);
+        }
+
+        default:
+            ASSERT_NOT_REACHED();
+    }
+
+    return false;
+}
+
+bool NetscapePlugin::platformHandleMouseEnterEvent(const WebMouseEvent& mouseEvent)
+{
+    switch (m_eventModel) {
+        case NPEventModelCocoa: {
+            NPCocoaEvent event = initializeEvent(NPCocoaEventMouseEntered);
             
+            fillInCocoaEventFromMouseEvent(event, mouseEvent, m_frameRect.location());
             return NPP_HandleEvent(&event);
         }
 
@@ -254,5 +274,38 @@ bool NetscapePlugin::platformHandleWheelEvent(const WebWheelEvent& wheelEvent)
 
     return false;
 }
-    
+        
+bool NetscapePlugin::platformHandleMouseLeaveEvent(const WebMouseEvent& mouseEvent)
+{
+    switch (m_eventModel) {
+        case NPEventModelCocoa: {
+            NPCocoaEvent event = initializeEvent(NPCocoaEventMouseExited);
+            
+            fillInCocoaEventFromMouseEvent(event, mouseEvent, m_frameRect.location());
+            return NPP_HandleEvent(&event);
+        }
+
+        default:
+            ASSERT_NOT_REACHED();
+    }
+
+    return false;
+}
+
+void NetscapePlugin::platformSetFocus(bool hasFocus)
+{
+    switch (m_eventModel) {
+        case NPEventModelCocoa: {
+            NPCocoaEvent event = initializeEvent(NPCocoaEventFocusChanged);
+            
+            event.data.focus.hasFocus = hasFocus;
+            NPP_HandleEvent(&event);
+            break;
+        }
+
+        default:
+            ASSERT_NOT_REACHED();
+    }
+}
+
 } // namespace WebKit
diff --git a/WebKit2/WebProcess/Plugins/Plugin.h b/WebKit2/WebProcess/Plugins/Plugin.h
index b3c836e..292a516 100644
--- a/WebKit2/WebProcess/Plugins/Plugin.h
+++ b/WebKit2/WebProcess/Plugins/Plugin.h
@@ -95,6 +95,15 @@ public:
     // Tells the plug-in to handle the passed in wheel event. The plug-in should return true if it processed the event.
     virtual bool handleWheelEvent(const WebWheelEvent&) = 0;
 
+    // Tells the plug-in to handle the passed in mouse over event. The plug-in should return true if it processed the event.
+    virtual bool handleMouseEnterEvent(const WebMouseEvent&) = 0;
+    
+    // Tells the plug-in to handle the passed in mouse leave event. The plug-in should return true if it processed the event.
+    virtual bool handleMouseLeaveEvent(const WebMouseEvent&) = 0;
+
+    // Tells the focus about focus changes.
+    virtual void setFocus(bool) = 0;
+
     // Returns the plug-in controller for this plug-in.
     // FIXME: We could just have the controller be a member variable of Plugin.
     virtual PluginController* controller() = 0;
diff --git a/WebKit2/WebProcess/Plugins/PluginView.cpp b/WebKit2/WebProcess/Plugins/PluginView.cpp
index ce5a7a0..1447632 100644
--- a/WebKit2/WebProcess/Plugins/PluginView.cpp
+++ b/WebKit2/WebProcess/Plugins/PluginView.cpp
@@ -30,6 +30,7 @@
 #include "WebPage.h"
 #include <WebCore/DocumentLoader.h>
 #include <WebCore/Event.h>
+#include <WebCore/FocusController.h>
 #include <WebCore/FrameLoadRequest.h>
 #include <WebCore/FrameLoaderClient.h>
 #include <WebCore/FrameView.h>
@@ -332,10 +333,19 @@ void PluginView::handleEvent(Event* event)
         || (event->type() == eventNames().mousedownEvent && currentEvent->type() == WebEvent::MouseDown)
         || (event->type() == eventNames().mouseupEvent && currentEvent->type() == WebEvent::MouseUp)) {
         // We have a mouse event.
+        if (currentEvent->type() == WebEvent::MouseDown)
+            focusPluginElement();
+
         didHandleEvent = m_plugin->handleMouseEvent(static_cast<const WebMouseEvent&>(*currentEvent));
     } else if (event->type() == eventNames().mousewheelEvent && currentEvent->type() == WebEvent::Wheel) {
         // We have a wheel event.
         didHandleEvent = m_plugin->handleWheelEvent(static_cast<const WebWheelEvent&>(*currentEvent));
+    } else if (event->type() == eventNames().mouseoverEvent && currentEvent->type() == WebEvent::MouseMove) {
+        // We have a mouse enter event.
+        didHandleEvent = m_plugin->handleMouseEnterEvent(static_cast<const WebMouseEvent&>(*currentEvent));
+    } else if (event->type() == eventNames().mouseoutEvent && currentEvent->type() == WebEvent::MouseMove) {
+        // We have a mouse leave event.
+        didHandleEvent = m_plugin->handleMouseLeaveEvent(static_cast<const WebMouseEvent&>(*currentEvent));
     }
 
     if (didHandleEvent)
@@ -369,6 +379,15 @@ IntRect PluginView::clipRectInWindowCoordinates() const
     return intersection(frameRectInWindowCoordinates, windowClipRect);
 }
 
+void PluginView::focusPluginElement()
+{
+    ASSERT(frame());
+    
+    if (Page* page = frame()->page())
+        page->focusController()->setFocusedFrame(frame());
+    frame()->document()->setFocusedNode(m_pluginElement);
+}
+
 void PluginView::pendingURLRequestsTimerFired()
 {
     ASSERT(!m_pendingURLRequests.isEmpty());
@@ -523,6 +542,13 @@ void PluginView::invalidateRect(const IntRect& dirtyRect)
     parent()->hostWindow()->invalidateContentsAndWindow(intersection(dirtyRectInWindowCoordinates, clipRectInWindowCoordinates()), false);
 }
 
+void PluginView::setFocus(bool hasFocus)
+{
+    Widget::setFocus(hasFocus);
+    
+    m_plugin->setFocus(hasFocus);
+}
+
 void PluginView::mediaCanStart()
 {
     ASSERT(m_isWaitingUntilMediaCanStart);
diff --git a/WebKit2/WebProcess/Plugins/PluginView.h b/WebKit2/WebProcess/Plugins/PluginView.h
index 5967271..dc6b713 100644
--- a/WebKit2/WebProcess/Plugins/PluginView.h
+++ b/WebKit2/WebProcess/Plugins/PluginView.h
@@ -63,7 +63,8 @@ private:
 
     void viewGeometryDidChange();
     WebCore::IntRect clipRectInWindowCoordinates() const;
-
+    void focusPluginElement();
+    
     void pendingURLRequestsTimerFired();
     class URLRequest;
     void performURLRequest(URLRequest*);
@@ -83,6 +84,7 @@ private:
     virtual void setFrameRect(const WebCore::IntRect&);
     virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect&);
     virtual void invalidateRect(const WebCore::IntRect&);
+    virtual void setFocus(bool);
     virtual void frameRectsChanged();
     virtual void setParent(WebCore::ScrollView*);
     virtual void handleEvent(WebCore::Event*);

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list