[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