- Revision
- 163406
- Author
- [email protected]
- Date
- 2014-02-04 15:24:00 -0800 (Tue, 04 Feb 2014)
Log Message
Add WK2 event handling path for iOS, and make Mac and iOS code more similar
https://bugs.webkit.org/show_bug.cgi?id=128199
Reviewed by Sam Weinig.
EventHandlerIOS need some changes for WebKit2, where we have no native
widget. Merge those changes from EventHandlerMac.
Make a few drive-by changes to match EventHandlerMac behavior.
Clean up EventHandlerMac, removing trailing whitespace and fixing
the odd comment.
* page/ios/EventHandlerIOS.mm:
(WebCore::EventHandler::passWidgetMouseDownEventToWidget):
(WebCore::EventHandler::passMouseDownEventToWidget):
(WebCore::EventHandler::passSubframeEventToSubframe):
(WebCore::EventHandler::passWheelEventToWidget):
(WebCore::EventHandler::mouseDown):
(WebCore::EventHandler::mouseMoved):
(WebCore::frameHasPlatformWidget):
(WebCore::EventHandler::passMousePressEventToSubframe):
(WebCore::EventHandler::passMouseMoveEventToSubframe):
(WebCore::EventHandler::passMouseReleaseEventToSubframe):
* page/mac/EventHandlerMac.mm:
(WebCore::EventHandler::passWidgetMouseDownEventToWidget):
(WebCore::EventHandler::passMouseDownEventToWidget):
(WebCore::findViewInSubviews):
(WebCore::EventHandler::eventLoopHandleMouseUp):
(WebCore::EventHandler::passWheelEventToWidget):
(WebCore::EventHandler::mouseMoved):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (163405 => 163406)
--- trunk/Source/WebCore/ChangeLog 2014-02-04 23:21:23 UTC (rev 163405)
+++ trunk/Source/WebCore/ChangeLog 2014-02-04 23:24:00 UTC (rev 163406)
@@ -1,3 +1,37 @@
+2014-02-04 Simon Fraser <[email protected]>
+
+ Add WK2 event handling path for iOS, and make Mac and iOS code more similar
+ https://bugs.webkit.org/show_bug.cgi?id=128199
+
+ Reviewed by Sam Weinig.
+
+ EventHandlerIOS need some changes for WebKit2, where we have no native
+ widget. Merge those changes from EventHandlerMac.
+
+ Make a few drive-by changes to match EventHandlerMac behavior.
+
+ Clean up EventHandlerMac, removing trailing whitespace and fixing
+ the odd comment.
+
+ * page/ios/EventHandlerIOS.mm:
+ (WebCore::EventHandler::passWidgetMouseDownEventToWidget):
+ (WebCore::EventHandler::passMouseDownEventToWidget):
+ (WebCore::EventHandler::passSubframeEventToSubframe):
+ (WebCore::EventHandler::passWheelEventToWidget):
+ (WebCore::EventHandler::mouseDown):
+ (WebCore::EventHandler::mouseMoved):
+ (WebCore::frameHasPlatformWidget):
+ (WebCore::EventHandler::passMousePressEventToSubframe):
+ (WebCore::EventHandler::passMouseMoveEventToSubframe):
+ (WebCore::EventHandler::passMouseReleaseEventToSubframe):
+ * page/mac/EventHandlerMac.mm:
+ (WebCore::EventHandler::passWidgetMouseDownEventToWidget):
+ (WebCore::EventHandler::passMouseDownEventToWidget):
+ (WebCore::findViewInSubviews):
+ (WebCore::EventHandler::eventLoopHandleMouseUp):
+ (WebCore::EventHandler::passWheelEventToWidget):
+ (WebCore::EventHandler::mouseMoved):
+
2014-02-04 Benjamin Poulain <[email protected]>
[OSX] Limit progress bar's dimensions to ushort
Modified: trunk/Source/WebCore/page/ios/EventHandlerIOS.mm (163405 => 163406)
--- trunk/Source/WebCore/page/ios/EventHandlerIOS.mm 2014-02-04 23:21:23 UTC (rev 163405)
+++ trunk/Source/WebCore/page/ios/EventHandlerIOS.mm 2014-02-04 23:24:00 UTC (rev 163406)
@@ -169,7 +169,7 @@
bool EventHandler::passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults& event)
{
// Figure out which view to send the event to.
- RenderObject* target = event.targetNode() ? event.targetNode()->renderer() : nullptr;
+ auto target = event.targetNode() ? event.targetNode()->renderer() : nullptr;
if (!target || !target->isWidget())
return false;
@@ -216,6 +216,11 @@
return true;
}
+ // In WebKit2 we will never have a native widget. Just return early and let the regular event handler machinery take care of
+ // dispatching the event.
+ if (!widget->platformWidget())
+ return false;
+
BEGIN_BLOCK_OBJC_EXCEPTIONS;
NSView *nodeView = widget->platformWidget();
@@ -251,7 +256,12 @@
ASSERT(!m_sendingEventToSubview);
m_sendingEventToSubview = true;
- [view mouseDown:currentEvent()];
+
+ {
+ WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates;
+ [view mouseDown:currentEvent()];
+ }
+
m_sendingEventToSubview = false;
if (!wasDeferringLoading)
@@ -353,7 +363,7 @@
Node* node = event.targetNode();
if (!node)
return false;
- RenderObject* renderer = node->renderer();
+ auto renderer = node->renderer();
if (!renderer || !renderer->isWidget())
return false;
Widget* widget = toRenderWidget(renderer)->widget();
@@ -391,10 +401,18 @@
{
BEGIN_BLOCK_OBJC_EXCEPTIONS;
+ if (!widget)
+ return false;
+
+ NSView* nodeView = widget->platformWidget();
+ if (!nodeView) {
+ // WK2 code path. No wheel events on iOS anyway.
+ return false;
+ }
+
if (currentEvent().type != WebEventScrollWheel || m_sendingEventToSubview || !widget)
return false;
- NSView* nodeView = widget->platformWidget();
ASSERT(nodeView);
ASSERT([nodeView superview]);
NSView *view = [nodeView hitTest:[[nodeView superview] convertPoint:currentEvent().locationInWindow fromView:nil]];
@@ -421,6 +439,7 @@
BEGIN_BLOCK_OBJC_EXCEPTIONS;
+ // FIXME: Why is this here? EventHandler::handleMousePressEvent() calls it.
m_frame.loader().resetMultipleFormSubmissionProtection();
m_mouseDownView = nil;
@@ -463,25 +482,54 @@
WKBeginObservingContentChanges(true);
CurrentEventScope scope(event);
event.wasHandled = mouseMoved(currentPlatformMouseEvent());
+
+ // FIXME: Why is this here?
m_frame.document()->updateStyleIfNeeded();
WKStopObservingContentChanges();
END_BLOCK_OBJC_EXCEPTIONS;
}
+static bool frameHasPlatformWidget(const Frame& frame)
+{
+ if (FrameView* frameView = frame.view()) {
+ if (frameView->platformWidget())
+ return true;
+ }
+
+ return false;
+}
+
bool EventHandler::passMousePressEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe)
{
- return passSubframeEventToSubframe(mev, subframe);
+ // WebKit1 code path.
+ if (frameHasPlatformWidget(m_frame))
+ return passSubframeEventToSubframe(mev, subframe);
+
+ // WebKit2 code path.
+ subframe->eventHandler().handleMousePressEvent(mev.event());
+ return true;
}
bool EventHandler::passMouseMoveEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe, HitTestResult* hoveredNode)
{
- return passSubframeEventToSubframe(mev, subframe, hoveredNode);
+ // WebKit1 code path.
+ if (frameHasPlatformWidget(m_frame))
+ return passSubframeEventToSubframe(mev, subframe, hoveredNode);
+
+ subframe->eventHandler().handleMouseMoveEvent(mev.event(), hoveredNode);
+ return true;
}
bool EventHandler::passMouseReleaseEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe)
{
- return passSubframeEventToSubframe(mev, subframe);
+ // WebKit1 code path.
+ if (frameHasPlatformWidget(m_frame))
+ return passSubframeEventToSubframe(mev, subframe);
+
+ // WebKit2 code path.
+ subframe->eventHandler().handleMouseReleaseEvent(mev.event());
+ return true;
}
unsigned EventHandler::accessKeyModifiers()
Modified: trunk/Source/WebCore/page/mac/EventHandlerMac.mm (163405 => 163406)
--- trunk/Source/WebCore/page/mac/EventHandlerMac.mm 2014-02-04 23:21:23 UTC (rev 163405)
+++ trunk/Source/WebCore/page/mac/EventHandlerMac.mm 2014-02-04 23:24:00 UTC (rev 163406)
@@ -138,13 +138,13 @@
bool EventHandler::passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults& event)
{
// Figure out which view to send the event to.
- auto target = event.targetNode() ? event.targetNode()->renderer() : 0;
+ auto target = event.targetNode() ? event.targetNode()->renderer() : nullptr;
if (!target || !target->isWidget())
return false;
-
- // Double-click events don't exist in Cocoa. Since passWidgetMouseDownEventToWidget will
+
+ // Double-click events don't exist in Cocoa. Since passWidgetMouseDownEventToWidget() will
// just pass currentEvent down to the widget, we don't want to call it for events that
- // don't correspond to Cocoa events. The mousedown/ups will have already been passed on as
+ // don't correspond to Cocoa events. The mousedown/ups will have already been passed on as
// part of the pressed/released handling.
return passMouseDownEventToWidget(toRenderWidget(target)->widget());
}
@@ -176,7 +176,7 @@
{
// FIXME: This function always returns true. It should be changed either to return
// false in some cases or the return value should be removed.
-
+
RefPtr<Widget> widget = pWidget;
if (!widget) {
@@ -184,13 +184,13 @@
return true;
}
- // In WebKit2 we will never have an NSView. Just return early and let the regular event handler machinery take care of
+ // In WebKit2 we will never have a native widget. Just return early and let the regular event handler machinery take care of
// dispatching the event.
if (!widget->platformWidget())
return false;
BEGIN_BLOCK_OBJC_EXCEPTIONS;
-
+
NSView *nodeView = widget->platformWidget();
ASSERT([nodeView superview]);
NSView *view = [nodeView hitTest:[[nodeView superview] convertPoint:[currentNSEvent() locationInWindow] fromView:nil]];
@@ -198,7 +198,7 @@
// We probably hit the border of a RenderWidget
return true;
}
-
+
Page* page = m_frame.page();
if (!page)
return true;
@@ -212,11 +212,11 @@
// We need to "defer loading" while tracking the mouse, because tearing down the
// page while an AppKit control is tracking the mouse can cause a crash.
-
+
// FIXME: In theory, WebCore now tolerates tear-down while tracking the
// mouse. We should confirm that, and then remove the deferrsLoading
// hack entirely.
-
+
bool wasDeferringLoading = page->defersLoading();
if (!wasDeferringLoading)
page->setDefersLoading(true);
@@ -237,7 +237,7 @@
// Remember which view we sent the event to, so we can direct the release event properly.
m_mouseDownView = view;
m_mouseDownWasInSubframe = false;
-
+
// Many AppKit widgets run their own event loops and consume events while the mouse is down.
// When they finish, currentEvent is the mouseUp that they exited on. We need to update
// the EventHandler state with this mouseUp, which we never saw.
@@ -250,7 +250,7 @@
return true;
}
-
+
// Note that this does the same kind of check as [target isDescendantOf:superview].
// There are two differences: This is a lot slower because it has to walk the whole
// tree, and this works in cases where the target has already been deallocated.
@@ -265,7 +265,7 @@
}
}
END_BLOCK_OBJC_EXCEPTIONS;
-
+
return false;
}
@@ -307,13 +307,13 @@
return true;
}
#endif // ENABLE(DRAG_SUPPORT)
-
+
bool EventHandler::eventLoopHandleMouseUp(const MouseEventWithHitTestResults&)
{
NSView *view = mouseDownViewIfStillGood();
if (!view)
return false;
-
+
if (!m_mouseDownWasInSubframe) {
ASSERT(!m_sendingEventToSubview);
m_sendingEventToSubview = true;
@@ -440,9 +440,10 @@
ASSERT(nodeView);
ASSERT([nodeView superview]);
NSView *view = [nodeView hitTest:[[nodeView superview] convertPoint:[currentNSEvent() locationInWindow] fromView:nil]];
- if (!view)
+ if (!view) {
// We probably hit the border of a RenderWidget
return false;
+ }
ASSERT(!m_sendingEventToSubview);
m_sendingEventToSubview = true;
@@ -454,7 +455,7 @@
setNSScrollViewScrollWheelShouldRetainSelf(false);
m_sendingEventToSubview = false;
return true;
-
+
END_BLOCK_OBJC_EXCEPTIONS;
return false;
}
@@ -591,7 +592,7 @@
// These happen because WebKit sometimes has to fake up moved events.
if (!m_frame.view() || m_mousePressed || m_sendingEventToSubview)
return;
-
+
BEGIN_BLOCK_OBJC_EXCEPTIONS;
CurrentEventScope scope(event);
mouseMoved(currentPlatformMouseEvent());