WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
scrollend-programmatic-for-ews
scrollend-programmatic-008-all.diff (text/plain), 142.59 KB, created by
cathiechen
on 2020-04-09 06:14:54 PDT
(
hide
)
Description:
scrollend-programmatic-for-ews
Filename:
MIME Type:
Creator:
cathiechen
Created:
2020-04-09 06:14:54 PDT
Size:
142.59 KB
patch
obsolete
>diff --git a/ChangeLog b/ChangeLog >index 088868ee12..373194986e 100644 >--- a/ChangeLog >+++ b/ChangeLog >@@ -1,3 +1,16 @@ >+2020-03-09 Cathie Chen <cathiechen@igalia.com> >+ >+ Add support for overscroll events parsing >+ https://bugs.webkit.org/show_bug.cgi?id=208802 >+ >+ Reviewed by Frédéric Wang. >+ >+ Based on Frédéric Wang's patch. >+ >+ Add ENABLE_OVERSCROLL_EVENTS which is off by default. >+ >+ * Source/cmake/WebKitFeatures.cmake: >+ > 2020-04-08 Ross Kirsling <ross.kirsling@sony.com> > > Remove ENABLE_INTL define >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 790076a72e..b6dfe0300b 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,15 @@ >+2020-04-08 Cathie Chen <cathiechen@igalia.com> >+ >+ Add support for scrollend event of programmatic scrolling >+ https://bugs.webkit.org/show_bug.cgi?id=209134 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * platform/ios/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView-expected.txt: Added. >+ Test fails on iOS because the FrameView scroll position is no clamped, see bug: 179735. >+ * platform/mac-wk1/TestExpectations: Test fails on mac-wk1 because the FrameView smooth scrolling is not functional. See bug: 191357. >+ * TestExpectations: Enable the test for programmatic scrolling scrollend event. >+ > 2020-04-09 Diego Pino Garcia <dpino@igalia.com> > > [WPE] Gardening, update TestExpectations >diff --git a/LayoutTests/TestExpectations b/LayoutTests/TestExpectations >index 915051fc32..02b1dde7a3 100644 >--- a/LayoutTests/TestExpectations >+++ b/LayoutTests/TestExpectations >@@ -165,7 +165,15 @@ http/tests/in-app-browser-privacy/ [ Skip ] > fast/harness/uiscriptcontroller [ Skip ] > > # Only iOS has an implementation of UIScriptController::sendEventStream(). >-imported/w3c/web-platform-tests/dom/events/scrolling [ Skip ] >+imported/w3c/web-platform-tests/dom/events/scrolling/overscroll-event-fired-to-document.html [ Skip ] >+imported/w3c/web-platform-tests/dom/events/scrolling/overscroll-event-fired-to-element-with-overscroll-behavior.html [ Skip ] >+imported/w3c/web-platform-tests/dom/events/scrolling/overscroll-event-fired-to-scrolled-element.html [ Skip ] >+imported/w3c/web-platform-tests/dom/events/scrolling/overscroll-event-fired-to-window.html [ Skip ] >+imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-after-snap.html [ Skip ] >+imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-to-document.html [ Skip ] >+imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-to-element-with-overscroll-behavior.html [ Skip ] >+imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-to-scrolled-element.html [ Skip ] >+imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-to-window.html [ Skip ] > > # This test only makes sense on Mac > fast/attachment/attachment-subtitle-resize.html [ Skip ] >diff --git a/LayoutTests/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-programmatic-scroll-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-programmatic-scroll-expected.txt >new file mode 100644 >index 0000000000..966c9f1abb >--- /dev/null >+++ b/LayoutTests/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-programmatic-scroll-expected.txt >@@ -0,0 +1,4 @@ >+ >+PASS Tests scrollend event for calling scroll functions. >+PASS Tests scrollend event for changing scroll attributes. >+ >diff --git a/LayoutTests/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-programmatic-scroll.html b/LayoutTests/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-programmatic-scroll.html >new file mode 100644 >index 0000000000..43fb7acddf >--- /dev/null >+++ b/LayoutTests/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-programmatic-scroll.html >@@ -0,0 +1,135 @@ >+<!DOCTYPE HTML><!-- webkit-test-runner [ experimental:OverscrollEventsEnabled=true experimental:CSSOMViewSmoothScrollingEnabled=true ] --> >+<meta name="timeout" content="long"> >+<script src="/resources/testharness.js"></script> >+<script src="/resources/testharnessreport.js"></script> >+<script src="/resources/testdriver.js"></script> >+<script src="/resources/testdriver-actions.js"></script> >+<script src="/resources/testdriver-vendor.js"></script> >+<script src="scroll_support.js"></script> >+<style> >+ html { >+ height: 3000px; >+ width: 3000px; >+ } >+ >+ #targetDiv { >+ width: 200px; >+ height: 200px; >+ overflow: scroll; >+ } >+ >+ #innerDiv { >+ width: 400px; >+ height: 400px; >+ } >+</style> >+ >+<body style="margin:0" onload=runTest()> >+ <div id="targetDiv"> >+ <div id="innerDiv"> >+ </div> >+ </div> >+</body> >+<script> >+ var element_scrollend_arrived = false; >+ var document_scrollend_arrived = false; >+ >+ function onElementScrollEnd(event) { >+ assert_false(event.cancelable); >+ assert_false(event.bubbles); >+ element_scrollend_arrived = true; >+ } >+ >+ function onDocumentScrollEnd(event) { >+ assert_false(event.cancelable); >+ // scrollend events are bubbled when the target node is document. >+ assert_true(event.bubbles); >+ document_scrollend_arrived = true; >+ } >+ >+ function callScrollFunction([scrollTarget, scrollFunction, args]) { >+ scrollTarget[scrollFunction](args); >+ } >+ >+ function runTest() { >+ let root_element = document.scrollingElement; >+ let target_div = document.getElementById("targetDiv"); >+ >+ promise_test(async (t) => { >+ await waitForCompositorCommit(); >+ target_div.addEventListener("scrollend", onElementScrollEnd); >+ document.addEventListener("scrollend", onDocumentScrollEnd); >+ >+ let test_cases = [ >+ [target_div, 200, 200, [target_div, "scrollTo", { top: 200, left: 200, behavior: "auto" }]], >+ [target_div, 0, 0, [target_div, "scrollTo", { top: 0, left: 0, behavior: "smooth" }]], >+ [root_element, 200, 200, [root_element, "scrollTo", { top: 200, left: 200, behavior: "auto" }]], >+ [root_element, 0, 0, [root_element, "scrollTo", { top: 0, left: 0, behavior: "smooth" }]], >+ [target_div, 200, 200, [target_div, "scrollBy", { top: 200, left: 200, behavior: "auto" }]], >+ [target_div, 0, 0, [target_div, "scrollBy", { top: -200, left: -200, behavior: "smooth" }]], >+ [root_element, 200, 200, [root_element, "scrollBy", { top: 200, left: 200, behavior: "auto" }]], >+ [root_element, 0, 0, [root_element, "scrollBy", { top: -200, left: -200, behavior: "smooth" }]] >+ ]; >+ >+ for (i = 0; i < test_cases.length; i++) { >+ let t = test_cases[i]; >+ let target = t[0]; >+ let expected_x = t[1]; >+ let expected_y = t[2]; >+ let scroll_datas = t[3]; >+ >+ callScrollFunction(scroll_datas); >+ await waitFor(() => { return element_scrollend_arrived || document_scrollend_arrived; }, target.tagName + "." + scroll_datas[1] + " did not receive scrollend event."); >+ if (target == root_element) >+ assert_false(element_scrollend_arrived); >+ else >+ assert_false(document_scrollend_arrived); >+ assert_equals(target.scrollLeft, expected_x, target.tagName + "." + scroll_datas[1] + " scrollLeft"); >+ assert_equals(target.scrollTop, expected_y, target.tagName + "." + scroll_datas[1] + " scrollTop"); >+ >+ element_scrollend_arrived = false; >+ document_scrollend_arrived = false; >+ } >+ }, "Tests scrollend event for calling scroll functions."); >+ >+ promise_test(async (t) => { >+ await waitForCompositorCommit(); >+ >+ let test_cases = [ >+ [target_div, "scrollTop"], >+ [target_div, "scrollLeft"], >+ [root_element, "scrollTop"], >+ [root_element, "scrollLeft"] >+ ]; >+ for (i = 0; i < test_cases.length; i++) { >+ let t = test_cases[i]; >+ let target = t[0]; >+ let attribute = t[1]; >+ let position = 200; >+ >+ target.style.scrollBehavior = "smooth"; >+ target[attribute] = position; >+ await waitFor(() => { return element_scrollend_arrived || document_scrollend_arrived; }, target.tagName + "." + attribute + " did not receive scrollend event."); >+ if (target == root_element) >+ assert_false(element_scrollend_arrived); >+ else >+ assert_false(document_scrollend_arrived); >+ assert_equals(target[attribute], position, target.tagName + "." + attribute + " "); >+ element_scrollend_arrived = false; >+ document_scrollend_arrived = false; >+ >+ await waitForCompositorCommit(); >+ target.style.scrollBehavior = "auto"; >+ target[attribute] = 0; >+ await waitFor(() => { return element_scrollend_arrived || document_scrollend_arrived; }, target.tagName + "." + attribute + " did not receive scrollend event."); >+ if (target == root_element) >+ assert_false(element_scrollend_arrived); >+ else >+ assert_false(document_scrollend_arrived); >+ assert_equals(target[attribute], 0, target.tagName + "." + attribute + " "); >+ element_scrollend_arrived = false; >+ document_scrollend_arrived = false; >+ } >+ }, "Tests scrollend event for changing scroll attributes."); >+ } >+</script> >\ No newline at end of file >diff --git a/LayoutTests/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView-expected.txt >new file mode 100644 >index 0000000000..bec711fde3 >--- /dev/null >+++ b/LayoutTests/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView-expected.txt >@@ -0,0 +1,4 @@ >+ >+PASS Tests scrollend event for scrollIntoView. >+PASS Tests scrollend event for nested scrollIntoView. >+ >diff --git a/LayoutTests/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html b/LayoutTests/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html >new file mode 100644 >index 0000000000..edd38c0f2e >--- /dev/null >+++ b/LayoutTests/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html >@@ -0,0 +1,124 @@ >+<!DOCTYPE HTML><!-- webkit-test-runner [ experimental:OverscrollEventsEnabled=true experimental:CSSOMViewSmoothScrollingEnabled=true ] --> >+<meta name="timeout" content="long"> >+<script src="/resources/testharness.js"></script> >+<script src="/resources/testharnessreport.js"></script> >+<script src="/resources/testdriver.js"></script> >+<script src="/resources/testdriver-actions.js"></script> >+<script src="/resources/testdriver-vendor.js"></script> >+<script src="scroll_support.js"></script> >+<style> >+ html { >+ height: 3000px; >+ width: 3000px; >+ } >+ >+ #targetDiv { >+ width: 200px; >+ height: 200px; >+ overflow: scroll; >+ } >+ >+ #innerDiv { >+ width: 400px; >+ height: 400px; >+ } >+</style> >+ >+<body style="margin:0" onload=runTest()> >+ <div id="targetDiv"> >+ <div id="innerDiv"> >+ </div> >+ </div> >+</body> >+<script> >+ var element_scrollend_arrived = false; >+ var document_scrollend_arrived = false; >+ >+ function onElementScrollEnd(event) { >+ assert_false(event.cancelable); >+ assert_false(event.bubbles); >+ element_scrollend_arrived = true; >+ } >+ >+ function onDocumentScrollEnd(event) { >+ assert_false(event.cancelable); >+ // scrollend events are bubbled when the target node is document. >+ assert_true(event.bubbles); >+ document_scrollend_arrived = true; >+ } >+ >+ function callScrollFunction([scrollTarget, scrollFunction, args]) { >+ scrollTarget[scrollFunction](args); >+ } >+ >+ function runTest() { >+ let root_element = document.scrollingElement; >+ let target_div = document.getElementById("targetDiv"); >+ let inner_div = document.getElementById("innerDiv"); >+ >+ // Get expected position for root_element scrollIntoView. >+ root_element.scrollTo(10000, 10000); >+ let max_root_x = root_element.scrollLeft; >+ let max_root_y = root_element.scrollTop; >+ root_element.scrollTo(0, 0); >+ >+ target_div.scrollTo(10000, 10000); >+ let max_element_x = target_div.scrollLeft; >+ let max_element_y = target_div.scrollTop; >+ target_div.scrollTo(0, 0); >+ >+ promise_test(async (t) => { >+ await waitForCompositorCommit(); >+ target_div.addEventListener("scrollend", onElementScrollEnd); >+ document.addEventListener("scrollend", onDocumentScrollEnd); >+ >+ let test_cases = [ >+ [target_div, max_element_x, max_element_y, [inner_div, "scrollIntoView", { inline: "end", block: "end", behavior: "auto" }]], >+ [target_div, 0, 0, [inner_div, "scrollIntoView", { inline: "start", block: "start", behavior: "smooth" }]], >+ [root_element, max_root_x, max_root_y, [root_element, "scrollIntoView", { inline: "end", block: "end", behavior: "smooth" }]], >+ [root_element, 0, 0, [root_element, "scrollIntoView", { inline: "start", block: "start", behavior: "smooth" }]] >+ ]; >+ >+ for (i = 0; i < test_cases.length; i++) { >+ let t = test_cases[i]; >+ let target = t[0]; >+ let expected_x = t[1]; >+ let expected_y = t[2]; >+ let scroll_datas = t[3]; >+ >+ callScrollFunction(scroll_datas); >+ await waitFor(() => { return element_scrollend_arrived || document_scrollend_arrived; }, target.tagName + ".scrollIntoView did not receive scrollend event."); >+ if (target == root_element) >+ assert_false(element_scrollend_arrived); >+ else >+ assert_false(document_scrollend_arrived); >+ assert_equals(target.scrollLeft, expected_x, target.tagName + ".scrollIntoView scrollLeft"); >+ assert_equals(target.scrollTop, expected_y, target.tagName + ".scrollIntoView scrollTop"); >+ >+ element_scrollend_arrived = false; >+ document_scrollend_arrived = false; >+ } >+ }, "Tests scrollend event for scrollIntoView."); >+ >+ promise_test(async (t) => { >+ document.body.removeChild(target_div); >+ let out_div = document.createElement("div"); >+ out_div.style = "width: 100px; height:100px; overflow:scroll; scroll-behavior:smooth;"; >+ out_div.appendChild(target_div); >+ document.body.appendChild(out_div); >+ await waitForCompositorCommit(); >+ >+ element_scrollend_arrived = false; >+ document_scrollend_arrived = false; >+ inner_div.scrollIntoView({ inline: "end", block: "end", behavior: "auto" }); >+ await waitFor(() => { return element_scrollend_arrived || document_scrollend_arrived; }, "Nested scrollIntoView did not receive scrollend event."); >+ assert_equals(root_element.scrollLeft, 0, "Nested scrollIntoView root_element scrollLeft"); >+ assert_equals(root_element.scrollTop, 0, "Nested scrollIntoView root_element scrollTop"); >+ assert_equals(out_div.scrollLeft, 100, "Nested scrollIntoView out_div scrollLeft"); >+ assert_equals(out_div.scrollTop, 100, "Nested scrollIntoView out_div scrollTop"); >+ assert_equals(target_div.scrollLeft, max_element_x, "Nested scrollIntoView target_div scrollLeft"); >+ assert_equals(target_div.scrollTop, max_element_y, "Nested scrollIntoView target_div scrollTop"); >+ assert_false(document_scrollend_arrived); >+ }, "Tests scrollend event for nested scrollIntoView."); >+ } >+</script> >\ No newline at end of file >diff --git a/LayoutTests/platform/ios/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView-expected.txt b/LayoutTests/platform/ios/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView-expected.txt >new file mode 100644 >index 0000000000..4abaa6a231 >--- /dev/null >+++ b/LayoutTests/platform/ios/imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView-expected.txt >@@ -0,0 +1,4 @@ >+ >+FAIL Tests scrollend event for scrollIntoView. assert_equals: HTML.scrollIntoView scrollLeft expected 10000 but got 2200 >+PASS Tests scrollend event for nested scrollIntoView. >+ >diff --git a/LayoutTests/platform/mac-wk1/TestExpectations b/LayoutTests/platform/mac-wk1/TestExpectations >index 0e07479f7f..8551778f89 100644 >--- a/LayoutTests/platform/mac-wk1/TestExpectations >+++ b/LayoutTests/platform/mac-wk1/TestExpectations >@@ -755,6 +755,8 @@ webkit.org/b/191357 imported/w3c/web-platform-tests/css/cssom-view/scroll-behavi > webkit.org/b/191357 imported/w3c/web-platform-tests/css/cssom-view/scroll-behavior-main-frame-window.html [ Skip ] > webkit.org/b/191357 imported/w3c/web-platform-tests/css/cssom-view/scroll-behavior-subframe-root.html [ Skip ] > webkit.org/b/191357 imported/w3c/web-platform-tests/css/cssom-view/scroll-behavior-subframe-window.html [ Skip ] >+webkit.org/b/191357 imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-programmatic-scroll.html [ Skip ] >+webkit.org/b/191357 imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html [ Skip ] > > webkit.org/b/189908 imported/w3c/web-platform-tests/resource-timing/resource_timing.worker.html [ Failure ] > >diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog >index f582bcb838..5605e44925 100644 >--- a/Source/JavaScriptCore/ChangeLog >+++ b/Source/JavaScriptCore/ChangeLog >@@ -1,3 +1,16 @@ >+2020-03-09 Cathie Chen <cathiechen@igalia.com> >+ >+ Add support for overscroll events parsing >+ https://bugs.webkit.org/show_bug.cgi?id=208802 >+ >+ Reviewed by Frédéric Wang. >+ >+ Based on Frédéric Wang's patch. >+ >+ Add ENABLE_OVERSCROLL_EVENTS. >+ >+ * Configurations/FeatureDefines.xcconfig: >+ > 2020-04-09 Mark Lam <mark.lam@apple.com> > > Implement a more efficient tagCFunction() tool. >diff --git a/Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig b/Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig >index a74b4a666f..69a4dbd061 100644 >--- a/Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig >+++ b/Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig >@@ -301,6 +301,8 @@ ENABLE_OFFSCREEN_CANVAS = ; > ENABLE_OVERFLOW_SCROLLING_TOUCH = $(ENABLE_OVERFLOW_SCROLLING_TOUCH_$(WK_COCOA_TOUCH)); > ENABLE_OVERFLOW_SCROLLING_TOUCH_cocoatouch = ENABLE_OVERFLOW_SCROLLING_TOUCH; > >+ENABLE_OVERSCROLL_EVENTS = ENABLE_OVERSCROLL_EVENTS; >+ > ENABLE_PAYMENT_REQUEST = ENABLE_PAYMENT_REQUEST; > > ENABLE_PICTURE_IN_PICTURE_API = $(ENABLE_PICTURE_IN_PICTURE_API_$(WK_PLATFORM_NAME)); >@@ -421,4 +423,4 @@ ENABLE_WIRELESS_PLAYBACK_TARGET = ENABLE_WIRELESS_PLAYBACK_TARGET; > > ENABLE_XSLT = ENABLE_XSLT; > >-FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCESSIBILITY_ISOLATED_TREE) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLE_PAY_SESSION_V9) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_CONIC_GRADIENTS) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_PAINTING_API) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CSS_TYPED_OM) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_C_LOOP) $(ENABLE_DARK_MODE_CSS) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_EDITABLE_REGION) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FULLSCREEN_API) $(ENABLE_PICTURE_IN_PICTURE_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_GPU_PROCESS) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INSPECTOR_ALTERNATE_DISPATCHERS) $(ENABLE_INSPECTOR_TELEMETRY) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_MEMORY_SAMPLER) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION) $(ENABLE_NETWORK_CACHE_STALE_WHILE_REVALIDATE) $(ENABLE_NOTIFICATIONS) $(ENABLE_OFFSCREEN_CANVAS) $(ENABLE_OVERFLOW_SCROLLING_TOUCH) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESIZE_OBSERVER) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_LOAD_STATISTICS) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SANDBOX_EXTENSIONS) $(ENABLE_SERVER_PRECONNECT) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SHAREABLE_RESOURCE) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USERSELECT_ALL) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEBDRIVER_MOUSE_INTERACTIONS) $(ENABLE_WEBDRIVER_KEYBOARD_INTERACTIONS) $(ENABLE_WEBDRIVER_TOUCH_INTERACTIONS) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WEBXR) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_CRYPTO) $(ENABLE_WEB_RTC) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >+FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCESSIBILITY_ISOLATED_TREE) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLE_PAY_SESSION_V9) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_CONIC_GRADIENTS) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_PAINTING_API) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CSS_TYPED_OM) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_C_LOOP) $(ENABLE_DARK_MODE_CSS) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_EDITABLE_REGION) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FULLSCREEN_API) $(ENABLE_PICTURE_IN_PICTURE_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_GPU_PROCESS) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INSPECTOR_ALTERNATE_DISPATCHERS) $(ENABLE_INSPECTOR_TELEMETRY) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_MEMORY_SAMPLER) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION) $(ENABLE_NETWORK_CACHE_STALE_WHILE_REVALIDATE) $(ENABLE_NOTIFICATIONS) $(ENABLE_OFFSCREEN_CANVAS) $(ENABLE_OVERFLOW_SCROLLING_TOUCH) $(ENABLE_OVERSCROLL_EVENTS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESIZE_OBSERVER) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_LOAD_STATISTICS) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SANDBOX_EXTENSIONS) $(ENABLE_SERVER_PRECONNECT) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SHAREABLE_RESOURCE) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USERSELECT_ALL) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEBDRIVER_MOUSE_INTERACTIONS) $(ENABLE_WEBDRIVER_KEYBOARD_INTERACTIONS) $(ENABLE_WEBDRIVER_TOUCH_INTERACTIONS) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WEBXR) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_CRYPTO) $(ENABLE_WEB_RTC) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index fce18c9434..f21289d93d 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,161 @@ >+2020-04-08 Cathie Chen <cathiechen@igalia.com> >+ >+ Add support for scrollend event of programmatic scrolling >+ https://bugs.webkit.org/show_bug.cgi?id=209134 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add support for scrollend event of programmatic scrolling. m_pendingScrollendEventTargetList in Document stores >+ the scrolled targets which need to dispatch scrollend events. FrameView and RenderLayer provide three ways to >+ add elements to the scrollend list. >+ 1. Instant scrolling including the scrolling position not changed animated scroll, the element would add to the list >+ after scroll position changed. >+ 2. Animated scrolling, the element would be set as the m_scrollEndEventTarget of ScrollAnimation and add to the list >+ when animation stops. For scrollRectIntoView, in order to make sure scrollend event fired after all ancestor layers >+ finishing scrolling, add m_duringScrollRectIntoView to indicate if scrollRectIntoView finished. When ScrollAnimation >+ stops, it will try to find a duringScrollRectIntoView ancestor layer and pass the m_scrollEndEventTarget to its >+ ScrollAnimation. If no such layer found, add m_scrollEndEventTarget to the scrollend list. >+ 3. User asynchronous scrolling, the scroll position wouldn't change immediately. So saveScrollEndEventPosition >+ then checkScrollEndEventPosition if scroll position changed. The programmatic scrolling wouldn't trigger this way. >+ >+ Test: imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-programmatic-scroll.html >+ imported/w3c/web-platform-tests/dom/events/scrolling/scrollend-event-fired-for-scrollIntoView.html >+ >+ * dom/Document.cpp: >+ (WebCore::Document::commonTeardown): >+ (WebCore::Document::addPendingScrollEndEventTarget): Append the targets to m_pendingScrollEndEventTargetList. >+ (WebCore::Document::runScrollSteps): Dispatch scrollend event for each target. >+ * dom/Document.h: Add m_pendingScrollEndEventTargetList which keeps the scrollend event targets. >+ * dom/Element.cpp: >+ (WebCore::Element::setScrollLeft): Set RequestScrollEndEvent::Yes for FrameView element. >+ (WebCore::Element::setScrollTop): Ditto. >+ * page/DOMWindow.cpp: >+ (WebCore::DOMWindow::scrollTo const): Add document to the scrollend list for scrolling to (0, 0) optimization. >+ * page/FrameView.cpp: >+ (WebCore::FrameView::setScrollPosition): Add document to the scrollend list if it scrolled(instant scroll or smooth scroll >+ without changing the position, otherwise set document as the scrollEndTarget of scrollAniamtion.). >+ (WebCore::FrameView::saveScrollEndEventPosition): Save the scroll position that requires to fire an scrollend event. This is for asynchronous scroll. >+ (WebCore::FrameView::checkScrollEndEventPosition): Add document to the list if the scroll position equal to the preserved one. >+ (WebCore::FrameView::addPendingScrollEndEventTarget): Add Document to m_pendingScrollendEventTargetList in Document. >+ * page/FrameView.h: Add m_duringScrollRectIntoView to indicate FrameView is performing a animated scrollRectIntoView scroll. >+ * platform/ScrollAnimation.h: >+ (WebCore::ScrollAnimation::setScrollEndTarget): >+ * platform/ScrollAnimationSmooth.cpp: >+ (WebCore::ScrollAnimationSmooth::stop): Call notifyScrollEnd. >+ (WebCore::ScrollAnimationSmooth::notifyScrollEnd): setDuringScrollRectIntoView false. If there's m_scrollEndEventTarget, try to find an ancestor layer >+ duringScrollRectIntoView and set the target to it. Otherwise, add the target to the scrollend list. >+ (WebCore::ScrollAnimationSmooth::setScrollEndTarget): >+ (WebCore::ScrollAnimationSmooth::animationTimerFired): Call notifyScrollEnd if not continueAnimation. >+ * platform/ScrollAnimationSmooth.h: Add m_scrollEndEventTarget. >+ * platform/ScrollAnimator.cpp: >+ (WebCore::ScrollAnimator::setScrollEndTarget): Set m_scrollEndEventTarget to ScrollAnimationSmooth. >+ * platform/ScrollAnimator.h: >+ * platform/ScrollTypes.h: Add RequestScrollEndEvent. >+ * platform/ScrollView.cpp: >+ (WebCore::ScrollView::setContentsScrollPosition): Add RequestScrollEndEvent::Yes. >+ (WebCore::ScrollView::scrollTo): Call checkScrollEndEventPosition if the scroll position changed. >+ (WebCore::ScrollView::setScrollPosition): >+ * platform/ScrollView.h: >+ * platform/ScrollableArea.cpp: >+ (WebCore::ScrollableArea::setScrollEndTarget): >+ * platform/ScrollableArea.h: >+ (WebCore::ScrollableArea::saveScrollEndEventPosition): >+ (WebCore::ScrollableArea::checkScrollEndEventPosition): >+ (WebCore::ScrollableArea::addPendingScrollEndEventTarget): >+ (WebCore::ScrollableArea::duringScrollRectIntoView): >+ (WebCore::ScrollableArea::setDuringScrollRectIntoView): >+ (WebCore::ScrollableArea::findAncestorDuringScrollRectIntoView): >+ * rendering/RenderBox.cpp: >+ (WebCore::RenderBox::setScrollPosition): >+ * rendering/RenderLayer.cpp: >+ (WebCore::RenderLayer::scrollToXPosition): >+ (WebCore::RenderLayer::scrollToYPosition): >+ (WebCore::RenderLayer::setScrollPosition): Add element to the scrollend list if it scrolled(instant scroll or smooth scroll >+ without changing the position, otherwise set element as the scrollEndTarget of scrollAniamtion.). >+ >+ (WebCore::RenderLayer::scrollToOffset): Call checkScrollEndEventPosition, if there is no scrolling. >+ (WebCore::RenderLayer::scrollTo): checkScrollEndEventPosition if scroll position changed. >+ (WebCore::RenderLayer::scrollRectToVisible): setDuringScrollRectIntoView(true) if it's performing a animated scrolling. >+ After parentLayer->scrollRectToVisible(), check if current layer is duringScrollRectIntoView, set the element as animation's scrollend Target. >+ Otherwise, find the duringScrollRectIntoView ancestor layer and pass the element to ancestor layer's scrollAnimation. >+ If no duringScrollRectIntoView layer found, add the element to the scrollend list. >+ (WebCore::RenderLayer::saveScrollEndEventPosition): >+ (WebCore::RenderLayer::checkScrollEndEventPosition): >+ (WebCore::RenderLayer::addPendingScrollEndEventTarget): >+ (WebCore::RenderLayer::findAncestorDuringScrollRectIntoView): Find the duringScrollRectIntoView ancestor layer, and check FrameView at the end. >+ * rendering/RenderLayer.h: >+ * rendering/RenderObject.cpp: >+ (WebCore::RenderObject::scrollRectToVisible): Add RequestScrollEndEvent::Yes. >+ >+2020-03-09 Cathie Chen <cathiechen@igalia.com> >+ >+ Add support for overscroll events parsing >+ https://bugs.webkit.org/show_bug.cgi?id=208802 >+ >+ Reviewed by Frédéric Wang. >+ >+ Based on Frédéric Wang's patch. >+ >+ Parse onoverscroll/scrollend attribute and overscroll/overscroll event name. >+ >+ * bindings/js/WebCoreBuiltinNames.h: >+ * dom/EventNames.h: >+ * dom/GlobalEventHandlers.idl: >+ * html/HTMLAttributeNames.in: >+ * html/HTMLElement.cpp: >+ (WebCore::HTMLElement::createEventHandlerNameMap): >+ * page/Settings.yaml: >+ >+2020-04-07 Cathie Chen <cathiechen@igalia.com> >+ >+ Fix up code style for scroll animation >+ https://bugs.webkit.org/show_bug.cgi?id=210171 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 1. Use AnimatedScroll instead of bool to indicate animated or not. >+ 2. Remove parameter ScrollRectToVisibleOptions, the autoscroll status is available from EventHandler. >+ 3. In order to keep consistent, use RenderLayer::setScrollPosition instead of RenderLayer::scrollToPosition. >+ 4. Add AnimatedScroll parameter to ScrollView::setContentsScrollPosition, then the scroll animation >+ can be dealt in FrameView::setScrollPosition. >+ 5. In ScrollView::setScrollPosition, the scroll animation should be cancled before return. >+ >+ * dom/Element.cpp: Use AnimatedScroll instead of bool. >+ (WebCore::Element::scrollTo): >+ (WebCore::Element::setScrollLeft): >+ (WebCore::Element::setScrollTop): >+ * page/DOMWindow.cpp: >+ (WebCore::DOMWindow::scrollTo const): No need to call scrollToOffsetWithAnimation here. >+ * page/FrameView.cpp: >+ (WebCore::FrameView::setScrollPosition): >+ * page/FrameView.h: >+ * platform/ScrollTypes.h: Add AnimatedScroll. >+ * platform/ScrollView.cpp: >+ (WebCore::ScrollView::setContentsScrollPosition): Add parameter AnimatedScroll. >+ (WebCore::ScrollView::setScrollPosition): Cancel the scroll animation before return. >+ * platform/ScrollView.h: >+ * rendering/RenderBox.cpp: >+ (WebCore::RenderBox::setScrollLeft): >+ (WebCore::RenderBox::setScrollTop): >+ (WebCore::RenderBox::setScrollPosition): >+ * rendering/RenderBox.h: >+ * rendering/RenderLayer.cpp: >+ (WebCore::RenderLayer::scrollToXPosition): >+ (WebCore::RenderLayer::scrollToYPosition): >+ (WebCore::RenderLayer::setScrollPosition): >+ (WebCore::RenderLayer::scrollRectToVisible): Remove AutoscrollStatus. >+ (WebCore::RenderLayer::autoscroll): >+ (WebCore::RenderLayer::scrollToPosition): Deleted. Use setScrollPosition instead. >+ * rendering/RenderLayer.h: >+ * rendering/RenderListBox.cpp: >+ (WebCore::RenderListBox::setScrollLeft): >+ (WebCore::RenderListBox::setScrollTop): >+ * rendering/RenderListBox.h: >+ * rendering/RenderTextControlSingleLine.cpp: >+ (WebCore::RenderTextControlSingleLine::setScrollLeft): >+ (WebCore::RenderTextControlSingleLine::setScrollTop): >+ * rendering/RenderTextControlSingleLine.h: >+ > 2020-04-09 Delan Azabani <dazabani@igalia.com> > > Remove unnecessary explicit parsing for mo@maxsize value "infinity" >diff --git a/Source/WebCore/Configurations/FeatureDefines.xcconfig b/Source/WebCore/Configurations/FeatureDefines.xcconfig >index a74b4a666f..69a4dbd061 100644 >--- a/Source/WebCore/Configurations/FeatureDefines.xcconfig >+++ b/Source/WebCore/Configurations/FeatureDefines.xcconfig >@@ -301,6 +301,8 @@ ENABLE_OFFSCREEN_CANVAS = ; > ENABLE_OVERFLOW_SCROLLING_TOUCH = $(ENABLE_OVERFLOW_SCROLLING_TOUCH_$(WK_COCOA_TOUCH)); > ENABLE_OVERFLOW_SCROLLING_TOUCH_cocoatouch = ENABLE_OVERFLOW_SCROLLING_TOUCH; > >+ENABLE_OVERSCROLL_EVENTS = ENABLE_OVERSCROLL_EVENTS; >+ > ENABLE_PAYMENT_REQUEST = ENABLE_PAYMENT_REQUEST; > > ENABLE_PICTURE_IN_PICTURE_API = $(ENABLE_PICTURE_IN_PICTURE_API_$(WK_PLATFORM_NAME)); >@@ -421,4 +423,4 @@ ENABLE_WIRELESS_PLAYBACK_TARGET = ENABLE_WIRELESS_PLAYBACK_TARGET; > > ENABLE_XSLT = ENABLE_XSLT; > >-FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCESSIBILITY_ISOLATED_TREE) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLE_PAY_SESSION_V9) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_CONIC_GRADIENTS) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_PAINTING_API) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CSS_TYPED_OM) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_C_LOOP) $(ENABLE_DARK_MODE_CSS) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_EDITABLE_REGION) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FULLSCREEN_API) $(ENABLE_PICTURE_IN_PICTURE_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_GPU_PROCESS) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INSPECTOR_ALTERNATE_DISPATCHERS) $(ENABLE_INSPECTOR_TELEMETRY) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_MEMORY_SAMPLER) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION) $(ENABLE_NETWORK_CACHE_STALE_WHILE_REVALIDATE) $(ENABLE_NOTIFICATIONS) $(ENABLE_OFFSCREEN_CANVAS) $(ENABLE_OVERFLOW_SCROLLING_TOUCH) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESIZE_OBSERVER) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_LOAD_STATISTICS) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SANDBOX_EXTENSIONS) $(ENABLE_SERVER_PRECONNECT) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SHAREABLE_RESOURCE) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USERSELECT_ALL) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEBDRIVER_MOUSE_INTERACTIONS) $(ENABLE_WEBDRIVER_KEYBOARD_INTERACTIONS) $(ENABLE_WEBDRIVER_TOUCH_INTERACTIONS) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WEBXR) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_CRYPTO) $(ENABLE_WEB_RTC) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >+FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCESSIBILITY_ISOLATED_TREE) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLE_PAY_SESSION_V9) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_CONIC_GRADIENTS) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_PAINTING_API) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CSS_TYPED_OM) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_C_LOOP) $(ENABLE_DARK_MODE_CSS) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_EDITABLE_REGION) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FULLSCREEN_API) $(ENABLE_PICTURE_IN_PICTURE_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_GPU_PROCESS) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INSPECTOR_ALTERNATE_DISPATCHERS) $(ENABLE_INSPECTOR_TELEMETRY) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_MEMORY_SAMPLER) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION) $(ENABLE_NETWORK_CACHE_STALE_WHILE_REVALIDATE) $(ENABLE_NOTIFICATIONS) $(ENABLE_OFFSCREEN_CANVAS) $(ENABLE_OVERFLOW_SCROLLING_TOUCH) $(ENABLE_OVERSCROLL_EVENTS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESIZE_OBSERVER) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_LOAD_STATISTICS) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SANDBOX_EXTENSIONS) $(ENABLE_SERVER_PRECONNECT) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SHAREABLE_RESOURCE) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USERSELECT_ALL) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEBDRIVER_MOUSE_INTERACTIONS) $(ENABLE_WEBDRIVER_KEYBOARD_INTERACTIONS) $(ENABLE_WEBDRIVER_TOUCH_INTERACTIONS) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WEBXR) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_CRYPTO) $(ENABLE_WEB_RTC) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >diff --git a/Source/WebCore/PAL/ChangeLog b/Source/WebCore/PAL/ChangeLog >index 8bf1ef4097..97dc52c031 100644 >--- a/Source/WebCore/PAL/ChangeLog >+++ b/Source/WebCore/PAL/ChangeLog >@@ -1,3 +1,16 @@ >+2020-03-09 Cathie Chen <cathiechen@igalia.com> >+ >+ Add support for overscroll events parsing >+ https://bugs.webkit.org/show_bug.cgi?id=208802 >+ >+ Reviewed by Frédéric Wang. >+ >+ Based on Frédéric Wang's patch. >+ >+ Add ENABLE_OVERSCROLL_EVENTS. >+ >+ * Configurations/FeatureDefines.xcconfig: >+ > 2020-04-08 Daniel Bates <dabates@apple.com> > > Track editable elements on screen >diff --git a/Source/WebCore/PAL/Configurations/FeatureDefines.xcconfig b/Source/WebCore/PAL/Configurations/FeatureDefines.xcconfig >index a74b4a666f..69a4dbd061 100644 >--- a/Source/WebCore/PAL/Configurations/FeatureDefines.xcconfig >+++ b/Source/WebCore/PAL/Configurations/FeatureDefines.xcconfig >@@ -301,6 +301,8 @@ ENABLE_OFFSCREEN_CANVAS = ; > ENABLE_OVERFLOW_SCROLLING_TOUCH = $(ENABLE_OVERFLOW_SCROLLING_TOUCH_$(WK_COCOA_TOUCH)); > ENABLE_OVERFLOW_SCROLLING_TOUCH_cocoatouch = ENABLE_OVERFLOW_SCROLLING_TOUCH; > >+ENABLE_OVERSCROLL_EVENTS = ENABLE_OVERSCROLL_EVENTS; >+ > ENABLE_PAYMENT_REQUEST = ENABLE_PAYMENT_REQUEST; > > ENABLE_PICTURE_IN_PICTURE_API = $(ENABLE_PICTURE_IN_PICTURE_API_$(WK_PLATFORM_NAME)); >@@ -421,4 +423,4 @@ ENABLE_WIRELESS_PLAYBACK_TARGET = ENABLE_WIRELESS_PLAYBACK_TARGET; > > ENABLE_XSLT = ENABLE_XSLT; > >-FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCESSIBILITY_ISOLATED_TREE) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLE_PAY_SESSION_V9) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_CONIC_GRADIENTS) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_PAINTING_API) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CSS_TYPED_OM) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_C_LOOP) $(ENABLE_DARK_MODE_CSS) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_EDITABLE_REGION) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FULLSCREEN_API) $(ENABLE_PICTURE_IN_PICTURE_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_GPU_PROCESS) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INSPECTOR_ALTERNATE_DISPATCHERS) $(ENABLE_INSPECTOR_TELEMETRY) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_MEMORY_SAMPLER) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION) $(ENABLE_NETWORK_CACHE_STALE_WHILE_REVALIDATE) $(ENABLE_NOTIFICATIONS) $(ENABLE_OFFSCREEN_CANVAS) $(ENABLE_OVERFLOW_SCROLLING_TOUCH) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESIZE_OBSERVER) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_LOAD_STATISTICS) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SANDBOX_EXTENSIONS) $(ENABLE_SERVER_PRECONNECT) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SHAREABLE_RESOURCE) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USERSELECT_ALL) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEBDRIVER_MOUSE_INTERACTIONS) $(ENABLE_WEBDRIVER_KEYBOARD_INTERACTIONS) $(ENABLE_WEBDRIVER_TOUCH_INTERACTIONS) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WEBXR) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_CRYPTO) $(ENABLE_WEB_RTC) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >+FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCESSIBILITY_ISOLATED_TREE) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLE_PAY_SESSION_V9) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_CONIC_GRADIENTS) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_PAINTING_API) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CSS_TYPED_OM) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_C_LOOP) $(ENABLE_DARK_MODE_CSS) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_EDITABLE_REGION) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FULLSCREEN_API) $(ENABLE_PICTURE_IN_PICTURE_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_GPU_PROCESS) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INSPECTOR_ALTERNATE_DISPATCHERS) $(ENABLE_INSPECTOR_TELEMETRY) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_MEMORY_SAMPLER) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION) $(ENABLE_NETWORK_CACHE_STALE_WHILE_REVALIDATE) $(ENABLE_NOTIFICATIONS) $(ENABLE_OFFSCREEN_CANVAS) $(ENABLE_OVERFLOW_SCROLLING_TOUCH) $(ENABLE_OVERSCROLL_EVENTS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESIZE_OBSERVER) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_LOAD_STATISTICS) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SANDBOX_EXTENSIONS) $(ENABLE_SERVER_PRECONNECT) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SHAREABLE_RESOURCE) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USERSELECT_ALL) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEBDRIVER_MOUSE_INTERACTIONS) $(ENABLE_WEBDRIVER_KEYBOARD_INTERACTIONS) $(ENABLE_WEBDRIVER_TOUCH_INTERACTIONS) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WEBXR) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_CRYPTO) $(ENABLE_WEB_RTC) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >diff --git a/Source/WebCore/bindings/js/WebCoreBuiltinNames.h b/Source/WebCore/bindings/js/WebCoreBuiltinNames.h >index c6205c5f6e..3360bc58ca 100644 >--- a/Source/WebCore/bindings/js/WebCoreBuiltinNames.h >+++ b/Source/WebCore/bindings/js/WebCoreBuiltinNames.h >@@ -305,6 +305,8 @@ namespace WebCore { > macro(matchingElementInFlatTree) \ > macro(mediaStreamTrackConstraints) \ > macro(openDatabase) \ >+ macro(onoverscroll) \ >+ macro(onscrollend) \ > macro(ontouchcancel) \ > macro(ontouchend) \ > macro(ontouchmove) \ >diff --git a/Source/WebCore/dom/Document.cpp b/Source/WebCore/dom/Document.cpp >index c4088cfe24..dee04c8f77 100644 >--- a/Source/WebCore/dom/Document.cpp >+++ b/Source/WebCore/dom/Document.cpp >@@ -799,6 +799,10 @@ void Document::commonTeardown() > > m_pendingScrollEventTargetList = nullptr; > >+#if ENABLE(OVERSCROLL_EVENTS) >+ m_pendingScrollEndEventTargetList = nullptr; >+#endif >+ > while (!m_timelines.computesEmpty()) > m_timelines.begin()->detachFromDocument(); > m_timeline = nullptr; >@@ -4072,6 +4076,26 @@ void Document::addPendingScrollEventTarget(ContainerNode& target) > targets.append(target); > } > >+#if ENABLE(OVERSCROLL_EVENTS) >+void Document::addPendingScrollEndEventTarget(ContainerNode& target) >+{ >+ if (!settings().overscrollEventsEnabled()) >+ return; >+ >+ if (!m_pendingScrollEndEventTargetList) >+ m_pendingScrollEndEventTargetList = makeUnique<PendingScrollEventTargetList>(); >+ >+ auto& targets = m_pendingScrollEndEventTargetList->targets; >+ if (targets.findMatching([&] (auto& entry) { return entry.ptr() == ⌖ }) != notFound) >+ return; >+ >+ if (targets.isEmpty()) >+ scheduleTimedRenderingUpdate(); >+ >+ targets.append(target); >+} >+#endif >+ > void Document::setNeedsVisualViewportScrollEvent() > { > if (!m_needsVisualViewportScrollEvent) >@@ -4097,6 +4121,18 @@ void Document::runScrollSteps() > if (auto* window = domWindow()) > window->visualViewport().dispatchEvent(Event::create(eventNames().scrollEvent, Event::CanBubble::No, Event::IsCancelable::No)); > } >+ >+#if ENABLE(OVERSCROLL_EVENTS) >+ // Deal with scrollend event. >+ if (m_pendingScrollEndEventTargetList && !m_pendingScrollEndEventTargetList->targets.isEmpty()) { >+ LOG_WITH_STREAM(Events, stream << "Document" << this << "sending scrollend events to pending scroll event targets"); >+ auto currentScrollEndTargets = WTFMove(m_pendingScrollEndEventTargetList->targets); >+ for (auto& target : currentScrollEndTargets) { >+ auto bubbles = target->isDocumentNode() ? Event::CanBubble::Yes : Event::CanBubble::No; >+ target->dispatchEvent(Event::create(eventNames().scrollendEvent, bubbles, Event::IsCancelable::No)); >+ } >+ } >+#endif > } > > void Document::addAudioProducer(MediaProducer& audioProducer) >diff --git a/Source/WebCore/dom/Document.h b/Source/WebCore/dom/Document.h >index 34fd00e15b..5d792079fc 100644 >--- a/Source/WebCore/dom/Document.h >+++ b/Source/WebCore/dom/Document.h >@@ -1365,6 +1365,9 @@ public: > void runResizeSteps(); > > void addPendingScrollEventTarget(ContainerNode&); >+#if ENABLE(OVERSCROLL_EVENTS) >+ void addPendingScrollEndEventTarget(ContainerNode&); >+#endif > void setNeedsVisualViewportScrollEvent(); > void runScrollSteps(); > >@@ -2051,6 +2054,9 @@ private: > > struct PendingScrollEventTargetList; > std::unique_ptr<PendingScrollEventTargetList> m_pendingScrollEventTargetList; >+#if ENABLE(OVERSCROLL_EVENTS) >+ std::unique_ptr<PendingScrollEventTargetList> m_pendingScrollEndEventTargetList; >+#endif > > #if ENABLE(MEDIA_STREAM) > HashSet<HTMLMediaElement*> m_mediaStreamStateChangeElements; >diff --git a/Source/WebCore/dom/Element.cpp b/Source/WebCore/dom/Element.cpp >index 278d987d08..1ae3980f90 100644 >--- a/Source/WebCore/dom/Element.cpp >+++ b/Source/WebCore/dom/Element.cpp >@@ -950,7 +950,7 @@ void Element::scrollTo(const ScrollToOptions& options, ScrollClamping clamping) > clampToInteger(scrollToOptions.left.value() * renderer->style().effectiveZoom()), > clampToInteger(scrollToOptions.top.value() * renderer->style().effectiveZoom()) > ); >- bool animated = useSmoothScrolling(scrollToOptions.behavior.valueOr(ScrollBehavior::Auto), this); >+ AnimatedScroll animated = useSmoothScrolling(scrollToOptions.behavior.valueOr(ScrollBehavior::Auto), this) ? AnimatedScroll::Yes : AnimatedScroll::No; > renderer->setScrollPosition(scrollPosition, ScrollType::Programmatic, clamping, animated); > } > >@@ -1293,16 +1293,20 @@ void Element::setScrollLeft(int newLeft) > if (auto* frame = documentFrameWithNonNullView()) { > // FIXME: Should we use document()->scrollingElement()? > // See https://bugs.webkit.org/show_bug.cgi?id=205059 >- bool animated = useSmoothScrolling(ScrollBehavior::Auto, document().documentElement()); >+ AnimatedScroll animated = useSmoothScrolling(ScrollBehavior::Auto, document().documentElement()) ? AnimatedScroll::Yes : AnimatedScroll::No; > IntPoint position(static_cast<int>(newLeft * frame->pageZoomFactor() * frame->frameScaleFactor()), frame->view()->scrollY()); >+#if ENABLE(OVERSCROLL_EVENTS) >+ frame->view()->setScrollPosition(position, ScrollClamping::Clamped, animated, RequestScrollEndEvent::Yes); >+#else > frame->view()->setScrollPosition(position, ScrollClamping::Clamped, animated); >+#endif > } > return; > } > > if (auto* renderer = renderBox()) { > int clampedLeft = clampToInteger(newLeft * renderer->style().effectiveZoom()); >- bool animated = useSmoothScrolling(ScrollBehavior::Auto, this); >+ AnimatedScroll animated = useSmoothScrolling(ScrollBehavior::Auto, this) ? AnimatedScroll::Yes : AnimatedScroll::No; > renderer->setScrollLeft(clampedLeft, ScrollType::Programmatic, ScrollClamping::Clamped, animated); > if (auto* scrollableArea = renderer->layer()) > scrollableArea->setScrollShouldClearLatchedState(true); >@@ -1317,16 +1321,20 @@ void Element::setScrollTop(int newTop) > if (auto* frame = documentFrameWithNonNullView()) { > // FIXME: Should we use document()->scrollingElement()? > // See https://bugs.webkit.org/show_bug.cgi?id=205059 >- bool animated = useSmoothScrolling(ScrollBehavior::Auto, document().documentElement()); >+ AnimatedScroll animated = useSmoothScrolling(ScrollBehavior::Auto, document().documentElement()) ? AnimatedScroll::Yes : AnimatedScroll::No; > IntPoint position(frame->view()->scrollX(), static_cast<int>(newTop * frame->pageZoomFactor() * frame->frameScaleFactor())); >+#if ENABLE(OVERSCROLL_EVENTS) >+ frame->view()->setScrollPosition(position, ScrollClamping::Clamped, animated, RequestScrollEndEvent::Yes); >+#else > frame->view()->setScrollPosition(position, ScrollClamping::Clamped, animated); >+#endif > } > return; > } > > if (auto* renderer = renderBox()) { > int clampedTop = clampToInteger(newTop * renderer->style().effectiveZoom()); >- bool animated = useSmoothScrolling(ScrollBehavior::Auto, this); >+ AnimatedScroll animated = useSmoothScrolling(ScrollBehavior::Auto, this) ? AnimatedScroll::Yes : AnimatedScroll::No; > renderer->setScrollTop(clampedTop, ScrollType::Programmatic, ScrollClamping::Clamped, animated); > if (auto* scrollableArea = renderer->layer()) > scrollableArea->setScrollShouldClearLatchedState(true); >diff --git a/Source/WebCore/dom/EventNames.h b/Source/WebCore/dom/EventNames.h >index 5ceee6f681..e4df4c4b7d 100644 >--- a/Source/WebCore/dom/EventNames.h >+++ b/Source/WebCore/dom/EventNames.h >@@ -191,6 +191,7 @@ namespace WebCore { > macro(orientationchange) \ > macro(overconstrained) \ > macro(overflowchanged) \ >+ macro(overscroll) \ > macro(pagehide) \ > macro(pageshow) \ > macro(paste) \ >@@ -227,6 +228,7 @@ namespace WebCore { > macro(result) \ > macro(resume) \ > macro(scroll) \ >+ macro(scrollend) \ > macro(search) \ > macro(securitypolicyviolation) \ > macro(seeked) \ >diff --git a/Source/WebCore/dom/GlobalEventHandlers.idl b/Source/WebCore/dom/GlobalEventHandlers.idl >index 770aa9c3a7..1f276534f7 100644 >--- a/Source/WebCore/dom/GlobalEventHandlers.idl >+++ b/Source/WebCore/dom/GlobalEventHandlers.idl >@@ -132,4 +132,8 @@ > [NotEnumerable, Conditional=MOUSE_FORCE_EVENTS] attribute EventHandler onwebkitmouseforcedown; > [NotEnumerable, Conditional=MOUSE_FORCE_EVENTS] attribute EventHandler onwebkitmouseforcewillbegin; > [NotEnumerable, Conditional=MOUSE_FORCE_EVENTS] attribute EventHandler onwebkitmouseforceup; >+ >+ // Event handlers from Overscroll Events API (https://wicg.github.io/overscroll-scrollend-events/) >+ [NotEnumerable, Conditional=OVERSCROLL_EVENTS, EnabledBySetting=OverscrollEvents] attribute EventHandler onoverscroll; >+ [NotEnumerable, Conditional=OVERSCROLL_EVENTS, EnabledBySetting=OverscrollEvents] attribute EventHandler onscrollend; > }; >diff --git a/Source/WebCore/html/HTMLAttributeNames.in b/Source/WebCore/html/HTMLAttributeNames.in >index dcd8378d95..099ffb8225 100644 >--- a/Source/WebCore/html/HTMLAttributeNames.in >+++ b/Source/WebCore/html/HTMLAttributeNames.in >@@ -267,6 +267,7 @@ onmousewheel > ononline > onoffline > onorientationchange >+onoverscroll > onpagehide > onpageshow > onpaste >@@ -287,6 +288,7 @@ onratechange > onreset > onresize > onscroll >+onscrollend > onsearch > onseeked > onseeking >diff --git a/Source/WebCore/html/HTMLElement.cpp b/Source/WebCore/html/HTMLElement.cpp >index 45772d13dd..d6eee43c52 100644 >--- a/Source/WebCore/html/HTMLElement.cpp >+++ b/Source/WebCore/html/HTMLElement.cpp >@@ -284,6 +284,7 @@ HTMLElement::EventHandlerNameMap HTMLElement::createEventHandlerNameMap() > &onmouseoverAttr.get(), > &onmouseupAttr.get(), > &onmousewheelAttr.get(), >+ &onoverscrollAttr.get(), > &onpasteAttr.get(), > &onpauseAttr.get(), > &onplayAttr.get(), >@@ -301,6 +302,7 @@ HTMLElement::EventHandlerNameMap HTMLElement::createEventHandlerNameMap() > &onresetAttr.get(), > &onresizeAttr.get(), > &onscrollAttr.get(), >+ &onscrollendAttr.get(), > &onsearchAttr.get(), > &onseekedAttr.get(), > &onseekingAttr.get(), >diff --git a/Source/WebCore/page/DOMWindow.cpp b/Source/WebCore/page/DOMWindow.cpp >index a7b22a9629..62fde6e7c3 100644 >--- a/Source/WebCore/page/DOMWindow.cpp >+++ b/Source/WebCore/page/DOMWindow.cpp >@@ -1679,8 +1679,15 @@ void DOMWindow::scrollTo(const ScrollToOptions& options, ScrollClamping clamping > > // This is an optimization for the common case of scrolling to (0, 0) when the scroller is already at the origin. > // If an animated scroll is in progress, this optimization is skipped to ensure that the animated scroll is really stopped. >- if (view->currentScrollBehaviorStatus() == ScrollBehaviorStatus::NotInAnimation && !scrollToOptions.left.value() && !scrollToOptions.top.value() && view->contentsScrollPosition() == IntPoint(0, 0)) >+ if (view->currentScrollBehaviorStatus() == ScrollBehaviorStatus::NotInAnimation >+ && !scrollToOptions.left.value() >+ && !scrollToOptions.top.value() >+ && view->contentsScrollPosition() == IntPoint(0, 0)) { >+#if ENABLE(OVERSCROLL_EVENTS) >+ view->addPendingScrollEndEventTarget(); >+#endif > return; >+ } > > document()->updateLayoutIgnorePendingStylesheets(); > >@@ -1688,12 +1695,9 @@ void DOMWindow::scrollTo(const ScrollToOptions& options, ScrollClamping clamping > > // FIXME: Should we use document()->scrollingElement()? > // See https://bugs.webkit.org/show_bug.cgi?id=205059 >- if (useSmoothScrolling(scrollToOptions.behavior.valueOr(ScrollBehavior::Auto), document()->documentElement())) { >- view->scrollToOffsetWithAnimation(layoutPos, ScrollType::Programmatic, clamping); >- return; >- } >+ AnimatedScroll animated = useSmoothScrolling(scrollToOptions.behavior.valueOr(ScrollBehavior::Auto), document()->documentElement()) ? AnimatedScroll::Yes : AnimatedScroll::No; > >- view->setContentsScrollPosition(layoutPos, clamping); >+ view->setContentsScrollPosition(layoutPos, clamping, animated); > } > > bool DOMWindow::allowedToChangeWindowGeometry() const >diff --git a/Source/WebCore/page/FrameView.cpp b/Source/WebCore/page/FrameView.cpp >index 620124d6ba..141b82c95f 100644 >--- a/Source/WebCore/page/FrameView.cpp >+++ b/Source/WebCore/page/FrameView.cpp >@@ -2282,7 +2282,7 @@ void FrameView::scrollElementToRect(const Element& element, const IntRect& rect) > setScrollPosition(IntPoint(bounds.x() - centeringOffsetX - rect.x(), bounds.y() - centeringOffsetY - rect.y())); > } > >-void FrameView::setScrollPosition(const ScrollPosition& scrollPosition, ScrollClamping clamping, bool animated) >+void FrameView::setScrollPosition(const ScrollPosition& scrollPosition, ScrollClamping clamping, AnimatedScroll animated, RequestScrollEndEvent requestScrollEndEvent) > { > LOG_WITH_STREAM(Scrolling, stream << "FrameView::setScrollPosition " << scrollPosition << " , clearing anchor"); > >@@ -2295,10 +2295,21 @@ void FrameView::setScrollPosition(const ScrollPosition& scrollPosition, ScrollCl > Page* page = frame().page(); > if (page && page->isMonitoringWheelEvents()) > scrollAnimator().setWheelEventTestMonitor(page->wheelEventTestMonitor()); >- if (animated) >- scrollToOffsetWithAnimation(scrollOffsetFromPosition(scrollPosition), currentScrollType(), clamping); >+ >+ ScrollPosition newScrollPosition = (!delegatesScrolling() && clamping == ScrollClamping::Clamped) ? adjustScrollPositionWithinRange(scrollPosition) : scrollPosition; >+ if (animated == AnimatedScroll::Yes) >+ scrollToOffsetWithAnimation(scrollOffsetFromPosition(newScrollPosition), currentScrollType(), clamping); > else >- ScrollView::setScrollPosition(scrollPosition, clamping); >+ ScrollView::setScrollPosition(newScrollPosition, clamping, animated, requestScrollEndEvent); >+ >+#if ENABLE(OVERSCROLL_EVENTS) >+ if (frame().settings().overscrollEventsEnabled() && requestScrollEndEvent == RequestScrollEndEvent::Yes) { >+ if (newScrollPosition == ScrollView::scrollPosition()) >+ addPendingScrollEndEventTarget(); >+ else if (animated == AnimatedScroll::Yes) >+ setScrollEndTarget(makeWeakPtr(frame().document())); >+ } >+#endif > > setCurrentScrollType(oldScrollType); > } >@@ -3735,6 +3746,32 @@ void FrameView::scrollToOffsetWithAnimation(const ScrollOffset& offset, ScrollTy > setCurrentScrollType(previousScrollType); > } > >+#if ENABLE(OVERSCROLL_EVENTS) >+void FrameView::saveScrollEndEventPosition(const ScrollPosition& position, ScrollClamping clamping) >+{ >+ if (!frame().settings().overscrollEventsEnabled()) >+ return; >+ >+ ScrollPosition clampedScrollPosition = clamping == ScrollClamping::Clamped ? adjustScrollPositionWithinRange(position) : position; >+ m_fireScrollEndEventAtPosition = clampedScrollPosition; >+} >+ >+void FrameView::checkScrollEndEventPosition(const ScrollPosition& position) >+{ >+ if (!m_fireScrollEndEventAtPosition || m_fireScrollEndEventAtPosition.value() != position) >+ return; >+ >+ addPendingScrollEndEventTarget(); >+ m_fireScrollEndEventAtPosition = WTF::nullopt; >+} >+ >+void FrameView::addPendingScrollEndEventTarget() >+{ >+ if (Document* document = frame().document()) >+ document->addPendingScrollEndEventTarget(*document); >+} >+#endif >+ > float FrameView::adjustScrollStepForFixedContent(float step, ScrollbarOrientation orientation, ScrollGranularity granularity) > { > if (granularity != ScrollByPage || orientation == HorizontalScrollbar) >diff --git a/Source/WebCore/page/FrameView.h b/Source/WebCore/page/FrameView.h >index 8984535e75..be29a853e4 100644 >--- a/Source/WebCore/page/FrameView.h >+++ b/Source/WebCore/page/FrameView.h >@@ -230,7 +230,7 @@ public: > #if USE(COORDINATED_GRAPHICS) > WEBCORE_EXPORT void setFixedVisibleContentRect(const IntRect&) final; > #endif >- WEBCORE_EXPORT void setScrollPosition(const ScrollPosition&, ScrollClamping = ScrollClamping::Clamped, bool animated = false) final; >+ WEBCORE_EXPORT void setScrollPosition(const ScrollPosition&, ScrollClamping = ScrollClamping::Clamped, AnimatedScroll = AnimatedScroll::No, RequestScrollEndEvent = RequestScrollEndEvent::No) final; > void restoreScrollbar(); > void scheduleScrollToFocusedElement(SelectionRevealMode); > void scrollToFocusedElementImmediatelyIfNeeded(); >@@ -667,6 +667,14 @@ public: > > String debugDescription() const final; > >+#if ENABLE(OVERSCROLL_EVENTS) >+ void saveScrollEndEventPosition(const ScrollPosition&, ScrollClamping = ScrollClamping::Clamped) final; >+ void checkScrollEndEventPosition(const ScrollPosition&) final; >+ void addPendingScrollEndEventTarget() final; >+ bool duringScrollRectIntoView() final { return m_duringScrollRectIntoView; } >+ void setDuringScrollRectIntoView(bool scrolling) final { m_duringScrollRectIntoView = scrolling; } >+#endif >+ > protected: > bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect) final; > void scrollContentsSlowPath(const IntRect& updateRect) final; >@@ -907,6 +915,10 @@ private: > > Pagination m_pagination; > >+#if ENABLE(OVERSCROLL_EVENTS) >+ Optional<ScrollPosition> m_fireScrollEndEventAtPosition; >+#endif >+ > enum class ViewportRendererType : uint8_t { None, Document, Body }; > ViewportRendererType m_viewportRendererType { ViewportRendererType::None }; > ScrollPinningBehavior m_scrollPinningBehavior { DoNotPin }; >@@ -952,6 +964,10 @@ private: > // True if autosize has been run since m_shouldAutoSize was set. > bool m_didRunAutosize { false }; > bool m_inUpdateEmbeddedObjects { false }; >+ >+#if ENABLE(OVERSCROLL_EVENTS) >+ bool m_duringScrollRectIntoView { false }; >+#endif > }; > > inline void FrameView::incrementVisuallyNonEmptyPixelCount(const IntSize& size) >diff --git a/Source/WebCore/page/Settings.yaml b/Source/WebCore/page/Settings.yaml >index a8676d97c3..8c5eaa2331 100644 >--- a/Source/WebCore/page/Settings.yaml >+++ b/Source/WebCore/page/Settings.yaml >@@ -919,6 +919,10 @@ isLoggedInAPIEnabled: > enterKeyHintEnabled: > initial: false > >+overscrollEventsEnabled: >+ initial: false >+ conditional: OVERSCROLL_EVENTS >+ > legacyGetUserMediaEnabled: > initial: false > conditional: MEDIA_STREAM >diff --git a/Source/WebCore/platform/ScrollAnimation.h b/Source/WebCore/platform/ScrollAnimation.h >index 523a77f335..db53f1df7e 100644 >--- a/Source/WebCore/platform/ScrollAnimation.h >+++ b/Source/WebCore/platform/ScrollAnimation.h >@@ -26,6 +26,7 @@ > #ifndef ScrollAnimation_h > #define ScrollAnimation_h > >+#include "ContainerNode.h" > #include "ScrollTypes.h" > > namespace WebCore { >@@ -44,6 +45,9 @@ public: > virtual void updateVisibleLengths() { }; > virtual void setCurrentPosition(const FloatPoint&) { }; > virtual void serviceAnimation() { }; >+#if ENABLE(OVERSCROLL_EVENTS) >+ virtual void setScrollEndTarget(WeakPtr<ContainerNode>) { }; >+#endif > > protected: > ScrollAnimation(ScrollableArea& scrollableArea) >diff --git a/Source/WebCore/platform/ScrollAnimationSmooth.cpp b/Source/WebCore/platform/ScrollAnimationSmooth.cpp >index 2ca578a30f..44e88ab044 100644 >--- a/Source/WebCore/platform/ScrollAnimationSmooth.cpp >+++ b/Source/WebCore/platform/ScrollAnimationSmooth.cpp >@@ -28,7 +28,10 @@ > #include "config.h" > #include "ScrollAnimationSmooth.h" > >+#include "ContainerNode.h" >+#include "Document.h" > #include "FloatPoint.h" >+#include "RenderLayer.h" > #include "ScrollableArea.h" > > namespace WebCore { >@@ -80,10 +83,39 @@ void ScrollAnimationSmooth::scroll(const FloatPoint& position) > > void ScrollAnimationSmooth::stop() > { >+#if ENABLE(OVERSCROLL_EVENTS) >+ if (m_animationTimer.isActive()) >+ notifyScrollEnd(); >+#endif >+ > m_animationTimer.stop(); > m_scrollableArea.setScrollBehaviorStatus(ScrollBehaviorStatus::NotInAnimation); > } > >+#if ENABLE(OVERSCROLL_EVENTS) >+void ScrollAnimationSmooth::notifyScrollEnd() >+{ >+ if (!m_scrollEndEventTarget) { >+ m_scrollableArea.setDuringScrollRectIntoView(false); >+ return; >+ } >+ >+ auto* duringScrollingParentLayer = m_scrollableArea.duringScrollRectIntoView() ? m_scrollableArea.findAncestorDuringScrollRectIntoView() : nullptr; >+ if (duringScrollingParentLayer) >+ duringScrollingParentLayer->setScrollEndTarget(m_scrollEndEventTarget); >+ else >+ m_scrollEndEventTarget->document().addPendingScrollEndEventTarget(*m_scrollEndEventTarget); >+ >+ m_scrollableArea.setDuringScrollRectIntoView(false); >+ m_scrollEndEventTarget = nullptr; >+} >+ >+void ScrollAnimationSmooth::setScrollEndTarget(WeakPtr<ContainerNode> target) >+{ >+ m_scrollEndEventTarget = target; >+} >+#endif >+ > void ScrollAnimationSmooth::updateVisibleLengths() > { > m_horizontalData.visibleLength = m_scrollableArea.visibleWidth(); >@@ -410,8 +442,12 @@ void ScrollAnimationSmooth::animationTimerFired() > > if (continueAnimation) > startNextTimer(std::max(minimumTimerInterval, deltaToNextFrame)); >- else >+ else { > m_scrollableArea.setScrollBehaviorStatus(ScrollBehaviorStatus::NotInAnimation); >+#if ENABLE(OVERSCROLL_EVENTS) >+ notifyScrollEnd(); >+#endif >+ } > > m_notifyPositionChangedFunction(FloatPoint(m_horizontalData.currentPosition, m_verticalData.currentPosition)); > } >diff --git a/Source/WebCore/platform/ScrollAnimationSmooth.h b/Source/WebCore/platform/ScrollAnimationSmooth.h >index 8173fa7e20..184cfad1d1 100644 >--- a/Source/WebCore/platform/ScrollAnimationSmooth.h >+++ b/Source/WebCore/platform/ScrollAnimationSmooth.h >@@ -31,6 +31,7 @@ > > namespace WebCore { > >+class ContainerNode; > class FloatPoint; > class ScrollableArea; > enum class ScrollClamping : uint8_t; >@@ -48,10 +49,16 @@ public: > Bounce > }; > >+#if ENABLE(OVERSCROLL_EVENTS) >+ void setScrollEndTarget(WeakPtr<ContainerNode>) override; >+#endif > private: > bool scroll(ScrollbarOrientation, ScrollGranularity, float step, float multiplier) override; > void scroll(const FloatPoint&) override; > void stop() override; >+#if ENABLE(OVERSCROLL_EVENTS) >+ void notifyScrollEnd(); >+#endif > void updateVisibleLengths() override; > void setCurrentPosition(const FloatPoint&) override; > >@@ -104,6 +111,9 @@ private: > > MonotonicTime m_startTime; > Timer m_animationTimer; >+#if ENABLE(OVERSCROLL_EVENTS) >+ WeakPtr<ContainerNode> m_scrollEndEventTarget; >+#endif > }; > > } // namespace WebCore >diff --git a/Source/WebCore/platform/ScrollAnimator.cpp b/Source/WebCore/platform/ScrollAnimator.cpp >index 0fc729e912..d893008aa0 100644 >--- a/Source/WebCore/platform/ScrollAnimator.cpp >+++ b/Source/WebCore/platform/ScrollAnimator.cpp >@@ -287,5 +287,10 @@ void ScrollAnimator::didAddHorizontalScrollbar(Scrollbar*) > { > m_animationProgrammaticScroll->updateVisibleLengths(); > } >- >+#if ENABLE(OVERSCROLL_EVENTS) >+void ScrollAnimator::setScrollEndTarget(WeakPtr<ContainerNode> target) >+{ >+ m_animationProgrammaticScroll->setScrollEndTarget(target); >+} >+#endif > } // namespace WebCore >diff --git a/Source/WebCore/platform/ScrollAnimator.h b/Source/WebCore/platform/ScrollAnimator.h >index 9b7c09b690..eede798db5 100644 >--- a/Source/WebCore/platform/ScrollAnimator.h >+++ b/Source/WebCore/platform/ScrollAnimator.h >@@ -37,6 +37,7 @@ > #include "WheelEventTestMonitor.h" > #include <wtf/FastMalloc.h> > #include <wtf/Forward.h> >+#include <wtf/WeakPtr.h> > > #if ENABLE(RUBBER_BANDING) || ENABLE(CSS_SCROLL_SNAP) > #include "ScrollController.h" >@@ -44,6 +45,7 @@ > > namespace WebCore { > >+class ContainerNode; > class FloatPoint; > class PlatformTouchEvent; > class ScrollAnimation; >@@ -143,6 +145,10 @@ public: > FloatSize viewportSize() const override; > #endif > >+#if ENABLE(OVERSCROLL_EVENTS) >+ void setScrollEndTarget(WeakPtr<ContainerNode>); >+#endif >+ > protected: > virtual void notifyPositionChanged(const FloatSize& delta); > void updateActiveScrollSnapIndexForOffset(); >diff --git a/Source/WebCore/platform/ScrollTypes.h b/Source/WebCore/platform/ScrollTypes.h >index 5c52d5bbde..562734547b 100644 >--- a/Source/WebCore/platform/ScrollTypes.h >+++ b/Source/WebCore/platform/ScrollTypes.h >@@ -60,6 +60,16 @@ enum class ScrollBehaviorStatus : uint8_t { > InNonNativeAnimation, > }; > >+enum class AnimatedScroll : uint8_t { >+ No, >+ Yes >+}; >+ >+enum class RequestScrollEndEvent : uint8_t { >+ No, >+ Yes >+}; >+ > inline ScrollDirection logicalToPhysical(ScrollLogicalDirection direction, bool isVertical, bool isFlipped) > { > switch (direction) { >diff --git a/Source/WebCore/platform/ScrollView.cpp b/Source/WebCore/platform/ScrollView.cpp >index 361f053893..1ab20abc5b 100644 >--- a/Source/WebCore/platform/ScrollView.cpp >+++ b/Source/WebCore/platform/ScrollView.cpp >@@ -207,13 +207,17 @@ IntPoint ScrollView::contentsScrollPosition() const > return scrollPosition(); > } > >-void ScrollView::setContentsScrollPosition(const IntPoint& position, ScrollClamping clamping) >+void ScrollView::setContentsScrollPosition(const IntPoint& position, ScrollClamping clamping, AnimatedScroll animated) > { > #if PLATFORM(IOS_FAMILY) > if (platformWidget()) > setActualScrollPosition(position); > #endif >- setScrollPosition(position, clamping); >+#if ENABLE(OVERSCROLL_EVENTS) >+ setScrollPosition(position, clamping, animated, RequestScrollEndEvent::Yes); >+#else >+ setScrollPosition(position, clamping, animated); >+#endif > } > > FloatRect ScrollView::exposedContentRect() const >@@ -487,6 +491,10 @@ void ScrollView::scrollTo(const ScrollPosition& newPosition) > > m_scrollPosition = newPosition; > >+#if ENABLE(OVERSCROLL_EVENTS) >+ checkScrollEndEventPosition(m_scrollPosition); >+#endif >+ > if (scrollbarsSuppressed()) > return; > >@@ -514,7 +522,7 @@ void ScrollView::completeUpdatesAfterScrollTo(const IntSize& scrollDelta) > updateCompositingLayersAfterScrolling(); > } > >-void ScrollView::setScrollPosition(const ScrollPosition& scrollPosition, ScrollClamping clamping, bool/* animated*/) >+void ScrollView::setScrollPosition(const ScrollPosition& scrollPosition, ScrollClamping clamping, AnimatedScroll /* animated*/, RequestScrollEndEvent) > { > LOG_WITH_STREAM(Scrolling, stream << "ScrollView::setScrollPosition " << scrollPosition); > >@@ -526,14 +534,13 @@ void ScrollView::setScrollPosition(const ScrollPosition& scrollPosition, ScrollC > return; > } > >- ScrollPosition newScrollPosition = (!delegatesScrolling() && clamping == ScrollClamping::Clamped) ? adjustScrollPositionWithinRange(scrollPosition) : scrollPosition; >+ if (currentScrollBehaviorStatus() == ScrollBehaviorStatus::InNonNativeAnimation) >+ scrollAnimator().cancelAnimations(); > >+ ScrollPosition newScrollPosition = (!delegatesScrolling() && clamping == ScrollClamping::Clamped) ? adjustScrollPositionWithinRange(scrollPosition) : scrollPosition; > if ((!delegatesScrolling() || currentScrollType() == ScrollType::User) && currentScrollBehaviorStatus() == ScrollBehaviorStatus::NotInAnimation && newScrollPosition == this->scrollPosition()) > return; > >- if (currentScrollBehaviorStatus() == ScrollBehaviorStatus::InNonNativeAnimation) >- scrollAnimator().cancelAnimations(); >- > if (!requestScrollPositionUpdate(newScrollPosition, currentScrollType(), clamping)) > updateScrollbars(newScrollPosition); > >diff --git a/Source/WebCore/platform/ScrollView.h b/Source/WebCore/platform/ScrollView.h >index 8f5df8eb92..e3c1d7d130 100644 >--- a/Source/WebCore/platform/ScrollView.h >+++ b/Source/WebCore/platform/ScrollView.h >@@ -232,7 +232,7 @@ public: > > // Scroll position used by web-exposed features (has legacy iOS behavior). > WEBCORE_EXPORT IntPoint contentsScrollPosition() const; >- void setContentsScrollPosition(const IntPoint&, ScrollClamping = ScrollClamping::Clamped); >+ void setContentsScrollPosition(const IntPoint&, ScrollClamping = ScrollClamping::Clamped, AnimatedScroll = AnimatedScroll::No); > > #if PLATFORM(IOS_FAMILY) > int actualScrollX() const { return unobscuredContentRect().x(); } >@@ -262,7 +262,7 @@ public: > ScrollPosition cachedScrollPosition() const { return m_cachedScrollPosition; } > > // Functions for scrolling the view. >- virtual void setScrollPosition(const ScrollPosition&, ScrollClamping = ScrollClamping::Clamped, bool animated = false); >+ virtual void setScrollPosition(const ScrollPosition&, ScrollClamping = ScrollClamping::Clamped, AnimatedScroll = AnimatedScroll::No, RequestScrollEndEvent = RequestScrollEndEvent::No); > > void scrollBy(const IntSize& s) { return setScrollPosition(scrollPosition() + s); } > >diff --git a/Source/WebCore/platform/ScrollableArea.cpp b/Source/WebCore/platform/ScrollableArea.cpp >index cdad3601d3..89d4d99e47 100644 >--- a/Source/WebCore/platform/ScrollableArea.cpp >+++ b/Source/WebCore/platform/ScrollableArea.cpp >@@ -32,6 +32,7 @@ > #include "config.h" > #include "ScrollableArea.h" > >+#include "ContainerNode.h" > #include "FloatPoint.h" > #include "GraphicsContext.h" > #include "GraphicsLayer.h" >@@ -775,4 +776,11 @@ TextStream& operator<<(TextStream& ts, const ScrollableArea& scrollableArea) > return ts; > } > >+#if ENABLE(OVERSCROLL_EVENTS) >+void ScrollableArea::setScrollEndTarget(WeakPtr<ContainerNode> target) >+{ >+ scrollAnimator().setScrollEndTarget(target); >+} >+#endif >+ > } // namespace WebCore >diff --git a/Source/WebCore/platform/ScrollableArea.h b/Source/WebCore/platform/ScrollableArea.h >index 45fac029bd..3b9a7779f3 100644 >--- a/Source/WebCore/platform/ScrollableArea.h >+++ b/Source/WebCore/platform/ScrollableArea.h >@@ -37,6 +37,7 @@ class TextStream; > > namespace WebCore { > >+class ContainerNode; > class FloatPoint; > class GraphicsContext; > class LayoutPoint; >@@ -352,6 +353,16 @@ public: > > virtual String debugDescription() const = 0; > >+#if ENABLE(OVERSCROLL_EVENTS) >+ virtual void saveScrollEndEventPosition(const ScrollPosition&, ScrollClamping = ScrollClamping::Clamped) { } >+ virtual void checkScrollEndEventPosition(const ScrollPosition&) { } >+ virtual void addPendingScrollEndEventTarget() { } >+ virtual bool duringScrollRectIntoView() { return false; } >+ virtual void setDuringScrollRectIntoView(bool) { } >+ virtual ScrollableArea* findAncestorDuringScrollRectIntoView() { return nullptr; } >+ void setScrollEndTarget(WeakPtr<ContainerNode>); >+#endif >+ > protected: > WEBCORE_EXPORT ScrollableArea(); > WEBCORE_EXPORT virtual ~ScrollableArea(); >diff --git a/Source/WebCore/rendering/RenderBox.cpp b/Source/WebCore/rendering/RenderBox.cpp >index 4f378d735f..f81df6e60d 100644 >--- a/Source/WebCore/rendering/RenderBox.cpp >+++ b/Source/WebCore/rendering/RenderBox.cpp >@@ -581,7 +581,7 @@ static void setupWheelEventMonitor(RenderLayer& layer) > layer.scrollAnimator().setWheelEventTestMonitor(page.wheelEventTestMonitor()); > } > >-void RenderBox::setScrollLeft(int newLeft, ScrollType scrollType, ScrollClamping clamping, bool animated) >+void RenderBox::setScrollLeft(int newLeft, ScrollType scrollType, ScrollClamping clamping, AnimatedScroll animated) > { > if (!hasOverflowClip() || !layer()) > return; >@@ -589,7 +589,7 @@ void RenderBox::setScrollLeft(int newLeft, ScrollType scrollType, ScrollClamping > layer()->scrollToXPosition(newLeft, scrollType, clamping, animated); > } > >-void RenderBox::setScrollTop(int newTop, ScrollType scrollType, ScrollClamping clamping, bool animated) >+void RenderBox::setScrollTop(int newTop, ScrollType scrollType, ScrollClamping clamping, AnimatedScroll animated) > { > if (!hasOverflowClip() || !layer()) > return; >@@ -597,12 +597,16 @@ void RenderBox::setScrollTop(int newTop, ScrollType scrollType, ScrollClamping c > layer()->scrollToYPosition(newTop, scrollType, clamping, animated); > } > >-void RenderBox::setScrollPosition(const ScrollPosition& position, ScrollType scrollType, ScrollClamping clamping, bool animated) >+void RenderBox::setScrollPosition(const ScrollPosition& position, ScrollType scrollType, ScrollClamping clamping, AnimatedScroll animated) > { > if (!hasOverflowClip() || !layer()) > return; > setupWheelEventMonitor(*layer()); >- layer()->scrollToPosition(position, scrollType, clamping, animated); >+#if ENABLE(OVERSCROLL_EVENTS) >+ layer()->setScrollPosition(position, scrollType, clamping, animated, RequestScrollEndEvent::Yes); >+#else >+ layer()->setScrollPosition(position, scrollType, clamping, animated); >+#endif > } > > void RenderBox::absoluteRects(Vector<IntRect>& rects, const LayoutPoint& accumulatedOffset) const >diff --git a/Source/WebCore/rendering/RenderBox.h b/Source/WebCore/rendering/RenderBox.h >index 275220b6be..814344f75a 100644 >--- a/Source/WebCore/rendering/RenderBox.h >+++ b/Source/WebCore/rendering/RenderBox.h >@@ -247,9 +247,9 @@ public: > virtual int scrollTop() const; > virtual int scrollWidth() const; > virtual int scrollHeight() const; >- virtual void setScrollLeft(int, ScrollType, ScrollClamping = ScrollClamping::Clamped, bool animated = false); >- virtual void setScrollTop(int, ScrollType, ScrollClamping = ScrollClamping::Clamped, bool animated = false); >- void setScrollPosition(const ScrollPosition&, ScrollType, ScrollClamping = ScrollClamping::Clamped, bool animated = false); >+ virtual void setScrollLeft(int, ScrollType, ScrollClamping = ScrollClamping::Clamped, AnimatedScroll = AnimatedScroll::No); >+ virtual void setScrollTop(int, ScrollType, ScrollClamping = ScrollClamping::Clamped, AnimatedScroll = AnimatedScroll::No); >+ void setScrollPosition(const ScrollPosition&, ScrollType, ScrollClamping = ScrollClamping::Clamped, AnimatedScroll = AnimatedScroll::No); > > LayoutUnit marginTop() const override { return m_marginBox.top(); } > LayoutUnit marginBottom() const override { return m_marginBox.bottom(); } >diff --git a/Source/WebCore/rendering/RenderLayer.cpp b/Source/WebCore/rendering/RenderLayer.cpp >index f23331f718..0baad9a9b7 100644 >--- a/Source/WebCore/rendering/RenderLayer.cpp >+++ b/Source/WebCore/rendering/RenderLayer.cpp >@@ -2590,24 +2590,47 @@ void RenderLayer::applyPostLayoutScrollPositionIfNeeded() > m_postLayoutScrollPosition = WTF::nullopt; > } > >-void RenderLayer::scrollToXPosition(int x, ScrollType scrollType, ScrollClamping clamping, bool animated) >+void RenderLayer::scrollToXPosition(int x, ScrollType scrollType, ScrollClamping clamping, AnimatedScroll animated) > { > ScrollPosition position(x, m_scrollPosition.y()); >- scrollToPosition(position, scrollType, clamping, animated); >+#if ENABLE(OVERSCROLL_EVENTS) >+ setScrollPosition(position, scrollType, clamping, animated, RequestScrollEndEvent::Yes); >+#else >+ setScrollPosition(position, scrollType, clamping, animated); >+#endif > } > >-void RenderLayer::scrollToYPosition(int y, ScrollType scrollType, ScrollClamping clamping, bool animated) >+void RenderLayer::scrollToYPosition(int y, ScrollType scrollType, ScrollClamping clamping, AnimatedScroll animated) > { > ScrollPosition position(m_scrollPosition.x(), y); >- scrollToPosition(position, scrollType, clamping, animated); >+#if ENABLE(OVERSCROLL_EVENTS) >+ setScrollPosition(position, scrollType, clamping, animated, RequestScrollEndEvent::Yes); >+#else >+ setScrollPosition(position, scrollType, clamping, animated); >+#endif > } > >-void RenderLayer::scrollToPosition(const ScrollPosition& position, ScrollType scrollType, ScrollClamping clamping, bool animated) >+void RenderLayer::setScrollPosition(const ScrollPosition& position, ScrollType scrollType, ScrollClamping clamping, AnimatedScroll animated, RequestScrollEndEvent requestScrollEndEvent) > { >- if (animated) >- scrollToOffsetWithAnimation(scrollOffsetFromPosition(position), scrollType, clamping); >+#if !ENABLE(OVERSCROLL_EVENTS) >+ UNUSED_PARAM(requestScrollEndEvent); >+#endif >+ >+ auto offset = scrollOffsetFromPosition(position); >+ ScrollOffset newScrollOffset = clamping == ScrollClamping::Clamped ? clampScrollOffset(offset) : offset; >+ if (animated == AnimatedScroll::Yes) >+ scrollToOffsetWithAnimation(newScrollOffset, scrollType, clamping); > else >- scrollToOffset(scrollOffsetFromPosition(position), scrollType, clamping); >+ scrollToOffset(newScrollOffset, scrollType, clamping); >+ >+#if ENABLE(OVERSCROLL_EVENTS) >+ if (renderer().settings().overscrollEventsEnabled() && requestScrollEndEvent == RequestScrollEndEvent::Yes) { >+ if (newScrollOffset == scrollOffset()) >+ addPendingScrollEndEventTarget(); >+ else if (animated == AnimatedScroll::Yes) >+ setScrollEndTarget(makeWeakPtr(renderer().element())); >+ } >+#endif > } > > ScrollOffset RenderLayer::clampScrollOffset(const ScrollOffset& scrollOffset) const >@@ -2630,13 +2653,18 @@ void RenderLayer::scrollToOffset(const ScrollOffset& scrollOffset, ScrollType sc > scrollAnimator().cancelAnimations(); > > ScrollOffset clampedScrollOffset = clamping == ScrollClamping::Clamped ? clampScrollOffset(scrollOffset) : scrollOffset; >- if (clampedScrollOffset == this->scrollOffset()) >+ ScrollPosition clampedScrollPosition = scrollPositionFromOffset(clampedScrollOffset); >+ if (clampedScrollOffset == this->scrollOffset()) { >+#if ENABLE(OVERSCROLL_EVENTS) >+ checkScrollEndEventPosition(clampedScrollPosition); >+#endif > return; >+ } > > auto previousScrollType = currentScrollType(); > setCurrentScrollType(scrollType); > >- if (!requestScrollPositionUpdate(scrollPositionFromOffset(clampedScrollOffset), scrollType, clamping)) >+ if (!requestScrollPositionUpdate(clampedScrollPosition, scrollType, clamping)) > scrollToOffsetWithoutAnimation(clampedScrollOffset, clamping); > setScrollBehaviorStatus(ScrollBehaviorStatus::NotInAnimation); > >@@ -2760,6 +2788,10 @@ void RenderLayer::scrollTo(const ScrollPosition& position) > if (Element* element = renderer().element()) > element->document().addPendingScrollEventTarget(*element); > >+#if ENABLE(OVERSCROLL_EVENTS) >+ checkScrollEndEventPosition(m_scrollPosition); >+#endif >+ > if (scrollsOverflow()) > view.frameView().didChangeScrollOffset(); > >@@ -2805,13 +2837,18 @@ bool RenderLayer::allowsCurrentScroll() const > return box->hasHorizontalOverflow() || box->hasVerticalOverflow(); > } > >-void RenderLayer::scrollRectToVisible(const LayoutRect& absoluteRect, bool insideFixed, const ScrollRectToVisibleOptions& options, AutoscrollStatus autoscrollStatus) >+void RenderLayer::scrollRectToVisible(const LayoutRect& absoluteRect, bool insideFixed, const ScrollRectToVisibleOptions& options, RequestScrollEndEvent requestScrollEndEvent) > { > LOG_WITH_STREAM(Scrolling, stream << "Layer " << this << " scrollRectToVisible " << absoluteRect); > >+#if ENABLE(OVERSCROLL_EVENTS) >+ bool overscrollEventsEnabled = renderer().settings().overscrollEventsEnabled(); >+#endif >+ > LayoutRect newRect = absoluteRect; > FrameView& frameView = renderer().view().frameView(); > auto* parentLayer = enclosingContainingBlockLayer(*this, CrossFrameBoundaries::No); >+ bool autoscrollNotInProgress = !renderer().frame().eventHandler().autoscrollInProgress(); > > if (allowsCurrentScroll()) { > // Don't scroll to reveal an overflow layer that is restricted by the -webkit-line-clamp property. >@@ -2830,8 +2867,14 @@ void RenderLayer::scrollRectToVisible(const LayoutRect& absoluteRect, bool insid > ScrollOffset clampedScrollOffset = clampScrollOffset(scrollOffset() + toIntSize(roundedIntRect(revealRect).location())); > if (clampedScrollOffset != scrollOffset() || currentScrollBehaviorStatus() != ScrollBehaviorStatus::NotInAnimation) { > ScrollOffset oldScrollOffset = scrollOffset(); >- bool animated = autoscrollStatus == AutoscrollStatus::NotInProgress && useSmoothScrolling(options.behavior, box->element()); >- scrollToPosition(scrollPositionFromOffset(clampedScrollOffset), ScrollType::Programmatic, ScrollClamping::Clamped, animated); >+ AnimatedScroll animated = AnimatedScroll::No; >+ if (autoscrollNotInProgress && useSmoothScrolling(options.behavior, box->element())) >+ animated = AnimatedScroll::Yes; >+ setScrollPosition(scrollPositionFromOffset(clampedScrollOffset), ScrollType::Programmatic, ScrollClamping::Clamped, animated); >+#if ENABLE(OVERSCROLL_EVENTS) >+ if (overscrollEventsEnabled && animated == AnimatedScroll::Yes && clampedScrollOffset != scrollOffset()) >+ setDuringScrollRectIntoView(true); >+#endif > IntSize scrollOffsetDifference = clampedScrollOffset - oldScrollOffset; > localExposeRect.move(-scrollOffsetDifference); > newRect = LayoutRect(box->localToAbsoluteQuad(FloatQuad(FloatRect(localExposeRect)), UseTransforms).boundingBox()); >@@ -2857,9 +2900,21 @@ void RenderLayer::scrollRectToVisible(const LayoutRect& absoluteRect, bool insid > scrollPosition = scrollPosition.constrainedBetween(IntPoint(), IntPoint(frameView.contentsSize())); > // FIXME: Should we use contentDocument()->scrollingElement()? > // See https://bugs.webkit.org/show_bug.cgi?id=205059 >- bool animated = autoscrollStatus == AutoscrollStatus::NotInProgress && ownerElement->contentDocument() && useSmoothScrolling(options.behavior, ownerElement->contentDocument()->documentElement()); >+ AnimatedScroll animated = AnimatedScroll::No; >+ if (autoscrollNotInProgress >+ && ownerElement->contentDocument() >+ && useSmoothScrolling(options.behavior, ownerElement->contentDocument()->documentElement())) >+ animated = AnimatedScroll::Yes; > frameView.setScrollPosition(scrollPosition, ScrollClamping::Clamped, animated); > >+#if ENABLE(OVERSCROLL_EVENTS) >+ if (overscrollEventsEnabled && animated == AnimatedScroll::Yes && scrollPosition != frameView.scrollPosition()) { >+ frameView.setDuringScrollRectIntoView(true); >+ if (requestScrollEndEvent == RequestScrollEndEvent::Yes) >+ frameView.setScrollEndTarget(makeWeakPtr(frameView.frame().document())); >+ } >+#endif >+ > if (options.shouldAllowCrossOriginScrolling == ShouldAllowCrossOriginScrolling::Yes || frameView.safeToPropagateScrollToParent()) { > if (auto* enclosingLayer = ownerElement->renderer()->enclosingLayer()) > parentLayer = enclosingLayer->enclosingScrollableLayer(IncludeSelfOrNot::IncludeSelf, CrossFrameBoundaries::No); >@@ -2900,8 +2955,17 @@ void RenderLayer::scrollRectToVisible(const LayoutRect& absoluteRect, bool insid > ScrollOffset clampedScrollPosition = roundedIntPoint(revealRect.location()).constrainedBetween(minScrollPosition, maxScrollPosition); > // FIXME: Should we use document()->scrollingElement()? > // See https://bugs.webkit.org/show_bug.cgi?id=205059 >- bool animated = autoscrollStatus == AutoscrollStatus::NotInProgress && useSmoothScrolling(options.behavior, renderer().document().documentElement()); >+ AnimatedScroll animated = AnimatedScroll::No; >+ if (autoscrollNotInProgress && useSmoothScrolling(options.behavior, renderer().document().documentElement())) >+ animated = AnimatedScroll::Yes; > frameView.setScrollPosition(clampedScrollPosition, ScrollClamping::Clamped, animated); >+#if ENABLE(OVERSCROLL_EVENTS) >+ if (overscrollEventsEnabled && animated == AnimatedScroll::Yes && clampedScrollPosition != frameView.scrollPosition()) { >+ frameView.setDuringScrollRectIntoView(true); >+ if (requestScrollEndEvent == RequestScrollEndEvent::Yes) >+ frameView.setScrollEndTarget(makeWeakPtr(frameView.frame().document())); >+ } >+#endif > } > > // This is the outermost view of a web page, so after scrolling this view we >@@ -2913,8 +2977,26 @@ void RenderLayer::scrollRectToVisible(const LayoutRect& absoluteRect, bool insid > } > } > >- if (parentLayer) >+ if (parentLayer) { > parentLayer->scrollRectToVisible(newRect, insideFixed, options); >+#if ENABLE(OVERSCROLL_EVENTS) >+ if (overscrollEventsEnabled && requestScrollEndEvent == RequestScrollEndEvent::Yes) { >+ ContainerNode* target = renderer().element(); >+ if (renderer().document().scrollingElement() == target) >+ target = &renderer().document(); >+ >+ if (duringScrollRectIntoView()) >+ setScrollEndTarget(makeWeakPtr(target)); >+ else { >+ auto* duringScrollingParentLayer = findAncestorDuringScrollRectIntoView(); >+ if (duringScrollingParentLayer) >+ duringScrollingParentLayer->setScrollEndTarget(makeWeakPtr(target)); >+ else >+ renderer().document().addPendingScrollEndEventTarget(*target); >+ } >+ } >+#endif >+ } > } > > void RenderLayer::updateCompositingLayersAfterScroll() >@@ -3040,7 +3122,7 @@ LayoutRect RenderLayer::getRectToExpose(const LayoutRect& visibleRect, const Lay > void RenderLayer::autoscroll(const IntPoint& positionInWindow) > { > IntPoint currentDocumentPosition = renderer().view().frameView().windowToContents(positionInWindow); >- scrollRectToVisible(LayoutRect(currentDocumentPosition, LayoutSize(1, 1)), false, { SelectionRevealMode::Reveal, ScrollAlignment::alignToEdgeIfNeeded, ScrollAlignment::alignToEdgeIfNeeded, ShouldAllowCrossOriginScrolling::Yes }, AutoscrollStatus::InProgress); >+ scrollRectToVisible(LayoutRect(currentDocumentPosition, LayoutSize(1, 1)), false, { SelectionRevealMode::Reveal, ScrollAlignment::alignToEdgeIfNeeded, ScrollAlignment::alignToEdgeIfNeeded, ShouldAllowCrossOriginScrolling::Yes }); > } > > bool RenderLayer::canResize() const >@@ -7047,6 +7129,49 @@ bool RenderLayer::invalidateEventRegion(EventRegionInvalidationReason reason) > #endif > } > >+#if ENABLE(OVERSCROLL_EVENTS) >+void RenderLayer::saveScrollEndEventPosition(const ScrollPosition& position, ScrollClamping clamping) >+{ >+ if (!renderer().settings().overscrollEventsEnabled()) >+ return; >+ >+ auto offset = scrollOffsetFromPosition(position); >+ ScrollOffset clampedScrollOffset = clamping == ScrollClamping::Clamped ? clampScrollOffset(offset) : offset; >+ m_fireScrollEndEventAtPosition = scrollPositionFromOffset(clampedScrollOffset); >+} >+ >+void RenderLayer::checkScrollEndEventPosition(const ScrollPosition& position) >+{ >+ if (!m_fireScrollEndEventAtPosition || m_fireScrollEndEventAtPosition.value() != position) >+ return; >+ >+ addPendingScrollEndEventTarget(); >+ >+ m_fireScrollEndEventAtPosition = WTF::nullopt; >+} >+ >+void RenderLayer::addPendingScrollEndEventTarget() >+{ >+ if (Element* element = renderer().element()) >+ element->document().addPendingScrollEndEventTarget(*element); >+} >+ >+ScrollableArea* RenderLayer::findAncestorDuringScrollRectIntoView() >+{ >+ auto* parentLayer = enclosingContainingBlockLayer(*this, CrossFrameBoundaries::No); >+ while (parentLayer) { >+ if (parentLayer->duringScrollRectIntoView()) >+ return parentLayer; >+ parentLayer = enclosingContainingBlockLayer(*parentLayer, CrossFrameBoundaries::No); >+ } >+ >+ FrameView& frameView = renderer().view().frameView(); >+ if (frameView.duringScrollRectIntoView()) >+ return &frameView; >+ return nullptr; >+} >+#endif >+ > TextStream& operator<<(WTF::TextStream& ts, ClipRectsType clipRectsType) > { > switch (clipRectsType) { >diff --git a/Source/WebCore/rendering/RenderLayer.h b/Source/WebCore/rendering/RenderLayer.h >index b03f1e3941..3a053cb400 100644 >--- a/Source/WebCore/rendering/RenderLayer.h >+++ b/Source/WebCore/rendering/RenderLayer.h >@@ -450,9 +450,9 @@ public: > WEBCORE_EXPORT void scrollToOffset(const ScrollOffset&, ScrollType = ScrollType::Programmatic, ScrollClamping = ScrollClamping::Clamped); > WEBCORE_EXPORT void scrollToOffsetWithAnimation(const ScrollOffset&, ScrollType = ScrollType::Programmatic, ScrollClamping = ScrollClamping::Clamped); > >- void scrollToXPosition(int x, ScrollType, ScrollClamping = ScrollClamping::Clamped, bool animated = false); >- void scrollToYPosition(int y, ScrollType, ScrollClamping = ScrollClamping::Clamped, bool animated = false); >- void scrollToPosition(const ScrollPosition&, ScrollType, ScrollClamping = ScrollClamping::Clamped, bool animated = false); >+ void scrollToXPosition(int x, ScrollType, ScrollClamping = ScrollClamping::Clamped, AnimatedScroll = AnimatedScroll::No); >+ void scrollToYPosition(int y, ScrollType, ScrollClamping = ScrollClamping::Clamped, AnimatedScroll = AnimatedScroll::No); >+ void setScrollPosition(const ScrollPosition&, ScrollType, ScrollClamping = ScrollClamping::Clamped, AnimatedScroll = AnimatedScroll::No, RequestScrollEndEvent = RequestScrollEndEvent::No); > > // These are only used by marquee. > void scrollToXOffset(int x) { scrollToOffset(ScrollOffset(x, scrollOffset().y()), ScrollType::Programmatic, ScrollClamping::Unclamped); } >@@ -466,9 +466,8 @@ public: > > void availableContentSizeChanged(AvailableSizeChangeReason) final; > >- enum AutoscrollStatus { NotInProgress, InProgress }; > // "absoluteRect" is in scaled document coordinates. >- void scrollRectToVisible(const LayoutRect& absoluteRect, bool insideFixed, const ScrollRectToVisibleOptions&, AutoscrollStatus = AutoscrollStatus::NotInProgress); >+ void scrollRectToVisible(const LayoutRect& absoluteRect, bool insideFixed, const ScrollRectToVisibleOptions&, RequestScrollEndEvent = RequestScrollEndEvent::No); > > bool scrollsOverflow() const; > bool hasScrollableHorizontalOverflow() const; >@@ -931,6 +930,15 @@ public: > > String debugDescription() const final; > >+#if ENABLE(OVERSCROLL_EVENTS) >+ void saveScrollEndEventPosition(const ScrollPosition&, ScrollClamping = ScrollClamping::Clamped) final; >+ void checkScrollEndEventPosition(const ScrollPosition&) final; >+ void addPendingScrollEndEventTarget() final; >+ bool duringScrollRectIntoView() final { return m_duringScrollRectIntoView; } >+ void setDuringScrollRectIntoView(bool scrolling) final { m_duringScrollRectIntoView = scrolling; } >+ ScrollableArea* findAncestorDuringScrollRectIntoView() final; >+#endif >+ > private: > > void setNextSibling(RenderLayer* next) { m_next = next; } >@@ -1287,6 +1295,10 @@ private: > bool m_layerListMutationAllowed : 1; > #endif > >+#if ENABLE(OVERSCROLL_EVENTS) >+ bool m_duringScrollRectIntoView : 1; >+#endif >+ > #if ENABLE(CSS_COMPOSITING) > unsigned m_blendMode : 5; // BlendMode > bool m_hasNotIsolatedCompositedBlendingDescendants : 1; >@@ -1362,6 +1374,10 @@ private: > > std::unique_ptr<RenderLayerFilters> m_filters; > std::unique_ptr<RenderLayerBacking> m_backing; >+ >+#if ENABLE(OVERSCROLL_EVENTS) >+ Optional<ScrollPosition> m_fireScrollEndEventAtPosition; >+#endif > > PaintFrequencyTracker m_paintFrequencyTracker; > }; >diff --git a/Source/WebCore/rendering/RenderListBox.cpp b/Source/WebCore/rendering/RenderListBox.cpp >index b57477d2dc..341e881d2b 100644 >--- a/Source/WebCore/rendering/RenderListBox.cpp >+++ b/Source/WebCore/rendering/RenderListBox.cpp >@@ -743,7 +743,7 @@ int RenderListBox::scrollLeft() const > return 0; > } > >-void RenderListBox::setScrollLeft(int, ScrollType, ScrollClamping, bool) >+void RenderListBox::setScrollLeft(int, ScrollType, ScrollClamping, AnimatedScroll) > { > } > >@@ -760,7 +760,7 @@ static void setupWheelEventTestMonitor(RenderListBox& renderer) > renderer.scrollAnimator().setWheelEventTestMonitor(renderer.page().wheelEventTestMonitor()); > } > >-void RenderListBox::setScrollTop(int newTop, ScrollType, ScrollClamping, bool) >+void RenderListBox::setScrollTop(int newTop, ScrollType, ScrollClamping, AnimatedScroll) > { > // Determine an index and scroll to it. > int index = newTop / itemHeight(); >diff --git a/Source/WebCore/rendering/RenderListBox.h b/Source/WebCore/rendering/RenderListBox.h >index 8c5a8faf20..5f0261a323 100644 >--- a/Source/WebCore/rendering/RenderListBox.h >+++ b/Source/WebCore/rendering/RenderListBox.h >@@ -106,8 +106,8 @@ private: > int scrollTop() const override; > int scrollWidth() const override; > int scrollHeight() const override; >- void setScrollLeft(int, ScrollType, ScrollClamping, bool) override; >- void setScrollTop(int, ScrollType, ScrollClamping, bool) override; >+ void setScrollLeft(int, ScrollType, ScrollClamping, AnimatedScroll) override; >+ void setScrollTop(int, ScrollType, ScrollClamping, AnimatedScroll) override; > > bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) override; > >diff --git a/Source/WebCore/rendering/RenderObject.cpp b/Source/WebCore/rendering/RenderObject.cpp >index 8c144d651f..52c99c2684 100644 >--- a/Source/WebCore/rendering/RenderObject.cpp >+++ b/Source/WebCore/rendering/RenderObject.cpp >@@ -429,7 +429,11 @@ bool RenderObject::scrollRectToVisible(const LayoutRect& absoluteRect, bool insi > if (!enclosingLayer) > return false; > >+#if ENABLE(OVERSCROLL_EVENTS) >+ enclosingLayer->scrollRectToVisible(absoluteRect, insideFixed, options, RequestScrollEndEvent::Yes); >+#else > enclosingLayer->scrollRectToVisible(absoluteRect, insideFixed, options); >+#endif > return true; > } > >diff --git a/Source/WebCore/rendering/RenderTextControlSingleLine.cpp b/Source/WebCore/rendering/RenderTextControlSingleLine.cpp >index 74a80b0687..1660217309 100644 >--- a/Source/WebCore/rendering/RenderTextControlSingleLine.cpp >+++ b/Source/WebCore/rendering/RenderTextControlSingleLine.cpp >@@ -380,13 +380,13 @@ int RenderTextControlSingleLine::scrollTop() const > return RenderBlockFlow::scrollTop(); > } > >-void RenderTextControlSingleLine::setScrollLeft(int newLeft, ScrollType, ScrollClamping, bool) >+void RenderTextControlSingleLine::setScrollLeft(int newLeft, ScrollType, ScrollClamping, AnimatedScroll) > { > if (innerTextElement()) > innerTextElement()->setScrollLeft(newLeft); > } > >-void RenderTextControlSingleLine::setScrollTop(int newTop, ScrollType, ScrollClamping, bool) >+void RenderTextControlSingleLine::setScrollTop(int newTop, ScrollType, ScrollClamping, AnimatedScroll) > { > if (innerTextElement()) > innerTextElement()->setScrollTop(newTop); >diff --git a/Source/WebCore/rendering/RenderTextControlSingleLine.h b/Source/WebCore/rendering/RenderTextControlSingleLine.h >index fd633019ed..25a2c96d50 100644 >--- a/Source/WebCore/rendering/RenderTextControlSingleLine.h >+++ b/Source/WebCore/rendering/RenderTextControlSingleLine.h >@@ -57,8 +57,8 @@ private: > int scrollTop() const override; > int scrollWidth() const override; > int scrollHeight() const override; >- void setScrollLeft(int, ScrollType, ScrollClamping, bool) override; >- void setScrollTop(int, ScrollType, ScrollClamping, bool) override; >+ void setScrollLeft(int, ScrollType, ScrollClamping, AnimatedScroll) override; >+ void setScrollTop(int, ScrollType, ScrollClamping, AnimatedScroll) override; > bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1, Element** stopElement = nullptr, RenderBox* startBox = nullptr, const IntPoint& wheelEventAbsolutePoint = IntPoint()) final; > bool logicalScroll(ScrollLogicalDirection, ScrollGranularity, float multiplier = 1, Element** stopElement = 0) final; > >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 53aef8c85e..ec5ac7c984 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,17 @@ >+2020-03-09 Cathie Chen <cathiechen@igalia.com> >+ >+ Add support for overscroll events parsing >+ https://bugs.webkit.org/show_bug.cgi?id=208802 >+ >+ Reviewed by Frédéric Wang. >+ >+ Based on Frédéric Wang's patch. >+ >+ Add ENABLE_OVERSCROLL_EVENTS. >+ >+ * Configurations/FeatureDefines.xcconfig: >+ * Shared/WebPreferences.yaml: >+ > 2020-04-09 David Kilzer <ddkilzer@apple.com> > > UserData::decode should add bounds checks >diff --git a/Source/WebKit/Configurations/FeatureDefines.xcconfig b/Source/WebKit/Configurations/FeatureDefines.xcconfig >index a74b4a666f..69a4dbd061 100644 >--- a/Source/WebKit/Configurations/FeatureDefines.xcconfig >+++ b/Source/WebKit/Configurations/FeatureDefines.xcconfig >@@ -301,6 +301,8 @@ ENABLE_OFFSCREEN_CANVAS = ; > ENABLE_OVERFLOW_SCROLLING_TOUCH = $(ENABLE_OVERFLOW_SCROLLING_TOUCH_$(WK_COCOA_TOUCH)); > ENABLE_OVERFLOW_SCROLLING_TOUCH_cocoatouch = ENABLE_OVERFLOW_SCROLLING_TOUCH; > >+ENABLE_OVERSCROLL_EVENTS = ENABLE_OVERSCROLL_EVENTS; >+ > ENABLE_PAYMENT_REQUEST = ENABLE_PAYMENT_REQUEST; > > ENABLE_PICTURE_IN_PICTURE_API = $(ENABLE_PICTURE_IN_PICTURE_API_$(WK_PLATFORM_NAME)); >@@ -421,4 +423,4 @@ ENABLE_WIRELESS_PLAYBACK_TARGET = ENABLE_WIRELESS_PLAYBACK_TARGET; > > ENABLE_XSLT = ENABLE_XSLT; > >-FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCESSIBILITY_ISOLATED_TREE) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLE_PAY_SESSION_V9) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_CONIC_GRADIENTS) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_PAINTING_API) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CSS_TYPED_OM) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_C_LOOP) $(ENABLE_DARK_MODE_CSS) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_EDITABLE_REGION) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FULLSCREEN_API) $(ENABLE_PICTURE_IN_PICTURE_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_GPU_PROCESS) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INSPECTOR_ALTERNATE_DISPATCHERS) $(ENABLE_INSPECTOR_TELEMETRY) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_MEMORY_SAMPLER) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION) $(ENABLE_NETWORK_CACHE_STALE_WHILE_REVALIDATE) $(ENABLE_NOTIFICATIONS) $(ENABLE_OFFSCREEN_CANVAS) $(ENABLE_OVERFLOW_SCROLLING_TOUCH) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESIZE_OBSERVER) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_LOAD_STATISTICS) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SANDBOX_EXTENSIONS) $(ENABLE_SERVER_PRECONNECT) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SHAREABLE_RESOURCE) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USERSELECT_ALL) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEBDRIVER_MOUSE_INTERACTIONS) $(ENABLE_WEBDRIVER_KEYBOARD_INTERACTIONS) $(ENABLE_WEBDRIVER_TOUCH_INTERACTIONS) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WEBXR) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_CRYPTO) $(ENABLE_WEB_RTC) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >+FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCESSIBILITY_ISOLATED_TREE) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLE_PAY_SESSION_V9) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_CONIC_GRADIENTS) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_PAINTING_API) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CSS_TYPED_OM) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_C_LOOP) $(ENABLE_DARK_MODE_CSS) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_EDITABLE_REGION) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FULLSCREEN_API) $(ENABLE_PICTURE_IN_PICTURE_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_GPU_PROCESS) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INSPECTOR_ALTERNATE_DISPATCHERS) $(ENABLE_INSPECTOR_TELEMETRY) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_MEMORY_SAMPLER) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION) $(ENABLE_NETWORK_CACHE_STALE_WHILE_REVALIDATE) $(ENABLE_NOTIFICATIONS) $(ENABLE_OFFSCREEN_CANVAS) $(ENABLE_OVERFLOW_SCROLLING_TOUCH) $(ENABLE_OVERSCROLL_EVENTS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESIZE_OBSERVER) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_LOAD_STATISTICS) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SANDBOX_EXTENSIONS) $(ENABLE_SERVER_PRECONNECT) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SHAREABLE_RESOURCE) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USERSELECT_ALL) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEBDRIVER_MOUSE_INTERACTIONS) $(ENABLE_WEBDRIVER_KEYBOARD_INTERACTIONS) $(ENABLE_WEBDRIVER_TOUCH_INTERACTIONS) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WEBXR) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_CRYPTO) $(ENABLE_WEB_RTC) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >diff --git a/Source/WebKit/Shared/WebPreferences.yaml b/Source/WebKit/Shared/WebPreferences.yaml >index f5448376a3..c2a5c0c6ca 100644 >--- a/Source/WebKit/Shared/WebPreferences.yaml >+++ b/Source/WebKit/Shared/WebPreferences.yaml >@@ -1573,6 +1573,14 @@ AspectRatioOfImgFromWidthAndHeightEnabled: > humanReadableDescription: "Map HTML attributes width/height to the default aspect ratio of <img>" > category: experimental > >+OverscrollEventsEnabled: >+ type: bool >+ defaultValue: false >+ humanReadableName: "Overscroll events" >+ humanReadableDescription: "Enable the onscrollend and scrollend events" >+ category: experimental >+ condition: ENABLE(OVERSCROLL_EVENTS) >+ > # For internal features: > # The type should be boolean. > # You must provide a humanReadableName and humanReadableDescription for all debug features. They >diff --git a/Source/WebKitLegacy/mac/ChangeLog b/Source/WebKitLegacy/mac/ChangeLog >index 604b159839..e2506a1198 100644 >--- a/Source/WebKitLegacy/mac/ChangeLog >+++ b/Source/WebKitLegacy/mac/ChangeLog >@@ -1,3 +1,23 @@ >+2020-03-09 Cathie Chen <cathiechen@igalia.com> >+ >+ Add support for overscroll events parsing >+ https://bugs.webkit.org/show_bug.cgi?id=208802 >+ >+ Reviewed by Frédéric Wang. >+ >+ Based on Frédéric Wang's patch. >+ >+ Add overscrollEventsEnabled WebPreference setting. >+ >+ * Configurations/FeatureDefines.xcconfig: >+ * WebView/WebPreferenceKeysPrivate.h: >+ * WebView/WebPreferences.mm: >+ (+[WebPreferences initialize]): >+ (-[WebPreferences overscrollEventsEnabled]): >+ (-[WebPreferences setOverscrollEventsEnabled:]): >+ * WebView/WebPreferencesPrivate.h: >+ * WebView/WebView.mm: >+ > 2020-04-08 Daniel Bates <dabates@apple.com> > > Track editable elements on screen >diff --git a/Source/WebKitLegacy/mac/Configurations/FeatureDefines.xcconfig b/Source/WebKitLegacy/mac/Configurations/FeatureDefines.xcconfig >index a74b4a666f..69a4dbd061 100644 >--- a/Source/WebKitLegacy/mac/Configurations/FeatureDefines.xcconfig >+++ b/Source/WebKitLegacy/mac/Configurations/FeatureDefines.xcconfig >@@ -301,6 +301,8 @@ ENABLE_OFFSCREEN_CANVAS = ; > ENABLE_OVERFLOW_SCROLLING_TOUCH = $(ENABLE_OVERFLOW_SCROLLING_TOUCH_$(WK_COCOA_TOUCH)); > ENABLE_OVERFLOW_SCROLLING_TOUCH_cocoatouch = ENABLE_OVERFLOW_SCROLLING_TOUCH; > >+ENABLE_OVERSCROLL_EVENTS = ENABLE_OVERSCROLL_EVENTS; >+ > ENABLE_PAYMENT_REQUEST = ENABLE_PAYMENT_REQUEST; > > ENABLE_PICTURE_IN_PICTURE_API = $(ENABLE_PICTURE_IN_PICTURE_API_$(WK_PLATFORM_NAME)); >@@ -421,4 +423,4 @@ ENABLE_WIRELESS_PLAYBACK_TARGET = ENABLE_WIRELESS_PLAYBACK_TARGET; > > ENABLE_XSLT = ENABLE_XSLT; > >-FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCESSIBILITY_ISOLATED_TREE) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLE_PAY_SESSION_V9) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_CONIC_GRADIENTS) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_PAINTING_API) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CSS_TYPED_OM) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_C_LOOP) $(ENABLE_DARK_MODE_CSS) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_EDITABLE_REGION) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FULLSCREEN_API) $(ENABLE_PICTURE_IN_PICTURE_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_GPU_PROCESS) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INSPECTOR_ALTERNATE_DISPATCHERS) $(ENABLE_INSPECTOR_TELEMETRY) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_MEMORY_SAMPLER) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION) $(ENABLE_NETWORK_CACHE_STALE_WHILE_REVALIDATE) $(ENABLE_NOTIFICATIONS) $(ENABLE_OFFSCREEN_CANVAS) $(ENABLE_OVERFLOW_SCROLLING_TOUCH) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESIZE_OBSERVER) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_LOAD_STATISTICS) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SANDBOX_EXTENSIONS) $(ENABLE_SERVER_PRECONNECT) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SHAREABLE_RESOURCE) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USERSELECT_ALL) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEBDRIVER_MOUSE_INTERACTIONS) $(ENABLE_WEBDRIVER_KEYBOARD_INTERACTIONS) $(ENABLE_WEBDRIVER_TOUCH_INTERACTIONS) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WEBXR) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_CRYPTO) $(ENABLE_WEB_RTC) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >+FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCESSIBILITY_ISOLATED_TREE) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLE_PAY_SESSION_V9) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_CONIC_GRADIENTS) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_PAINTING_API) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CSS_TYPED_OM) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_C_LOOP) $(ENABLE_DARK_MODE_CSS) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_EDITABLE_REGION) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FULLSCREEN_API) $(ENABLE_PICTURE_IN_PICTURE_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_GPU_PROCESS) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INSPECTOR_ALTERNATE_DISPATCHERS) $(ENABLE_INSPECTOR_TELEMETRY) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_MEMORY_SAMPLER) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION) $(ENABLE_NETWORK_CACHE_STALE_WHILE_REVALIDATE) $(ENABLE_NOTIFICATIONS) $(ENABLE_OFFSCREEN_CANVAS) $(ENABLE_OVERFLOW_SCROLLING_TOUCH) $(ENABLE_OVERSCROLL_EVENTS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESIZE_OBSERVER) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_LOAD_STATISTICS) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SANDBOX_EXTENSIONS) $(ENABLE_SERVER_PRECONNECT) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SHAREABLE_RESOURCE) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USERSELECT_ALL) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEBDRIVER_MOUSE_INTERACTIONS) $(ENABLE_WEBDRIVER_KEYBOARD_INTERACTIONS) $(ENABLE_WEBDRIVER_TOUCH_INTERACTIONS) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WEBXR) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_CRYPTO) $(ENABLE_WEB_RTC) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >diff --git a/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h b/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h >index 77b3989502..85f13565e8 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h >+++ b/Source/WebKitLegacy/mac/WebView/WebPreferenceKeysPrivate.h >@@ -210,6 +210,7 @@ > #define WebKitCSSShadowPartsEnabledPreferenceKey @"WebKitCSSShadowPartsEnabled" > #define WebKitLayoutFormattingContextIntegrationEnabledPreferenceKey @"WebKitLayoutFormattingContextIntegrationEnabled" > #define WebKitWebSQLEnabledPreferenceKey @"WebKitWebSQLEnabled" >+#define WebKitOverscrollEventsEnabledPreferenceKey @"WebKitOverscrollEventsEnabled" > > #if !TARGET_OS_IPHONE > // These are private both because callers should be using the cover methods and because the >diff --git a/Source/WebKitLegacy/mac/WebView/WebPreferences.mm b/Source/WebKitLegacy/mac/WebView/WebPreferences.mm >index 0279394308..c47aa1c03c 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebPreferences.mm >+++ b/Source/WebKitLegacy/mac/WebView/WebPreferences.mm >@@ -714,6 +714,9 @@ public: > @NO, WebKitAspectRatioOfImgFromWidthAndHeightEnabledPreferenceKey, > @NO, WebKitWebSQLEnabledPreferenceKey, > @YES, WebKitDebugNeedsInAppBrowserPrivacyQuirksPreferenceKey, >+#if ENABLE(OVERSCROLL_EVENTS) >+ @NO, WebKitOverscrollEventsEnabledPreferenceKey, >+#endif > nil]; > > #if !PLATFORM(IOS_FAMILY) >@@ -3680,6 +3683,16 @@ static NSString *classIBCreatorID = nil; > [self _setBoolValue:webSQLEnabled forKey:WebKitWebSQLEnabledPreferenceKey]; > } > >+- (BOOL)overscrollEventsEnabled >+{ >+ return [self _boolValueForKey:WebKitOverscrollEventsEnabledPreferenceKey]; >+} >+ >+- (void)setOverscrollEventsEnabled:(BOOL)flag >+{ >+ [self _setBoolValue:flag forKey:WebKitOverscrollEventsEnabledPreferenceKey]; >+} >+ > @end > > @implementation WebPreferences (WebInternal) >diff --git a/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h b/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h >index a84549d4ab..7ff7319d87 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h >+++ b/Source/WebKitLegacy/mac/WebView/WebPreferencesPrivate.h >@@ -688,6 +688,7 @@ extern NSString *WebPreferencesCacheModelChangedInternalNotification WEBKIT_DEPR > @property (nonatomic) BOOL asyncClipboardAPIEnabled; > @property (nonatomic) BOOL linkPreloadResponsiveImagesEnabled; > @property (nonatomic) BOOL aspectRatioOfImgFromWidthAndHeightEnabled; >+@property (nonatomic) BOOL overscrollEventsEnabled; > > #if TARGET_OS_IPHONE > @property (nonatomic) BOOL quickLookDocumentSavingEnabled; >diff --git a/Source/WebKitLegacy/mac/WebView/WebView.mm b/Source/WebKitLegacy/mac/WebView/WebView.mm >index d11777db6e..f064557c09 100644 >--- a/Source/WebKitLegacy/mac/WebView/WebView.mm >+++ b/Source/WebKitLegacy/mac/WebView/WebView.mm >@@ -3015,6 +3015,9 @@ static bool needsSelfRetainWhileLoadingQuirk() > settings.setCSSOMViewScrollingAPIEnabled([preferences CSSOMViewScrollingAPIEnabled]); > settings.setCSSOMViewSmoothScrollingEnabled([preferences CSSOMViewSmoothScrollingEnabled]); > settings.setMediaContentTypesRequiringHardwareSupport([preferences mediaContentTypesRequiringHardwareSupport]); >+#if ENABLE(OVERSCROLL_EVENTS) >+ settings.setOverscrollEventsEnabled([preferences overscrollEventsEnabled]); >+#endif > > switch ([preferences storageBlockingPolicy]) { > case WebAllowAllStorage: >diff --git a/Source/WebKitLegacy/win/ChangeLog b/Source/WebKitLegacy/win/ChangeLog >index 804be5a44a..1d28ba4199 100644 >--- a/Source/WebKitLegacy/win/ChangeLog >+++ b/Source/WebKitLegacy/win/ChangeLog >@@ -1,3 +1,24 @@ >+2020-03-09 Cathie Chen <cathiechen@igalia.com> >+ >+ Add support for overscroll events parsing >+ https://bugs.webkit.org/show_bug.cgi?id=208802 >+ >+ Reviewed by Frédéric Wang. >+ >+ Based on Frédéric Wang's patch. >+ >+ Add overscrollEventsEnabled WebPreference setting. >+ >+ * Interfaces/IWebPreferencesPrivate.idl: >+ * WebPreferenceKeysPrivate.h: >+ * WebPreferences.cpp: >+ (WebPreferences::initializeDefaultSettings): >+ (WebPreferences::overscrollEventsEnabled): >+ (WebPreferences::setOverscrollEventsEnabled): >+ * WebPreferences.h: >+ * WebView.cpp: >+ (WebView::notifyPreferencesChanged): >+ > 2020-04-08 Daniel Bates <dabates@apple.com> > > Should find touch-action elements inside non-composited iframes >diff --git a/Source/WebKitLegacy/win/Interfaces/IWebPreferencesPrivate.idl b/Source/WebKitLegacy/win/Interfaces/IWebPreferencesPrivate.idl >index dffd94dd86..65cf3ad97f 100644 >--- a/Source/WebKitLegacy/win/Interfaces/IWebPreferencesPrivate.idl >+++ b/Source/WebKitLegacy/win/Interfaces/IWebPreferencesPrivate.idl >@@ -265,4 +265,7 @@ interface IWebPreferencesPrivate8 : IWebPreferencesPrivate7 > { > HRESULT allowTopNavigationToDataURLs([out, retval] BOOL* enabled); > HRESULT setAllowTopNavigationToDataURLs([in] BOOL enabled); >+ HRESULT overscrollEventsEnabled([out, retval] BOOL*); >+ HRESULT setOverscrollEventsEnabled([in] BOOL enabled); >+ > } >diff --git a/Source/WebKitLegacy/win/WebPreferenceKeysPrivate.h b/Source/WebKitLegacy/win/WebPreferenceKeysPrivate.h >index 17bcf9be18..04aeb6c7ba 100644 >--- a/Source/WebKitLegacy/win/WebPreferenceKeysPrivate.h >+++ b/Source/WebKitLegacy/win/WebPreferenceKeysPrivate.h >@@ -227,3 +227,5 @@ > #define WebKitAspectRatioOfImgFromWidthAndHeightEnabledPreferenceKey "WebKitAspectRatioOfImgFromWidthAndHeightEnabled" > > #define WebKitWebSQLEnabledPreferenceKey "WebKitWebSQLEnabled" >+ >+#define WebKitOverscrollEventsEnabledPreferenceKey "WebKitOverscrollEventsEnabled" >diff --git a/Source/WebKitLegacy/win/WebPreferences.cpp b/Source/WebKitLegacy/win/WebPreferences.cpp >index dd29e9236c..184b2c8b8d 100644 >--- a/Source/WebKitLegacy/win/WebPreferences.cpp >+++ b/Source/WebKitLegacy/win/WebPreferences.cpp >@@ -354,6 +354,8 @@ void WebPreferences::initializeDefaultSettings() > > CFDictionaryAddValue(defaults, CFSTR(WebKitWebSQLEnabledPreferenceKey), kCFBooleanFalse); > >+ CFDictionaryAddValue(defaults, CFSTR(WebKitOverscrollEventsEnabledPreferenceKey), kCFBooleanFalse); >+ > defaultSettings = defaults; > #endif > } >@@ -2470,6 +2472,20 @@ HRESULT WebPreferences::setWebSQLEnabled(BOOL enabled) > return S_OK; > } > >+HRESULT WebPreferences::overscrollEventsEnabled(_Out_ BOOL* enabled) >+{ >+ if (!enabled) >+ return E_POINTER; >+ *enabled = boolValueForKey(WebKitOverscrollEventsEnabledPreferenceKey); >+ return S_OK; >+} >+ >+HRESULT WebPreferences::setOverscrollEventsEnabled(BOOL enabled) >+{ >+ setBoolValue(WebKitOverscrollEventsEnabledPreferenceKey, enabled); >+ return S_OK; >+} >+ > HRESULT WebPreferences::allowTopNavigationToDataURLs(_Out_ BOOL* allowAccess) > { > if (!allowAccess) >diff --git a/Source/WebKitLegacy/win/WebPreferences.h b/Source/WebKitLegacy/win/WebPreferences.h >index a31ba03a82..7098ee1192 100644 >--- a/Source/WebKitLegacy/win/WebPreferences.h >+++ b/Source/WebKitLegacy/win/WebPreferences.h >@@ -307,6 +307,8 @@ public: > // IWebPreferencesPrivate8 > virtual HRESULT STDMETHODCALLTYPE allowTopNavigationToDataURLs(_Out_ BOOL*); > virtual HRESULT STDMETHODCALLTYPE setAllowTopNavigationToDataURLs(BOOL); >+ virtual HRESULT STDMETHODCALLTYPE overscrollEventsEnabled(_Out_ BOOL*); >+ virtual HRESULT STDMETHODCALLTYPE setOverscrollEventsEnabled(BOOL); > > // WebPreferences > >diff --git a/Source/WebKitLegacy/win/WebView.cpp b/Source/WebKitLegacy/win/WebView.cpp >index 9bce368adb..2158710a36 100644 >--- a/Source/WebKitLegacy/win/WebView.cpp >+++ b/Source/WebKitLegacy/win/WebView.cpp >@@ -5670,6 +5670,11 @@ HRESULT WebView::notifyPreferencesChanged(IWebNotification* notification) > return hr; > settings.setAspectRatioOfImgFromWidthAndHeightEnabled(!!enabled); > >+ hr = prefsPrivate->overscrollEventsEnabled(&enabled); >+ if (FAILED(hr)) >+ return hr; >+ settings.setOverscrollEventsEnabled(!!enabled); >+ > return S_OK; > } > >diff --git a/Source/cmake/WebKitFeatures.cmake b/Source/cmake/WebKitFeatures.cmake >index fd93c85245..b2ef885f04 100644 >--- a/Source/cmake/WebKitFeatures.cmake >+++ b/Source/cmake/WebKitFeatures.cmake >@@ -180,6 +180,7 @@ macro(WEBKIT_OPTION_BEGIN) > WEBKIT_OPTION_DEFINE(ENABLE_OFFSCREEN_CANVAS "Toggle OffscreenCanvas support" PRIVATE OFF) > WEBKIT_OPTION_DEFINE(ENABLE_ORIENTATION_EVENTS "Toggle Orientation Events support" PRIVATE OFF) > WEBKIT_OPTION_DEFINE(ENABLE_OVERFLOW_SCROLLING_TOUCH "Toggle accelerated scrolling support" PRIVATE OFF) >+ WEBKIT_OPTION_DEFINE(ENABLE_OVERSCROLL_EVENTS "Toggle overscroll events" PRIVATE OFF) > WEBKIT_OPTION_DEFINE(ENABLE_PAYMENT_REQUEST "Toggle Payment Request support" PRIVATE OFF) > WEBKIT_OPTION_DEFINE(ENABLE_PDFKIT_PLUGIN "Toggle PDFKit plugin support" PRIVATE OFF) > WEBKIT_OPTION_DEFINE(ENABLE_PICTURE_IN_PICTURE_API "Toggle Picture-in-Picture API support" PRIVATE OFF) >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index d4566cd88e..e70acbf4b1 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,23 @@ >+2020-03-09 Cathie Chen <cathiechen@igalia.com> >+ >+ Add support for overscroll events parsing >+ https://bugs.webkit.org/show_bug.cgi?id=208802 >+ >+ Reviewed by Frédéric Wang. >+ >+ Based on Frédéric Wang's patch. >+ >+ Deal with overscrollEventsEnabled. >+ >+ * DumpRenderTree/TestOptions.cpp: >+ (TestOptions::TestOptions): >+ * DumpRenderTree/TestOptions.h: >+ * DumpRenderTree/mac/DumpRenderTree.mm: >+ (enableExperimentalFeatures): >+ (setWebPreferencesForTestOptions): >+ * Scripts/webkitperl/FeatureList.pm: >+ * TestWebKitAPI/Configurations/FeatureDefines.xcconfig: >+ > 2020-04-09 Aakash Jain <aakash_jain@apple.com> > > [ews] rename CompileWebKitToT to CompileWebKitWithoutPatch >diff --git a/Tools/DumpRenderTree/TestOptions.cpp b/Tools/DumpRenderTree/TestOptions.cpp >index 290606a255..a312215ad3 100644 >--- a/Tools/DumpRenderTree/TestOptions.cpp >+++ b/Tools/DumpRenderTree/TestOptions.cpp >@@ -156,6 +156,8 @@ TestOptions::TestOptions(const std::string& pathOrURL, const std::string& absolu > enableAspectRatioOfImgFromWidthAndHeight = parseBooleanTestHeaderValue(value); > else if (key == "allowTopNavigationToDataURLs") > allowTopNavigationToDataURLs = parseBooleanTestHeaderValue(value); >+ else if (key == "experimental:OverscrollEventsEnabled") >+ enableOverscrollEvents = parseBooleanTestHeaderValue(value); > pairStart = pairEnd + 1; > } > } >diff --git a/Tools/DumpRenderTree/TestOptions.h b/Tools/DumpRenderTree/TestOptions.h >index ae4ba4ad5d..01cf3460a0 100644 >--- a/Tools/DumpRenderTree/TestOptions.h >+++ b/Tools/DumpRenderTree/TestOptions.h >@@ -58,6 +58,7 @@ struct TestOptions { > bool enableAspectRatioOfImgFromWidthAndHeight { false }; > bool enableWebSQL { true }; > bool allowTopNavigationToDataURLs { true }; >+ bool enableOverscrollEvents { false }; > std::string jscOptions; > std::string additionalSupportedImageTypes; > >diff --git a/Tools/DumpRenderTree/mac/DumpRenderTree.mm b/Tools/DumpRenderTree/mac/DumpRenderTree.mm >index 0b74449521..0ed31fb60c 100644 >--- a/Tools/DumpRenderTree/mac/DumpRenderTree.mm >+++ b/Tools/DumpRenderTree/mac/DumpRenderTree.mm >@@ -886,6 +886,7 @@ static void enableExperimentalFeatures(WebPreferences* preferences) > [preferences setCSSShadowPartsEnabled:YES]; > [preferences setAspectRatioOfImgFromWidthAndHeightEnabled:YES]; > [preferences setCSSOMViewSmoothScrollingEnabled:YES]; >+ [preferences setOverscrollEventsEnabled:YES]; > } > > // Called before each test. >@@ -1044,6 +1045,7 @@ static void setWebPreferencesForTestOptions(const TestOptions& options) > preferences.layoutFormattingContextIntegrationEnabled = options.layoutFormattingContextIntegrationEnabled; > preferences.aspectRatioOfImgFromWidthAndHeightEnabled = options.enableAspectRatioOfImgFromWidthAndHeight; > preferences.allowTopNavigationToDataURLs = options.allowTopNavigationToDataURLs; >+ preferences.overscrollEventsEnabled = options.enableOverscrollEvents; > } > > // Called once on DumpRenderTree startup. >diff --git a/Tools/Scripts/webkitperl/FeatureList.pm b/Tools/Scripts/webkitperl/FeatureList.pm >index f730519136..2be06330ef 100644 >--- a/Tools/Scripts/webkitperl/FeatureList.pm >+++ b/Tools/Scripts/webkitperl/FeatureList.pm >@@ -137,6 +137,7 @@ my ( > $offscreenCanvasSupport, > $orientationEventsSupport, > $overflowScrollingTouchSupport, >+ $overscrollEventsSupport, > $paymentRequestSupport, > $pdfkitPluginSupport, > $pictureInPictureAPISupport, >@@ -460,6 +461,9 @@ my @features = ( > { option => "overflow-scrolling-touch", desc => "Toggle accelerated scrolling support", > define => "ENABLE_OVERFLOW_SCROLLING_TOUCH", value => \$overflowScrollingTouchSupport }, > >+ { option => "overscroll-events", desc => "Enable Overscroll Events support", >+ define => "ENABLE_OVERSCROLL_EVENTS", value => \$overscrollEventsSupport }, >+ > { option => "payment-request", desc => "Toggle Payment Request support", > define => "ENABLE_PAYMENT_REQUEST", value => \$paymentRequestSupport }, > >diff --git a/Tools/TestWebKitAPI/Configurations/FeatureDefines.xcconfig b/Tools/TestWebKitAPI/Configurations/FeatureDefines.xcconfig >index a74b4a666f..69a4dbd061 100644 >--- a/Tools/TestWebKitAPI/Configurations/FeatureDefines.xcconfig >+++ b/Tools/TestWebKitAPI/Configurations/FeatureDefines.xcconfig >@@ -301,6 +301,8 @@ ENABLE_OFFSCREEN_CANVAS = ; > ENABLE_OVERFLOW_SCROLLING_TOUCH = $(ENABLE_OVERFLOW_SCROLLING_TOUCH_$(WK_COCOA_TOUCH)); > ENABLE_OVERFLOW_SCROLLING_TOUCH_cocoatouch = ENABLE_OVERFLOW_SCROLLING_TOUCH; > >+ENABLE_OVERSCROLL_EVENTS = ENABLE_OVERSCROLL_EVENTS; >+ > ENABLE_PAYMENT_REQUEST = ENABLE_PAYMENT_REQUEST; > > ENABLE_PICTURE_IN_PICTURE_API = $(ENABLE_PICTURE_IN_PICTURE_API_$(WK_PLATFORM_NAME)); >@@ -421,4 +423,4 @@ ENABLE_WIRELESS_PLAYBACK_TARGET = ENABLE_WIRELESS_PLAYBACK_TARGET; > > ENABLE_XSLT = ENABLE_XSLT; > >-FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCESSIBILITY_ISOLATED_TREE) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLE_PAY_SESSION_V9) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_CONIC_GRADIENTS) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_PAINTING_API) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CSS_TYPED_OM) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_C_LOOP) $(ENABLE_DARK_MODE_CSS) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_EDITABLE_REGION) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FULLSCREEN_API) $(ENABLE_PICTURE_IN_PICTURE_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_GPU_PROCESS) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INSPECTOR_ALTERNATE_DISPATCHERS) $(ENABLE_INSPECTOR_TELEMETRY) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_MEMORY_SAMPLER) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION) $(ENABLE_NETWORK_CACHE_STALE_WHILE_REVALIDATE) $(ENABLE_NOTIFICATIONS) $(ENABLE_OFFSCREEN_CANVAS) $(ENABLE_OVERFLOW_SCROLLING_TOUCH) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESIZE_OBSERVER) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_LOAD_STATISTICS) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SANDBOX_EXTENSIONS) $(ENABLE_SERVER_PRECONNECT) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SHAREABLE_RESOURCE) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USERSELECT_ALL) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEBDRIVER_MOUSE_INTERACTIONS) $(ENABLE_WEBDRIVER_KEYBOARD_INTERACTIONS) $(ENABLE_WEBDRIVER_TOUCH_INTERACTIONS) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WEBXR) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_CRYPTO) $(ENABLE_WEB_RTC) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >+FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCESSIBILITY_ISOLATED_TREE) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLE_PAY_SESSION_V9) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_CONIC_GRADIENTS) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_PAINTING_API) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CSS_TYPED_OM) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_C_LOOP) $(ENABLE_DARK_MODE_CSS) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_EDITABLE_REGION) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FULLSCREEN_API) $(ENABLE_PICTURE_IN_PICTURE_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_GPU_PROCESS) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INSPECTOR_ALTERNATE_DISPATCHERS) $(ENABLE_INSPECTOR_TELEMETRY) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_MEMORY_SAMPLER) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION) $(ENABLE_NETWORK_CACHE_STALE_WHILE_REVALIDATE) $(ENABLE_NOTIFICATIONS) $(ENABLE_OFFSCREEN_CANVAS) $(ENABLE_OVERFLOW_SCROLLING_TOUCH) $(ENABLE_OVERSCROLL_EVENTS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESIZE_OBSERVER) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_LOAD_STATISTICS) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SANDBOX_EXTENSIONS) $(ENABLE_SERVER_PRECONNECT) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SHAREABLE_RESOURCE) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USERSELECT_ALL) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEBDRIVER_MOUSE_INTERACTIONS) $(ENABLE_WEBDRIVER_KEYBOARD_INTERACTIONS) $(ENABLE_WEBDRIVER_TOUCH_INTERACTIONS) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WEBXR) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_CRYPTO) $(ENABLE_WEB_RTC) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 209134
:
393744
|
393745
|
393746
|
393747
|
395799
|
395800
|
395801
|
395802
|
395805
|
395806
|
395939
|
395940
|
395943
|
395944
|
396058
|
396059
|
396062
|
399465
|
399466