Diff
Modified: trunk/Source/WebCore/CMakeLists.txt (188859 => 188860)
--- trunk/Source/WebCore/CMakeLists.txt 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebCore/CMakeLists.txt 2015-08-24 15:23:21 UTC (rev 188860)
@@ -2003,7 +2003,7 @@
page/UserContentController.cpp
page/UserContentURLPattern.cpp
page/VisitedLinkStore.cpp
- page/WheelEventDeltaTracker.cpp
+ page/WheelEventDeltaFilter.cpp
page/WheelEventTestTrigger.cpp
page/WindowFeatures.cpp
page/WindowFocusAllowedIndicator.cpp
Modified: trunk/Source/WebCore/ChangeLog (188859 => 188860)
--- trunk/Source/WebCore/ChangeLog 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebCore/ChangeLog 2015-08-24 15:23:21 UTC (rev 188860)
@@ -1,3 +1,68 @@
+2015-08-24 Wenson Hsieh <wenson_hs...@apple.com>
+
+ Use _NSScrollingPredominantAxisFilter for wheel event filtering on Mac
+ https://bugs.webkit.org/show_bug.cgi?id=147320
+
+ Reviewed by Simon Fraser.
+
+ Refactored to use a predominant axis filter instead of a predominant axis tracker. This allows us to
+ employ AppKit's _NSScrollingPredominantAxisFilter when possible, and use the wheel event delta tracker
+ as a fallback. Here, we refactor EventHandler to use the new filters for overflow scrolling and replace
+ the MainFrame's WheelEventDeltaTracker with an appropriate type of WheelEventDeltaFilter.
+
+ In the case where an _NSScrollingPredominantAxisFilter is unavailable, the platform-invariant wheel
+ event delta filter simply uses the existing wheel event delta tracker to compute the current predominant
+ axis. It uses the predominant axis to determine which axis (if any) should have its delta zeroed out.
+
+ This patch also introduces NSScrollingInputFilterSPI.h, which either imports the internal input filter
+ header from AppKit or declares relevant interfaces and functions.
+
+ No new tests, since this change does not add new functionality.
+
+ * CMakeLists.txt: Add page/WheelEventDeltaFilter.cpp.
+ * WebCore.vcxproj/WebCore.vcxproj: Add WheelEventDeltaFilter.cpp and WheelEventDeltaFilter.h.
+ * WebCore.vcxproj/WebCore.vcxproj.filters: Add WheelEventDeltaFilter.cpp and WheelEventDeltaFilter.h.
+ * WebCore.xcodeproj/project.pbxproj: Add WheelEventDeltaFilter.cpp, WheelEventDeltaFilter.h, and their Mac counterparts.
+ * page/EventHandler.cpp:
+ (WebCore::didScrollInScrollableArea): Refactored to no longer handle axes separately.
+ (WebCore::handleWheelEventInAppropriateEnclosingBox): Ditto.
+ (WebCore::EventHandler::platformRecordWheelEvent): Refactored to update the wheel delta filter.
+ (WebCore::EventHandler::clearLatchedState): Ditto.
+ (WebCore::EventHandler::defaultWheelEventHandler): Refactored to use wheel delta filters. No longer splits wheel events
+ and handles them on separate axes.
+ (WebCore::didScrollInScrollableAreaForSingleAxis): Deleted.
+ (WebCore::handleWheelEventInAppropriateEnclosingBoxForSingleAxis): Deleted.
+ * page/EventHandler.h:
+ * page/MainFrame.cpp:
+ (WebCore::MainFrame::MainFrame): Initializes the appropriate type of WheelEventDeltaFilter.
+ * page/MainFrame.h:
+ * page/WheelEventDeltaFilter.cpp: Added.
+ (WebCore::WheelEventDeltaFilter::WheelEventDeltaFilter):
+ (WebCore::WheelEventDeltaFilter::~WheelEventDeltaFilter):
+ (WebCore::WheelEventDeltaFilter::create):
+ (WebCore::BasicWheelEventDeltaFilter::BasicWheelEventDeltaFilter):
+ (WebCore::BasicWheelEventDeltaFilter::updateFromDelta):
+ (WebCore::BasicWheelEventDeltaFilter::beginFilteringDeltas):
+ (WebCore::BasicWheelEventDeltaFilter::endFilteringDeltas):
+ (WebCore::deltaIsPredominantlyVertical):
+ (WebCore::BasicWheelEventDeltaFilter::dominantScrollGestureDirection):
+ * page/WheelEventDeltaFilter.h: Refactored WheelEventDeltaTracker logic to work as a filter instead.
+ * page/mac/EventHandlerMac.mm:
+ (WebCore::EventHandler::platformPrepareForWheelEvents): Refactored to use wheel delta filters.
+ (WebCore::EventHandler::platformRecordWheelEvent): Ditto.
+ * page/mac/WheelEventDeltaFilterMac.h: Wraps the new _NSScrollingPredominantAxisFilter.
+ * page/mac/WheelEventDeltaFilterMac.mm: Added.
+ (WebCore::WheelEventDeltaFilterMac::WheelEventDeltaFilterMac):
+ (WebCore::WheelEventDeltaFilterMac::beginFilteringDeltas):
+ (WebCore::WheelEventDeltaFilterMac::updateFromDelta):
+ (WebCore::WheelEventDeltaFilterMac::endFilteringDeltas):
+ * platform/PlatformWheelEvent.h:
+ (WebCore::PlatformWheelEvent::copyWithDeltas): Used to create a copy of the platform wheel event with filtered deltas.
+ (WebCore::PlatformWheelEvent::copyIgnoringHorizontalDelta): Deleted. No longer necessary, since we won't be handling wheel
+ events on separate axes.
+ (WebCore::PlatformWheelEvent::copyIgnoringVerticalDelta): Ditto.
+ * platform/spi/mac/NSScrollingInputFilterSPI.h: Added.
+
2015-08-24 Michael Catanzaro <mcatanz...@igalia.com>
Unreviewed, fix typo in a comment ("unsused" -> "unused")
Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj (188859 => 188860)
--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj 2015-08-24 15:23:21 UTC (rev 188860)
@@ -7341,7 +7341,7 @@
<ClCompile Include="..\page\UserContentURLPattern.cpp" />
<ClCompile Include="..\page\VisitedLinkStore.cpp" />
<ClCompile Include="..\fileapi\WebKitBlobBuilder.cpp" />
- <ClCompile Include="..\page\WheelEventDeltaTracker.cpp" />
+ <ClCompile Include="..\page\WheelEventDeltaFilter.cpp" />
<ClCompile Include="..\page\WheelEventTestTrigger.cpp" />
<ClCompile Include="..\page\WindowFeatures.cpp" />
<ClCompile Include="..\page\WindowFocusAllowedIndicator.cpp" />
@@ -20779,7 +20779,7 @@
<ClInclude Include="..\page\VisitedLinkStore.h" />
<ClInclude Include="..\fileapi\WebKitBlobBuilder.h" />
<ClInclude Include="..\page\WebKitPoint.h" />
- <ClInclude Include="..\page\WheelEventDeltaTracker.h" />
+ <ClInclude Include="..\page\WheelEventDeltaFilter.h" />
<ClInclude Include="..\page\WheelEventTestTrigger.h" />
<ClInclude Include="..\page\WindowFeatures.h" />
<ClInclude Include="..\page\WindowFocusAllowedIndicator.h" />
Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters (188859 => 188860)
--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters 2015-08-24 15:23:21 UTC (rev 188860)
@@ -813,7 +813,7 @@
<ClCompile Include="..\fileapi\WebKitBlobBuilder.cpp">
<Filter>page</Filter>
</ClCompile>
- <ClCompile Include="..\page\WheelEventDeltaTracker.cpp">
+ <ClCompile Include="..\page\WheelEventDeltaFilter.cpp">
<Filter>page</Filter>
</ClCompile>
<ClCompile Include="..\page\WheelEventTestTrigger.cpp">
@@ -7844,7 +7844,7 @@
<ClInclude Include="..\page\WebKitPoint.h">
<Filter>page</Filter>
</ClInclude>
- <ClInclude Include="..\page\WheelEventDeltaTracker.h">
+ <ClInclude Include="..\page\WheelEventDeltaFilter.h">
<Filter>page</Filter>
</ClInclude>
<ClInclude Include="..\page\WheelEventTestTrigger.h">
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (188859 => 188860)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2015-08-24 15:23:21 UTC (rev 188860)
@@ -1178,6 +1178,7 @@
2E0888D41148848A00AF4265 /* JSDOMFormData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E0888D21148848A00AF4265 /* JSDOMFormData.cpp */; };
2E0888D51148848A00AF4265 /* JSDOMFormData.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E0888D31148848A00AF4265 /* JSDOMFormData.h */; };
2E0888E6114884E200AF4265 /* JSDOMFormDataCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E0888E5114884E200AF4265 /* JSDOMFormDataCustom.cpp */; };
+ 2E19516B1B6598D200DF6EEF /* WheelEventDeltaFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E19516A1B6598D200DF6EEF /* WheelEventDeltaFilter.cpp */; };
2E2D99CD10E2BBDA00496337 /* JSBlob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E2D99CB10E2BBDA00496337 /* JSBlob.cpp */; };
2E2D99CE10E2BBDA00496337 /* JSBlob.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E2D99CC10E2BBDA00496337 /* JSBlob.h */; settings = {ATTRIBUTES = (Private, ); }; };
2E2D99E710E2BC1C00496337 /* DOMBlob.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E2D99E510E2BC1C00496337 /* DOMBlob.h */; };
@@ -1218,9 +1219,11 @@
2E75841F12779ADA0062628B /* FileReaderLoaderClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E75841C12779ADA0062628B /* FileReaderLoaderClient.h */; };
2E94F43B119207DA00B7F75D /* JSFileReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E94F439119207DA00B7F75D /* JSFileReader.cpp */; };
2E94F43C119207DA00B7F75D /* JSFileReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E94F43A119207DA00B7F75D /* JSFileReader.h */; };
+ 2E9B5D8F1B66A94E008C6A24 /* WheelEventDeltaFilterMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E9B5D8E1B66A94E008C6A24 /* WheelEventDeltaFilterMac.h */; settings = {ATTRIBUTES = (Private, ); }; };
2EA768040FE7126400AB9C8A /* WorkerScriptLoaderClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EA768030FE7126400AB9C8A /* WorkerScriptLoaderClient.h */; };
2EB4BCD2121F03E300EC4885 /* BlobResourceHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2EB4BCD0121F03E300EC4885 /* BlobResourceHandle.cpp */; };
2EB4BCD3121F03E300EC4885 /* BlobResourceHandle.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EB4BCD1121F03E300EC4885 /* BlobResourceHandle.h */; };
+ 2EBBC3D81B65988300F5253D /* WheelEventDeltaFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EBBC3D71B65988300F5253D /* WheelEventDeltaFilter.h */; settings = {ATTRIBUTES = (Private, ); }; };
2ECF7ADC10162B3800427DE7 /* JSErrorEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2ECF7ADA10162B3800427DE7 /* JSErrorEvent.cpp */; };
2ECF7ADD10162B3800427DE7 /* JSErrorEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 2ECF7ADB10162B3800427DE7 /* JSErrorEvent.h */; };
2ECF7AE110162B5800427DE7 /* ErrorEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2ECF7ADE10162B5800427DE7 /* ErrorEvent.cpp */; };
@@ -1235,6 +1238,7 @@
2EDF369C122C94B4002F7D4E /* FileReaderSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2EDF369A122C94B4002F7D4E /* FileReaderSync.cpp */; };
2EDF369D122C94B4002F7D4E /* FileReaderSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EDF369B122C94B4002F7D4E /* FileReaderSync.h */; };
2EDF369F122C94C8002F7D4E /* FileException.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EDF369E122C94C8002F7D4E /* FileException.h */; };
+ 2EEEE55C1B66A047008E2CBC /* WheelEventDeltaFilterMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2EEEE55B1B66A047008E2CBC /* WheelEventDeltaFilterMac.mm */; };
2EF1BFEA121C9F4200C27627 /* FileStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2EF1BFE8121C9F4200C27627 /* FileStream.cpp */; };
2EF1BFEB121C9F4200C27627 /* FileStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EF1BFE9121C9F4200C27627 /* FileStream.h */; settings = {ATTRIBUTES = (Private, ); }; };
2EF1BFF9121CB0CE00C27627 /* FileStreamClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EF1BFF8121CB0CE00C27627 /* FileStreamClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -3513,8 +3517,6 @@
93EB169509F880B00091F8FF /* WebCoreSystemInterface.mm in Sources */ = {isa = PBXBuildFile; fileRef = 93EB169409F880B00091F8FF /* WebCoreSystemInterface.mm */; };
93EB169709F880C00091F8FF /* WebCoreSystemInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 93EB169609F880C00091F8FF /* WebCoreSystemInterface.h */; settings = {ATTRIBUTES = (Private, ); }; };
93EB355F09E37FD600F43799 /* MouseEventWithHitTestResults.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93EB355E09E37FD600F43799 /* MouseEventWithHitTestResults.cpp */; };
- 93EC44A1188F4BB800661DF1 /* WheelEventDeltaTracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93EC449F188F4BB800661DF1 /* WheelEventDeltaTracker.cpp */; };
- 93EC44A2188F4BB800661DF1 /* WheelEventDeltaTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 93EC44A0188F4BB800661DF1 /* WheelEventDeltaTracker.h */; settings = {ATTRIBUTES = (Private, ); }; };
93EF7D551954F13900DFB71D /* ScrollingStateNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 93EF7D541954E98F00DFB71D /* ScrollingStateNode.mm */; };
93F198E508245E59001E9ABC /* HTMLDocument.h in Headers */ = {isa = PBXBuildFile; fileRef = F523D23C02DE4396018635CA /* HTMLDocument.h */; settings = {ATTRIBUTES = (Private, ); }; };
93F198E608245E59001E9ABC /* HTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = F523D23F02DE4396018635CA /* HTMLElement.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -6460,6 +6462,7 @@
F3D4C47912E07663003DA150 /* InspectorDOMDebuggerAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = F3D4C47712E07663003DA150 /* InspectorDOMDebuggerAgent.h */; };
F3F5CF1112ED81A80084C569 /* InspectorConsoleInstrumentation.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F5CF1012ED81A80084C569 /* InspectorConsoleInstrumentation.h */; };
F3F5CF1312ED81B30084C569 /* InspectorDatabaseInstrumentation.h in Headers */ = {isa = PBXBuildFile; fileRef = F3F5CF1212ED81B30084C569 /* InspectorDatabaseInstrumentation.h */; };
+ F40EA8AB1B867E4400CE5581 /* NSScrollingInputFilterSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = F40EA8AA1B867D6500CE5581 /* NSScrollingInputFilterSPI.h */; settings = {ATTRIBUTES = (Private, ); }; };
F42FFB461984B71600F6837F /* LengthRepeat.h in Headers */ = {isa = PBXBuildFile; fileRef = F42FFB451984B71600F6837F /* LengthRepeat.h */; };
F45C231D1995B73B00A6E2E3 /* AxisScrollSnapOffsets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F45C231B1995B73B00A6E2E3 /* AxisScrollSnapOffsets.cpp */; };
F45C231E1995B73B00A6E2E3 /* AxisScrollSnapOffsets.h in Headers */ = {isa = PBXBuildFile; fileRef = F45C231C1995B73B00A6E2E3 /* AxisScrollSnapOffsets.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -8387,6 +8390,7 @@
2E0888D21148848A00AF4265 /* JSDOMFormData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDOMFormData.cpp; sourceTree = "<group>"; };
2E0888D31148848A00AF4265 /* JSDOMFormData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDOMFormData.h; sourceTree = "<group>"; };
2E0888E5114884E200AF4265 /* JSDOMFormDataCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDOMFormDataCustom.cpp; sourceTree = "<group>"; };
+ 2E19516A1B6598D200DF6EEF /* WheelEventDeltaFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WheelEventDeltaFilter.cpp; sourceTree = "<group>"; };
2E2D99CB10E2BBDA00496337 /* JSBlob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSBlob.cpp; sourceTree = "<group>"; };
2E2D99CC10E2BBDA00496337 /* JSBlob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSBlob.h; sourceTree = "<group>"; };
2E2D99E510E2BC1C00496337 /* DOMBlob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMBlob.h; sourceTree = "<group>"; };
@@ -8429,9 +8433,11 @@
2E75841C12779ADA0062628B /* FileReaderLoaderClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileReaderLoaderClient.h; sourceTree = "<group>"; };
2E94F439119207DA00B7F75D /* JSFileReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSFileReader.cpp; sourceTree = "<group>"; };
2E94F43A119207DA00B7F75D /* JSFileReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSFileReader.h; sourceTree = "<group>"; };
+ 2E9B5D8E1B66A94E008C6A24 /* WheelEventDeltaFilterMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WheelEventDeltaFilterMac.h; sourceTree = "<group>"; };
2EA768030FE7126400AB9C8A /* WorkerScriptLoaderClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerScriptLoaderClient.h; sourceTree = "<group>"; };
2EB4BCD0121F03E300EC4885 /* BlobResourceHandle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BlobResourceHandle.cpp; sourceTree = "<group>"; };
2EB4BCD1121F03E300EC4885 /* BlobResourceHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlobResourceHandle.h; sourceTree = "<group>"; };
+ 2EBBC3D71B65988300F5253D /* WheelEventDeltaFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WheelEventDeltaFilter.h; sourceTree = "<group>"; };
2ECF7ADA10162B3800427DE7 /* JSErrorEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSErrorEvent.cpp; sourceTree = "<group>"; };
2ECF7ADB10162B3800427DE7 /* JSErrorEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSErrorEvent.h; sourceTree = "<group>"; };
2ECF7ADE10162B5800427DE7 /* ErrorEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ErrorEvent.cpp; sourceTree = "<group>"; };
@@ -8447,6 +8453,7 @@
2EDF369A122C94B4002F7D4E /* FileReaderSync.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileReaderSync.cpp; sourceTree = "<group>"; };
2EDF369B122C94B4002F7D4E /* FileReaderSync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileReaderSync.h; sourceTree = "<group>"; };
2EDF369E122C94C8002F7D4E /* FileException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileException.h; sourceTree = "<group>"; };
+ 2EEEE55B1B66A047008E2CBC /* WheelEventDeltaFilterMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WheelEventDeltaFilterMac.mm; sourceTree = "<group>"; };
2EF1BFE8121C9F4200C27627 /* FileStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileStream.cpp; sourceTree = "<group>"; };
2EF1BFE9121C9F4200C27627 /* FileStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileStream.h; sourceTree = "<group>"; };
2EF1BFF8121CB0CE00C27627 /* FileStreamClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileStreamClient.h; sourceTree = "<group>"; };
@@ -10868,8 +10875,6 @@
93EB169409F880B00091F8FF /* WebCoreSystemInterface.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebCoreSystemInterface.mm; sourceTree = "<group>"; };
93EB169609F880C00091F8FF /* WebCoreSystemInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebCoreSystemInterface.h; sourceTree = "<group>"; };
93EB355E09E37FD600F43799 /* MouseEventWithHitTestResults.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MouseEventWithHitTestResults.cpp; sourceTree = "<group>"; };
- 93EC449F188F4BB800661DF1 /* WheelEventDeltaTracker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WheelEventDeltaTracker.cpp; sourceTree = "<group>"; };
- 93EC44A0188F4BB800661DF1 /* WheelEventDeltaTracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WheelEventDeltaTracker.h; sourceTree = "<group>"; };
93EEC1E509C2877700C515D1 /* Attr.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Attr.idl; sourceTree = "<group>"; };
93EEC1E609C2877700C515D1 /* CharacterData.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CharacterData.idl; sourceTree = "<group>"; };
93EEC1E809C2877700C515D1 /* DocumentType.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DocumentType.idl; sourceTree = "<group>"; };
@@ -14189,6 +14194,7 @@
F3D4C47712E07663003DA150 /* InspectorDOMDebuggerAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorDOMDebuggerAgent.h; sourceTree = "<group>"; };
F3F5CF1012ED81A80084C569 /* InspectorConsoleInstrumentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorConsoleInstrumentation.h; sourceTree = "<group>"; };
F3F5CF1212ED81B30084C569 /* InspectorDatabaseInstrumentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorDatabaseInstrumentation.h; sourceTree = "<group>"; };
+ F40EA8AA1B867D6500CE5581 /* NSScrollingInputFilterSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSScrollingInputFilterSPI.h; sourceTree = "<group>"; };
F42FFB451984B71600F6837F /* LengthRepeat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LengthRepeat.h; sourceTree = "<group>"; };
F45C231B1995B73B00A6E2E3 /* AxisScrollSnapOffsets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AxisScrollSnapOffsets.cpp; sourceTree = "<group>"; };
F45C231C1995B73B00A6E2E3 /* AxisScrollSnapOffsets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AxisScrollSnapOffsets.h; sourceTree = "<group>"; };
@@ -17266,8 +17272,8 @@
7C48A6D2191C9D8E00026674 /* WebKitNamespace.idl */,
494BD7930F55C8EE00747828 /* WebKitPoint.h */,
494BD7940F55C8EE00747828 /* WebKitPoint.idl */,
- 93EC449F188F4BB800661DF1 /* WheelEventDeltaTracker.cpp */,
- 93EC44A0188F4BB800661DF1 /* WheelEventDeltaTracker.h */,
+ 2E19516A1B6598D200DF6EEF /* WheelEventDeltaFilter.cpp */,
+ 2EBBC3D71B65988300F5253D /* WheelEventDeltaFilter.h */,
7AE335EF1ACB09E200E401EF /* WheelEventTestTrigger.cpp */,
7AE335F01ACB09E200E401EF /* WheelEventTestTrigger.h */,
7C4189AC1B07CBF2000FA757 /* WindowEventHandlers.idl */,
@@ -18125,6 +18131,7 @@
9321D58F1A3906FA008052BE /* NSImmediateActionGestureRecognizerSPI.h */,
937F4CCD1A2D4B0100BB39F5 /* NSMenuSPI.h */,
93F1E1EB1A40FDDC00348D13 /* NSPopoverSPI.h */,
+ F40EA8AA1B867D6500CE5581 /* NSScrollingInputFilterSPI.h */,
2DCB837719F99BBA00A7FBE4 /* NSSharingServicePickerSPI.h */,
2DCB837819F99BBA00A7FBE4 /* NSSharingServiceSPI.h */,
937F4CCB1A2D48C100BB39F5 /* QuickLookMacSPI.h */,
@@ -18158,6 +18165,8 @@
2D4F96F41A1ECC240098BF88 /* TextIndicatorWindow.mm */,
26255F0218878E110006E1FD /* UserAgentMac.mm */,
F587854C02DE375901EA4122 /* WebCoreFrameView.h */,
+ 2EEEE55B1B66A047008E2CBC /* WheelEventDeltaFilterMac.mm */,
+ 2E9B5D8E1B66A94E008C6A24 /* WheelEventDeltaFilterMac.h */,
);
path = mac;
sourceTree = "<group>";
@@ -24035,6 +24044,7 @@
FD31600812B0267600C1A359 /* AudioDestinationNode.h in Headers */,
FD31608012B026F700C1A359 /* AudioDSPKernel.h in Headers */,
FD31608212B026F700C1A359 /* AudioDSPKernelProcessor.h in Headers */,
+ F40EA8AB1B867E4400CE5581 /* NSScrollingInputFilterSPI.h in Headers */,
FD31608312B026F700C1A359 /* AudioFileReader.h in Headers */,
CD5596921475B678001D0BD0 /* AudioFileReaderIOS.h in Headers */,
FD3160BF12B0272A00C1A359 /* AudioFileReaderMac.h in Headers */,
@@ -25359,6 +25369,7 @@
CE12524D1A1A77DE00864480 /* IOPMLibSPI.h in Headers */,
44DEF6431A6FF92700D45EEC /* IOReturnSPI.h in Headers */,
2D0B4AAB18DA1CCD00434DE1 /* IOSurface.h in Headers */,
+ 2E9B5D8F1B66A94E008C6A24 /* WheelEventDeltaFilterMac.h in Headers */,
1C21E57D183ED1FF001C289D /* IOSurfacePool.h in Headers */,
44DFF6431A6FF92700D45EEC /* IOSurfaceSPI.h in Headers */,
44EFF6431A6FF92700D45EEC /* IOTypesSPI.h in Headers */,
@@ -25715,6 +25726,7 @@
1AFE119A0CBFFCC4003017FA /* JSSQLResultSetRowList.h in Headers */,
B59DD6A511902A62007E9684 /* JSSQLStatementCallback.h in Headers */,
B59DD6A911902A71007E9684 /* JSSQLStatementErrorCallback.h in Headers */,
+ 2EBBC3D81B65988300F5253D /* WheelEventDeltaFilter.h in Headers */,
BC82432A0D0CE8A200460C8F /* JSSQLTransaction.h in Headers */,
B59DD69D11902A42007E9684 /* JSSQLTransactionCallback.h in Headers */,
B59DD6A111902A52007E9684 /* JSSQLTransactionErrorCallback.h in Headers */,
@@ -27437,7 +27449,6 @@
A91C9FC31B659A6700AFFD54 /* AccessibilityTreeItem.h in Headers */,
F55B3DE01251F12D003EF269 /* WeekInputType.h in Headers */,
85031B510A44EFC700F992E0 /* WheelEvent.h in Headers */,
- 93EC44A2188F4BB800661DF1 /* WheelEventDeltaTracker.h in Headers */,
7AE335F21ACB09E200E401EF /* WheelEventTestTrigger.h in Headers */,
9380F47409A11AB4001FDB34 /* Widget.h in Headers */,
1411DCB1164C39A800D49BC1 /* WidthCache.h in Headers */,
@@ -30372,6 +30383,7 @@
B22279AD0D00BF220071B782 /* SVGDefsElement.cpp in Sources */,
B22279B00D00BF220071B782 /* SVGDescElement.cpp in Sources */,
B22279B30D00BF220071B782 /* SVGDocument.cpp in Sources */,
+ 2EEEE55C1B66A047008E2CBC /* WheelEventDeltaFilterMac.mm in Sources */,
B28C6A270D00C44800334AA4 /* SVGDocumentExtensions.cpp in Sources */,
B22279B60D00BF220071B782 /* SVGElement.cpp in Sources */,
A833C8520A2CF52800D57664 /* SVGElementFactory.cpp in Sources */,
@@ -30466,6 +30478,7 @@
B2227A8B0D00BF220071B782 /* SVGPointList.cpp in Sources */,
B2227A8E0D00BF220071B782 /* SVGPolyElement.cpp in Sources */,
B2227A900D00BF220071B782 /* SVGPolygonElement.cpp in Sources */,
+ 2E19516B1B6598D200DF6EEF /* WheelEventDeltaFilter.cpp in Sources */,
B2227A930D00BF220071B782 /* SVGPolylineElement.cpp in Sources */,
B2227A960D00BF220071B782 /* SVGPreserveAspectRatio.cpp in Sources */,
B543B85717EB758F003BE93A /* SVGPropertyInfo.cpp in Sources */,
@@ -30765,7 +30778,6 @@
CD8203111395ACE700F956C6 /* WebWindowAnimation.mm in Sources */,
F55B3DDF1251F12D003EF269 /* WeekInputType.cpp in Sources */,
85031B500A44EFC700F992E0 /* WheelEvent.cpp in Sources */,
- 93EC44A1188F4BB800661DF1 /* WheelEventDeltaTracker.cpp in Sources */,
7AE335F11ACB09E200E401EF /* WheelEventTestTrigger.cpp in Sources */,
9380F47309A11AB4001FDB34 /* Widget.cpp in Sources */,
E453904D0EAFD637003695C8 /* WidgetIOS.mm in Sources */,
Modified: trunk/Source/WebCore/page/EventHandler.cpp (188859 => 188860)
--- trunk/Source/WebCore/page/EventHandler.cpp 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebCore/page/EventHandler.cpp 2015-08-24 15:23:21 UTC (rev 188860)
@@ -287,17 +287,22 @@
}
}
-static inline bool didScrollInScrollableAreaForSingleAxis(ScrollableArea* scrollableArea, WheelEvent* wheelEvent, ScrollEventAxis axis)
+static inline bool didScrollInScrollableArea(ScrollableArea* scrollableArea, WheelEvent* wheelEvent)
{
- float delta = axis == ScrollEventAxis::Vertical ? wheelEvent->deltaY() : wheelEvent->deltaX();
- ScrollDirection negativeDirection = axis == ScrollEventAxis::Vertical ? ScrollUp : ScrollLeft;
- ScrollDirection positiveDirection = axis == ScrollEventAxis::Vertical ? ScrollDown : ScrollRight;
- return scrollableArea->scroll(delta < 0 ? negativeDirection : positiveDirection, wheelGranularityToScrollGranularity(wheelEvent->deltaMode()), delta > 0 ? delta : -delta);
+ ScrollGranularity scrollGranularity = wheelGranularityToScrollGranularity(wheelEvent->deltaMode());
+ bool didHandleWheelEvent = false;
+ if (float absoluteDelta = std::abs(wheelEvent->deltaX()))
+ didHandleWheelEvent |= scrollableArea->scroll(wheelEvent->deltaX() > 0 ? ScrollRight : ScrollLeft, scrollGranularity, absoluteDelta);
+
+ if (float absoluteDelta = std::abs(wheelEvent->deltaY()))
+ didHandleWheelEvent |= scrollableArea->scroll(wheelEvent->deltaY() > 0 ? ScrollDown : ScrollUp, scrollGranularity, absoluteDelta);
+
+ return didHandleWheelEvent;
}
-static inline bool handleWheelEventInAppropriateEnclosingBoxForSingleAxis(Node* startNode, WheelEvent* wheelEvent, Element** stopElement, ScrollEventAxis axis)
+static inline bool handleWheelEventInAppropriateEnclosingBox(Node* startNode, WheelEvent* wheelEvent, Element** stopElement, const FloatSize& filteredPlatformDelta)
{
- bool shouldHandleEvent = (axis == ScrollEventAxis::Vertical && wheelEvent->deltaY()) || (axis == ScrollEventAxis::Horizontal && wheelEvent->deltaX());
+ bool shouldHandleEvent = wheelEvent->deltaX() || wheelEvent->deltaY();
#if PLATFORM(MAC)
shouldHandleEvent |= wheelEvent->phase() == PlatformWheelEventPhaseEnded;
#if ENABLE(CSS_SCROLL_SNAP)
@@ -309,7 +314,7 @@
RenderBox& initialEnclosingBox = startNode->renderer()->enclosingBox();
if (initialEnclosingBox.isListBox())
- return didScrollInScrollableAreaForSingleAxis(static_cast<RenderListBox*>(&initialEnclosingBox), wheelEvent, axis);
+ return didScrollInScrollableArea(static_cast<RenderListBox*>(&initialEnclosingBox), wheelEvent);
RenderBox* currentEnclosingBox = &initialEnclosingBox;
while (currentEnclosingBox) {
@@ -317,9 +322,9 @@
const PlatformWheelEvent* platformEvent = wheelEvent->wheelEvent();
bool scrollingWasHandled;
if (platformEvent != nullptr)
- scrollingWasHandled = boxLayer->handleWheelEvent(axis == ScrollEventAxis::Vertical ? platformEvent->copyIgnoringHorizontalDelta() : platformEvent->copyIgnoringVerticalDelta());
+ scrollingWasHandled = boxLayer->handleWheelEvent(platformEvent->copyWithDeltas(filteredPlatformDelta.width(), filteredPlatformDelta.height()));
else
- scrollingWasHandled = didScrollInScrollableAreaForSingleAxis(boxLayer, wheelEvent, axis);
+ scrollingWasHandled = didScrollInScrollableArea(boxLayer, wheelEvent);
if (scrollingWasHandled) {
if (stopElement)
@@ -2670,7 +2675,7 @@
void EventHandler::platformRecordWheelEvent(const PlatformWheelEvent& event)
{
- m_frame.mainFrame().wheelEventDeltaTracker()->recordWheelEventDelta(event);
+ m_frame.mainFrame().wheelEventDeltaFilter()->updateFromDelta(FloatSize(event.deltaX(), event.deltaY()));
}
bool EventHandler::platformCompleteWheelEvent(const PlatformWheelEvent& event, ContainerNode*, ScrollableArea*)
@@ -2775,7 +2780,7 @@
#if PLATFORM(MAC)
m_frame.mainFrame().resetLatchingState();
#endif
- m_frame.mainFrame().wheelEventDeltaTracker()->endTrackingDeltas();
+ m_frame.mainFrame().wheelEventDeltaFilter()->endFilteringDeltas();
}
void EventHandler::defaultWheelEventHandler(Node* startNode, WheelEvent* wheelEvent)
@@ -2783,25 +2788,24 @@
if (!startNode || !wheelEvent)
return;
- DominantScrollGestureDirection dominantDirection = DominantScrollGestureDirection::None;
-
+ FloatSize filteredPlatformDelta(wheelEvent->deltaX(), wheelEvent->deltaY());
+ if (const PlatformWheelEvent* platformWheelEvent = wheelEvent->wheelEvent()) {
+ filteredPlatformDelta.setWidth(platformWheelEvent->deltaX());
+ filteredPlatformDelta.setHeight(platformWheelEvent->deltaY());
+ }
+
#if PLATFORM(MAC)
ScrollLatchingState* latchedState = m_frame.mainFrame().latchingState();
Element* stopElement = latchedState ? latchedState->previousWheelScrolledElement() : nullptr;
- // Workaround for scrolling issues <rdar://problem/14758615>.
- if (m_frame.mainFrame().wheelEventDeltaTracker()->isTrackingDeltas())
- dominantDirection = m_frame.mainFrame().wheelEventDeltaTracker()->dominantScrollGestureDirection();
+ if (m_frame.mainFrame().wheelEventDeltaFilter()->isFilteringDeltas())
+ filteredPlatformDelta = m_frame.mainFrame().wheelEventDeltaFilter()->filteredDelta();
#else
Element* stopElement = nullptr;
#endif
- // Break up into two scrolls if we need to. Diagonal movement on
- // a MacBook pro is an example of a 2-dimensional mouse wheel event (where both deltaX and deltaY can be set).
- if (dominantDirection != DominantScrollGestureDirection::Vertical && handleWheelEventInAppropriateEnclosingBoxForSingleAxis(startNode, wheelEvent, &stopElement, ScrollEventAxis::Horizontal))
- wheelEvent->setDefaultHandled();
- if (dominantDirection != DominantScrollGestureDirection::Horizontal && handleWheelEventInAppropriateEnclosingBoxForSingleAxis(startNode, wheelEvent, &stopElement, ScrollEventAxis::Vertical))
+ if (handleWheelEventInAppropriateEnclosingBox(startNode, wheelEvent, &stopElement, filteredPlatformDelta))
wheelEvent->setDefaultHandled();
#if PLATFORM(MAC)
Modified: trunk/Source/WebCore/page/EventHandler.h (188859 => 188860)
--- trunk/Source/WebCore/page/EventHandler.h 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebCore/page/EventHandler.h 2015-08-24 15:23:21 UTC (rev 188860)
@@ -37,7 +37,7 @@
#include "TextEventInputType.h"
#include "TextGranularity.h"
#include "Timer.h"
-#include "WheelEventDeltaTracker.h"
+#include "WheelEventDeltaFilter.h"
#include <memory>
#include <wtf/Forward.h>
#include <wtf/RefPtr.h>
Modified: trunk/Source/WebCore/page/MainFrame.cpp (188859 => 188860)
--- trunk/Source/WebCore/page/MainFrame.cpp 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebCore/page/MainFrame.cpp 2015-08-24 15:23:21 UTC (rev 188860)
@@ -32,12 +32,12 @@
#include "PageOverlayController.h"
#include "ScrollLatchingState.h"
#include "Settings.h"
-#include "WheelEventDeltaTracker.h"
+#include "WheelEventDeltaFilter.h"
#include <wtf/NeverDestroyed.h>
#if PLATFORM(MAC)
#include "ServicesOverlayController.h"
-#endif
+#endif /* PLATFORM(MAC) */
namespace WebCore {
@@ -49,7 +49,7 @@
, m_servicesOverlayController(std::make_unique<ServicesOverlayController>(*this))
#endif
#endif
- , m_recentWheelEventDeltaTracker(std::make_unique<WheelEventDeltaTracker>())
+ , m_recentWheelEventDeltaFilter(WheelEventDeltaFilter::create())
, m_pageOverlayController(std::make_unique<PageOverlayController>(*this))
, m_diagnosticLoggingClient(configuration.diagnosticLoggingClient)
{
Modified: trunk/Source/WebCore/page/MainFrame.h (188859 => 188860)
--- trunk/Source/WebCore/page/MainFrame.h 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebCore/page/MainFrame.h 2015-08-24 15:23:21 UTC (rev 188860)
@@ -36,7 +36,7 @@
class PageOverlayController;
class ScrollLatchingState;
class ServicesOverlayController;
-class WheelEventDeltaTracker;
+class WheelEventDeltaFilter;
class MainFrame final : public Frame {
public:
@@ -47,7 +47,7 @@
void selfOnlyRef();
void selfOnlyDeref();
- WheelEventDeltaTracker* wheelEventDeltaTracker() { return m_recentWheelEventDeltaTracker.get(); }
+ WheelEventDeltaFilter* wheelEventDeltaFilter() { return m_recentWheelEventDeltaFilter.get(); }
PageOverlayController& pageOverlayController() { return *m_pageOverlayController; }
#if PLATFORM(MAC)
@@ -77,7 +77,7 @@
#endif
#endif
- std::unique_ptr<WheelEventDeltaTracker> m_recentWheelEventDeltaTracker;
+ std::unique_ptr<WheelEventDeltaFilter> m_recentWheelEventDeltaFilter;
std::unique_ptr<PageOverlayController> m_pageOverlayController;
DiagnosticLoggingClient* m_diagnosticLoggingClient;
};
Copied: trunk/Source/WebCore/page/WheelEventDeltaFilter.cpp (from rev 188859, trunk/Source/WebCore/page/WheelEventDeltaTracker.cpp) (0 => 188860)
--- trunk/Source/WebCore/page/WheelEventDeltaFilter.cpp (rev 0)
+++ trunk/Source/WebCore/page/WheelEventDeltaFilter.cpp 2015-08-24 15:23:21 UTC (rev 188860)
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WheelEventDeltaFilter.h"
+
+#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
+#include "WheelEventDeltaFilterMac.h"
+#endif
+
+#include "FloatSize.h"
+
+namespace WebCore {
+
+WheelEventDeltaFilter::WheelEventDeltaFilter()
+{
+}
+
+WheelEventDeltaFilter::~WheelEventDeltaFilter()
+{
+}
+
+std::unique_ptr<WheelEventDeltaFilter> WheelEventDeltaFilter::create()
+{
+#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
+ return std::make_unique<WheelEventDeltaFilterMac>();
+#else
+ return std::make_unique<BasicWheelEventDeltaFilter>();
+#endif
+}
+
+BasicWheelEventDeltaFilter::BasicWheelEventDeltaFilter()
+ : WheelEventDeltaFilter()
+{
+}
+
+const size_t basicWheelEventDeltaFilterWindowSize = 3;
+
+void BasicWheelEventDeltaFilter::updateFromDelta(const FloatSize& delta)
+{
+ m_currentFilteredDelta = delta;
+ if (!m_isFilteringDeltas)
+ return;
+
+ m_recentWheelEventDeltas.append(delta);
+ if (m_recentWheelEventDeltas.size() > basicWheelEventDeltaFilterWindowSize)
+ m_recentWheelEventDeltas.removeFirst();
+
+ DominantScrollGestureDirection scrollDirection = dominantScrollGestureDirection();
+ if (scrollDirection == DominantScrollGestureDirection::Vertical)
+ m_currentFilteredDelta.setWidth(0);
+ else if (scrollDirection == DominantScrollGestureDirection::Horizontal)
+ m_currentFilteredDelta.setHeight(0);
+}
+
+void BasicWheelEventDeltaFilter::beginFilteringDeltas()
+{
+ m_recentWheelEventDeltas.clear();
+ m_isFilteringDeltas = true;
+}
+
+void BasicWheelEventDeltaFilter::endFilteringDeltas()
+{
+ m_currentFilteredDelta = FloatSize(0, 0);
+ m_isFilteringDeltas = false;
+}
+
+static inline bool deltaIsPredominantlyVertical(const FloatSize& delta)
+{
+ return fabs(delta.height()) > fabs(delta.width());
+}
+
+DominantScrollGestureDirection BasicWheelEventDeltaFilter::dominantScrollGestureDirection() const
+{
+ bool allVertical = m_recentWheelEventDeltas.size();
+ bool allHorizontal = m_recentWheelEventDeltas.size();
+
+ for (const auto& delta : m_recentWheelEventDeltas) {
+ bool isVertical = deltaIsPredominantlyVertical(delta);
+ allVertical &= isVertical;
+ allHorizontal &= !isVertical;
+ }
+
+ if (allVertical)
+ return DominantScrollGestureDirection::Vertical;
+
+ if (allHorizontal)
+ return DominantScrollGestureDirection::Horizontal;
+
+ return DominantScrollGestureDirection::None;
+}
+
+};
Copied: trunk/Source/WebCore/page/WheelEventDeltaFilter.h (from rev 188859, trunk/Source/WebCore/page/WheelEventDeltaTracker.h) (0 => 188860)
--- trunk/Source/WebCore/page/WheelEventDeltaFilter.h (rev 0)
+++ trunk/Source/WebCore/page/WheelEventDeltaFilter.h 2015-08-24 15:23:21 UTC (rev 188860)
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WheelEventDeltaFilter_h
+#define WheelEventDeltaFilter_h
+
+#include "FloatSize.h"
+#include <wtf/Deque.h>
+
+namespace WebCore {
+
+class PlatformWheelEvent;
+
+class WheelEventDeltaFilter {
+public:
+ WheelEventDeltaFilter();
+ virtual ~WheelEventDeltaFilter();
+
+ WEBCORE_EXPORT static std::unique_ptr<WheelEventDeltaFilter> create();
+ WEBCORE_EXPORT virtual void updateFromDelta(const FloatSize&) = 0;
+ WEBCORE_EXPORT virtual void beginFilteringDeltas() = 0;
+ WEBCORE_EXPORT virtual void endFilteringDeltas() = 0;
+ WEBCORE_EXPORT bool isFilteringDeltas() const
+ {
+ return m_isFilteringDeltas;
+ }
+
+ WEBCORE_EXPORT FloatSize filteredDelta() const
+ {
+ return m_currentFilteredDelta;
+ }
+
+protected:
+ FloatSize m_currentFilteredDelta;
+ bool m_isFilteringDeltas { false };
+};
+
+enum class DominantScrollGestureDirection {
+ None,
+ Vertical,
+ Horizontal
+};
+
+class BasicWheelEventDeltaFilter final : public WheelEventDeltaFilter {
+public:
+ BasicWheelEventDeltaFilter();
+ virtual void updateFromDelta(const FloatSize&) override;
+ virtual void beginFilteringDeltas() override;
+ virtual void endFilteringDeltas() override;
+
+private:
+ DominantScrollGestureDirection dominantScrollGestureDirection() const;
+
+ Deque<FloatSize> m_recentWheelEventDeltas;
+};
+
+}
+
+#endif
Deleted: trunk/Source/WebCore/page/WheelEventDeltaTracker.cpp (188859 => 188860)
--- trunk/Source/WebCore/page/WheelEventDeltaTracker.cpp 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebCore/page/WheelEventDeltaTracker.cpp 2015-08-24 15:23:21 UTC (rev 188860)
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include "WheelEventDeltaTracker.h"
-
-#include "PlatformWheelEvent.h"
-
-namespace WebCore {
-
-WheelEventDeltaTracker::WheelEventDeltaTracker()
- : m_isTrackingDeltas(false)
-{
-}
-
-WheelEventDeltaTracker::~WheelEventDeltaTracker()
-{
-}
-
-void WheelEventDeltaTracker::beginTrackingDeltas()
-{
- m_recentWheelEventDeltas.clear();
- m_isTrackingDeltas = true;
-}
-
-void WheelEventDeltaTracker::endTrackingDeltas()
-{
- m_isTrackingDeltas = false;
-}
-
-void WheelEventDeltaTracker::recordWheelEventDelta(const PlatformWheelEvent& event)
-{
- m_recentWheelEventDeltas.append(FloatSize(event.deltaX(), event.deltaY()));
- if (m_recentWheelEventDeltas.size() > recentEventCount)
- m_recentWheelEventDeltas.removeFirst();
-}
-
-static bool deltaIsPredominantlyVertical(const FloatSize& delta)
-{
- return fabs(delta.height()) > fabs(delta.width());
-}
-
-DominantScrollGestureDirection WheelEventDeltaTracker::dominantScrollGestureDirection() const
-{
- bool allVertical = m_recentWheelEventDeltas.size();
- bool allHorizontal = m_recentWheelEventDeltas.size();
-
- for (const auto& delta : m_recentWheelEventDeltas) {
- bool isVertical = deltaIsPredominantlyVertical(delta);
- allVertical &= isVertical;
- allHorizontal &= !isVertical;
- }
-
- if (allVertical)
- return DominantScrollGestureDirection::Vertical;
-
- if (allHorizontal)
- return DominantScrollGestureDirection::Horizontal;
-
- return DominantScrollGestureDirection::None;
-}
-
-} // namespace WebCore
Deleted: trunk/Source/WebCore/page/WheelEventDeltaTracker.h (188859 => 188860)
--- trunk/Source/WebCore/page/WheelEventDeltaTracker.h 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebCore/page/WheelEventDeltaTracker.h 2015-08-24 15:23:21 UTC (rev 188860)
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#ifndef WheelEventDeltaTracker_h
-#define WheelEventDeltaTracker_h
-
-#include "FloatSize.h"
-#include <wtf/Deque.h>
-
-namespace WebCore {
-
-class PlatformWheelEvent;
-
-const size_t recentEventCount = 3;
-
-enum class DominantScrollGestureDirection {
- None,
- Vertical,
- Horizontal
-};
-
-class WheelEventDeltaTracker final {
-public:
- WEBCORE_EXPORT WheelEventDeltaTracker();
- WEBCORE_EXPORT ~WheelEventDeltaTracker();
-
- WEBCORE_EXPORT void beginTrackingDeltas();
- WEBCORE_EXPORT void endTrackingDeltas();
-
- bool isTrackingDeltas() const { return m_isTrackingDeltas; }
-
- WEBCORE_EXPORT void recordWheelEventDelta(const PlatformWheelEvent&);
- WEBCORE_EXPORT DominantScrollGestureDirection dominantScrollGestureDirection() const;
-
-private:
- Deque<FloatSize> m_recentWheelEventDeltas;
- bool m_isTrackingDeltas;
-
-};
-
-} // namespace WebCore
-
-#endif // WheelEventDeltaTracker_h
Modified: trunk/Source/WebCore/page/mac/EventHandlerMac.mm (188859 => 188860)
--- trunk/Source/WebCore/page/mac/EventHandlerMac.mm 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebCore/page/mac/EventHandlerMac.mm 2015-08-24 15:23:21 UTC (rev 188860)
@@ -954,7 +954,7 @@
latchingState->setScrollableContainer(scrollableContainer);
latchingState->setWidgetIsLatched(result.isOverWidget());
isOverWidget = latchingState->widgetIsLatched();
- m_frame.mainFrame().wheelEventDeltaTracker()->beginTrackingDeltas();
+ m_frame.mainFrame().wheelEventDeltaFilter()->beginFilteringDeltas();
}
}
} else if (wheelEvent.shouldResetLatching())
@@ -982,16 +982,15 @@
{
switch (wheelEvent.phase()) {
case PlatformWheelEventPhaseBegan:
- m_frame.mainFrame().wheelEventDeltaTracker()->beginTrackingDeltas();
+ m_frame.mainFrame().wheelEventDeltaFilter()->beginFilteringDeltas();
break;
case PlatformWheelEventPhaseEnded:
- m_frame.mainFrame().wheelEventDeltaTracker()->endTrackingDeltas();
+ m_frame.mainFrame().wheelEventDeltaFilter()->endFilteringDeltas();
break;
default:
break;
}
-
- m_frame.mainFrame().wheelEventDeltaTracker()->recordWheelEventDelta(wheelEvent);
+ m_frame.mainFrame().wheelEventDeltaFilter()->updateFromDelta(FloatSize(wheelEvent.deltaX(), wheelEvent.deltaY()));
}
static FrameView* frameViewForLatchingState(Frame& frame, ScrollLatchingState* latchingState)
Copied: trunk/Source/WebCore/page/mac/WheelEventDeltaFilterMac.h (from rev 188859, trunk/Source/WebCore/page/WheelEventDeltaTracker.h) (0 => 188860)
--- trunk/Source/WebCore/page/mac/WheelEventDeltaFilterMac.h (rev 0)
+++ trunk/Source/WebCore/page/mac/WheelEventDeltaFilterMac.h 2015-08-24 15:23:21 UTC (rev 188860)
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WheelEventDeltaFilterMac_h
+#define WheelEventDeltaFilterMac_h
+
+#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
+
+#include "WheelEventDeltaFilter.h"
+#include <wtf/RetainPtr.h>
+
+OBJC_CLASS _NSScrollingPredominantAxisFilter;
+
+namespace WebCore {
+
+class WheelEventDeltaFilterMac final : public WheelEventDeltaFilter {
+public:
+ WheelEventDeltaFilterMac();
+
+ virtual void updateFromDelta(const FloatSize&) override;
+ virtual void beginFilteringDeltas() override;
+ virtual void endFilteringDeltas() override;
+
+private:
+ RetainPtr<_NSScrollingPredominantAxisFilter> m_predominantAxisFilter;
+ double m_beginFilteringDeltasTime { 0 };
+};
+
+}
+
+#endif /* PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100 */
+
+#endif /* WheelEventDeltaFilterMac_h */
Added: trunk/Source/WebCore/page/mac/WheelEventDeltaFilterMac.mm (0 => 188860)
--- trunk/Source/WebCore/page/mac/WheelEventDeltaFilterMac.mm (rev 0)
+++ trunk/Source/WebCore/page/mac/WheelEventDeltaFilterMac.mm 2015-08-24 15:23:21 UTC (rev 188860)
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
+
+#include "config.h"
+#include "WheelEventDeltaFilterMac.h"
+
+#import "NSScrollingInputFilterSPI.h"
+#import <wtf/CurrentTime.h>
+
+namespace WebCore {
+
+WheelEventDeltaFilterMac::WheelEventDeltaFilterMac()
+ : WheelEventDeltaFilter()
+ , m_predominantAxisFilter(adoptNS([[_NSScrollingPredominantAxisFilter alloc] init]))
+{
+}
+
+void WheelEventDeltaFilterMac::beginFilteringDeltas()
+{
+ m_beginFilteringDeltasTime = monotonicallyIncreasingTime();
+ m_isFilteringDeltas = true;
+}
+
+void WheelEventDeltaFilterMac::updateFromDelta(const FloatSize& delta)
+{
+ if (!m_isFilteringDeltas)
+ return;
+
+ NSPoint filteredDeltaResult;
+ NSPoint filteredVelocityResult;
+ [m_predominantAxisFilter filterInputDelta:CGPointMake(delta.width(), delta.height()) timestamp:monotonicallyIncreasingTime() - m_beginFilteringDeltasTime outputDelta:&filteredDeltaResult velocity:&filteredVelocityResult];
+ m_currentFilteredDelta = FloatSize(filteredDeltaResult.x, filteredDeltaResult.y);
+}
+
+void WheelEventDeltaFilterMac::endFilteringDeltas()
+{
+ m_currentFilteredDelta = FloatSize(0, 0);
+ m_beginFilteringDeltasTime = 0;
+ [m_predominantAxisFilter reset];
+ m_isFilteringDeltas = false;
+}
+
+}
+
+#endif /* PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100 */
Modified: trunk/Source/WebCore/platform/PlatformWheelEvent.h (188859 => 188860)
--- trunk/Source/WebCore/platform/PlatformWheelEvent.h 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebCore/platform/PlatformWheelEvent.h 2015-08-24 15:23:21 UTC (rev 188860)
@@ -119,20 +119,14 @@
return copy;
}
- PlatformWheelEvent copyIgnoringHorizontalDelta() const
+ PlatformWheelEvent copyWithDeltas(float deltaX, float deltaY) const
{
PlatformWheelEvent copy = *this;
- copy.m_deltaX = 0;
+ copy.m_deltaX = deltaX;
+ copy.m_deltaY = deltaY;
return copy;
}
- PlatformWheelEvent copyIgnoringVerticalDelta() const
- {
- PlatformWheelEvent copy = *this;
- copy.m_deltaY = 0;
- return copy;
- }
-
const IntPoint& position() const { return m_position; } // PlatformWindow coordinates.
const IntPoint& globalPosition() const { return m_globalPosition; } // Screen coordinates.
Added: trunk/Source/WebCore/platform/spi/mac/NSScrollingInputFilterSPI.h (0 => 188860)
--- trunk/Source/WebCore/platform/spi/mac/NSScrollingInputFilterSPI.h (rev 0)
+++ trunk/Source/WebCore/platform/spi/mac/NSScrollingInputFilterSPI.h 2015-08-24 15:23:21 UTC (rev 188860)
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100
+
+#if USE(APPLE_INTERNAL_SDK)
+
+#import <AppKit/NSScrollingInputFilter_Private.h>
+
+#else
+
+@interface _NSScrollingPredominantAxisFilter : NSObject;
+- (void)filterInputDelta:(NSPoint)delta timestamp:(NSTimeInterval)timestamp outputDelta:(NSPoint*)pDelta velocity:(NSPoint *)pVelocity;
+- (void)reset;
+@end
+
+#endif /* USE(APPLE_INTERNAL_SDK) */
+
+#endif /* PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100 */
Modified: trunk/Source/WebKit2/ChangeLog (188859 => 188860)
--- trunk/Source/WebKit2/ChangeLog 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebKit2/ChangeLog 2015-08-24 15:23:21 UTC (rev 188860)
@@ -1,3 +1,23 @@
+2015-08-24 Wenson Hsieh <wenson_hs...@apple.com>
+
+ Use _NSScrollingPredominantAxisFilter for wheel event filtering on Mac
+ https://bugs.webkit.org/show_bug.cgi?id=147320
+
+ Reviewed by Simon Fraser.
+
+ Refactored to use a predominant axis filter instead of a predominant axis tracker. This allows us to
+ employ AppKit's _NSScrollingPredominantAxisFilter when possible, and use the wheel event delta tracker
+ as a fallback. Here, we refactor EventDispatcher to use the new filters for mainframe scrolling.
+
+ No new tests, since this change does not add new functionality.
+
+ * WebProcess/WebPage/EventDispatcher.cpp: Include WheelEventDeltaFilterMac.h when necessary.
+ (WebKit::EventDispatcher::EventDispatcher): Initialize a WheelEventDeltaFilterMac when possible. Otherwise,
+ fall back to a BasicWheelEventDeltaFilter.
+ (WebKit::EventDispatcher::wheelEvent): Use filtered deltas to initialize the platform wheel event instead
+ of zeroing out non-predominant axes.
+ * WebProcess/WebPage/EventDispatcher.h: Replace m_recentWheelEventDeltaTracker with m_recentWheelEventDeltaFilter.
+
2015-08-23 Andy Estes <aes...@apple.com>
[Content Filtering] REGRESSION (r182356): Provisional URL is incorrect in didReceiveServerRedirectForProvisionalLoadForFrame when Content Filtering is enabled
Modified: trunk/Source/WebKit2/WebProcess/WebPage/EventDispatcher.cpp (188859 => 188860)
--- trunk/Source/WebKit2/WebProcess/WebPage/EventDispatcher.cpp 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebKit2/WebProcess/WebPage/EventDispatcher.cpp 2015-08-24 15:23:21 UTC (rev 188860)
@@ -54,7 +54,7 @@
EventDispatcher::EventDispatcher()
: m_queue(WorkQueue::create("com.apple.WebKit.EventDispatcher", WorkQueue::Type::Serial, WorkQueue::QOS::UserInteractive))
- , m_recentWheelEventDeltaTracker(std::make_unique<WheelEventDeltaTracker>())
+ , m_recentWheelEventDeltaFilter(WheelEventDeltaFilter::create())
{
}
@@ -95,26 +95,19 @@
#if PLATFORM(COCOA)
switch (wheelEvent.phase()) {
case PlatformWheelEventPhaseBegan:
- m_recentWheelEventDeltaTracker->beginTrackingDeltas();
+ m_recentWheelEventDeltaFilter->beginFilteringDeltas();
break;
case PlatformWheelEventPhaseEnded:
- m_recentWheelEventDeltaTracker->endTrackingDeltas();
+ m_recentWheelEventDeltaFilter->endFilteringDeltas();
break;
default:
break;
}
- if (m_recentWheelEventDeltaTracker->isTrackingDeltas()) {
- m_recentWheelEventDeltaTracker->recordWheelEventDelta(platformWheelEvent);
-
- DominantScrollGestureDirection dominantDirection = DominantScrollGestureDirection::None;
- dominantDirection = m_recentWheelEventDeltaTracker->dominantScrollGestureDirection();
-
- // Workaround for scrolling issues <rdar://problem/14758615>.
- if (dominantDirection == DominantScrollGestureDirection::Vertical && platformWheelEvent.deltaX())
- platformWheelEvent = platformWheelEvent.copyIgnoringHorizontalDelta();
- else if (dominantDirection == DominantScrollGestureDirection::Horizontal && platformWheelEvent.deltaY())
- platformWheelEvent = platformWheelEvent.copyIgnoringVerticalDelta();
+ if (m_recentWheelEventDeltaFilter->isFilteringDeltas()) {
+ m_recentWheelEventDeltaFilter->updateFromDelta(FloatSize(platformWheelEvent.deltaX(), platformWheelEvent.deltaY()));
+ FloatSize filteredDelta = m_recentWheelEventDeltaFilter->filteredDelta();
+ platformWheelEvent = platformWheelEvent.copyWithDeltas(filteredDelta.width(), filteredDelta.height());
}
#endif
Modified: trunk/Source/WebKit2/WebProcess/WebPage/EventDispatcher.h (188859 => 188860)
--- trunk/Source/WebKit2/WebProcess/WebPage/EventDispatcher.h 2015-08-24 13:39:11 UTC (rev 188859)
+++ trunk/Source/WebKit2/WebProcess/WebPage/EventDispatcher.h 2015-08-24 15:23:21 UTC (rev 188860)
@@ -28,7 +28,7 @@
#include "Connection.h"
-#include <WebCore/WheelEventDeltaTracker.h>
+#include <WebCore/WheelEventDeltaFilter.h>
#include <WebEvent.h>
#include <memory>
#include <wtf/HashMap.h>
@@ -95,7 +95,7 @@
Lock m_scrollingTreesMutex;
HashMap<uint64_t, RefPtr<WebCore::ThreadedScrollingTree>> m_scrollingTrees;
#endif
- std::unique_ptr<WebCore::WheelEventDeltaTracker> m_recentWheelEventDeltaTracker;
+ std::unique_ptr<WebCore::WheelEventDeltaFilter> m_recentWheelEventDeltaFilter;
#if ENABLE(IOS_TOUCH_EVENTS)
Lock m_touchEventsLock;
HashMap<uint64_t, TouchEventQueue> m_touchEvents;