haikuwebkit/Source/WebCore/page/RenderingUpdateScheduler.h

74 lines
2.4 KiB
C
Raw Permalink Normal View History

[Web Animations] Ensure animations are updated prior to requestAnimationFrame callbacks https://bugs.webkit.org/show_bug.cgi?id=186997 <rdar://problem/41419414> Reviewed by Dean Jackson. LayoutTests/imported/mozilla: Mark progressions in the Mozilla CSS Animations tests. * css-animations/test_animation-pausing-expected.txt: Source/WebCore: Some sub-tests of imported/mozilla/css-animations/test_animation-pausing.html clearly expect that animations would be resolved prior to firing a requestAnimationFrame() callback, as the HTML5 event loop mandates. But until now, both DocumentTimeline and ScriptedAnimationController would make calls to DisplayRefreshMonitorManager::scheduleAnimation() that were not coordinated and so the order in which the DocumentTimeline and ScriptedAnimationController callbacks were performed was not guaranteed. In this patch we add a new DocumentAnimationScheduler class which is created by a Document to manage this specific situation. Now DocumentTimeline and ScriptedAnimationController use this supporting object instead of being their own DisplayRefreshMonitorClient and call scheduleWebAnimationsResolution() and scheduleScriptedAnimationResolution() respectively to indicate the need to schedule an animation through the DisplayRefreshMonitorManager to serve the specific needs of either, or both, classes. Then DocumentAnimationScheduler ensures that Web Animations resolution happens prior to requestAnimationFrame callbacks when both are scheduled. In the future we should be able to move more code from DocumentTimeline and ScriptedAnimationController over to DocumentAnimationScheduler, such as support for throttling and using a timer-based fallback, but this patch provides the minimal functionality required to provide a sounder foundation. * Modules/webvr/VRDisplay.cpp: (WebCore::VRDisplay::requestAnimationFrame): * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * animation/DocumentAnimationScheduler.cpp: Added. (WebCore::DocumentAnimationScheduler::create): (WebCore::DocumentAnimationScheduler::DocumentAnimationScheduler): (WebCore::DocumentAnimationScheduler::detachFromDocument): (WebCore::DocumentAnimationScheduler::scheduleWebAnimationsResolution): (WebCore::DocumentAnimationScheduler::scheduleScriptedAnimationResolution): (WebCore::DocumentAnimationScheduler::displayRefreshFired): (WebCore::DocumentAnimationScheduler::windowScreenDidChange): (WebCore::DocumentAnimationScheduler::createDisplayRefreshMonitor const): * animation/DocumentAnimationScheduler.h: Copied from Source/WebCore/animation/CSSAnimation.h. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::create): (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::windowScreenDidChange): Deleted. (WebCore::DocumentTimeline::createDisplayRefreshMonitor const): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::prepareForDestruction): (WebCore::Document::windowScreenDidChange): (WebCore::Document::requestAnimationFrame): (WebCore::Document::animationScheduler): (WebCore::Document::timeline): * dom/Document.h: * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::ScriptedAnimationController): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): (WebCore::ScriptedAnimationController::windowScreenDidChange): Deleted. (WebCore::ScriptedAnimationController::displayRefreshFired): Deleted. (WebCore::ScriptedAnimationController::createDisplayRefreshMonitor const): Deleted. * dom/ScriptedAnimationController.h: (WebCore::ScriptedAnimationController::create): Canonical link: https://commits.webkit.org/202231@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233140 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-06-25 09:54:34 +00:00
/*
Throttling requestAnimationFrame should be controlled by RenderingUpdateScheduler https://bugs.webkit.org/show_bug.cgi?id=204713 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2020-05-04 Reviewed by Simon Fraser. Source/WebCore: rAF and Page rendering were managed by two different timers. Throttling rAF was implemented by changing its timer. After r242624, RenderingUpdate steps have been managed by RenderingUpdateScheduler. This means rAF is now serviced by the preferredFramesPerSecond which is 60 fps regardless it's throttled or not. Moreover the rAF throttling timer was mistakenly kept and it has been running under the old assumption which is: rAF is serviced by a timer only. This means rAF will be serviced by its timer and by the RenderingUpdate steps at the same time when it is supposed to throttle. This will make it fire more than 60 fps in cases which it is supposed to run less than 60 fps. The solution is to have two throttling types: 1) Page throttling (or full throttling): This slows down all the steps of RenderingUpdate for the main document and all the sub-documents. Page throttling reasons are: -- VisuallyIdle: Aggressive throttling. -- LowPowerMode: Half speed throttling. 2) Document throttling (or partial throttling): This only slows down the rAF of a certain document. Document throttling reasons are: -- OutsideViewport: Aggressive throttling. -- NonInteractedCrossOriginFrame: Half speed throttling. RenderingUpdate steps will still be managed by RenderingUpdateScheduler which can be throttled. The assumption is none of these steps will need to run faster than the Page preferredFramesPerSecond. If rAF wants to run slower than the Page because of a Document throttling reason, no rAF callbacks will be serviced before its preferredFrameInterval has elapsed. In this patch, "Half speed throttling" is only implemented for the Page and the Document throttling. The "Aggressive throttling" will be done in following patches. Page rendering was never throttled before. We need to make sure this is not going to affect PLT. Some tests need to be changed and new tests need to be written. All of the throttling tests checks the state of the code but none of them checks the real user's experience. * Headers.cmake: * WebCore.xcodeproj/project.pbxproj: * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::animationInterval const): (WebCore::DocumentTimeline::updateThrottlingState): Deleted. * animation/DocumentTimeline.h: There is no need to have DocumentTimeline throttling. It is already throttled when the page RenderingUpdate is throttled. * dom/Document.cpp: (WebCore::Document::requestAnimationFrame): (WebCore::Document::updateLastHandledUserGestureTimestamp): LowPowerMode throttling is now handled by the Page. So remove its handling from the Document. * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::ScriptedAnimationController): (WebCore::ScriptedAnimationController::page const): (WebCore::ScriptedAnimationController::interval const): (WebCore::ScriptedAnimationController::preferredScriptedAnimationInterval const): (WebCore::ScriptedAnimationController::throttlingReasons const): (WebCore::ScriptedAnimationController::isThrottledRelativeToPage const): (WebCore::ScriptedAnimationController::shouldRescheduleRequestAnimationFrame const): (WebCore::ScriptedAnimationController::registerCallback): (WebCore::ScriptedAnimationController::cancelCallback): (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::throttlingReasonToString): Deleted. (WebCore::throttlingReasonsToString): Deleted. (WebCore::ScriptedAnimationController::addThrottlingReason): Deleted. (WebCore::ScriptedAnimationController::removeThrottlingReason): Deleted. (WebCore::ScriptedAnimationController::isThrottled const): Deleted. (WebCore::ScriptedAnimationController::animationTimerFired): Deleted. * dom/ScriptedAnimationController.h: (WebCore::ScriptedAnimationController::addThrottlingReason): (WebCore::ScriptedAnimationController::removeThrottlingReason): Get rid of the rAF throttling timer. Service the rAF callback only when the period from the current time stamp till the last service time stamp is greater than the preferred rAF interval. * page/FrameView.cpp: (WebCore::FrameView::updateScriptedAnimationsAndTimersThrottlingState): ThrottlingReason is now defined outside ScriptedAnimationController. * page/Page.cpp: (WebCore::m_loadsFromNetwork): (WebCore::Page::setLowPowerModeEnabledOverrideForTesting): (WebCore::Page::preferredRenderingUpdateInterval const): Calculate the preferred RenderingUpdate interval from the throttling reasons. (WebCore::Page::setIsVisuallyIdleInternal): (WebCore::Page::handleLowModePowerChange): Call adjustRenderingUpdateFrequency() when isLowPowerModeEnabled or IsVisuallyIdle is toggled. (WebCore::Page::isLowPowerModeEnabled const): Deleted. (WebCore::updateScriptedAnimationsThrottlingReason): Deleted. * page/Page.h: (WebCore::Page::isLowPowerModeEnabled const): (WebCore::Page::throttlingReasons const): (WebCore::Page::canUpdateThrottlingReason const): * page/RenderingUpdateScheduler.cpp: (WebCore::RenderingUpdateScheduler::setPreferredFramesPerSecond): (WebCore::RenderingUpdateScheduler::scheduleAnimation): (WebCore::RenderingUpdateScheduler::adjustRenderingUpdateFrequency): Change the preferredFramesPerSecond of the DisplayRefreshMonitor if the throttling is not aggressive e.g. 10_s. Otherwise use the timer. (WebCore::RenderingUpdateScheduler::scheduleTimedRenderingUpdate): Call adjustFramesPerSecond() when DisplayRefreshMonitor is created. (WebCore::RenderingUpdateScheduler::startTimer): * page/RenderingUpdateScheduler.h: * platform/graphics/AnimationFrameRate.h: Added. (WebCore::preferredFrameInterval): (WebCore::preferredFramesPerSecond): (WebCore::operator<<): Push names of ThrottlingReasons to a TextStream. * platform/graphics/DisplayRefreshMonitor.h: (WebCore::DisplayRefreshMonitor::setPreferredFramesPerSecond): * platform/graphics/DisplayRefreshMonitorManager.cpp: (WebCore::DisplayRefreshMonitorManager::monitorForClient): Rename createMonitorForClient() to monitorForClient() since it may return a cached DisplayRefreshMonitor. (WebCore::DisplayRefreshMonitorManager::setPreferredFramesPerSecond): (WebCore::DisplayRefreshMonitorManager::scheduleAnimation): (WebCore::DisplayRefreshMonitorManager::windowScreenDidChange): No need to call registerClient(). This function was just ensuring the DisplayRefreshMonitor is created. scheduleAnimation() does the same thing. (WebCore::DisplayRefreshMonitorManager::createMonitorForClient): Deleted. (WebCore::DisplayRefreshMonitorManager::registerClient): Deleted. * platform/graphics/DisplayRefreshMonitorManager.h: (WebCore::DisplayRefreshMonitorManager::DisplayRefreshMonitorManager): Deleted. * platform/graphics/GraphicsLayerUpdater.cpp: (WebCore::GraphicsLayerUpdater::GraphicsLayerUpdater): * platform/graphics/ios/DisplayRefreshMonitorIOS.mm: (-[WebDisplayLinkHandler setPreferredFramesPerSecond:]): Set the preferredFramesPerSecond of the CADisplayLink. * testing/Internals.cpp: (WebCore::Internals::requestAnimationFrameThrottlingReasons const): (WebCore::Internals::isRequestAnimationFrameThrottled const): Deleted. * testing/Internals.h: * testing/Internals.idl: Replace isRequestAnimationFrameThrottled() which returns a boolean by requestAnimationFrameThrottlingReasons() which returns a string. The string represents the throttling reasons. Source/WebKit: Create an IPC message on the DrawingArea to send a message from the WebProcess to the UIProcess to setPreferredFramesPerSecond of the DisplayRefreshMonitor. * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.h: * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.messages.in: * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm: (-[WKOneShotDisplayLinkHandler setPreferredFramesPerSecond:]): (WebKit::RemoteLayerTreeDrawingAreaProxy::setPreferredFramesPerSecond): Set the preferredFramesPerSecond of the CADisplayLink. * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDisplayRefreshMonitor.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDisplayRefreshMonitor.mm: (WebKit::RemoteLayerTreeDisplayRefreshMonitor::setPreferredFramesPerSecond): Forward the call to RemoteLayerTreeDrawingArea. * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::setPreferredFramesPerSecond): Send the IPC message from the WebProcess to the UIProcess. LayoutTests: * fast/animation/request-animation-frame-throttle-inside-overflow-scroll-expected.txt: * fast/animation/request-animation-frame-throttle-inside-overflow-scroll.html: * fast/animation/request-animation-frame-throttle-subframe-display-none-expected.txt: * fast/animation/request-animation-frame-throttle-subframe-display-none.html: * fast/animation/request-animation-frame-throttle-subframe-expected.txt: * fast/animation/request-animation-frame-throttle-subframe-zero-size-expected.txt: * fast/animation/request-animation-frame-throttle-subframe-zero-size.html: * fast/animation/request-animation-frame-throttle-subframe.html: * fast/animation/request-animation-frame-throttling-detached-iframe-expected.txt: * fast/animation/request-animation-frame-throttling-detached-iframe.html: Replace the call isRequestAnimationFrameThrottled() by requestAnimationFrameThrottlingReasons(). * fast/animation/request-animation-frame-throttling-lowPowerMode-expected.txt: * fast/animation/request-animation-frame-throttling-lowPowerMode.html: Ensure the actual rAF interval is > 30ms for lowPowerMode. * http/tests/frame-throttling/raf-throttle-in-cross-origin-subframe-expected.txt: * http/tests/frame-throttling/raf-throttle-in-cross-origin-subframe.html: * http/tests/frame-throttling/resources/requestAnimationFrame-frame.html: Replace the call isRequestAnimationFrameThrottled() by requestAnimationFrameThrottlingReasons(). Canonical link: https://commits.webkit.org/224287@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@261113 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-05-04 21:24:49 +00:00
* Copyright (C) 2019-2020 Apple Inc. All rights reserved.
[Web Animations] Ensure animations are updated prior to requestAnimationFrame callbacks https://bugs.webkit.org/show_bug.cgi?id=186997 <rdar://problem/41419414> Reviewed by Dean Jackson. LayoutTests/imported/mozilla: Mark progressions in the Mozilla CSS Animations tests. * css-animations/test_animation-pausing-expected.txt: Source/WebCore: Some sub-tests of imported/mozilla/css-animations/test_animation-pausing.html clearly expect that animations would be resolved prior to firing a requestAnimationFrame() callback, as the HTML5 event loop mandates. But until now, both DocumentTimeline and ScriptedAnimationController would make calls to DisplayRefreshMonitorManager::scheduleAnimation() that were not coordinated and so the order in which the DocumentTimeline and ScriptedAnimationController callbacks were performed was not guaranteed. In this patch we add a new DocumentAnimationScheduler class which is created by a Document to manage this specific situation. Now DocumentTimeline and ScriptedAnimationController use this supporting object instead of being their own DisplayRefreshMonitorClient and call scheduleWebAnimationsResolution() and scheduleScriptedAnimationResolution() respectively to indicate the need to schedule an animation through the DisplayRefreshMonitorManager to serve the specific needs of either, or both, classes. Then DocumentAnimationScheduler ensures that Web Animations resolution happens prior to requestAnimationFrame callbacks when both are scheduled. In the future we should be able to move more code from DocumentTimeline and ScriptedAnimationController over to DocumentAnimationScheduler, such as support for throttling and using a timer-based fallback, but this patch provides the minimal functionality required to provide a sounder foundation. * Modules/webvr/VRDisplay.cpp: (WebCore::VRDisplay::requestAnimationFrame): * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * animation/DocumentAnimationScheduler.cpp: Added. (WebCore::DocumentAnimationScheduler::create): (WebCore::DocumentAnimationScheduler::DocumentAnimationScheduler): (WebCore::DocumentAnimationScheduler::detachFromDocument): (WebCore::DocumentAnimationScheduler::scheduleWebAnimationsResolution): (WebCore::DocumentAnimationScheduler::scheduleScriptedAnimationResolution): (WebCore::DocumentAnimationScheduler::displayRefreshFired): (WebCore::DocumentAnimationScheduler::windowScreenDidChange): (WebCore::DocumentAnimationScheduler::createDisplayRefreshMonitor const): * animation/DocumentAnimationScheduler.h: Copied from Source/WebCore/animation/CSSAnimation.h. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::create): (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::windowScreenDidChange): Deleted. (WebCore::DocumentTimeline::createDisplayRefreshMonitor const): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::prepareForDestruction): (WebCore::Document::windowScreenDidChange): (WebCore::Document::requestAnimationFrame): (WebCore::Document::animationScheduler): (WebCore::Document::timeline): * dom/Document.h: * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::ScriptedAnimationController): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): (WebCore::ScriptedAnimationController::windowScreenDidChange): Deleted. (WebCore::ScriptedAnimationController::displayRefreshFired): Deleted. (WebCore::ScriptedAnimationController::createDisplayRefreshMonitor const): Deleted. * dom/ScriptedAnimationController.h: (WebCore::ScriptedAnimationController::create): Canonical link: https://commits.webkit.org/202231@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233140 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-06-25 09:54:34 +00:00
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
Throttling requestAnimationFrame should be controlled by RenderingUpdateScheduler https://bugs.webkit.org/show_bug.cgi?id=204713 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2020-05-04 Reviewed by Simon Fraser. Source/WebCore: rAF and Page rendering were managed by two different timers. Throttling rAF was implemented by changing its timer. After r242624, RenderingUpdate steps have been managed by RenderingUpdateScheduler. This means rAF is now serviced by the preferredFramesPerSecond which is 60 fps regardless it's throttled or not. Moreover the rAF throttling timer was mistakenly kept and it has been running under the old assumption which is: rAF is serviced by a timer only. This means rAF will be serviced by its timer and by the RenderingUpdate steps at the same time when it is supposed to throttle. This will make it fire more than 60 fps in cases which it is supposed to run less than 60 fps. The solution is to have two throttling types: 1) Page throttling (or full throttling): This slows down all the steps of RenderingUpdate for the main document and all the sub-documents. Page throttling reasons are: -- VisuallyIdle: Aggressive throttling. -- LowPowerMode: Half speed throttling. 2) Document throttling (or partial throttling): This only slows down the rAF of a certain document. Document throttling reasons are: -- OutsideViewport: Aggressive throttling. -- NonInteractedCrossOriginFrame: Half speed throttling. RenderingUpdate steps will still be managed by RenderingUpdateScheduler which can be throttled. The assumption is none of these steps will need to run faster than the Page preferredFramesPerSecond. If rAF wants to run slower than the Page because of a Document throttling reason, no rAF callbacks will be serviced before its preferredFrameInterval has elapsed. In this patch, "Half speed throttling" is only implemented for the Page and the Document throttling. The "Aggressive throttling" will be done in following patches. Page rendering was never throttled before. We need to make sure this is not going to affect PLT. Some tests need to be changed and new tests need to be written. All of the throttling tests checks the state of the code but none of them checks the real user's experience. * Headers.cmake: * WebCore.xcodeproj/project.pbxproj: * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::animationInterval const): (WebCore::DocumentTimeline::updateThrottlingState): Deleted. * animation/DocumentTimeline.h: There is no need to have DocumentTimeline throttling. It is already throttled when the page RenderingUpdate is throttled. * dom/Document.cpp: (WebCore::Document::requestAnimationFrame): (WebCore::Document::updateLastHandledUserGestureTimestamp): LowPowerMode throttling is now handled by the Page. So remove its handling from the Document. * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::ScriptedAnimationController): (WebCore::ScriptedAnimationController::page const): (WebCore::ScriptedAnimationController::interval const): (WebCore::ScriptedAnimationController::preferredScriptedAnimationInterval const): (WebCore::ScriptedAnimationController::throttlingReasons const): (WebCore::ScriptedAnimationController::isThrottledRelativeToPage const): (WebCore::ScriptedAnimationController::shouldRescheduleRequestAnimationFrame const): (WebCore::ScriptedAnimationController::registerCallback): (WebCore::ScriptedAnimationController::cancelCallback): (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::throttlingReasonToString): Deleted. (WebCore::throttlingReasonsToString): Deleted. (WebCore::ScriptedAnimationController::addThrottlingReason): Deleted. (WebCore::ScriptedAnimationController::removeThrottlingReason): Deleted. (WebCore::ScriptedAnimationController::isThrottled const): Deleted. (WebCore::ScriptedAnimationController::animationTimerFired): Deleted. * dom/ScriptedAnimationController.h: (WebCore::ScriptedAnimationController::addThrottlingReason): (WebCore::ScriptedAnimationController::removeThrottlingReason): Get rid of the rAF throttling timer. Service the rAF callback only when the period from the current time stamp till the last service time stamp is greater than the preferred rAF interval. * page/FrameView.cpp: (WebCore::FrameView::updateScriptedAnimationsAndTimersThrottlingState): ThrottlingReason is now defined outside ScriptedAnimationController. * page/Page.cpp: (WebCore::m_loadsFromNetwork): (WebCore::Page::setLowPowerModeEnabledOverrideForTesting): (WebCore::Page::preferredRenderingUpdateInterval const): Calculate the preferred RenderingUpdate interval from the throttling reasons. (WebCore::Page::setIsVisuallyIdleInternal): (WebCore::Page::handleLowModePowerChange): Call adjustRenderingUpdateFrequency() when isLowPowerModeEnabled or IsVisuallyIdle is toggled. (WebCore::Page::isLowPowerModeEnabled const): Deleted. (WebCore::updateScriptedAnimationsThrottlingReason): Deleted. * page/Page.h: (WebCore::Page::isLowPowerModeEnabled const): (WebCore::Page::throttlingReasons const): (WebCore::Page::canUpdateThrottlingReason const): * page/RenderingUpdateScheduler.cpp: (WebCore::RenderingUpdateScheduler::setPreferredFramesPerSecond): (WebCore::RenderingUpdateScheduler::scheduleAnimation): (WebCore::RenderingUpdateScheduler::adjustRenderingUpdateFrequency): Change the preferredFramesPerSecond of the DisplayRefreshMonitor if the throttling is not aggressive e.g. 10_s. Otherwise use the timer. (WebCore::RenderingUpdateScheduler::scheduleTimedRenderingUpdate): Call adjustFramesPerSecond() when DisplayRefreshMonitor is created. (WebCore::RenderingUpdateScheduler::startTimer): * page/RenderingUpdateScheduler.h: * platform/graphics/AnimationFrameRate.h: Added. (WebCore::preferredFrameInterval): (WebCore::preferredFramesPerSecond): (WebCore::operator<<): Push names of ThrottlingReasons to a TextStream. * platform/graphics/DisplayRefreshMonitor.h: (WebCore::DisplayRefreshMonitor::setPreferredFramesPerSecond): * platform/graphics/DisplayRefreshMonitorManager.cpp: (WebCore::DisplayRefreshMonitorManager::monitorForClient): Rename createMonitorForClient() to monitorForClient() since it may return a cached DisplayRefreshMonitor. (WebCore::DisplayRefreshMonitorManager::setPreferredFramesPerSecond): (WebCore::DisplayRefreshMonitorManager::scheduleAnimation): (WebCore::DisplayRefreshMonitorManager::windowScreenDidChange): No need to call registerClient(). This function was just ensuring the DisplayRefreshMonitor is created. scheduleAnimation() does the same thing. (WebCore::DisplayRefreshMonitorManager::createMonitorForClient): Deleted. (WebCore::DisplayRefreshMonitorManager::registerClient): Deleted. * platform/graphics/DisplayRefreshMonitorManager.h: (WebCore::DisplayRefreshMonitorManager::DisplayRefreshMonitorManager): Deleted. * platform/graphics/GraphicsLayerUpdater.cpp: (WebCore::GraphicsLayerUpdater::GraphicsLayerUpdater): * platform/graphics/ios/DisplayRefreshMonitorIOS.mm: (-[WebDisplayLinkHandler setPreferredFramesPerSecond:]): Set the preferredFramesPerSecond of the CADisplayLink. * testing/Internals.cpp: (WebCore::Internals::requestAnimationFrameThrottlingReasons const): (WebCore::Internals::isRequestAnimationFrameThrottled const): Deleted. * testing/Internals.h: * testing/Internals.idl: Replace isRequestAnimationFrameThrottled() which returns a boolean by requestAnimationFrameThrottlingReasons() which returns a string. The string represents the throttling reasons. Source/WebKit: Create an IPC message on the DrawingArea to send a message from the WebProcess to the UIProcess to setPreferredFramesPerSecond of the DisplayRefreshMonitor. * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.h: * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.messages.in: * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm: (-[WKOneShotDisplayLinkHandler setPreferredFramesPerSecond:]): (WebKit::RemoteLayerTreeDrawingAreaProxy::setPreferredFramesPerSecond): Set the preferredFramesPerSecond of the CADisplayLink. * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDisplayRefreshMonitor.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDisplayRefreshMonitor.mm: (WebKit::RemoteLayerTreeDisplayRefreshMonitor::setPreferredFramesPerSecond): Forward the call to RemoteLayerTreeDrawingArea. * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::setPreferredFramesPerSecond): Send the IPC message from the WebProcess to the UIProcess. LayoutTests: * fast/animation/request-animation-frame-throttle-inside-overflow-scroll-expected.txt: * fast/animation/request-animation-frame-throttle-inside-overflow-scroll.html: * fast/animation/request-animation-frame-throttle-subframe-display-none-expected.txt: * fast/animation/request-animation-frame-throttle-subframe-display-none.html: * fast/animation/request-animation-frame-throttle-subframe-expected.txt: * fast/animation/request-animation-frame-throttle-subframe-zero-size-expected.txt: * fast/animation/request-animation-frame-throttle-subframe-zero-size.html: * fast/animation/request-animation-frame-throttle-subframe.html: * fast/animation/request-animation-frame-throttling-detached-iframe-expected.txt: * fast/animation/request-animation-frame-throttling-detached-iframe.html: Replace the call isRequestAnimationFrameThrottled() by requestAnimationFrameThrottlingReasons(). * fast/animation/request-animation-frame-throttling-lowPowerMode-expected.txt: * fast/animation/request-animation-frame-throttling-lowPowerMode.html: Ensure the actual rAF interval is > 30ms for lowPowerMode. * http/tests/frame-throttling/raf-throttle-in-cross-origin-subframe-expected.txt: * http/tests/frame-throttling/raf-throttle-in-cross-origin-subframe.html: * http/tests/frame-throttling/resources/requestAnimationFrame-frame.html: Replace the call isRequestAnimationFrameThrottled() by requestAnimationFrameThrottlingReasons(). Canonical link: https://commits.webkit.org/224287@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@261113 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-05-04 21:24:49 +00:00
#include "AnimationFrameRate.h"
[Web Animations] Ensure animations are updated prior to requestAnimationFrame callbacks https://bugs.webkit.org/show_bug.cgi?id=186997 <rdar://problem/41419414> Reviewed by Dean Jackson. LayoutTests/imported/mozilla: Mark progressions in the Mozilla CSS Animations tests. * css-animations/test_animation-pausing-expected.txt: Source/WebCore: Some sub-tests of imported/mozilla/css-animations/test_animation-pausing.html clearly expect that animations would be resolved prior to firing a requestAnimationFrame() callback, as the HTML5 event loop mandates. But until now, both DocumentTimeline and ScriptedAnimationController would make calls to DisplayRefreshMonitorManager::scheduleAnimation() that were not coordinated and so the order in which the DocumentTimeline and ScriptedAnimationController callbacks were performed was not guaranteed. In this patch we add a new DocumentAnimationScheduler class which is created by a Document to manage this specific situation. Now DocumentTimeline and ScriptedAnimationController use this supporting object instead of being their own DisplayRefreshMonitorClient and call scheduleWebAnimationsResolution() and scheduleScriptedAnimationResolution() respectively to indicate the need to schedule an animation through the DisplayRefreshMonitorManager to serve the specific needs of either, or both, classes. Then DocumentAnimationScheduler ensures that Web Animations resolution happens prior to requestAnimationFrame callbacks when both are scheduled. In the future we should be able to move more code from DocumentTimeline and ScriptedAnimationController over to DocumentAnimationScheduler, such as support for throttling and using a timer-based fallback, but this patch provides the minimal functionality required to provide a sounder foundation. * Modules/webvr/VRDisplay.cpp: (WebCore::VRDisplay::requestAnimationFrame): * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * animation/DocumentAnimationScheduler.cpp: Added. (WebCore::DocumentAnimationScheduler::create): (WebCore::DocumentAnimationScheduler::DocumentAnimationScheduler): (WebCore::DocumentAnimationScheduler::detachFromDocument): (WebCore::DocumentAnimationScheduler::scheduleWebAnimationsResolution): (WebCore::DocumentAnimationScheduler::scheduleScriptedAnimationResolution): (WebCore::DocumentAnimationScheduler::displayRefreshFired): (WebCore::DocumentAnimationScheduler::windowScreenDidChange): (WebCore::DocumentAnimationScheduler::createDisplayRefreshMonitor const): * animation/DocumentAnimationScheduler.h: Copied from Source/WebCore/animation/CSSAnimation.h. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::create): (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::windowScreenDidChange): Deleted. (WebCore::DocumentTimeline::createDisplayRefreshMonitor const): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::prepareForDestruction): (WebCore::Document::windowScreenDidChange): (WebCore::Document::requestAnimationFrame): (WebCore::Document::animationScheduler): (WebCore::Document::timeline): * dom/Document.h: * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::ScriptedAnimationController): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): (WebCore::ScriptedAnimationController::windowScreenDidChange): Deleted. (WebCore::ScriptedAnimationController::displayRefreshFired): Deleted. (WebCore::ScriptedAnimationController::createDisplayRefreshMonitor const): Deleted. * dom/ScriptedAnimationController.h: (WebCore::ScriptedAnimationController::create): Canonical link: https://commits.webkit.org/202231@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233140 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-06-25 09:54:34 +00:00
#include "DisplayRefreshMonitorClient.h"
[Web Animations] Make WPT test at timing-model/timelines/document-timelines.html pass reliably https://bugs.webkit.org/show_bug.cgi?id=186507 <rdar://problem/41000257> Reviewed by Dean Jackson. LayoutTests/imported/w3c: Record WPT test progressions. * web-platform-tests/web-animations/timing-model/timelines/document-timelines-expected.txt: Source/WebCore: The Web Animations spec, along with the HTML5 event loop spec, specify some assumptions on the time reported by document.timeline.currentTime: - it should only increase once per frame - it should have the same value as the timestamp passed to requestAnimationFrame() callbacks The WPT test at web-platform-tests/web-animations/timing-model/timelines/document-timelines.html relies on these assumptions to be true so that we check that the start time of a new animation is not the same as the timeline time when it was created, since it will be in the "play-pending" state for a frame. In order to support this, we add two new methods on DocumentAnimationScheduler. First, when a scheduled display update fires, we record the timestamp and expose it via lastTimestamp() such that DocumentTimeline and ScriptedAnimationController can use the same value when updating animations. Then, to know whether code is run as a result of a display update, we expose isFiring(). Now, within DocumentTimeline::currentTime(), we can cache the current time this way: - if we're in the middle of a display update, use the value returned by lastTimestamp(). - otherwise, compute what would have been the ideal number of frames (at 60fps or less if throttled) and add those to the lastTimestamp() value. Then, we remove this cached current time when both currently-running JavaScript has completed and all animation update code has completed by waiting on the invalidation task to run. * animation/DocumentAnimationScheduler.cpp: (WebCore::DocumentAnimationScheduler::displayRefreshFired): * animation/DocumentAnimationScheduler.h: (WebCore::DocumentAnimationScheduler::lastTimestamp): (WebCore::DocumentAnimationScheduler::isFiring const): * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::currentTime): (WebCore::DocumentTimeline::performInvalidationTask): (WebCore::DocumentTimeline::maybeClearCachedCurrentTime): * animation/DocumentTimeline.h: * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::serviceScriptedAnimations): (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): LayoutTests: This test now passes reliably. * TestExpectations: Canonical link: https://commits.webkit.org/202479@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233394 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-06-30 13:43:26 +00:00
#include <wtf/Seconds.h>
[Web Animations] Ensure animations are updated prior to requestAnimationFrame callbacks https://bugs.webkit.org/show_bug.cgi?id=186997 <rdar://problem/41419414> Reviewed by Dean Jackson. LayoutTests/imported/mozilla: Mark progressions in the Mozilla CSS Animations tests. * css-animations/test_animation-pausing-expected.txt: Source/WebCore: Some sub-tests of imported/mozilla/css-animations/test_animation-pausing.html clearly expect that animations would be resolved prior to firing a requestAnimationFrame() callback, as the HTML5 event loop mandates. But until now, both DocumentTimeline and ScriptedAnimationController would make calls to DisplayRefreshMonitorManager::scheduleAnimation() that were not coordinated and so the order in which the DocumentTimeline and ScriptedAnimationController callbacks were performed was not guaranteed. In this patch we add a new DocumentAnimationScheduler class which is created by a Document to manage this specific situation. Now DocumentTimeline and ScriptedAnimationController use this supporting object instead of being their own DisplayRefreshMonitorClient and call scheduleWebAnimationsResolution() and scheduleScriptedAnimationResolution() respectively to indicate the need to schedule an animation through the DisplayRefreshMonitorManager to serve the specific needs of either, or both, classes. Then DocumentAnimationScheduler ensures that Web Animations resolution happens prior to requestAnimationFrame callbacks when both are scheduled. In the future we should be able to move more code from DocumentTimeline and ScriptedAnimationController over to DocumentAnimationScheduler, such as support for throttling and using a timer-based fallback, but this patch provides the minimal functionality required to provide a sounder foundation. * Modules/webvr/VRDisplay.cpp: (WebCore::VRDisplay::requestAnimationFrame): * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * animation/DocumentAnimationScheduler.cpp: Added. (WebCore::DocumentAnimationScheduler::create): (WebCore::DocumentAnimationScheduler::DocumentAnimationScheduler): (WebCore::DocumentAnimationScheduler::detachFromDocument): (WebCore::DocumentAnimationScheduler::scheduleWebAnimationsResolution): (WebCore::DocumentAnimationScheduler::scheduleScriptedAnimationResolution): (WebCore::DocumentAnimationScheduler::displayRefreshFired): (WebCore::DocumentAnimationScheduler::windowScreenDidChange): (WebCore::DocumentAnimationScheduler::createDisplayRefreshMonitor const): * animation/DocumentAnimationScheduler.h: Copied from Source/WebCore/animation/CSSAnimation.h. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::create): (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::windowScreenDidChange): Deleted. (WebCore::DocumentTimeline::createDisplayRefreshMonitor const): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::prepareForDestruction): (WebCore::Document::windowScreenDidChange): (WebCore::Document::requestAnimationFrame): (WebCore::Document::animationScheduler): (WebCore::Document::timeline): * dom/Document.h: * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::ScriptedAnimationController): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): (WebCore::ScriptedAnimationController::windowScreenDidChange): Deleted. (WebCore::ScriptedAnimationController::displayRefreshFired): Deleted. (WebCore::ScriptedAnimationController::createDisplayRefreshMonitor const): Deleted. * dom/ScriptedAnimationController.h: (WebCore::ScriptedAnimationController::create): Canonical link: https://commits.webkit.org/202231@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233140 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-06-25 09:54:34 +00:00
namespace WebCore {
requestAnimationFrame should execute before the next frame https://bugs.webkit.org/show_bug.cgi?id=177484 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2019-04-10 Reviewed by Simon Fraser. LayoutTests/imported/w3c: Add trace points for the page RenderingUpdate. * web-platform-tests/resize-observer/resources/resizeTestHelper.js: Change ResizeTestHelper.TIMEOUT to be 1 second instead of 100 ms which is too short for layout tests. Source/WebCore: This change fixes these issues with animation timing: 1. Calling the requestAnimationFrame callbacks would have happened when the DisplayLink fires. This may have happened even if the frame is missed and no display is committed. 2. Style changes and layout triggered by script could trigger painting at more than 60fps. CoreAnimation commits could happen at more than 60fps, although WindowServer will throttle those, and only some will be shown on the screen. This change introduces a new paint scheduling model where painting is driven by a "RenderingUpdateScheduler", which only triggers paints once per 16.7ms frame. Code that previously scheduled a compositing layer flush now schedules a "RenderingUpdate", and that update is driven by a DisplayRefreshMonitor callback. When the render happens, we service requestAnimationFrame callbacks, Web Animations, intersection observations and resize observations per the "Update the rendering" step of the HTML Event Loop specification: <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. In the future, more rendering steps will be added to this code. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * accessibility/mac/AXObjectCacheMac.mm: (WebCore::AXObjectCache::platformHandleFocusedUIElementChanged): Fix layout tests by adding null check. * animation/DocumentAnimationScheduler.cpp: Removed. * animation/DocumentAnimationScheduler.h: Removed. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::updateThrottlingState): (WebCore::DocumentTimeline::suspendAnimations): (WebCore::DocumentTimeline::resumeAnimations): (WebCore::DocumentTimeline::liveCurrentTime const): (WebCore::DocumentTimeline::currentTime): (WebCore::DocumentTimeline::cacheCurrentTime): (WebCore::DocumentTimeline::animationTimingDidChange): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::unscheduleAnimationResolution): (WebCore::DocumentTimeline::updateAnimationsAndSendEvents): (WebCore::DocumentTimeline::internalUpdateAnimationsAndSendEvents): (WebCore::DocumentTimeline::scheduleNextTick): (WebCore::DocumentTimeline::updateListOfElementsWithRunningAcceleratedAnimationsForElement): Simplify this function by handling the case of no-animations separately. (WebCore::DocumentTimeline::resolveAnimationsForElement): Simplify the loop and delete hasPendingAcceleratedAnimations because it is initialized to true and is not changed inside the loop. (WebCore::DocumentTimeline::scheduleAnimationResolutionIfNeeded): Deleted. (WebCore::DocumentTimeline::animationResolutionTimerFired): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::resolveStyle): There is no need to force update in resolveStyle(). notifyFlushRequired() will be called eventually which will scheduleRenderingUpdate(). (WebCore::Document::prepareForDestruction): (WebCore::Document::updateAnimationsAndSendEvents): (WebCore::Document::serviceRequestAnimationFrameCallbacks): (WebCore::Document::windowScreenDidChange): (WebCore::Document::scheduleRenderingUpdate): (WebCore::Document::updateIntersectionObservations): (WebCore::Document::addResizeObserver): (WebCore::Document::updateResizeObservations): (WebCore::Document::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Document::scheduleResizeObservations): Deleted. (WebCore::Document::animationScheduler): Deleted. No need to schedule web-animations, intersection observations and resize observations updates separately. All of them will be updated through the "Update the rendering" step, i.e. Page::updateRendering(). * dom/Document.h: (WebCore::Document::numberOfIntersectionObservers const): * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::animationTimerFired): (WebCore::ScriptedAnimationController::serviceScriptedAnimations): Deleted. (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): Deleted. * dom/ScriptedAnimationController.h: * page/FrameView.cpp: (WebCore::FrameView::didLayout): (WebCore::FrameView::viewportContentsChanged): * page/FrameViewLayoutContext.cpp: (WebCore::FrameViewLayoutContext::layoutTimerFired): * page/IntersectionObserver.cpp: (WebCore::IntersectionObserver::observe): * page/Page.cpp: (WebCore::Page::Page): (WebCore::Page::layoutIfNeeded): (WebCore::Page::updateRendering): (WebCore::Page::renderingUpdateScheduler): (WebCore::Page::willDisplayPage): Deleted. (WebCore::Page::addDocumentNeedingIntersectionObservationUpdate): Deleted. (WebCore::Page::updateIntersectionObservations): Deleted. (WebCore::Page::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Page::hasResizeObservers const): Deleted. (WebCore::Page::gatherDocumentsNeedingResizeObservationCheck): Deleted. (WebCore::Page::checkResizeObservations): Deleted. (WebCore::Page::scheduleResizeObservations): Deleted. (WebCore::Page::notifyResizeObservers): Deleted. * page/Page.h: (WebCore::Page::setNeedsCheckResizeObservations): Deleted. (WebCore::Page::needsCheckResizeObservations const): Deleted. The IntersectionObserver and the ResizeObserver do not need to schedule their own timers. The RenderingUpdateScheduler will schedule the "Update the rendering" step in which these obverses will be served. * page/PageOverlayController.cpp: (WebCore::PageOverlayController::didChangeViewExposedRect): (WebCore::PageOverlayController::notifyFlushRequired): Force committing the layers to be 60 fps at maximum. * page/RenderingUpdateScheduler.cpp: Added. (WebCore::RenderingUpdateScheduler::RenderingUpdateScheduler): (WebCore::RenderingUpdateScheduler::scheduleRenderingUpdate): (WebCore::RenderingUpdateScheduler::isScheduled const): (WebCore::RenderingUpdateScheduler::startTimer): (WebCore::RenderingUpdateScheduler::clearScheduled): (WebCore::RenderingUpdateScheduler::createDisplayRefreshMonitor const): (WebCore::RenderingUpdateScheduler::windowScreenDidChange): (WebCore::RenderingUpdateScheduler::displayRefreshFired): (WebCore::RenderingUpdateScheduler::scheduleCompositingLayerFlush): * page/RenderingUpdateScheduler.h: Added. (WebCore::RenderingUpdateScheduler::create): * page/ResizeObserver.cpp: (WebCore::ResizeObserver::observe): (WebCore::ResizeObserver::scheduleObservations): Deleted. * page/ResizeObserver.h: (WebCore::ResizeObserver::hasActiveObservations const): * page/ios/ContentChangeObserver.h: * page/mac/ServicesOverlayController.mm: (WebCore::ServicesOverlayController::Highlight::notifyFlushRequired): * page/scrolling/ScrollingStateTree.cpp: * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::scheduleLayerFlushNow): (WebCore::RenderLayerCompositor::layerTreeAsText): Source/WebKit: Replace the calls to Page::layoutIfNeeded() and willDisplayPage() by a single call to Page::updateRendering(). This new function implements "Update the rendering" step of the HTML Event Loop specification <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. * WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp: (WebKit::DrawingAreaCoordinatedGraphics::scheduleCompositingLayerFlush): (WebKit::DrawingAreaCoordinatedGraphics::updateBackingStoreState): (WebKit::DrawingAreaCoordinatedGraphics::display): * WebProcess/WebPage/CoordinatedGraphics/LayerTreeHost.cpp: (WebKit::LayerTreeHost::layerFlushTimerFired): * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::flushLayers): -- Call Page::updateRendering() to make sure that "Update the rendering" happens immediately before updating the page. -- Move the call to RemoteLayerBackingStoreCollection::willFlushLayers() to be exactly before flushing the layers. This fixes the assertion ASSERT(m_inLayerFlush) which was firing when running a layout test. RemoteLayerTreeDrawingArea::flushLayers() now can call itself through TestRunner::notifyDone(). flushLayers() was calling willFlushLayers() twice before calling didFlushLayers(). * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::layoutIfNeeded): (WebKit::WebPage::updateRendering): (WebKit::WebPage::willDisplayPage): Deleted. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::flushLayers): Source/WebKitLegacy/mac: * WebView/WebView.mm: (-[WebView _viewWillDrawInternal]): (-[WebView _flushCompositingChanges]): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WebKitLegacy/win: * WebView.cpp: (WebView::updateBackingStore): (WebView::flushPendingGraphicsLayerChangesSoon): (WebView::flushPendingGraphicsLayerChanges): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WTF: Add trace points for the page RenderingUpdate. * wtf/SystemTracing.h: Tools: Add trace points for the page RenderingUpdate. * Tracing/SystemTracePoints.plist: LayoutTests: * TestExpectations: There is a slight difference between the actual DRT and the expected DRT due to animation timing change. But these two tests are not animating correctly if they are opened in Safari with web animation turned on. * accessibility/mac/selection-notification-focus-change-expected.txt: * accessibility/mac/selection-notification-focus-change.html: Remove the debug statements form notificationCallback() since the number of times this function is called back and the order of notifications are not defined. This test has been flaky and some trials were made to make it more reliable. With this change it became flaky again. * animations/animation-multiple-callbacks-timestamp.html: Fix variable names used by an error message. * animations/no-style-recalc-during-accelerated-animation-expected.txt: * animations/no-style-recalc-during-accelerated-animation.html: One extra styleReclc was incurred due to the document styleRecalcTimer. I think this timer is not needed anymore. I will look at removing it in a separate patch. * animations/resources/animation-test-helpers.js: (waitForAnimationToStart): The expectation that animation will start at the beginning of the next event loop is not true anymore. The animation will start at the time the requestAnimationFrame fires. * compositing/video/video-clip-change-src.html: This test loads a video data and pushes it to the encoder. Originally it used to wait 150 ms after receiving the second canplaythrough. I had to change this timing to 250 ms. * css3/filters/composited-during-animation.html: Ditto. setTimeout({...}, 0) versus requestAnimationFrame. * media/media-controls-accessibility.html: Updating the accessibility button happens asynchronously, see [WebAccessibilityObjectWrapper accessibilityPerformPressAction]. Due to changing the page update timing, this test became flaky. Originally it used to setTimeout({...}, 10) to ensure the stringValue of the mutate button was changed after it was pressed. The fix is to loop using rAF till the stringValue changes. * platform/mac-wk2/accessibility/mac/selection-notification-focus-change-expected.txt: Removed. The number of time notificationCallback() is called and the order of notifications are not defined. And this is why we have two expected files: one for WK1 and the other for WK2. Since the test is now simplified, we can get rid of this duplication. We will test the minimum reliable thing we can test. Canonical link: https://commits.webkit.org/211093@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244182 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-04-11 05:44:13 +00:00
class Page;
class Timer;
[Web Animations] Ensure animations are updated prior to requestAnimationFrame callbacks https://bugs.webkit.org/show_bug.cgi?id=186997 <rdar://problem/41419414> Reviewed by Dean Jackson. LayoutTests/imported/mozilla: Mark progressions in the Mozilla CSS Animations tests. * css-animations/test_animation-pausing-expected.txt: Source/WebCore: Some sub-tests of imported/mozilla/css-animations/test_animation-pausing.html clearly expect that animations would be resolved prior to firing a requestAnimationFrame() callback, as the HTML5 event loop mandates. But until now, both DocumentTimeline and ScriptedAnimationController would make calls to DisplayRefreshMonitorManager::scheduleAnimation() that were not coordinated and so the order in which the DocumentTimeline and ScriptedAnimationController callbacks were performed was not guaranteed. In this patch we add a new DocumentAnimationScheduler class which is created by a Document to manage this specific situation. Now DocumentTimeline and ScriptedAnimationController use this supporting object instead of being their own DisplayRefreshMonitorClient and call scheduleWebAnimationsResolution() and scheduleScriptedAnimationResolution() respectively to indicate the need to schedule an animation through the DisplayRefreshMonitorManager to serve the specific needs of either, or both, classes. Then DocumentAnimationScheduler ensures that Web Animations resolution happens prior to requestAnimationFrame callbacks when both are scheduled. In the future we should be able to move more code from DocumentTimeline and ScriptedAnimationController over to DocumentAnimationScheduler, such as support for throttling and using a timer-based fallback, but this patch provides the minimal functionality required to provide a sounder foundation. * Modules/webvr/VRDisplay.cpp: (WebCore::VRDisplay::requestAnimationFrame): * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * animation/DocumentAnimationScheduler.cpp: Added. (WebCore::DocumentAnimationScheduler::create): (WebCore::DocumentAnimationScheduler::DocumentAnimationScheduler): (WebCore::DocumentAnimationScheduler::detachFromDocument): (WebCore::DocumentAnimationScheduler::scheduleWebAnimationsResolution): (WebCore::DocumentAnimationScheduler::scheduleScriptedAnimationResolution): (WebCore::DocumentAnimationScheduler::displayRefreshFired): (WebCore::DocumentAnimationScheduler::windowScreenDidChange): (WebCore::DocumentAnimationScheduler::createDisplayRefreshMonitor const): * animation/DocumentAnimationScheduler.h: Copied from Source/WebCore/animation/CSSAnimation.h. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::create): (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::windowScreenDidChange): Deleted. (WebCore::DocumentTimeline::createDisplayRefreshMonitor const): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::prepareForDestruction): (WebCore::Document::windowScreenDidChange): (WebCore::Document::requestAnimationFrame): (WebCore::Document::animationScheduler): (WebCore::Document::timeline): * dom/Document.h: * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::ScriptedAnimationController): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): (WebCore::ScriptedAnimationController::windowScreenDidChange): Deleted. (WebCore::ScriptedAnimationController::displayRefreshFired): Deleted. (WebCore::ScriptedAnimationController::createDisplayRefreshMonitor const): Deleted. * dom/ScriptedAnimationController.h: (WebCore::ScriptedAnimationController::create): Canonical link: https://commits.webkit.org/202231@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233140 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-06-25 09:54:34 +00:00
Add DisplayRefreshMonitorFactory. https://bugs.webkit.org/show_bug.cgi?id=223648 Reviewed by Chris Dumez. Future work will require that it's possible to create a DisplayRefreshMonitor without having a DisplayRefreshMonitorClient. It was also weird that the way to create a DisplayRefreshMonitor was via the DisplayRefreshMonitorClient, so this change fixes both by adding DisplayRefreshMonitorFactory. In WK2, the drawing areas are DisplayRefreshMonitorFactories. If there is no factory, we fall back to the default implementations. Source/WebCore: * Headers.cmake: * WebCore.xcodeproj/project.pbxproj: * loader/EmptyClients.cpp: (WebCore::EmptyDisplayRefreshMonitorFactory::sharedEmptyDisplayRefreshMonitorFactory): (WebCore::EmptyChromeClient::displayRefreshMonitorFactory const): (WebCore::EmptyChromeClient::createDisplayRefreshMonitor const): Deleted. * loader/EmptyClients.h: * page/ChromeClient.h: (WebCore::ChromeClient::displayRefreshMonitorFactory const): (WebCore::ChromeClient::createDisplayRefreshMonitor const): Deleted. * page/RenderingUpdateScheduler.cpp: (WebCore::RenderingUpdateScheduler::displayRefreshMonitorFactory const): (WebCore::RenderingUpdateScheduler::createDisplayRefreshMonitor const): Deleted. * page/RenderingUpdateScheduler.h: * platform/graphics/DisplayRefreshMonitor.cpp: (WebCore::DisplayRefreshMonitor::create): * platform/graphics/DisplayRefreshMonitor.h: * platform/graphics/DisplayRefreshMonitorClient.cpp: (WebCore::DisplayRefreshMonitorClient::DisplayRefreshMonitorClient): Deleted. * platform/graphics/DisplayRefreshMonitorClient.h: * platform/graphics/DisplayRefreshMonitorFactory.h: Copied from Source/WebCore/platform/graphics/DisplayRefreshMonitorClient.cpp. * platform/graphics/DisplayRefreshMonitorManager.cpp: (WebCore::DisplayRefreshMonitorManager::monitorForClient): * platform/graphics/GraphicsLayerUpdater.cpp: (WebCore::GraphicsLayerUpdater::GraphicsLayerUpdater): (WebCore::GraphicsLayerUpdater::displayRefreshMonitorFactory const): (WebCore::GraphicsLayerUpdater::createDisplayRefreshMonitor const): Deleted. * platform/graphics/GraphicsLayerUpdater.h: * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::displayRefreshMonitorFactory): (WebCore::RenderLayerCompositor::createDisplayRefreshMonitor const): Deleted. * rendering/RenderLayerCompositor.h: Source/WebKit: Remove DrawingAreaMac.cpp since its code was entirely related to creating DisplayRefreshMonitorMac objects. * SourcesCocoa.txt: * WebKit.xcodeproj/project.pbxproj: * WebProcess/WebCoreSupport/WebChromeClient.cpp: (WebKit::WebChromeClient::displayRefreshMonitorFactory const): (WebKit::WebChromeClient::createDisplayRefreshMonitor const): Deleted. * WebProcess/WebCoreSupport/WebChromeClient.h: * WebProcess/WebPage/DrawingArea.cpp: (WebKit::DrawingArea::createDisplayRefreshMonitor): Deleted. * WebProcess/WebPage/DrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::createDisplayRefreshMonitor): * WebProcess/WebPage/mac/DisplayRefreshMonitorMac.cpp: Renamed from Source/WebKit/WebProcess/WebPage/mac/DrawingAreaMac.cpp. (WebKit::DisplayRefreshMonitorMac::DisplayRefreshMonitorMac): (WebKit::DisplayRefreshMonitorMac::~DisplayRefreshMonitorMac): (WebKit::DisplayRefreshMonitorMac::requestRefreshCallback): (WebKit::DisplayRefreshMonitorMac::displayLinkFired): * WebProcess/WebPage/mac/DisplayRefreshMonitorMac.h: Copied from Source/WebCore/platform/graphics/GraphicsLayerUpdater.h. (WebKit::DisplayRefreshMonitorMac::create): * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::createDisplayRefreshMonitor): Canonical link: https://commits.webkit.org/235687@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274929 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 02:35:26 +00:00
class RenderingUpdateScheduler final : public DisplayRefreshMonitorClient {
requestAnimationFrame should execute before the next frame https://bugs.webkit.org/show_bug.cgi?id=177484 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2019-04-10 Reviewed by Simon Fraser. LayoutTests/imported/w3c: Add trace points for the page RenderingUpdate. * web-platform-tests/resize-observer/resources/resizeTestHelper.js: Change ResizeTestHelper.TIMEOUT to be 1 second instead of 100 ms which is too short for layout tests. Source/WebCore: This change fixes these issues with animation timing: 1. Calling the requestAnimationFrame callbacks would have happened when the DisplayLink fires. This may have happened even if the frame is missed and no display is committed. 2. Style changes and layout triggered by script could trigger painting at more than 60fps. CoreAnimation commits could happen at more than 60fps, although WindowServer will throttle those, and only some will be shown on the screen. This change introduces a new paint scheduling model where painting is driven by a "RenderingUpdateScheduler", which only triggers paints once per 16.7ms frame. Code that previously scheduled a compositing layer flush now schedules a "RenderingUpdate", and that update is driven by a DisplayRefreshMonitor callback. When the render happens, we service requestAnimationFrame callbacks, Web Animations, intersection observations and resize observations per the "Update the rendering" step of the HTML Event Loop specification: <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. In the future, more rendering steps will be added to this code. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * accessibility/mac/AXObjectCacheMac.mm: (WebCore::AXObjectCache::platformHandleFocusedUIElementChanged): Fix layout tests by adding null check. * animation/DocumentAnimationScheduler.cpp: Removed. * animation/DocumentAnimationScheduler.h: Removed. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::updateThrottlingState): (WebCore::DocumentTimeline::suspendAnimations): (WebCore::DocumentTimeline::resumeAnimations): (WebCore::DocumentTimeline::liveCurrentTime const): (WebCore::DocumentTimeline::currentTime): (WebCore::DocumentTimeline::cacheCurrentTime): (WebCore::DocumentTimeline::animationTimingDidChange): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::unscheduleAnimationResolution): (WebCore::DocumentTimeline::updateAnimationsAndSendEvents): (WebCore::DocumentTimeline::internalUpdateAnimationsAndSendEvents): (WebCore::DocumentTimeline::scheduleNextTick): (WebCore::DocumentTimeline::updateListOfElementsWithRunningAcceleratedAnimationsForElement): Simplify this function by handling the case of no-animations separately. (WebCore::DocumentTimeline::resolveAnimationsForElement): Simplify the loop and delete hasPendingAcceleratedAnimations because it is initialized to true and is not changed inside the loop. (WebCore::DocumentTimeline::scheduleAnimationResolutionIfNeeded): Deleted. (WebCore::DocumentTimeline::animationResolutionTimerFired): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::resolveStyle): There is no need to force update in resolveStyle(). notifyFlushRequired() will be called eventually which will scheduleRenderingUpdate(). (WebCore::Document::prepareForDestruction): (WebCore::Document::updateAnimationsAndSendEvents): (WebCore::Document::serviceRequestAnimationFrameCallbacks): (WebCore::Document::windowScreenDidChange): (WebCore::Document::scheduleRenderingUpdate): (WebCore::Document::updateIntersectionObservations): (WebCore::Document::addResizeObserver): (WebCore::Document::updateResizeObservations): (WebCore::Document::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Document::scheduleResizeObservations): Deleted. (WebCore::Document::animationScheduler): Deleted. No need to schedule web-animations, intersection observations and resize observations updates separately. All of them will be updated through the "Update the rendering" step, i.e. Page::updateRendering(). * dom/Document.h: (WebCore::Document::numberOfIntersectionObservers const): * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::animationTimerFired): (WebCore::ScriptedAnimationController::serviceScriptedAnimations): Deleted. (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): Deleted. * dom/ScriptedAnimationController.h: * page/FrameView.cpp: (WebCore::FrameView::didLayout): (WebCore::FrameView::viewportContentsChanged): * page/FrameViewLayoutContext.cpp: (WebCore::FrameViewLayoutContext::layoutTimerFired): * page/IntersectionObserver.cpp: (WebCore::IntersectionObserver::observe): * page/Page.cpp: (WebCore::Page::Page): (WebCore::Page::layoutIfNeeded): (WebCore::Page::updateRendering): (WebCore::Page::renderingUpdateScheduler): (WebCore::Page::willDisplayPage): Deleted. (WebCore::Page::addDocumentNeedingIntersectionObservationUpdate): Deleted. (WebCore::Page::updateIntersectionObservations): Deleted. (WebCore::Page::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Page::hasResizeObservers const): Deleted. (WebCore::Page::gatherDocumentsNeedingResizeObservationCheck): Deleted. (WebCore::Page::checkResizeObservations): Deleted. (WebCore::Page::scheduleResizeObservations): Deleted. (WebCore::Page::notifyResizeObservers): Deleted. * page/Page.h: (WebCore::Page::setNeedsCheckResizeObservations): Deleted. (WebCore::Page::needsCheckResizeObservations const): Deleted. The IntersectionObserver and the ResizeObserver do not need to schedule their own timers. The RenderingUpdateScheduler will schedule the "Update the rendering" step in which these obverses will be served. * page/PageOverlayController.cpp: (WebCore::PageOverlayController::didChangeViewExposedRect): (WebCore::PageOverlayController::notifyFlushRequired): Force committing the layers to be 60 fps at maximum. * page/RenderingUpdateScheduler.cpp: Added. (WebCore::RenderingUpdateScheduler::RenderingUpdateScheduler): (WebCore::RenderingUpdateScheduler::scheduleRenderingUpdate): (WebCore::RenderingUpdateScheduler::isScheduled const): (WebCore::RenderingUpdateScheduler::startTimer): (WebCore::RenderingUpdateScheduler::clearScheduled): (WebCore::RenderingUpdateScheduler::createDisplayRefreshMonitor const): (WebCore::RenderingUpdateScheduler::windowScreenDidChange): (WebCore::RenderingUpdateScheduler::displayRefreshFired): (WebCore::RenderingUpdateScheduler::scheduleCompositingLayerFlush): * page/RenderingUpdateScheduler.h: Added. (WebCore::RenderingUpdateScheduler::create): * page/ResizeObserver.cpp: (WebCore::ResizeObserver::observe): (WebCore::ResizeObserver::scheduleObservations): Deleted. * page/ResizeObserver.h: (WebCore::ResizeObserver::hasActiveObservations const): * page/ios/ContentChangeObserver.h: * page/mac/ServicesOverlayController.mm: (WebCore::ServicesOverlayController::Highlight::notifyFlushRequired): * page/scrolling/ScrollingStateTree.cpp: * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::scheduleLayerFlushNow): (WebCore::RenderLayerCompositor::layerTreeAsText): Source/WebKit: Replace the calls to Page::layoutIfNeeded() and willDisplayPage() by a single call to Page::updateRendering(). This new function implements "Update the rendering" step of the HTML Event Loop specification <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. * WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp: (WebKit::DrawingAreaCoordinatedGraphics::scheduleCompositingLayerFlush): (WebKit::DrawingAreaCoordinatedGraphics::updateBackingStoreState): (WebKit::DrawingAreaCoordinatedGraphics::display): * WebProcess/WebPage/CoordinatedGraphics/LayerTreeHost.cpp: (WebKit::LayerTreeHost::layerFlushTimerFired): * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::flushLayers): -- Call Page::updateRendering() to make sure that "Update the rendering" happens immediately before updating the page. -- Move the call to RemoteLayerBackingStoreCollection::willFlushLayers() to be exactly before flushing the layers. This fixes the assertion ASSERT(m_inLayerFlush) which was firing when running a layout test. RemoteLayerTreeDrawingArea::flushLayers() now can call itself through TestRunner::notifyDone(). flushLayers() was calling willFlushLayers() twice before calling didFlushLayers(). * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::layoutIfNeeded): (WebKit::WebPage::updateRendering): (WebKit::WebPage::willDisplayPage): Deleted. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::flushLayers): Source/WebKitLegacy/mac: * WebView/WebView.mm: (-[WebView _viewWillDrawInternal]): (-[WebView _flushCompositingChanges]): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WebKitLegacy/win: * WebView.cpp: (WebView::updateBackingStore): (WebView::flushPendingGraphicsLayerChangesSoon): (WebView::flushPendingGraphicsLayerChanges): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WTF: Add trace points for the page RenderingUpdate. * wtf/SystemTracing.h: Tools: Add trace points for the page RenderingUpdate. * Tracing/SystemTracePoints.plist: LayoutTests: * TestExpectations: There is a slight difference between the actual DRT and the expected DRT due to animation timing change. But these two tests are not animating correctly if they are opened in Safari with web animation turned on. * accessibility/mac/selection-notification-focus-change-expected.txt: * accessibility/mac/selection-notification-focus-change.html: Remove the debug statements form notificationCallback() since the number of times this function is called back and the order of notifications are not defined. This test has been flaky and some trials were made to make it more reliable. With this change it became flaky again. * animations/animation-multiple-callbacks-timestamp.html: Fix variable names used by an error message. * animations/no-style-recalc-during-accelerated-animation-expected.txt: * animations/no-style-recalc-during-accelerated-animation.html: One extra styleReclc was incurred due to the document styleRecalcTimer. I think this timer is not needed anymore. I will look at removing it in a separate patch. * animations/resources/animation-test-helpers.js: (waitForAnimationToStart): The expectation that animation will start at the beginning of the next event loop is not true anymore. The animation will start at the time the requestAnimationFrame fires. * compositing/video/video-clip-change-src.html: This test loads a video data and pushes it to the encoder. Originally it used to wait 150 ms after receiving the second canplaythrough. I had to change this timing to 250 ms. * css3/filters/composited-during-animation.html: Ditto. setTimeout({...}, 0) versus requestAnimationFrame. * media/media-controls-accessibility.html: Updating the accessibility button happens asynchronously, see [WebAccessibilityObjectWrapper accessibilityPerformPressAction]. Due to changing the page update timing, this test became flaky. Originally it used to setTimeout({...}, 10) to ensure the stringValue of the mutate button was changed after it was pressed. The fix is to loop using rAF till the stringValue changes. * platform/mac-wk2/accessibility/mac/selection-notification-focus-change-expected.txt: Removed. The number of time notificationCallback() is called and the order of notifications are not defined. And this is why we have two expected files: one for WK1 and the other for WK2. Since the test is now simplified, we can get rid of this duplication. We will test the minimum reliable thing we can test. Canonical link: https://commits.webkit.org/211093@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244182 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-04-11 05:44:13 +00:00
WTF_MAKE_FAST_ALLOCATED;
[Web Animations] Ensure animations are updated prior to requestAnimationFrame callbacks https://bugs.webkit.org/show_bug.cgi?id=186997 <rdar://problem/41419414> Reviewed by Dean Jackson. LayoutTests/imported/mozilla: Mark progressions in the Mozilla CSS Animations tests. * css-animations/test_animation-pausing-expected.txt: Source/WebCore: Some sub-tests of imported/mozilla/css-animations/test_animation-pausing.html clearly expect that animations would be resolved prior to firing a requestAnimationFrame() callback, as the HTML5 event loop mandates. But until now, both DocumentTimeline and ScriptedAnimationController would make calls to DisplayRefreshMonitorManager::scheduleAnimation() that were not coordinated and so the order in which the DocumentTimeline and ScriptedAnimationController callbacks were performed was not guaranteed. In this patch we add a new DocumentAnimationScheduler class which is created by a Document to manage this specific situation. Now DocumentTimeline and ScriptedAnimationController use this supporting object instead of being their own DisplayRefreshMonitorClient and call scheduleWebAnimationsResolution() and scheduleScriptedAnimationResolution() respectively to indicate the need to schedule an animation through the DisplayRefreshMonitorManager to serve the specific needs of either, or both, classes. Then DocumentAnimationScheduler ensures that Web Animations resolution happens prior to requestAnimationFrame callbacks when both are scheduled. In the future we should be able to move more code from DocumentTimeline and ScriptedAnimationController over to DocumentAnimationScheduler, such as support for throttling and using a timer-based fallback, but this patch provides the minimal functionality required to provide a sounder foundation. * Modules/webvr/VRDisplay.cpp: (WebCore::VRDisplay::requestAnimationFrame): * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * animation/DocumentAnimationScheduler.cpp: Added. (WebCore::DocumentAnimationScheduler::create): (WebCore::DocumentAnimationScheduler::DocumentAnimationScheduler): (WebCore::DocumentAnimationScheduler::detachFromDocument): (WebCore::DocumentAnimationScheduler::scheduleWebAnimationsResolution): (WebCore::DocumentAnimationScheduler::scheduleScriptedAnimationResolution): (WebCore::DocumentAnimationScheduler::displayRefreshFired): (WebCore::DocumentAnimationScheduler::windowScreenDidChange): (WebCore::DocumentAnimationScheduler::createDisplayRefreshMonitor const): * animation/DocumentAnimationScheduler.h: Copied from Source/WebCore/animation/CSSAnimation.h. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::create): (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::windowScreenDidChange): Deleted. (WebCore::DocumentTimeline::createDisplayRefreshMonitor const): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::prepareForDestruction): (WebCore::Document::windowScreenDidChange): (WebCore::Document::requestAnimationFrame): (WebCore::Document::animationScheduler): (WebCore::Document::timeline): * dom/Document.h: * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::ScriptedAnimationController): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): (WebCore::ScriptedAnimationController::windowScreenDidChange): Deleted. (WebCore::ScriptedAnimationController::displayRefreshFired): Deleted. (WebCore::ScriptedAnimationController::createDisplayRefreshMonitor const): Deleted. * dom/ScriptedAnimationController.h: (WebCore::ScriptedAnimationController::create): Canonical link: https://commits.webkit.org/202231@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233140 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-06-25 09:54:34 +00:00
public:
requestAnimationFrame should execute before the next frame https://bugs.webkit.org/show_bug.cgi?id=177484 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2019-04-10 Reviewed by Simon Fraser. LayoutTests/imported/w3c: Add trace points for the page RenderingUpdate. * web-platform-tests/resize-observer/resources/resizeTestHelper.js: Change ResizeTestHelper.TIMEOUT to be 1 second instead of 100 ms which is too short for layout tests. Source/WebCore: This change fixes these issues with animation timing: 1. Calling the requestAnimationFrame callbacks would have happened when the DisplayLink fires. This may have happened even if the frame is missed and no display is committed. 2. Style changes and layout triggered by script could trigger painting at more than 60fps. CoreAnimation commits could happen at more than 60fps, although WindowServer will throttle those, and only some will be shown on the screen. This change introduces a new paint scheduling model where painting is driven by a "RenderingUpdateScheduler", which only triggers paints once per 16.7ms frame. Code that previously scheduled a compositing layer flush now schedules a "RenderingUpdate", and that update is driven by a DisplayRefreshMonitor callback. When the render happens, we service requestAnimationFrame callbacks, Web Animations, intersection observations and resize observations per the "Update the rendering" step of the HTML Event Loop specification: <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. In the future, more rendering steps will be added to this code. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * accessibility/mac/AXObjectCacheMac.mm: (WebCore::AXObjectCache::platformHandleFocusedUIElementChanged): Fix layout tests by adding null check. * animation/DocumentAnimationScheduler.cpp: Removed. * animation/DocumentAnimationScheduler.h: Removed. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::updateThrottlingState): (WebCore::DocumentTimeline::suspendAnimations): (WebCore::DocumentTimeline::resumeAnimations): (WebCore::DocumentTimeline::liveCurrentTime const): (WebCore::DocumentTimeline::currentTime): (WebCore::DocumentTimeline::cacheCurrentTime): (WebCore::DocumentTimeline::animationTimingDidChange): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::unscheduleAnimationResolution): (WebCore::DocumentTimeline::updateAnimationsAndSendEvents): (WebCore::DocumentTimeline::internalUpdateAnimationsAndSendEvents): (WebCore::DocumentTimeline::scheduleNextTick): (WebCore::DocumentTimeline::updateListOfElementsWithRunningAcceleratedAnimationsForElement): Simplify this function by handling the case of no-animations separately. (WebCore::DocumentTimeline::resolveAnimationsForElement): Simplify the loop and delete hasPendingAcceleratedAnimations because it is initialized to true and is not changed inside the loop. (WebCore::DocumentTimeline::scheduleAnimationResolutionIfNeeded): Deleted. (WebCore::DocumentTimeline::animationResolutionTimerFired): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::resolveStyle): There is no need to force update in resolveStyle(). notifyFlushRequired() will be called eventually which will scheduleRenderingUpdate(). (WebCore::Document::prepareForDestruction): (WebCore::Document::updateAnimationsAndSendEvents): (WebCore::Document::serviceRequestAnimationFrameCallbacks): (WebCore::Document::windowScreenDidChange): (WebCore::Document::scheduleRenderingUpdate): (WebCore::Document::updateIntersectionObservations): (WebCore::Document::addResizeObserver): (WebCore::Document::updateResizeObservations): (WebCore::Document::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Document::scheduleResizeObservations): Deleted. (WebCore::Document::animationScheduler): Deleted. No need to schedule web-animations, intersection observations and resize observations updates separately. All of them will be updated through the "Update the rendering" step, i.e. Page::updateRendering(). * dom/Document.h: (WebCore::Document::numberOfIntersectionObservers const): * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::animationTimerFired): (WebCore::ScriptedAnimationController::serviceScriptedAnimations): Deleted. (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): Deleted. * dom/ScriptedAnimationController.h: * page/FrameView.cpp: (WebCore::FrameView::didLayout): (WebCore::FrameView::viewportContentsChanged): * page/FrameViewLayoutContext.cpp: (WebCore::FrameViewLayoutContext::layoutTimerFired): * page/IntersectionObserver.cpp: (WebCore::IntersectionObserver::observe): * page/Page.cpp: (WebCore::Page::Page): (WebCore::Page::layoutIfNeeded): (WebCore::Page::updateRendering): (WebCore::Page::renderingUpdateScheduler): (WebCore::Page::willDisplayPage): Deleted. (WebCore::Page::addDocumentNeedingIntersectionObservationUpdate): Deleted. (WebCore::Page::updateIntersectionObservations): Deleted. (WebCore::Page::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Page::hasResizeObservers const): Deleted. (WebCore::Page::gatherDocumentsNeedingResizeObservationCheck): Deleted. (WebCore::Page::checkResizeObservations): Deleted. (WebCore::Page::scheduleResizeObservations): Deleted. (WebCore::Page::notifyResizeObservers): Deleted. * page/Page.h: (WebCore::Page::setNeedsCheckResizeObservations): Deleted. (WebCore::Page::needsCheckResizeObservations const): Deleted. The IntersectionObserver and the ResizeObserver do not need to schedule their own timers. The RenderingUpdateScheduler will schedule the "Update the rendering" step in which these obverses will be served. * page/PageOverlayController.cpp: (WebCore::PageOverlayController::didChangeViewExposedRect): (WebCore::PageOverlayController::notifyFlushRequired): Force committing the layers to be 60 fps at maximum. * page/RenderingUpdateScheduler.cpp: Added. (WebCore::RenderingUpdateScheduler::RenderingUpdateScheduler): (WebCore::RenderingUpdateScheduler::scheduleRenderingUpdate): (WebCore::RenderingUpdateScheduler::isScheduled const): (WebCore::RenderingUpdateScheduler::startTimer): (WebCore::RenderingUpdateScheduler::clearScheduled): (WebCore::RenderingUpdateScheduler::createDisplayRefreshMonitor const): (WebCore::RenderingUpdateScheduler::windowScreenDidChange): (WebCore::RenderingUpdateScheduler::displayRefreshFired): (WebCore::RenderingUpdateScheduler::scheduleCompositingLayerFlush): * page/RenderingUpdateScheduler.h: Added. (WebCore::RenderingUpdateScheduler::create): * page/ResizeObserver.cpp: (WebCore::ResizeObserver::observe): (WebCore::ResizeObserver::scheduleObservations): Deleted. * page/ResizeObserver.h: (WebCore::ResizeObserver::hasActiveObservations const): * page/ios/ContentChangeObserver.h: * page/mac/ServicesOverlayController.mm: (WebCore::ServicesOverlayController::Highlight::notifyFlushRequired): * page/scrolling/ScrollingStateTree.cpp: * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::scheduleLayerFlushNow): (WebCore::RenderLayerCompositor::layerTreeAsText): Source/WebKit: Replace the calls to Page::layoutIfNeeded() and willDisplayPage() by a single call to Page::updateRendering(). This new function implements "Update the rendering" step of the HTML Event Loop specification <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. * WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp: (WebKit::DrawingAreaCoordinatedGraphics::scheduleCompositingLayerFlush): (WebKit::DrawingAreaCoordinatedGraphics::updateBackingStoreState): (WebKit::DrawingAreaCoordinatedGraphics::display): * WebProcess/WebPage/CoordinatedGraphics/LayerTreeHost.cpp: (WebKit::LayerTreeHost::layerFlushTimerFired): * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::flushLayers): -- Call Page::updateRendering() to make sure that "Update the rendering" happens immediately before updating the page. -- Move the call to RemoteLayerBackingStoreCollection::willFlushLayers() to be exactly before flushing the layers. This fixes the assertion ASSERT(m_inLayerFlush) which was firing when running a layout test. RemoteLayerTreeDrawingArea::flushLayers() now can call itself through TestRunner::notifyDone(). flushLayers() was calling willFlushLayers() twice before calling didFlushLayers(). * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::layoutIfNeeded): (WebKit::WebPage::updateRendering): (WebKit::WebPage::willDisplayPage): Deleted. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::flushLayers): Source/WebKitLegacy/mac: * WebView/WebView.mm: (-[WebView _viewWillDrawInternal]): (-[WebView _flushCompositingChanges]): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WebKitLegacy/win: * WebView.cpp: (WebView::updateBackingStore): (WebView::flushPendingGraphicsLayerChangesSoon): (WebView::flushPendingGraphicsLayerChanges): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WTF: Add trace points for the page RenderingUpdate. * wtf/SystemTracing.h: Tools: Add trace points for the page RenderingUpdate. * Tracing/SystemTracePoints.plist: LayoutTests: * TestExpectations: There is a slight difference between the actual DRT and the expected DRT due to animation timing change. But these two tests are not animating correctly if they are opened in Safari with web animation turned on. * accessibility/mac/selection-notification-focus-change-expected.txt: * accessibility/mac/selection-notification-focus-change.html: Remove the debug statements form notificationCallback() since the number of times this function is called back and the order of notifications are not defined. This test has been flaky and some trials were made to make it more reliable. With this change it became flaky again. * animations/animation-multiple-callbacks-timestamp.html: Fix variable names used by an error message. * animations/no-style-recalc-during-accelerated-animation-expected.txt: * animations/no-style-recalc-during-accelerated-animation.html: One extra styleReclc was incurred due to the document styleRecalcTimer. I think this timer is not needed anymore. I will look at removing it in a separate patch. * animations/resources/animation-test-helpers.js: (waitForAnimationToStart): The expectation that animation will start at the beginning of the next event loop is not true anymore. The animation will start at the time the requestAnimationFrame fires. * compositing/video/video-clip-change-src.html: This test loads a video data and pushes it to the encoder. Originally it used to wait 150 ms after receiving the second canplaythrough. I had to change this timing to 250 ms. * css3/filters/composited-during-animation.html: Ditto. setTimeout({...}, 0) versus requestAnimationFrame. * media/media-controls-accessibility.html: Updating the accessibility button happens asynchronously, see [WebAccessibilityObjectWrapper accessibilityPerformPressAction]. Due to changing the page update timing, this test became flaky. Originally it used to setTimeout({...}, 10) to ensure the stringValue of the mutate button was changed after it was pressed. The fix is to loop using rAF till the stringValue changes. * platform/mac-wk2/accessibility/mac/selection-notification-focus-change-expected.txt: Removed. The number of time notificationCallback() is called and the order of notifications are not defined. And this is why we have two expected files: one for WK1 and the other for WK2. Since the test is now simplified, we can get rid of this duplication. We will test the minimum reliable thing we can test. Canonical link: https://commits.webkit.org/211093@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244182 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-04-11 05:44:13 +00:00
static std::unique_ptr<RenderingUpdateScheduler> create(Page& page)
{
[WTF] Add makeUnique<T>, which ensures T is fast-allocated, makeUnique / makeUniqueWithoutFastMallocCheck part https://bugs.webkit.org/show_bug.cgi?id=200620 Source/JavaScriptCore: Reviewed by Geoff Garen. * API/JSCallbackObject.h: (JSC::JSCallbackObjectData::setPrivateProperty): * API/JSCallbackObjectFunctions.h: (JSC::JSCallbackObject<Parent>::JSCallbackObject): * API/JSClassRef.cpp: (OpaqueJSClassContextData::OpaqueJSClassContextData): (OpaqueJSClass::contextData): * API/JSMarkingConstraintPrivate.cpp: (JSContextGroupAddMarkingConstraint): * API/JSWrapperMap.mm: (-[JSWrapperMap initWithGlobalContextRef:]): * API/ObjCCallbackFunction.mm: (ArgumentTypeDelegate::typeInteger): (ArgumentTypeDelegate::typeDouble): (ArgumentTypeDelegate::typeBool): (ArgumentTypeDelegate::typeId): (ArgumentTypeDelegate::typeOfClass): (ArgumentTypeDelegate::typeStruct): (ResultTypeDelegate::typeInteger): (ResultTypeDelegate::typeDouble): (ResultTypeDelegate::typeBool): (ResultTypeDelegate::typeVoid): (ResultTypeDelegate::typeId): (ResultTypeDelegate::typeOfClass): (ResultTypeDelegate::typeBlock): (ResultTypeDelegate::typeStruct): (objCCallbackFunctionForInvocation): * API/glib/JSCContext.cpp: (jscContextSetVirtualMachine): * API/glib/JSCWrapperMap.cpp: (JSC::WrapperMap::WrapperMap): * assembler/ProbeStack.cpp: (JSC::Probe::Stack::ensurePageFor): * b3/B3LowerToAir.cpp: * b3/B3Procedure.cpp: (JSC::B3::Procedure::Procedure): (JSC::B3::Procedure::dominators): (JSC::B3::Procedure::naturalLoops): (JSC::B3::Procedure::backwardsCFG): (JSC::B3::Procedure::backwardsDominators): (JSC::B3::Procedure::addDataSection): * b3/air/AirCode.cpp: (JSC::B3::Air::Code::cCallSpecial): * b3/air/AirGenerate.cpp: (JSC::B3::Air::prepareForGeneration): * b3/air/testair.cpp: * b3/testb3.h: (compileProc): * bytecode/AccessCase.cpp: (JSC::AccessCase::generateImpl): * bytecode/AccessCaseSnippetParams.cpp: * bytecode/BytecodeBasicBlock.cpp: (JSC::BytecodeBasicBlock::computeImpl): * bytecode/CallLinkInfo.cpp: (JSC::CallLinkInfo::setFrameShuffleData): * bytecode/CodeBlock.cpp: (JSC::CodeBlock::ensureJITDataSlow): (JSC::CodeBlock::setCalleeSaveRegisters): (JSC::CodeBlock::ensureCatchLivenessIsComputedForBytecodeOffsetSlow): * bytecode/CodeBlock.h: (JSC::CodeBlock::createRareDataIfNecessary): * bytecode/DFGExitProfile.cpp: (JSC::DFG::ExitProfile::add): * bytecode/DeferredCompilationCallback.cpp: (JSC::DeferredCompilationCallback::ensureDeferredSourceDump): * bytecode/GetByIdStatus.cpp: (JSC::GetByIdStatus::computeForStubInfoWithoutExitSiteFeedback): * bytecode/GetByIdVariant.cpp: (JSC::GetByIdVariant::operator=): * bytecode/LazyOperandValueProfile.cpp: (JSC::CompressedLazyOperandValueProfileHolder::add): * bytecode/PolyProtoAccessChain.h: (JSC::PolyProtoAccessChain::clone): * bytecode/PolymorphicAccess.cpp: (JSC::PolymorphicAccess::regenerate): * bytecode/PutByIdStatus.cpp: (JSC::PutByIdStatus::computeForStubInfo): * bytecode/PutByIdVariant.cpp: (JSC::PutByIdVariant::operator=): * bytecode/RecordedStatuses.cpp: (JSC::RecordedStatuses::addCallLinkStatus): (JSC::RecordedStatuses::addGetByIdStatus): (JSC::RecordedStatuses::addPutByIdStatus): (JSC::RecordedStatuses::addInByIdStatus): * bytecode/StructureStubClearingWatchpoint.cpp: (JSC::WatchpointsOnStructureStubInfo::ensureReferenceAndAddWatchpoint): * bytecode/StructureStubInfo.cpp: (JSC::StructureStubInfo::addAccessCase): * bytecode/UnlinkedCodeBlock.cpp: (JSC::UnlinkedCodeBlock::livenessAnalysisSlow): * bytecode/UnlinkedCodeBlock.h: (JSC::UnlinkedCodeBlock::createRareDataIfNecessary): * bytecode/UnlinkedFunctionExecutable.cpp: (JSC::UnlinkedFunctionExecutable::ensureRareDataSlow): * bytecompiler/BytecodeGenerator.h: (JSC::BytecodeGenerator::generate): * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter<AbstractStateType>::AbstractInterpreter): * dfg/DFGGraph.cpp: (JSC::DFG::Graph::Graph): (JSC::DFG::Graph::livenessFor): (JSC::DFG::Graph::killsFor): (JSC::DFG::Graph::ensureCPSCFG): (JSC::DFG::Graph::ensureCPSDominators): (JSC::DFG::Graph::ensureSSADominators): (JSC::DFG::Graph::ensureCPSNaturalLoops): (JSC::DFG::Graph::ensureSSANaturalLoops): (JSC::DFG::Graph::ensureBackwardsCFG): (JSC::DFG::Graph::ensureBackwardsDominators): (JSC::DFG::Graph::ensureControlEquivalenceAnalysis): * dfg/DFGJITCompiler.cpp: (JSC::DFG::JITCompiler::JITCompiler): (JSC::DFG::JITCompiler::link): (JSC::DFG::JITCompiler::compile): (JSC::DFG::JITCompiler::compileFunction): (JSC::DFG::JITCompiler::addressOfDoubleConstant): * dfg/DFGLivenessAnalysisPhase.cpp: * dfg/DFGPlan.cpp: (JSC::DFG::Plan::compileInThreadImpl): * dfg/DFGSSAConversionPhase.cpp: (JSC::DFG::SSAConversionPhase::run): * dfg/DFGSlowPathGenerator.h: (JSC::DFG::slowPathCall): (JSC::DFG::slowPathMove): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::emitAllocateRawObject): (JSC::DFG::SpeculativeJIT::arrayify): (JSC::DFG::SpeculativeJIT::compileGetByValOnString): (JSC::DFG::SpeculativeJIT::compileCreateDirectArguments): (JSC::DFG::SpeculativeJIT::compileArraySlice): (JSC::DFG::SpeculativeJIT::emitStructureCheck): (JSC::DFG::SpeculativeJIT::compileAllocateNewArrayWithSize): * dfg/DFGStoreBarrierInsertionPhase.cpp: * dfg/DFGWorklist.cpp: (JSC::DFG::Worklist::createNewThread): * disassembler/Disassembler.cpp: (JSC::disassembleAsynchronously): * ftl/FTLAbstractHeap.cpp: (JSC::FTL::IndexedAbstractHeap::atSlow): * ftl/FTLCompile.cpp: (JSC::FTL::compile): * ftl/FTLFail.cpp: (JSC::FTL::fail): * ftl/FTLLink.cpp: (JSC::FTL::link): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::lazySlowPath): * ftl/FTLState.cpp: (JSC::FTL::State::State): * heap/CompleteSubspace.cpp: (JSC::CompleteSubspace::allocatorForSlow): * heap/Heap.cpp: (JSC::Heap::Heap): (JSC::Heap::protectedObjectTypeCounts): (JSC::Heap::objectTypeCounts): (JSC::Heap::addCoreConstraints): * heap/HeapInlines.h: * heap/HeapSnapshotBuilder.cpp: (JSC::HeapSnapshotBuilder::buildSnapshot): * heap/IsoCellSet.cpp: (JSC::IsoCellSet::addSlow): * heap/IsoSubspace.cpp: (JSC::IsoSubspace::IsoSubspace): * heap/MarkingConstraintSet.cpp: (JSC::MarkingConstraintSet::add): * inspector/JSGlobalObjectConsoleClient.cpp: (Inspector::JSGlobalObjectConsoleClient::messageWithTypeAndLevel): (Inspector::JSGlobalObjectConsoleClient::profile): (Inspector::JSGlobalObjectConsoleClient::profileEnd): (Inspector::JSGlobalObjectConsoleClient::warnUnimplemented): * inspector/JSGlobalObjectInspectorController.cpp: (Inspector::JSGlobalObjectInspectorController::JSGlobalObjectInspectorController): (Inspector::JSGlobalObjectInspectorController::reportAPIException): (Inspector::JSGlobalObjectInspectorController::ensureInspectorAgent): (Inspector::JSGlobalObjectInspectorController::ensureDebuggerAgent): (Inspector::JSGlobalObjectInspectorController::createLazyAgents): * inspector/agents/InspectorAgent.cpp: (Inspector::InspectorAgent::InspectorAgent): * inspector/agents/InspectorConsoleAgent.cpp: (Inspector::InspectorConsoleAgent::InspectorConsoleAgent): (Inspector::InspectorConsoleAgent::startTiming): (Inspector::InspectorConsoleAgent::logTiming): (Inspector::InspectorConsoleAgent::stopTiming): (Inspector::InspectorConsoleAgent::count): (Inspector::InspectorConsoleAgent::countReset): * inspector/agents/InspectorDebuggerAgent.cpp: (Inspector::InspectorDebuggerAgent::InspectorDebuggerAgent): * inspector/agents/InspectorHeapAgent.cpp: (Inspector::InspectorHeapAgent::InspectorHeapAgent): * inspector/agents/InspectorScriptProfilerAgent.cpp: (Inspector::InspectorScriptProfilerAgent::InspectorScriptProfilerAgent): * inspector/agents/InspectorTargetAgent.cpp: (Inspector::InspectorTargetAgent::InspectorTargetAgent): * inspector/agents/JSGlobalObjectDebuggerAgent.cpp: (Inspector::JSGlobalObjectDebuggerAgent::breakpointActionLog): * inspector/agents/JSGlobalObjectRuntimeAgent.cpp: (Inspector::JSGlobalObjectRuntimeAgent::JSGlobalObjectRuntimeAgent): * inspector/remote/socket/RemoteInspectorSocketEndpoint.cpp: (Inspector::RemoteInspectorSocketEndpoint::createClient): * inspector/remote/socket/RemoteInspectorSocketEndpoint.h: * inspector/scripts/codegen/objc_generator_templates.py: * inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result: * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/domain-availability.json-result: * inspector/scripts/tests/generic/expected/domains-with-varying-command-sizes.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result: * inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result: * jit/JIT.cpp: (JSC::JIT::compileWithoutLinking): (JSC::JIT::link): * jit/JITThunks.cpp: (JSC::JITThunks::JITThunks): * jit/Repatch.cpp: (JSC::linkPolymorphicCall): * jsc.cpp: (runJSC): * parser/Parser.cpp: (JSC::Parser<LexerType>::Parser): * parser/Parser.h: (JSC::Scope::pushLabel): (JSC::Parser<LexerType>::parse): * parser/ParserArena.h: (JSC::ParserArena::identifierArena): * profiler/ProfilerCompilation.cpp: (JSC::Profiler::Compilation::executionCounterFor): * runtime/Error.cpp: (JSC::getStackTrace): * runtime/FunctionExecutable.cpp: (JSC::FunctionExecutable::ensureRareDataSlow): * runtime/FunctionRareData.h: (JSC::FunctionRareData::createAllocationProfileClearingWatchpoint): * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): (JSC::JSGlobalObject::tryInstallArraySpeciesWatchpoint): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::createRareDataIfNeeded): * runtime/JSRunLoopTimer.cpp: (JSC::JSRunLoopTimer::Manager::PerVMData::PerVMData): (JSC::JSRunLoopTimer::Manager::registerVM): * runtime/PropertyMapHashTable.h: (JSC::PropertyTable::addDeletedOffset): * runtime/PropertyTable.cpp: (JSC::PropertyTable::PropertyTable): * runtime/RegExp.cpp: (JSC::RegExp::finishCreation): * runtime/RegExp.h: * runtime/ScriptExecutable.cpp: (JSC::ScriptExecutable::ensureTemplateObjectMapImpl): * runtime/Structure.cpp: (JSC::Structure::ensurePropertyReplacementWatchpointSet): * runtime/StructureRareData.cpp: (JSC::StructureRareData::setObjectToStringValue): * runtime/SymbolTable.cpp: (JSC::SymbolTable::localToEntry): (JSC::SymbolTable::cloneScopePart): (JSC::SymbolTable::prepareForTypeProfiling): (JSC::SymbolTable::setRareDataCodeBlock): * runtime/TypeSet.cpp: (JSC::StructureShape::propertyHash): * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::ensureHeapProfiler): (JSC::VM::enableTypeProfiler): (JSC::VM::enableControlFlowProfiler): (JSC::VM::queueMicrotask): (JSC::VM::ensureShadowChicken): * wasm/WasmAirIRGenerator.cpp: (JSC::Wasm::AirIRGenerator::emitPatchpoint): (JSC::Wasm::AirIRGenerator::emitCheck): (JSC::Wasm::parseAndCompileAir): * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::parseAndCompile): * wasm/WasmBBQPlan.cpp: (JSC::Wasm::BBQPlan::complete): * wasm/WasmOMGPlan.cpp: (JSC::Wasm::OMGPlan::work): * wasm/WasmWorklist.cpp: (JSC::Wasm::Worklist::Worklist): * wasm/js/JSToWasm.cpp: (JSC::Wasm::createJSToWasmWrapper): * yarr/YarrInterpreter.cpp: (JSC::Yarr::ByteCompiler::compile): (JSC::Yarr::ByteCompiler::atomParenthesesSubpatternEnd): (JSC::Yarr::ByteCompiler::regexBegin): * yarr/YarrJIT.cpp: (JSC::Yarr::YarrGenerator::compile): * yarr/YarrPattern.cpp: (JSC::Yarr::CharacterClassConstructor::charClass): (JSC::Yarr::YarrPatternConstructor::YarrPatternConstructor): (JSC::Yarr::YarrPatternConstructor::resetForReparsing): (JSC::Yarr::YarrPatternConstructor::atomParenthesesSubpatternBegin): (JSC::Yarr::YarrPatternConstructor::atomParentheticalAssertionBegin): (JSC::Yarr::YarrPatternConstructor::copyDisjunction): (JSC::Yarr::anycharCreate): * yarr/YarrPattern.h: (JSC::Yarr::PatternDisjunction::addNewAlternative): * yarr/create_regex_tables: * yarr/generateYarrUnicodePropertyTables.py: Source/WebCore: Reviewed by Geoff Garen. * Modules/applicationmanifest/ApplicationManifestParser.cpp: (WebCore::ApplicationManifestParser::logDeveloperWarning): * Modules/beacon/NavigatorBeacon.cpp: (WebCore::NavigatorBeacon::from): * Modules/cache/DOMWindowCaches.cpp: (WebCore::DOMWindowCaches::from): * Modules/cache/WorkerGlobalScopeCaches.cpp: (WebCore::WorkerGlobalScopeCaches::from): * Modules/credentialmanagement/NavigatorCredentials.cpp: (WebCore::NavigatorCredentials::from): * Modules/encryptedmedia/InitDataRegistry.cpp: (WebCore::InitDataRegistry::extractPsshBoxesFromCenc): * Modules/encryptedmedia/legacy/LegacyCDM.cpp: (WebCore::LegacyCDM::create): * Modules/encryptedmedia/legacy/LegacyCDMPrivateClearKey.cpp: (WebCore::LegacyCDMPrivateClearKey::createSession): * Modules/fetch/FetchBodyOwner.cpp: (WebCore::FetchBodyOwner::loadBlob): * Modules/fetch/FetchResponse.cpp: (WebCore::FetchResponse::fetch): (WebCore::FetchResponse::BodyLoader::start): * Modules/gamepad/NavigatorGamepad.cpp: (WebCore::NavigatorGamepad::from): * Modules/geolocation/GeolocationController.cpp: (WebCore::provideGeolocationTo): * Modules/geolocation/NavigatorGeolocation.cpp: (WebCore::NavigatorGeolocation::from): * Modules/indexeddb/DOMWindowIndexedDatabase.cpp: (WebCore::DOMWindowIndexedDatabase::from): * Modules/indexeddb/IDBObjectStore.cpp: (WebCore::IDBObjectStore::index): * Modules/indexeddb/IDBTransaction.cpp: (WebCore::IDBTransaction::objectStore): (WebCore::IDBTransaction::createObjectStore): (WebCore::IDBTransaction::createIndex): * Modules/indexeddb/WorkerGlobalScopeIndexedDatabase.cpp: (WebCore::WorkerGlobalScopeIndexedDatabase::from): * Modules/indexeddb/client/IDBConnectionToServer.cpp: (WebCore::IDBClient::IDBConnectionToServer::IDBConnectionToServer): * Modules/indexeddb/client/TransactionOperation.cpp: (WebCore::IDBClient::TransactionOperation::TransactionOperation): * Modules/indexeddb/server/IDBServer.cpp: (WebCore::IDBServer::IDBServer::getOrCreateUniqueIDBDatabase): (WebCore::IDBServer::IDBServer::createBackingStore): (WebCore::IDBServer::IDBServer::ensureQuotaUser): * Modules/indexeddb/server/IndexValueStore.cpp: (WebCore::IDBServer::IndexValueStore::addRecord): * Modules/indexeddb/server/MemoryBackingStoreTransaction.cpp: (WebCore::IDBServer::MemoryBackingStoreTransaction::create): (WebCore::IDBServer::MemoryBackingStoreTransaction::MemoryBackingStoreTransaction): (WebCore::IDBServer::MemoryBackingStoreTransaction::recordValueChanged): * Modules/indexeddb/server/MemoryIDBBackingStore.cpp: (WebCore::IDBServer::MemoryIDBBackingStore::create): (WebCore::IDBServer::MemoryIDBBackingStore::getOrEstablishDatabaseInfo): (WebCore::IDBServer::MemoryIDBBackingStore::setDatabaseInfo): * Modules/indexeddb/server/MemoryIndex.cpp: (WebCore::IDBServer::MemoryIndex::putIndexKey): (WebCore::IDBServer::MemoryIndex::maybeOpenCursor): * Modules/indexeddb/server/MemoryObjectStore.cpp: (WebCore::IDBServer::MemoryObjectStore::addRecord): (WebCore::IDBServer::MemoryObjectStore::maybeOpenCursor): * Modules/indexeddb/server/SQLiteIDBBackingStore.cpp: (WebCore::IDBServer::SQLiteIDBBackingStore::createAndPopulateInitialDatabaseInfo): (WebCore::IDBServer::SQLiteIDBBackingStore::extractExistingDatabaseInfo): (WebCore::IDBServer::SQLiteIDBBackingStore::getOrEstablishDatabaseInfo): (WebCore::IDBServer::SQLiteIDBBackingStore::beginTransaction): (WebCore::IDBServer::SQLiteIDBBackingStore::cachedStatement): * Modules/indexeddb/server/SQLiteIDBCursor.cpp: (WebCore::IDBServer::SQLiteIDBCursor::maybeCreate): (WebCore::IDBServer::SQLiteIDBCursor::maybeCreateBackingStoreCursor): (WebCore::IDBServer::SQLiteIDBCursor::createSQLiteStatement): (WebCore::IDBServer::SQLiteIDBCursor::internalFetchNextRecord): * Modules/indexeddb/server/SQLiteIDBTransaction.cpp: (WebCore::IDBServer::SQLiteIDBTransaction::begin): * Modules/indexeddb/server/UniqueIDBDatabase.cpp: (WebCore::IDBServer::UniqueIDBDatabase::didDeleteBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didOpenBackingStore): (WebCore::IDBServer::UniqueIDBDatabase::didPerformAbortTransaction): * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: (WebCore::IDBServer::UniqueIDBDatabaseTransaction::UniqueIDBDatabaseTransaction): * Modules/indexeddb/shared/IDBRequestData.cpp: (WebCore::IDBRequestData::IDBRequestData): (WebCore::IDBRequestData::isolatedCopy): * Modules/indexeddb/shared/IDBRequestData.h: (WebCore::IDBRequestData::decode): * Modules/indexeddb/shared/IDBResultData.cpp: (WebCore::IDBResultData::IDBResultData): (WebCore::IDBResultData::isolatedCopy): (WebCore::IDBResultData::openDatabaseSuccess): (WebCore::IDBResultData::openDatabaseUpgradeNeeded): (WebCore::IDBResultData::deleteDatabaseSuccess): (WebCore::IDBResultData::putOrAddSuccess): (WebCore::IDBResultData::getRecordSuccess): (WebCore::IDBResultData::getAllRecordsSuccess): (WebCore::IDBResultData::openCursorSuccess): (WebCore::IDBResultData::iterateCursorSuccess): * Modules/indexeddb/shared/IDBResultData.h: (WebCore::IDBResultData::decode): * Modules/indexeddb/shared/IDBTransactionInfo.cpp: (WebCore::IDBTransactionInfo::versionChange): (WebCore::IDBTransactionInfo::IDBTransactionInfo): (WebCore::IDBTransactionInfo::isolatedCopy): * Modules/indexeddb/shared/IDBTransactionInfo.h: (WebCore::IDBTransactionInfo::decode): * Modules/indexeddb/shared/InProcessIDBServer.cpp: (WebCore::InProcessIDBServer::quotaManager): * Modules/mediacapabilities/NavigatorMediaCapabilities.cpp: (WebCore::NavigatorMediaCapabilities::from): * Modules/mediasession/WebMediaSessionManager.cpp: (WebCore::WebMediaSessionManager::mockPicker): (WebCore::WebMediaSessionManager::addPlaybackTargetPickerClient): * Modules/mediasource/MediaSource.cpp: (WebCore::MediaSource::buffered const): (WebCore::MediaSource::setLiveSeekableRange): * Modules/mediastream/NavigatorMediaDevices.cpp: (WebCore::NavigatorMediaDevices::from): * Modules/mediastream/UserMediaController.cpp: (WebCore::provideUserMediaTo): * Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp: (WebCore::LibWebRTCDataChannelHandler::channelEvent): * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp: (WebCore::LibWebRTCMediaEndpoint::addRemoteTrack): (WebCore::LibWebRTCMediaEndpoint::collectTransceivers): (WebCore::LibWebRTCMediaEndpoint::newTransceiver): (WebCore::LibWebRTCMediaEndpoint::createTransceiverBackends): (WebCore::LibWebRTCMediaEndpoint::transceiverBackendFromSender): (WebCore::LibWebRTCMediaEndpoint::createDataChannel): * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp: (WebCore::createLibWebRTCPeerConnectionBackend): (WebCore::LibWebRTCPeerConnectionBackend::videoReceiver): (WebCore::LibWebRTCPeerConnectionBackend::audioReceiver): (WebCore::LibWebRTCPeerConnectionBackend::addTrack): (WebCore::LibWebRTCPeerConnectionBackend::addTransceiver): * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp: (WebCore::LibWebRTCRtpSenderBackend::createDTMFBackend): * Modules/mediastream/libwebrtc/LibWebRTCRtpTransceiverBackend.cpp: (WebCore::LibWebRTCRtpTransceiverBackend::createReceiverBackend): (WebCore::LibWebRTCRtpTransceiverBackend::createSenderBackend): * Modules/notifications/Notification.cpp: (WebCore::Notification::Notification): * Modules/notifications/NotificationController.cpp: (WebCore::provideNotification): * Modules/quota/DOMWindowQuota.cpp: (WebCore::DOMWindowQuota::from): * Modules/quota/NavigatorStorageQuota.cpp: (WebCore::NavigatorStorageQuota::from): * Modules/quota/WorkerNavigatorStorageQuota.cpp: (WebCore::WorkerNavigatorStorageQuota::from): * Modules/speech/DOMWindowSpeechSynthesis.cpp: (WebCore::DOMWindowSpeechSynthesis::from): * Modules/speech/SpeechSynthesis.cpp: (WebCore::SpeechSynthesis::ensurePlatformSpeechSynthesizer): * Modules/webaudio/AsyncAudioDecoder.cpp: (WebCore::AsyncAudioDecoder::decodeAsync): * Modules/webaudio/AudioBasicInspectorNode.cpp: (WebCore::AudioBasicInspectorNode::AudioBasicInspectorNode): * Modules/webaudio/AudioBasicProcessorNode.cpp: (WebCore::AudioBasicProcessorNode::AudioBasicProcessorNode): * Modules/webaudio/AudioBufferSourceNode.cpp: (WebCore::AudioBufferSourceNode::AudioBufferSourceNode): * Modules/webaudio/AudioContext.cpp: (WebCore::AudioContext::AudioContext): (WebCore::AudioContext::decodeAudioData): * Modules/webaudio/AudioDestinationNode.cpp: (WebCore::AudioDestinationNode::AudioDestinationNode): * Modules/webaudio/BiquadFilterNode.cpp: (WebCore::BiquadFilterNode::BiquadFilterNode): * Modules/webaudio/BiquadProcessor.cpp: (WebCore::BiquadProcessor::createKernel): (WebCore::BiquadProcessor::getFrequencyResponse): * Modules/webaudio/ChannelMergerNode.cpp: (WebCore::ChannelMergerNode::ChannelMergerNode): * Modules/webaudio/ChannelSplitterNode.cpp: (WebCore::ChannelSplitterNode::ChannelSplitterNode): * Modules/webaudio/ConvolverNode.cpp: (WebCore::ConvolverNode::ConvolverNode): (WebCore::ConvolverNode::setBuffer): * Modules/webaudio/DelayNode.cpp: (WebCore::DelayNode::DelayNode): * Modules/webaudio/DelayProcessor.cpp: (WebCore::DelayProcessor::createKernel): * Modules/webaudio/DynamicsCompressorNode.cpp: (WebCore::DynamicsCompressorNode::DynamicsCompressorNode): (WebCore::DynamicsCompressorNode::initialize): * Modules/webaudio/GainNode.cpp: (WebCore::GainNode::GainNode): * Modules/webaudio/MediaElementAudioSourceNode.cpp: (WebCore::MediaElementAudioSourceNode::MediaElementAudioSourceNode): (WebCore::MediaElementAudioSourceNode::setFormat): * Modules/webaudio/MediaStreamAudioSourceNode.cpp: (WebCore::MediaStreamAudioSourceNode::MediaStreamAudioSourceNode): (WebCore::MediaStreamAudioSourceNode::setFormat): * Modules/webaudio/OscillatorNode.cpp: (WebCore::OscillatorNode::OscillatorNode): * Modules/webaudio/PannerNode.cpp: (WebCore::PannerNode::PannerNode): * Modules/webaudio/PeriodicWave.cpp: (WebCore::PeriodicWave::createBandLimitedTables): * Modules/webaudio/RealtimeAnalyser.cpp: (WebCore::RealtimeAnalyser::RealtimeAnalyser): (WebCore::RealtimeAnalyser::setFftSize): * Modules/webaudio/ScriptProcessorNode.cpp: (WebCore::ScriptProcessorNode::ScriptProcessorNode): * Modules/webaudio/WaveShaperDSPKernel.cpp: (WebCore::WaveShaperDSPKernel::lazyInitializeOversampling): * Modules/webaudio/WaveShaperNode.cpp: (WebCore::WaveShaperNode::WaveShaperNode): * Modules/webaudio/WaveShaperProcessor.cpp: (WebCore::WaveShaperProcessor::createKernel): * Modules/webauthn/fido/FidoHidMessage.cpp: (fido::FidoHidMessage::FidoHidMessage): * Modules/webauthn/fido/FidoHidPacket.cpp: (fido::FidoHidInitPacket::createFromSerializedData): (fido::FidoHidContinuationPacket::createFromSerializedData): * Modules/webdatabase/Database.cpp: (WebCore::Database::openAndVerifyVersion): (WebCore::Database::close): (WebCore::Database::scheduleTransaction): (WebCore::Database::scheduleTransactionStep): (WebCore::Database::tableNames): * Modules/webdatabase/DatabaseThread.cpp: (WebCore::DatabaseThread::DatabaseThread): * Modules/webdatabase/DatabaseTracker.cpp: (WebCore::DatabaseTracker::addOpenDatabase): (WebCore::DatabaseTracker::recordCreatingDatabase): (WebCore::DatabaseTracker::recordDeletingDatabase): * Modules/webdatabase/SQLTransaction.cpp: (WebCore::SQLTransaction::executeSql): (WebCore::SQLTransaction::openTransactionAndPreflight): * Modules/webdriver/NavigatorWebDriver.cpp: (WebCore::NavigatorWebDriver::from): * Modules/webgpu/NavigatorGPU.cpp: (WebCore::NavigatorGPU::from): * Modules/webgpu/WHLSL/AST/WHLSLEnumerationDefinition.h: * Modules/webgpu/WHLSL/AST/WHLSLVariableDeclaration.h: * Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp: (WebCore::WHLSL::Metal::RenderFunctionDefinitionWriter::createEntryPointScaffolding): (WebCore::WHLSL::Metal::ComputeFunctionDefinitionWriter::createEntryPointScaffolding): * Modules/webgpu/WHLSL/Metal/WHLSLTypeNamer.cpp: (WebCore::WHLSL::Metal::TypeNamer::createNameNode): * Modules/webgpu/WHLSL/WHLSLChecker.cpp: (WebCore::WHLSL::Checker::assignConcreteType): (WebCore::WHLSL::Checker::assignType): (WebCore::WHLSL::Checker::forwardType): * Modules/webgpu/WHLSL/WHLSLParser.cpp: (WebCore::WHLSL::Parser::parseSemantic): * Modules/webgpu/WorkerNavigatorGPU.cpp: (WebCore::WorkerNavigatorGPU::from): * Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp: (WebCore::ThreadableWebSocketChannelClientWrapper::didConnect): (WebCore::ThreadableWebSocketChannelClientWrapper::didReceiveMessage): (WebCore::ThreadableWebSocketChannelClientWrapper::didReceiveBinaryData): (WebCore::ThreadableWebSocketChannelClientWrapper::didUpdateBufferedAmount): (WebCore::ThreadableWebSocketChannelClientWrapper::didStartClosingHandshake): (WebCore::ThreadableWebSocketChannelClientWrapper::didClose): (WebCore::ThreadableWebSocketChannelClientWrapper::didReceiveMessageError): (WebCore::ThreadableWebSocketChannelClientWrapper::didUpgradeURL): * Modules/websockets/WebSocketChannel.cpp: (WebCore::WebSocketChannel::connect): (WebCore::WebSocketChannel::enqueueTextFrame): (WebCore::WebSocketChannel::enqueueRawFrame): (WebCore::WebSocketChannel::enqueueBlobFrame): (WebCore::WebSocketChannel::processOutgoingFrameQueue): * Modules/websockets/WebSocketDeflateFramer.cpp: (WebCore::WebSocketDeflateFramer::createExtensionProcessor): (WebCore::WebSocketDeflateFramer::enableDeflate): (WebCore::WebSocketDeflateFramer::deflate): (WebCore::WebSocketDeflateFramer::inflate): * Modules/websockets/WebSocketDeflater.cpp: (WebCore::WebSocketDeflater::WebSocketDeflater): (WebCore::WebSocketInflater::WebSocketInflater): * Modules/websockets/WorkerThreadableWebSocketChannel.cpp: (WebCore::WorkerThreadableWebSocketChannel::Bridge::mainThreadInitialize): * Modules/webvr/NavigatorWebVR.cpp: (WebCore::NavigatorWebVR::from): * accessibility/AXObjectCache.cpp: (WebCore::AXObjectCache::startCachingComputedObjectAttributesUntilTreeMutates): * animation/WebAnimation.cpp: (WebCore::WebAnimation::updateFinishedState): * bindings/js/JSDOMWindowBase.cpp: (WebCore::JSDOMWindowBase::queueTaskToEventLoop): * bindings/js/JSEventTargetCustom.cpp: (WebCore::jsEventTargetCast): * bindings/js/JSWorkerGlobalScopeBase.cpp: (WebCore::JSWorkerGlobalScopeBase::queueTaskToEventLoop): * bindings/js/SerializedScriptValue.cpp: (WebCore::transferArrayBuffers): (WebCore::SerializedScriptValue::create): * bindings/js/SerializedScriptValue.h: (WebCore::SerializedScriptValue::decode): * bindings/js/WebCoreJSClientData.cpp: (WebCore::JSVMClientData::initNormalWorld): * bindings/js/WorkerScriptController.cpp: (WebCore::WorkerScriptController::initScript): * bridge/c/c_class.cpp: (JSC::Bindings::CClass::methodNamed const): (JSC::Bindings::CClass::fieldNamed const): * bridge/objc/objc_class.mm: (JSC::Bindings::ObjcClass::methodNamed const): (JSC::Bindings::ObjcClass::fieldNamed const): * bridge/objc/objc_runtime.mm: (JSC::Bindings::callObjCFallbackObject): * contentextensions/CombinedURLFilters.cpp: (WebCore::ContentExtensions::CombinedURLFilters::CombinedURLFilters): (WebCore::ContentExtensions::CombinedURLFilters::addPattern): * crypto/SubtleCrypto.cpp: (WebCore::normalizeCryptoAlgorithmParameters): (WebCore::crossThreadCopyImportParams): * css/CSSCalculationValue.cpp: (WebCore::determineCategory): * css/CSSDefaultStyleSheets.cpp: (WebCore::CSSDefaultStyleSheets::loadFullDefaultStyle): (WebCore::CSSDefaultStyleSheets::loadSimpleDefaultStyle): * css/CSSFontFace.cpp: (WebCore::CSSFontFace::appendSources): * css/CSSFontFaceSet.cpp: (WebCore::CSSFontFaceSet::ensureLocalFontFacesForFamilyRegistered): * css/CSSGroupingRule.cpp: (WebCore::CSSGroupingRule::cssRules const): * css/CSSImageGeneratorValue.cpp: (WebCore::CSSImageGeneratorValue::saveCachedImageForSize): * css/CSSKeyframesRule.cpp: (WebCore::CSSKeyframesRule::cssRules): * css/CSSStyleSheet.cpp: (WebCore::CSSStyleSheet::cssRules): * css/DOMCSSPaintWorklet.cpp: (WebCore::DOMCSSPaintWorklet::from): * css/DOMCSSRegisterCustomProperty.cpp: (WebCore::DOMCSSRegisterCustomProperty::from): * css/DocumentRuleSets.cpp: (WebCore::DocumentRuleSets::DocumentRuleSets): (WebCore::DocumentRuleSets::updateUserAgentMediaQueryStyleIfNeeded const): (WebCore::DocumentRuleSets::initializeUserStyle): (WebCore::makeRuleSet): (WebCore::DocumentRuleSets::resetAuthorStyle): (WebCore::ensureInvalidationRuleSets): * css/ElementRuleCollector.cpp: (WebCore::ElementRuleCollector::collectSlottedPseudoElementRulesForSlot): * css/FontFace.cpp: (WebCore::populateFontFaceWithArrayBuffer): * css/PropertySetCSSStyleDeclaration.cpp: (WebCore::PropertySetCSSStyleDeclaration::wrapForDeprecatedCSSOM): * css/RuleFeature.cpp: (WebCore::RuleFeatureSet::collectFeatures): (WebCore::RuleFeatureSet::add): * css/RuleSet.cpp: (WebCore::RuleSet::addToRuleSet): * css/StyleBuilderConverter.h: (WebCore::StyleBuilderConverter::convertTo100PercentMinusLength): * css/StyleBuilderCustom.h: (WebCore::StyleBuilderCustom::applyTextOrBoxShadowValue): (WebCore::StyleBuilderCustom::applyInheritTextShadow): (WebCore::StyleBuilderCustom::applyInheritBoxShadow): (WebCore::StyleBuilderCustom::applyValueContent): * css/StyleProperties.cpp: (WebCore::MutableStyleProperties::ensureCSSStyleDeclaration): (WebCore::MutableStyleProperties::ensureInlineCSSStyleDeclaration): * css/StyleResolver.cpp: (WebCore::StyleResolver::cascadedPropertiesForRollback): * css/makeprop.pl: (generateFillLayerPropertyInheritValueSetter): (generateFillLayerPropertyValueSetter): * css/parser/CSSParserImpl.cpp: (WebCore::CSSParserImpl::CSSParserImpl): (WebCore::CSSParserImpl::parsePageSelector): (WebCore::CSSParserImpl::consumeMediaRule): (WebCore::CSSParserImpl::consumeSupportsRule): (WebCore::CSSParserImpl::consumeKeyframesRule): * css/parser/CSSParserSelector.cpp: (WebCore::CSSParserSelector::parsePagePseudoSelector): (WebCore::CSSParserSelector::parsePseudoElementSelector): (WebCore::CSSParserSelector::parsePseudoClassSelector): (WebCore::CSSParserSelector::CSSParserSelector): (WebCore::CSSParserSelector::adoptSelectorVector): (WebCore::CSSParserSelector::prependTagSelector): * css/parser/CSSPropertyParser.cpp: (WebCore::consumeBasicShapePath): * css/parser/CSSSelectorParser.cpp: (WebCore::CSSSelectorParser::consumePseudo): * dom/CustomElementReactionQueue.cpp: (WebCore::CustomElementReactionQueue::ensureBackupQueue): * dom/DataTransfer.cpp: (WebCore::DataTransfer::items): (WebCore::DataTransfer::createForInputEvent): (WebCore::DataTransfer::createForDragStartEvent): (WebCore::DataTransfer::setDragImage): * dom/DeviceOrientationController.cpp: (WebCore::provideDeviceOrientationTo): * dom/Document.cpp: (WebCore::Document::Document): (WebCore::Document::buildAccessKeyCache): (WebCore::Document::implementation): (WebCore::Document::formController): (WebCore::Document::updateTextRenderer): (WebCore::Document::userAgentShadowTreeStyleResolver): (WebCore::Document::axObjectCache const): (WebCore::Document::setParsing): (WebCore::Document::accessSVGExtensions): (WebCore::Document::initSecurityContext): (WebCore::Document::textAutoSizing): (WebCore::Document::didAddWheelEventHandler): (WebCore::Document::didAddTouchEventHandler): (WebCore::Document::didLogMessage): (WebCore::Document::registerCSSProperty): (WebCore::Document::deviceOrientationAndMotionAccessController): (WebCore::Document::contentChangeObserver): (WebCore::Document::domTimerHoldingTank): * dom/Document.h: (WebCore::Document::createParserYieldToken): * dom/DocumentEventQueue.cpp: (WebCore::DocumentEventQueue::DocumentEventQueue): * dom/DocumentMarkerController.cpp: (WebCore::DocumentMarkerController::addMarker): * dom/DocumentStorageAccess.cpp: (WebCore::DocumentStorageAccess::from): (WebCore::DocumentStorageAccess::requestStorageAccess): (WebCore::DocumentStorageAccess::enableTemporaryTimeUserGesture): * dom/Element.cpp: (WebCore::Element::attributes const): (WebCore::Element::setIsDefinedCustomElement): (WebCore::Element::enqueueToUpgrade): (WebCore::Element::classList): (WebCore::Element::dataset): (WebCore::Element::ensureIntersectionObserverData): (WebCore::Element::ensureResizeObserverData): * dom/EventListenerMap.cpp: (WebCore::EventListenerMap::add): * dom/EventNames.h: * dom/EventPath.cpp: (WebCore::EventPath::buildPath): (WebCore::EventPath::EventPath): * dom/IdTargetObserverRegistry.cpp: (WebCore::IdTargetObserverRegistry::addObserver): * dom/KeyboardEvent.cpp: (WebCore::KeyboardEvent::KeyboardEvent): * dom/MutationObserver.cpp: (WebCore::queueMutationObserverCompoundMicrotask): * dom/MutationObserverInterestGroup.cpp: (WebCore::MutationObserverInterestGroup::createIfNeeded): * dom/MutationObserverRegistration.cpp: (WebCore::MutationObserverRegistration::observedSubtreeNodeWillDetach): * dom/Node.cpp: (WebCore::Node::materializeRareData): (WebCore::Node::ensureEventTargetData): (WebCore::Node::registerMutationObserver): * dom/NodeRareData.h: (WebCore::NodeRareData::ensureNodeLists): (WebCore::NodeRareData::ensureMutationObserverData): * dom/RadioButtonGroups.cpp: (WebCore::RadioButtonGroups::addButton): * dom/ScriptExecutionContext.cpp: (WebCore::ScriptExecutionContext::reportException): (WebCore::ScriptExecutionContext::reportUnhandledPromiseRejection): (WebCore::ScriptExecutionContext::ensureRejectedPromiseTrackerSlow): * dom/SelectorQuery.cpp: * dom/ShadowRoot.cpp: (WebCore::ShadowRoot::ShadowRoot): (WebCore::ShadowRoot::moveShadowRootToNewDocument): (WebCore::ShadowRoot::addSlotElementByName): * dom/SlotAssignment.cpp: (WebCore::SlotAssignment::addSlotElementByName): (WebCore::SlotAssignment::assignToSlot): * dom/TreeScope.cpp: (WebCore::TreeScope::TreeScope): (WebCore::TreeScope::addElementById): (WebCore::TreeScope::addElementByName): (WebCore::TreeScope::addImageMap): (WebCore::TreeScope::addImageElementByUsemap): (WebCore::TreeScope::labelElementForId): * editing/Editor.cpp: (WebCore::createDataTransferForClipboardEvent): (WebCore::Editor::Editor): * editing/ReplaceSelectionCommand.cpp: (WebCore::ReplaceSelectionCommand::ensureReplacementFragment): * editing/SelectionRectGatherer.cpp: (WebCore::SelectionRectGatherer::clearAndCreateNotifier): * editing/TextIterator.cpp: (WebCore::TextIterator::handleTextNode): * editing/cocoa/HTMLConverter.mm: (HTMLConverter::HTMLConverter): (HTMLConverterCaches::computedStylePropertyForElement): * editing/markup.cpp: (WebCore::createPageForSanitizingWebContent): * fileapi/AsyncFileStream.cpp: (WebCore::callOnFileThread): (WebCore::AsyncFileStream::AsyncFileStream): * fileapi/FileReader.cpp: (WebCore::FileReader::readInternal): * history/CachedFrame.cpp: (WebCore::CachedFrame::CachedFrame): * history/CachedPage.cpp: (WebCore::CachedPage::CachedPage): * history/PageCache.cpp: (WebCore::PageCache::addIfCacheable): * html/FileInputType.cpp: (WebCore::FileInputType::requestIcon): * html/FormAssociatedElement.cpp: (WebCore::FormAssociatedElement::resetFormAttributeTargetObserver): * html/FormController.cpp: (WebCore::SavedFormState::deserialize): (WebCore::FormController::createSavedFormStateMap): (WebCore::FormController::takeStateForFormElement): * html/HTMLAnchorElement.cpp: (WebCore::HTMLAnchorElement::relList const): * html/HTMLAreaElement.cpp: (WebCore::HTMLAreaElement::mapMouseEvent): * html/HTMLCanvasElement.cpp: (WebCore::HTMLCanvasElement::setImageBuffer const): * html/HTMLCollection.cpp: (WebCore::HTMLCollection::updateNamedElementCache const): * html/HTMLDetailsElement.cpp: (WebCore::HTMLDetailsElement::create): * html/HTMLFormControlElement.cpp: (WebCore::HTMLFormControlElement::updateVisibleValidationMessage): * html/HTMLFormControlsCollection.cpp: (WebCore::HTMLFormControlsCollection::updateNamedElementCache const): * html/HTMLFormElement.cpp: (WebCore::HTMLFormElement::addToPastNamesMap): * html/HTMLIFrameElement.cpp: (WebCore::HTMLIFrameElement::sandbox): * html/HTMLInputElement.cpp: (WebCore::HTMLInputElement::ensureImageLoader): (WebCore::HTMLInputElement::resetListAttributeTargetObserver): * html/HTMLLinkElement.cpp: (WebCore::HTMLLinkElement::sizes): (WebCore::HTMLLinkElement::relList): * html/HTMLMediaElement.cpp: (WebCore::HTMLMediaElement::finishInitialization): (WebCore::HTMLMediaElement::seekWithTolerance): * html/HTMLOutputElement.cpp: (WebCore::HTMLOutputElement::htmlFor): * html/HTMLPlugInImageElement.cpp: (WebCore::HTMLPlugInImageElement::updateAfterStyleResolution): * html/HTMLSummaryElement.cpp: (WebCore::HTMLSummaryElement::create): * html/HTMLVideoElement.cpp: (WebCore::HTMLVideoElement::didAttachRenderers): (WebCore::HTMLVideoElement::parseAttribute): * html/PublicURLManager.cpp: (WebCore::PublicURLManager::create): * html/ValidationMessage.cpp: (WebCore::ValidationMessage::setMessage): (WebCore::ValidationMessage::setMessageDOMAndStartTimer): (WebCore::ValidationMessage::requestToHideMessage): * html/canvas/CanvasRenderingContext2DBase.cpp: (WebCore::DisplayListDrawingContext::DisplayListDrawingContext): (WebCore::CanvasRenderingContext2DBase::drawingContext const): * html/canvas/WebGL2RenderingContext.cpp: (WebCore::WebGL2RenderingContext::getExtension): * html/canvas/WebGLRenderingContext.cpp: (WebCore::WebGLRenderingContext::getExtension): * html/canvas/WebGLRenderingContextBase.cpp: (WebCore::WebGLRenderingContextBase::initializeNewContext): (WebCore::WebGLRenderingContextBase::compileShader): (WebCore::WebGLRenderingContextBase::printToConsole): * html/parser/CSSPreloadScanner.cpp: (WebCore::CSSPreloadScanner::emitRule): * html/parser/HTMLConstructionSite.cpp: (WebCore::HTMLConstructionSite::insertHTMLElementOrFindCustomElementInterface): * html/parser/HTMLDocumentParser.cpp: (WebCore::HTMLDocumentParser::HTMLDocumentParser): (WebCore::HTMLDocumentParser::pumpTokenizer): (WebCore::HTMLDocumentParser::insert): * html/parser/HTMLElementStack.cpp: (WebCore::HTMLElementStack::insertAbove): (WebCore::HTMLElementStack::pushCommon): * html/parser/HTMLPreloadScanner.cpp: (WebCore::TokenPreloadScanner::StartTagScanner::createPreloadRequest): * html/parser/HTMLToken.h: (WebCore::HTMLToken::beginDOCTYPE): * html/parser/XSSAuditor.cpp: (WebCore::XSSAuditor::filterToken): (WebCore::XSSAuditor::decodedHTTPBodySuffixTree): * html/shadow/TextControlInnerElements.cpp: (WebCore::TextControlInnerTextElement::resolveCustomStyle): * html/track/InbandGenericTextTrack.cpp: (WebCore::InbandGenericTextTrack::parser): * html/track/InbandWebVTTTextTrack.cpp: (WebCore::InbandWebVTTTextTrack::parser): * html/track/LoadableTextTrack.cpp: (WebCore::LoadableTextTrack::loadTimerFired): * inspector/CommandLineAPIHost.cpp: (WebCore::CommandLineAPIHost::CommandLineAPIHost): (WebCore::CommandLineAPIHost::clearAllWrappers): * inspector/DOMEditor.cpp: (WebCore::DOMEditor::insertBefore): (WebCore::DOMEditor::removeChild): (WebCore::DOMEditor::setAttribute): (WebCore::DOMEditor::removeAttribute): (WebCore::DOMEditor::setOuterHTML): (WebCore::DOMEditor::insertAdjacentHTML): (WebCore::DOMEditor::replaceWholeText): (WebCore::DOMEditor::replaceChild): (WebCore::DOMEditor::setNodeValue): * inspector/DOMPatchSupport.cpp: (WebCore::DOMPatchSupport::createDigest): * inspector/InspectorController.cpp: (WebCore::InspectorController::InspectorController): (WebCore::InspectorController::createLazyAgents): (WebCore::InspectorController::ensureInspectorAgent): (WebCore::InspectorController::ensureDOMAgent): (WebCore::InspectorController::ensurePageAgent): * inspector/InspectorHistory.cpp: (WebCore::InspectorHistory::markUndoableState): * inspector/InspectorStyleSheet.cpp: (ParsedStyleSheet::setSourceData): (WebCore::InspectorStyleSheet::ensureSourceData): * inspector/NetworkResourcesData.cpp: (WebCore::NetworkResourcesData::resourceCreated): * inspector/WorkerInspectorController.cpp: (WebCore::WorkerInspectorController::WorkerInspectorController): (WebCore::WorkerInspectorController::connectFrontend): (WebCore::WorkerInspectorController::createLazyAgents): * inspector/agents/InspectorApplicationCacheAgent.cpp: (WebCore::InspectorApplicationCacheAgent::InspectorApplicationCacheAgent): * inspector/agents/InspectorCPUProfilerAgent.cpp: (WebCore::InspectorCPUProfilerAgent::InspectorCPUProfilerAgent): * inspector/agents/InspectorCSSAgent.cpp: (WebCore::InspectorCSSAgent::InspectorCSSAgent): (WebCore::InspectorCSSAgent::setStyleSheetText): (WebCore::InspectorCSSAgent::setStyleText): (WebCore::InspectorCSSAgent::setRuleSelector): (WebCore::InspectorCSSAgent::addRule): * inspector/agents/InspectorCanvasAgent.cpp: (WebCore::InspectorCanvasAgent::InspectorCanvasAgent): (WebCore::InspectorCanvasAgent::recordCanvasAction): * inspector/agents/InspectorDOMAgent.cpp: (WebCore::InspectorDOMAgent::InspectorDOMAgent): (WebCore::InspectorDOMAgent::didCreateFrontendAndBackend): (WebCore::InspectorDOMAgent::pushNodePathToFrontend): (WebCore::InspectorDOMAgent::highlightConfigFromInspectorObject): (WebCore::InspectorDOMAgent::highlightRect): (WebCore::InspectorDOMAgent::highlightQuad): (WebCore::InspectorDOMAgent::innerHighlightQuad): (WebCore::InspectorDOMAgent::highlightFrame): (WebCore::InspectorDOMAgent::setInspectedNode): (WebCore::InspectorDOMAgent::didInvalidateStyleAttr): * inspector/agents/InspectorDOMStorageAgent.cpp: (WebCore::InspectorDOMStorageAgent::InspectorDOMStorageAgent): * inspector/agents/InspectorDatabaseAgent.cpp: (WebCore::InspectorDatabaseAgent::InspectorDatabaseAgent): * inspector/agents/InspectorLayerTreeAgent.cpp: (WebCore::InspectorLayerTreeAgent::InspectorLayerTreeAgent): * inspector/agents/InspectorMemoryAgent.cpp: (WebCore::InspectorMemoryAgent::InspectorMemoryAgent): * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::InspectorNetworkAgent::InspectorNetworkAgent): * inspector/agents/InspectorPageAgent.cpp: (WebCore::InspectorPageAgent::InspectorPageAgent): * inspector/agents/InspectorTimelineAgent.cpp: (WebCore::InspectorTimelineAgent::InspectorTimelineAgent): (WebCore::InspectorTimelineAgent::internalStart): (WebCore::InspectorTimelineAgent::startFromConsole): (WebCore::InspectorTimelineAgent::stopFromConsole): * inspector/agents/InspectorWorkerAgent.cpp: (WebCore::InspectorWorkerAgent::InspectorWorkerAgent): * inspector/agents/WebConsoleAgent.cpp: (WebCore::WebConsoleAgent::didReceiveResponse): (WebCore::WebConsoleAgent::didFailLoading): * inspector/agents/WebHeapAgent.cpp: (WebCore::WebHeapAgent::WebHeapAgent): * inspector/agents/page/PageRuntimeAgent.cpp: (WebCore::PageRuntimeAgent::PageRuntimeAgent): * inspector/agents/worker/WorkerDebuggerAgent.cpp: (WebCore::WorkerDebuggerAgent::breakpointActionLog): * layout/LayoutState.cpp: (WebCore::Layout::LayoutState::displayBoxForLayoutBox const): (WebCore::Layout::LayoutState::createFormattingStateForFormattingRootIfNeeded): (WebCore::Layout::LayoutState::createFormattingContext): * layout/inlineformatting/InlineFormattingContext.cpp: (WebCore::Layout::InlineFormattingContext::collectInlineContent const): * layout/inlineformatting/InlineFormattingContextLineLayout.cpp: (WebCore::Layout::InlineFormattingContext::InlineLayout::createDisplayRuns const): * layout/inlineformatting/InlineLine.cpp: (WebCore::Layout::Line::Line): (WebCore::Layout::Line::appendNonBreakableSpace): (WebCore::Layout::Line::appendTextContent): (WebCore::Layout::Line::appendNonReplacedInlineBox): (WebCore::Layout::Line::appendHardLineBreak): * layout/inlineformatting/InlineTextItem.cpp: (WebCore::Layout::InlineTextItem::createAndAppendTextItems): (WebCore::Layout::InlineTextItem::split const): * layout/layouttree/LayoutBox.cpp: (WebCore::Layout::Box::Box): (WebCore::Layout::Box::ensureRareData): * layout/layouttree/LayoutTreeBuilder.cpp: (WebCore::Layout::TreeBuilder::createLayoutBox): (WebCore::Layout::TreeBuilder::createTableStructure): (WebCore::Layout::printLayoutTreeForLiveDocuments): * layout/tableformatting/TableGrid.cpp: (WebCore::Layout::TableGrid::appendCell): * loader/ContentFilter.cpp: (WebCore::ContentFilter::create): * loader/CrossOriginAccessControl.cpp: (WebCore::validatePreflightResponse): * loader/DocumentLoader.cpp: (WebCore::DocumentLoader::DocumentLoader): (WebCore::DocumentLoader::loadApplicationManifest): (WebCore::DocumentLoader::addAllArchiveResources): (WebCore::DocumentLoader::addArchiveResource): (WebCore::DocumentLoader::loadMainResource): (WebCore::DocumentLoader::didGetLoadDecisionForIcon): * loader/EmptyClients.cpp: (WebCore::pageConfigurationWithEmptyClients): * loader/FrameLoader.cpp: (WebCore::FrameLoader::FrameLoader): (WebCore::FrameLoader::init): (WebCore::FrameLoader::initForSynthesizedDocument): (WebCore::FrameLoader::detachChildren): * loader/LinkLoader.cpp: (WebCore::createLinkPreloadResourceClient): * loader/NavigationScheduler.cpp: (WebCore::NavigationScheduler::scheduleRedirect): (WebCore::NavigationScheduler::scheduleLocationChange): (WebCore::NavigationScheduler::scheduleFormSubmission): (WebCore::NavigationScheduler::scheduleRefresh): (WebCore::NavigationScheduler::scheduleHistoryNavigation): (WebCore::NavigationScheduler::schedulePageBlock): * loader/ProgressTracker.cpp: (WebCore::ProgressTracker::incrementProgress): * loader/TextResourceDecoder.cpp: (WebCore::TextResourceDecoder::checkForHeadCharset): * loader/TextTrackLoader.cpp: (WebCore::TextTrackLoader::processNewCueData): * loader/WorkerThreadableLoader.cpp: (WebCore::WorkerThreadableLoader::MainThreadBridge::MainThreadBridge): * loader/archive/cf/LegacyWebArchive.cpp: (WebCore::LegacyWebArchive::create): * loader/cache/CachedImage.cpp: (WebCore::CachedImage::setBodyDataFrom): (WebCore::CachedImage::createImage): * loader/cache/CachedRawResource.cpp: (WebCore::CachedRawResource::redirectReceived): * loader/cache/CachedResource.cpp: (WebCore::CachedResource::addClientToSet): * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): (WebCore::CachedResourceLoader::clearPreloads): * loader/cache/MemoryCache.cpp: (WebCore::MemoryCache::ensureSessionResourceMap): (WebCore::MemoryCache::addImageToCache): (WebCore::MemoryCache::lruListFor): * loader/ios/PreviewLoader.mm: (-[WebPreviewLoader initWithResourceLoader:resourceResponse:]): (-[WebPreviewLoader connection:didFailWithError:]): (WebCore::PreviewLoader::create): * page/ContextMenuController.cpp: (WebCore::ContextMenuController::maybeCreateContextMenu): * page/DebugPageOverlays.cpp: (WebCore::MouseWheelRegionOverlay::updateRegion): * page/EventHandler.cpp: (WebCore::EventHandler::EventHandler): * page/FrameView.cpp: (WebCore::FrameView::addEmbeddedObjectToUpdate): (WebCore::FrameView::addSlowRepaintObject): (WebCore::FrameView::addViewportConstrainedObject): (WebCore::FrameView::addScrollableArea): * page/FrameViewLayoutContext.cpp: (WebCore::FrameViewLayoutContext::pushLayoutState): (WebCore::FrameViewLayoutContext::pushLayoutStateForPaginationIfNeeded): * page/NavigatorBase.cpp: (WebCore::NavigatorBase::serviceWorker): * page/Page.cpp: (WebCore::Page::Page): (WebCore::Page::initGroup): (WebCore::Page::setResourceUsageOverlayVisible): * page/PageConsoleClient.cpp: (WebCore::PageConsoleClient::addMessage): (WebCore::PageConsoleClient::messageWithTypeAndLevel): (WebCore::PageConsoleClient::screenshot): * page/PageGroup.cpp: (WebCore::PageGroup::captionPreferences): * page/Performance.cpp: (WebCore::Performance::mark): (WebCore::Performance::clearMarks): (WebCore::Performance::measure): (WebCore::Performance::clearMeasures): * page/PrintContext.cpp: (WebCore::PrintContext::outputLinkedDestinations): * page/RenderingUpdateScheduler.cpp: (WebCore::RenderingUpdateScheduler::startTimer): * page/RenderingUpdateScheduler.h: (WebCore::RenderingUpdateScheduler::create): * page/SecurityPolicy.cpp: (WebCore::SecurityPolicy::addOriginAccessWhitelistEntry): * page/SettingsBase.cpp: (WebCore::SettingsBase::SettingsBase): * page/UserContentController.cpp: (WebCore::UserContentController::addUserScript): (WebCore::UserContentController::addUserStyleSheet): * page/WheelEventDeltaFilter.cpp: (WebCore::WheelEventDeltaFilter::create): * page/animation/CSSAnimationController.cpp: (WebCore::CSSAnimationController::CSSAnimationController): * page/animation/CSSPropertyAnimation.cpp: (WebCore::blendFunc): (WebCore::PropertyWrapperVisitedAffectedColor::PropertyWrapperVisitedAffectedColor): (WebCore::FillLayersPropertyWrapper::FillLayersPropertyWrapper): (WebCore::CSSPropertyAnimationWrapperMap::CSSPropertyAnimationWrapperMap): * page/csp/ContentSecurityPolicy.cpp: (WebCore::ContentSecurityPolicy::updateSourceSelf): * page/csp/ContentSecurityPolicyDirectiveList.cpp: (WebCore::ContentSecurityPolicyDirectiveList::create): (WebCore::ContentSecurityPolicyDirectiveList::setCSPDirective): * page/linux/ResourceUsageOverlayLinux.cpp: (WebCore::ResourceUsageOverlay::platformInitialize): * page/mac/PageMac.mm: (WebCore::Page::addSchedulePair): * page/scrolling/AsyncScrollingCoordinator.cpp: (WebCore::AsyncScrollingCoordinator::AsyncScrollingCoordinator): * page/scrolling/ScrollingMomentumCalculator.cpp: (WebCore::ScrollingMomentumCalculator::create): * page/scrolling/ScrollingStateNode.cpp: (WebCore::ScrollingStateNode::appendChild): (WebCore::ScrollingStateNode::insertChild): * page/scrolling/ScrollingStateTree.cpp: (WebCore::ScrollingStateTree::commit): * page/scrolling/ScrollingTreeNode.cpp: (WebCore::ScrollingTreeNode::appendChild): * page/scrolling/mac/ScrollingMomentumCalculatorMac.mm: (WebCore::ScrollingMomentumCalculator::create): * platform/Length.cpp: (WebCore::convertTo100PercentMinusLength): (WebCore::blendMixedTypes): * platform/RemoteCommandListener.cpp: (WebCore::RemoteCommandListener::create): * platform/ScrollAnimator.cpp: (WebCore::ScrollAnimator::create): * platform/ScrollableArea.cpp: (WebCore::ScrollableArea::scrollAnimator const): (WebCore::ScrollableArea::ensureSnapOffsetsInfo): * platform/ThreadGlobalData.cpp: (WebCore::ThreadGlobalData::ThreadGlobalData): * platform/audio/AudioBus.cpp: (WebCore::AudioBus::AudioBus): (WebCore::AudioBus::copyWithGainFrom): * platform/audio/AudioChannel.h: * platform/audio/AudioResampler.cpp: (WebCore::AudioResampler::AudioResampler): (WebCore::AudioResampler::configureChannels): * platform/audio/DynamicsCompressor.cpp: (WebCore::DynamicsCompressor::setNumberOfChannels): * platform/audio/DynamicsCompressorKernel.cpp: (WebCore::DynamicsCompressorKernel::setNumberOfChannels): * platform/audio/FFTFrame.cpp: (WebCore::FFTFrame::createInterpolatedFrame): * platform/audio/HRTFDatabaseLoader.cpp: (WebCore::HRTFDatabaseLoader::load): * platform/audio/HRTFElevation.cpp: (WebCore::HRTFElevation::createForSubject): (WebCore::HRTFElevation::createByInterpolatingSlices): * platform/audio/HRTFKernel.cpp: (WebCore::HRTFKernel::HRTFKernel): (WebCore::HRTFKernel::createImpulseResponse): * platform/audio/MultiChannelResampler.cpp: (WebCore::MultiChannelResampler::MultiChannelResampler): * platform/audio/Panner.cpp: (WebCore::Panner::create): * platform/audio/PlatformMediaSession.cpp: (WebCore::PlatformMediaSession::create): * platform/audio/Reverb.cpp: (WebCore::Reverb::initialize): * platform/audio/ReverbConvolver.cpp: (WebCore::ReverbConvolver::ReverbConvolver): * platform/audio/ReverbConvolverStage.cpp: (WebCore::ReverbConvolverStage::ReverbConvolverStage): * platform/audio/gstreamer/AudioDestinationGStreamer.cpp: (WebCore::AudioDestination::create): * platform/audio/ios/AudioDestinationIOS.cpp: (WebCore::AudioDestination::create): * platform/audio/ios/AudioSessionIOS.mm: (WebCore::AudioSession::AudioSession): * platform/audio/mac/AudioDestinationMac.cpp: (WebCore::AudioDestination::create): * platform/audio/mac/AudioSampleDataSource.mm: (WebCore::AudioSampleDataSource::setInputFormat): (WebCore::AudioSampleDataSource::setOutputFormat): * platform/audio/mac/AudioSessionMac.cpp: (WebCore::AudioSession::AudioSession): * platform/cf/KeyedDecoderCF.cpp: (WebCore::KeyedDecoder::decoder): * platform/cf/KeyedEncoderCF.cpp: (WebCore::KeyedEncoder::encoder): * platform/cf/MainThreadSharedTimerCF.cpp: (WebCore::setupPowerObserver): * platform/cocoa/NetworkExtensionContentFilter.mm: (WebCore::NetworkExtensionContentFilter::create): * platform/cocoa/ParentalControlsContentFilter.mm: (WebCore::ParentalControlsContentFilter::create): * platform/cocoa/ScrollController.mm: (WebCore::ScrollController::updateScrollSnapPoints): * platform/encryptedmedia/clearkey/CDMClearKey.cpp: (WebCore::CDMFactoryClearKey::createCDM): * platform/gamepad/cocoa/GameControllerGamepadProvider.mm: (WebCore::GameControllerGamepadProvider::controllerDidConnect): * platform/gamepad/mac/HIDGamepadProvider.cpp: (WebCore::HIDGamepadProvider::deviceAdded): * platform/generic/KeyedDecoderGeneric.cpp: (WebCore::KeyedDecoderGeneric::Dictionary::add): (WebCore::KeyedDecoder::decoder): (WebCore::KeyedDecoderGeneric::KeyedDecoderGeneric): * platform/generic/KeyedEncoderGeneric.cpp: (WebCore::KeyedEncoder::encoder): * platform/generic/ScrollAnimatorGeneric.cpp: (WebCore::ScrollAnimator::create): (WebCore::ScrollAnimatorGeneric::ScrollAnimatorGeneric): (WebCore::ScrollAnimatorGeneric::ensureSmoothScrollingAnimation): * platform/glib/KeyedDecoderGlib.cpp: (WebCore::KeyedDecoder::decoder): * platform/glib/KeyedEncoderGlib.cpp: (WebCore::KeyedEncoder::encoder): * platform/graphics/BitmapImage.cpp: (WebCore::BitmapImage::startTimer): (WebCore::BitmapImage::decode): * platform/graphics/ComplexTextController.cpp: (WebCore::TextLayout::TextLayout): * platform/graphics/Font.cpp: (WebCore::Font::ensureDerivedFontData const): * platform/graphics/Font.h: (WebCore::Font::boundsForGlyph const): * platform/graphics/FontCache.cpp: (WebCore::FontCache::getCachedFontPlatformData): * platform/graphics/FontCascade.cpp: (WebCore::retrieveOrAddCachedFonts): (WebCore::FontCascade::displayListForTextRun const): * platform/graphics/FontCascadeFonts.cpp: (WebCore::FontCascadeFonts::GlyphPageCacheEntry::setGlyphDataForCharacter): * platform/graphics/GlyphMetricsMap.h: (WebCore::GlyphMetricsMap<T>::locatePageSlowCase): * platform/graphics/GraphicsLayer.cpp: (WebCore::GraphicsLayer::setTransform): (WebCore::GraphicsLayer::setChildrenTransform): * platform/graphics/GraphicsLayer.h: * platform/graphics/Image.cpp: (WebCore::Image::startAnimationAsynchronously): * platform/graphics/MediaPlayer.cpp: (WebCore::MediaPlayer::MediaPlayer): (WebCore::MediaPlayer::loadWithNextMediaEngine): * platform/graphics/MediaPlayerPrivate.h: (WebCore::MediaPlayerPrivateInterface::seekable const): * platform/graphics/PathUtilities.cpp: (WebCore::FloatPointGraph::findOrCreateNode): * platform/graphics/Region.cpp: (WebCore::Region::setShape): * platform/graphics/Region.h: (WebCore::Region::copyShape const): (WebCore::Region::decode): * platform/graphics/TextTrackRepresentation.cpp: (WebCore::TextTrackRepresentation::create): * platform/graphics/angle/GraphicsContext3DANGLE.cpp: (WebCore::GraphicsContext3D::getExtensions): * platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm: (WebCore::AudioSourceProviderAVFObjC::prepare): * platform/graphics/avfoundation/CDMFairPlayStreaming.cpp: (WebCore::CDMFactoryFairPlayStreaming::createCDM): * platform/graphics/avfoundation/CDMPrivateMediaSourceAVFObjC.mm: (WebCore::CDMPrivateMediaSourceAVFObjC::createSession): * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp: (WebCore::MediaPlayerPrivateAVFoundation::buffered const): * platform/graphics/avfoundation/WebMediaSessionManagerMac.cpp: (WebCore::WebMediaSessionManagerMac::platformPicker): * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp: (WebCore::MediaPlayerPrivateAVFoundationCF::registerMediaEngine): (WebCore::MediaPlayerPrivateAVFoundationCF::platformBufferedTimeRanges const): (WebCore::MediaPlayerPrivateAVFoundationCF::createSession): (WebCore::AVFWrapper::notificationCallback): (WebCore::AVFWrapper::legibleOutputCallback): (WebCore::AVFWrapper::resourceLoaderShouldWaitForLoadingOfRequestedResource): (WebCore::AVFWrapper::platformLayer): * platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm: (WebCore::AudioTrackPrivateAVFObjC::AudioTrackPrivateAVFObjC): (WebCore::AudioTrackPrivateAVFObjC::setPlayerItemTrack): (WebCore::AudioTrackPrivateAVFObjC::setAssetTrack): (WebCore::AudioTrackPrivateAVFObjC::setMediaSelectionOption): * platform/graphics/avfoundation/objc/AudioTrackPrivateMediaSourceAVFObjC.cpp: (WebCore::AudioTrackPrivateMediaSourceAVFObjC::AudioTrackPrivateMediaSourceAVFObjC): (WebCore::AudioTrackPrivateMediaSourceAVFObjC::setAssetTrack): * platform/graphics/avfoundation/objc/ImageDecoderAVFObjC.mm: (WebCore::ImageDecoderAVFObjC::readTrackMetadata): * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm: (WebCore::MediaPlayerPrivateAVFoundationObjC::registerMediaEngine): (WebCore::MediaPlayerPrivateAVFoundationObjC::MediaPlayerPrivateAVFoundationObjC): (WebCore::MediaPlayerPrivateAVFoundationObjC::platformBufferedTimeRanges const): (WebCore::MediaPlayerPrivateAVFoundationObjC::updateRotationSession): (WebCore::MediaPlayerPrivateAVFoundationObjC::updateLastImage): (WebCore::MediaPlayerPrivateAVFoundationObjC::copyVideoTextureToPlatformTexture): (WebCore::MediaPlayerPrivateAVFoundationObjC::createSession): * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm: (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::MediaPlayerPrivateMediaSourceAVFObjC): (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::registerMediaEngine): (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::seekWithTolerance): (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::seekable const): (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::buffered const): (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::updateLastImage): (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::copyVideoTextureToPlatformTexture): * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm: (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::MediaPlayerPrivateMediaStreamAVFObjC): (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::registerMediaEngine): (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::seekable const): (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::buffered const): (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::updateCurrentFrameImage): * platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.cpp: (WebCore::VideoTrackPrivateAVFObjC::VideoTrackPrivateAVFObjC): (WebCore::VideoTrackPrivateAVFObjC::setPlayerItemTrack): (WebCore::VideoTrackPrivateAVFObjC::setAssetTrack): (WebCore::VideoTrackPrivateAVFObjC::setMediaSelectonOption): * platform/graphics/avfoundation/objc/VideoTrackPrivateMediaSourceAVFObjC.mm: (WebCore::VideoTrackPrivateMediaSourceAVFObjC::VideoTrackPrivateMediaSourceAVFObjC): (WebCore::VideoTrackPrivateMediaSourceAVFObjC::setAssetTrack): * platform/graphics/ca/GraphicsLayerCA.cpp: (WebCore::GraphicsLayerCA::recursiveCommitChanges): (WebCore::GraphicsLayerCA::ensureLayerAnimations): (WebCore::GraphicsLayerCA::createTransformAnimationsFromKeyframes): * platform/graphics/ca/TileController.cpp: (WebCore::TileController::TileController): (WebCore::TileController::setContentsScale): (WebCore::TileController::adjustTileCoverageRectForScrolling): (WebCore::TileController::tiledScrollingIndicatorLayer): * platform/graphics/ca/cocoa/PlatformCALayerCocoa.mm: (WebCore::PlatformCALayerCocoa::commonInit): (WebCore::PlatformCALayerCocoa::setShapeRoundedRect): * platform/graphics/ca/cocoa/WebTiledBackingLayer.mm: (-[WebTiledBackingLayer createTileController:]): * platform/graphics/ca/win/PlatformCALayerWin.cpp: (PlatformCALayerWin::PlatformCALayerWin): * platform/graphics/ca/win/WebTiledBackingLayerWin.cpp: (WebTiledBackingLayerWin::createTileController): * platform/graphics/cairo/GraphicsContextImplCairo.cpp: (WebCore::GraphicsContextImplCairo::createFactory): (WebCore::m_private): * platform/graphics/cairo/ImageBufferCairo.cpp: (WebCore::ImageBufferData::swapBuffersIfNeeded): (WebCore::ImageBuffer::ImageBuffer): * platform/graphics/cg/ImageBufferCG.cpp: (WebCore::ImageBuffer::ImageBuffer): * platform/graphics/cocoa/FontCacheCoreText.cpp: (WebCore::FontCache::createFontPlatformData): * platform/graphics/cocoa/FontFamilySpecificationCoreText.cpp: (WebCore::FontFamilySpecificationCoreText::fontRanges const): * platform/graphics/cocoa/GraphicsContext3DCocoa.mm: (WebCore::GraphicsContext3D::GraphicsContext3D): * platform/graphics/cocoa/IOSurface.mm: (WebCore::IOSurface::ensureGraphicsContext): * platform/graphics/cocoa/TextTrackRepresentationCocoa.mm: (TextTrackRepresentation::create): * platform/graphics/cv/TextureCacheCV.mm: (WebCore::TextureCacheCV::create): * platform/graphics/displaylists/DisplayListReplayer.cpp: (WebCore::DisplayList::Replayer::replay): * platform/graphics/filters/FilterOperation.cpp: (WebCore::ReferenceFilterOperation::loadExternalDocumentIfNeeded): * platform/graphics/freetype/FontCacheFreeType.cpp: (WebCore::FontCache::createFontPlatformData): * platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp: (WebCore::createFontCustomPlatformData): * platform/graphics/gpu/Texture.cpp: (WebCore::Texture::create): * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivateGStreamer::registerMediaEngine): (WebCore::MediaPlayerPrivateGStreamer::buffered const): (WebCore::MediaPlayerPrivateGStreamer::ensureAudioSourceProvider): * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp: (WebCore::MediaPlayerPrivateGStreamerBase::pushTextureToCompositor): (WebCore::MediaPlayerPrivateGStreamerBase::copyVideoTextureToPlatformTexture): (WebCore::MediaPlayerPrivateGStreamerBase::nativeImageForCurrentTime): (WebCore::MediaPlayerPrivateGStreamerBase::pushNextHolePunchBuffer): * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp: (webKitWebSrcMakeRequest): * platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp: (WebCore::MediaPlayerPrivateGStreamerMSE::registerMediaEngine): (WebCore::MediaPlayerPrivateGStreamerMSE::buffered const): * platform/graphics/holepunch/MediaPlayerPrivateHolePunch.cpp: (WebCore::MediaPlayerPrivateHolePunch::pushNextHolePunchBuffer): (WebCore::MediaPlayerPrivateHolePunch::registerMediaEngine): * platform/graphics/holepunch/MediaPlayerPrivateHolePunch.h: * platform/graphics/iso/ISOProtectionSchemeInfoBox.cpp: (WebCore::ISOProtectionSchemeInfoBox::parse): * platform/graphics/iso/ISOSchemeInformationBox.cpp: (WebCore::ISOSchemeInformationBox::parse): * platform/graphics/mac/FontCustomPlatformData.cpp: (WebCore::createFontCustomPlatformData): * platform/graphics/nicosia/NicosiaSceneIntegration.cpp: (Nicosia::SceneIntegration::createUpdateScope): * platform/graphics/nicosia/cairo/NicosiaCairoOperationRecorder.cpp: (Nicosia::createCommand): * platform/graphics/nicosia/cairo/NicosiaPaintingContextCairo.cpp: (Nicosia::PaintingContextCairo::ForPainting::ForPainting): (Nicosia::PaintingContextCairo::ForRecording::ForRecording): * platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.cpp: (Nicosia::BackingStoreTextureMapperImpl::createFactory): * platform/graphics/nicosia/texmap/NicosiaCompositionLayerTextureMapperImpl.cpp: (Nicosia::CompositionLayerTextureMapperImpl::createFactory): * platform/graphics/nicosia/texmap/NicosiaContentLayerTextureMapperImpl.cpp: (Nicosia::ContentLayerTextureMapperImpl::createFactory): * platform/graphics/nicosia/texmap/NicosiaGC3DLayer.cpp: (Nicosia::GC3DLayer::swapBuffersIfNeeded): * platform/graphics/nicosia/texmap/NicosiaImageBackingTextureMapperImpl.cpp: (Nicosia::ImageBackingTextureMapperImpl::createFactory): * platform/graphics/opengl/GraphicsContext3DOpenGL.cpp: (WebCore::GraphicsContext3D::getExtensions): * platform/graphics/opengl/GraphicsContext3DOpenGLCommon.cpp: (WebCore::GraphicsContext3D::compileShader): (WebCore::GraphicsContext3D::mappedSymbolName): * platform/graphics/opengl/GraphicsContext3DOpenGLES.cpp: (WebCore::GraphicsContext3D::getExtensions): (WebCore::GraphicsContext3D::GraphicsContext3D): * platform/graphics/texmap/GraphicsContext3DTextureMapper.cpp: (WebCore::GraphicsContext3D::GraphicsContext3D): (WebCore::GraphicsContext3D::getExtensions): * platform/graphics/texmap/TextureMapperGC3DPlatformLayer.cpp: (WebCore::TextureMapperGC3DPlatformLayer::swapBuffersIfNeeded): * platform/graphics/texmap/TextureMapperGL.cpp: (WebCore::TextureMapperGL::TextureMapperGL): (WebCore::TextureMapper::platformCreateAccelerated): * platform/graphics/texmap/TextureMapperPlatformLayerBuffer.cpp: (WebCore::TextureMapperPlatformLayerBuffer::clone): * platform/graphics/texmap/TextureMapperPlatformLayerProxy.cpp: (WebCore::TextureMapperPlatformLayerProxy::activateOnCompositingThread): * platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp: (WebCore::CoordinatedGraphicsLayer::updateContentBuffers): * platform/graphics/texmap/coordinated/TiledBackingStore.cpp: (WebCore::TiledBackingStore::createTiles): * platform/graphics/transforms/TransformState.cpp: (WebCore::TransformState::operator=): (WebCore::TransformState::applyTransform): (WebCore::TransformState::setLastPlanarSecondaryQuad): * platform/graphics/transforms/TransformState.h: (WebCore::TransformState::setSecondaryQuad): * platform/graphics/win/FontCacheWin.cpp: (WebCore::FontCache::createFontPlatformData): * platform/graphics/win/FontCustomPlatformData.cpp: (WebCore::createFontCustomPlatformData): * platform/graphics/win/FontCustomPlatformDataCairo.cpp: (WebCore::createFontCustomPlatformData): * platform/graphics/win/FullScreenController.cpp: (WebCore::FullScreenController::FullScreenController): (WebCore::FullScreenController::enterFullScreen): * platform/graphics/win/GraphicsContextCairoWin.cpp: (WebCore::GraphicsContext::platformInit): * platform/graphics/win/GraphicsContextDirect2D.cpp: (WebCore::GraphicsContext::GraphicsContext): (WebCore::GraphicsContext::platformInit): * platform/graphics/win/GraphicsContextImplDirect2D.cpp: (WebCore::GraphicsContextImplDirect2D::createFactory): (WebCore::m_private): * platform/graphics/win/GraphicsContextWin.cpp: (WebCore::GraphicsContext::createWindowsBitmap): * platform/graphics/win/ImageBufferDirect2D.cpp: (WebCore::ImageBuffer::ImageBuffer): * platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp: (WebCore::MediaPlayerPrivateMediaFoundation::registerMediaEngine): (WebCore::MediaPlayerPrivateMediaFoundation::buffered const): (WebCore::MediaPlayerPrivateMediaFoundation::CustomVideoPresenter::CustomVideoPresenter): * platform/graphics/win/WKCAImageQueue.cpp: (WebCore::WKCAImageQueue::WKCAImageQueue): * platform/gtk/PasteboardGtk.cpp: (WebCore::Pasteboard::createForCopyAndPaste): (WebCore::Pasteboard::createForGlobalSelection): (WebCore::Pasteboard::createForDragAndDrop): * platform/gtk/PasteboardHelper.cpp: (WebCore::PasteboardHelper::writeClipboardContents): * platform/gtk/RenderThemeGadget.cpp: (WebCore::RenderThemeGadget::create): * platform/gtk/RenderThemeWidget.cpp: (WebCore::RenderThemeWidget::getOrCreate): (WebCore::RenderThemeScrollbar::RenderThemeScrollbar): (WebCore::RenderThemeComboBox::RenderThemeComboBox): * platform/image-decoders/bmp/BMPImageDecoder.cpp: (WebCore::BMPImageDecoder::decodeHelper): * platform/image-decoders/gif/GIFImageDecoder.cpp: (WebCore::GIFImageDecoder::decode): * platform/image-decoders/gif/GIFImageReader.cpp: (GIFFrameContext::decode): (GIFImageReader::addFrameIfNecessary): * platform/image-decoders/ico/ICOImageDecoder.cpp: (WebCore::ICOImageDecoder::decodeAtIndex): * platform/image-decoders/jpeg/JPEGImageDecoder.cpp: (WebCore::JPEGImageDecoder::decode): * platform/image-decoders/png/PNGImageDecoder.cpp: (WebCore::PNGImageDecoder::decode): * platform/ios/LegacyTileCache.mm: (WebCore::LegacyTileCache::LegacyTileCache): (WebCore::LegacyTileCache::commitScaleChange): * platform/ios/PasteboardIOS.mm: (WebCore::Pasteboard::createForDragAndDrop): (WebCore::Pasteboard::createForCopyAndPaste): * platform/ios/QuickLook.mm: (WebCore::registerQLPreviewConverterIfNeeded): * platform/ios/RemoteCommandListenerIOS.mm: (WebCore::RemoteCommandListener::create): * platform/ios/ScrollAnimatorIOS.mm: (WebCore::ScrollAnimator::create): * platform/libwpe/PasteboardLibWPE.cpp: (WebCore::Pasteboard::createForCopyAndPaste): * platform/mac/PasteboardMac.mm: (WebCore::Pasteboard::createForCopyAndPaste): (WebCore::Pasteboard::createForDragAndDrop): * platform/mac/RemoteCommandListenerMac.mm: (WebCore::RemoteCommandListener::create): * platform/mac/ScrollAnimatorMac.mm: (WebCore::ScrollAnimator::create): * platform/mediarecorder/MediaRecorderPrivateAVFImpl.cpp: (WebCore::MediaRecorderPrivateAVFImpl::create): * platform/mediastream/gstreamer/GStreamerAudioCaptureSource.cpp: (WebCore::m_capturer): (WebCore::GStreamerAudioCaptureSource::GStreamerAudioCaptureSource): * platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp: (WebCore::webkit_media_stream_src_init): * platform/mediastream/gstreamer/GStreamerVideoCaptureSource.cpp: (WebCore::GStreamerVideoCaptureSource::GStreamerVideoCaptureSource): (WebCore::m_capturer): * platform/mediastream/libwebrtc/GStreamerVideoEncoderFactory.cpp: (WebCore::GStreamerVideoEncoderFactory::CreateVideoEncoder): * platform/mediastream/libwebrtc/LibWebRTCProvider.cpp: (WebCore::BasicPacketSocketFactory::BasicPacketSocketFactory): (WebCore::initializePeerConnectionFactoryAndThreads): (WebCore::LibWebRTCProvider::createPeerConnection): (WebCore::LibWebRTCProvider::certificateGenerator): * platform/mediastream/libwebrtc/LibWebRTCProviderGStreamer.cpp: (WebCore::LibWebRTCProviderGStreamer::createDecoderFactory): (WebCore::LibWebRTCProviderGStreamer::createEncoderFactory): * platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp: (WebCore::AudioTrackPrivateMediaStreamCocoa::audioSamplesAvailable): * platform/mediastream/mac/MockRealtimeAudioSourceMac.mm: (WebCore::MockRealtimeAudioSourceMac::reconfigure): * platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.mm: (WebCore::RealtimeOutgoingVideoSourceCocoa::convertToYUV): (WebCore::RealtimeOutgoingVideoSourceCocoa::rotatePixelBuffer): * platform/mock/RTCNotifiersMock.cpp: (WebCore::RemoteDataChannelNotifier::fire): * platform/mock/mediasource/MockMediaPlayerMediaSource.cpp: (WebCore::MockMediaPlayerMediaSource::registerMediaEngine): (WebCore::MockMediaPlayerMediaSource::buffered const): * platform/network/BlobResourceHandle.cpp: * platform/network/DataURLDecoder.cpp: (WebCore::DataURLDecoder::createDecodeTask): * platform/network/ResourceHandle.cpp: (WebCore::ResourceHandle::ResourceHandle): * platform/network/cf/ResourceHandleCFURLConnectionDelegateWithOperationQueue.cpp: (WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::willSendRequest): (WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::didReceiveResponse): (WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::didReceiveData): (WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::didFinishLoading): (WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::didFail): (WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::willCacheResponse): (WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::didReceiveChallenge): (WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::didSendBodyData): (WebCore::ResourceHandleCFURLConnectionDelegateWithOperationQueue::canRespondToProtectionSpace): * platform/network/cocoa/WebCoreNSURLSession.mm: (-[WebCoreNSURLSessionDataTask _restart]): * platform/network/curl/CookieJarDB.cpp: (WebCore::CookieJarDB::searchCookies): (WebCore::CookieJarDB::createPrepareStatement): * platform/network/curl/CurlCacheManager.cpp: (WebCore::CurlCacheManager::loadIndex): (WebCore::CurlCacheManager::didReceiveResponse): * platform/network/curl/CurlContext.cpp: (WebCore::CurlContext::CurlContext): (WebCore::CurlHandle::willSetupSslCtx): * platform/network/curl/CurlFormDataStream.cpp: (WebCore::CurlFormDataStream::getPostData): * platform/network/curl/CurlMultipartHandle.cpp: (WebCore::CurlMultipartHandle::createIfNeeded): * platform/network/curl/CurlRequest.cpp: (WebCore::CurlRequest::runOnMainThread): (WebCore::CurlRequest::setupTransfer): * platform/network/curl/CurlRequestScheduler.cpp: (WebCore::CurlRequestScheduler::workerThread): * platform/network/curl/ResourceHandleCurl.cpp: (WebCore::ResourceHandle::delegate): * platform/network/curl/SocketStreamHandleImplCurl.cpp: (WebCore::SocketStreamHandleImpl::callOnWorkerThread): * platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm: (-[WebCoreResourceHandleAsOperationQueueDelegate callFunctionOnMainThread:]): * platform/network/soup/DNSResolveQueueSoup.cpp: (WebCore::DNSResolveQueueSoup::resolve): * platform/network/soup/NetworkStorageSessionSoup.cpp: (WebCore::NetworkStorageSession::getCredentialFromPersistentStorage): * platform/text/BidiResolver.h: (WebCore::DerivedClass>::appendRunInternal): * platform/text/LocaleICU.cpp: (WebCore::Locale::create): (WebCore::LocaleICU::createLabelVector): (WebCore::createFallbackMonthLabels): (WebCore::createFallbackAMPMLabels): * platform/text/LocaleNone.cpp: (WebCore::Locale::create): * platform/text/TextCodecICU.cpp: (WebCore::TextCodecICU::registerCodecs): * platform/text/TextCodecLatin1.cpp: (WebCore::TextCodecLatin1::registerCodecs): * platform/text/TextCodecReplacement.cpp: (WebCore::TextCodecReplacement::registerCodecs): * platform/text/TextCodecUTF16.cpp: (WebCore::TextCodecUTF16::registerCodecs): * platform/text/TextCodecUTF8.cpp: (WebCore::TextCodecUTF8::registerCodecs): * platform/text/TextCodecUserDefined.cpp: (WebCore::TextCodecUserDefined::registerCodecs): * platform/text/mac/LocaleMac.mm: (WebCore::Locale::create): * platform/text/win/LocaleWin.cpp: (WebCore::Locale::create): * platform/text/win/TextCodecWin.cpp: (WebCore::newTextCodecWin): * platform/vr/openvr/VRPlatformManagerOpenVR.cpp: (WebCore::VRPlatformManagerOpenVR::create): (WebCore::VRPlatformManagerOpenVR::getVRDisplays): * platform/win/PasteboardWin.cpp: (WebCore::Pasteboard::createForCopyAndPaste): (WebCore::Pasteboard::createForDragAndDrop): * platform/win/SearchPopupMenuDB.cpp: (WebCore::SearchPopupMenuDB::createPreparedStatement): * platform/win/WCDataObject.cpp: (WebCore::WCDataObject::SetData): * rendering/CSSFilter.cpp: (WebCore::CSSFilter::buildReferenceFilter): * rendering/ComplexLineLayout.cpp: (WebCore::createRun): (WebCore::ComplexLineLayout::createRootInlineBox): (WebCore::ComplexLineLayout::handleTrailingSpaces): (WebCore::ComplexLineLayout::linkToEndLineIfNeeded): * rendering/FloatingObjects.cpp: (WebCore::FloatingObject::create): (WebCore::FloatingObject::copyToNewContainer const): (WebCore::FloatingObject::cloneForNewParent const): (WebCore::FloatingObjects::computePlacedFloatsTree): * rendering/Grid.cpp: (WebCore::GridIterator::nextEmptyGridArea): * rendering/GridBaselineAlignment.cpp: (WebCore::GridBaselineAlignment::updateBaselineAlignmentContext): * rendering/GridTrackSizingAlgorithm.cpp: (WebCore::GridTrackSizingAlgorithm::computeFlexFactorUnitSize const): (WebCore::GridTrackSizingAlgorithm::setup): * rendering/HitTestResult.cpp: (WebCore::HitTestResult::HitTestResult): (WebCore::HitTestResult::operator=): (WebCore::HitTestResult::listBasedTestResult const): (WebCore::HitTestResult::mutableListBasedTestResult): * rendering/InlineIterator.h: (WebCore::addPlaceholderRunForIsolatedInline): * rendering/LayerOverlapMap.cpp: (WebCore::LayerOverlapMap::pushCompositingContainer): * rendering/RenderBlock.cpp: (WebCore::insertIntoTrackedRendererMaps): (WebCore::PositionedDescendantsMap::addDescendant): (WebCore::RenderBlock::beginUpdateScrollInfoAfterLayoutTransaction): (WebCore::ensureBlockRareData): * rendering/RenderBlockFlow.cpp: (WebCore::RenderBlockFlow::layoutInlineChildren): (WebCore::RenderBlockFlow::layoutLineGridBox): (WebCore::RenderBlockFlow::createFloatingObjects): (WebCore::RenderBlockFlow::ensureLineBoxes): (WebCore::RenderBlockFlow::materializeRareBlockFlowData): * rendering/RenderBox.cpp: (WebCore::controlStatesForRenderer): (WebCore::RenderBox::createInlineBox): * rendering/RenderBoxModelObject.cpp: (WebCore::RenderBoxModelObject::ensureContinuationChainNode): * rendering/RenderCounter.cpp: (WebCore::makeCounterNode): * rendering/RenderFragmentContainer.cpp: (WebCore::RenderFragmentContainer::setRenderBoxFragmentInfo): * rendering/RenderFragmentedFlow.cpp: (WebCore::RenderFragmentedFlow::containingFragmentMap): * rendering/RenderGeometryMap.cpp: (WebCore::RenderGeometryMap::push): (WebCore::RenderGeometryMap::pushView): * rendering/RenderGrid.cpp: (WebCore::RenderGrid::computeEmptyTracksForAutoRepeat const): (WebCore::RenderGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid const): * rendering/RenderImage.cpp: (WebCore::RenderImage::RenderImage): * rendering/RenderInline.cpp: (WebCore::RenderInline::createInlineFlowBox): * rendering/RenderLayer.cpp: (WebCore::RenderLayer::updateNormalFlowList): (WebCore::RenderLayer::collectLayers): (WebCore::RenderLayer::updateTransform): (WebCore::RenderLayer::updateClipRects): (WebCore::RenderLayer::calculateClipRects const): * rendering/RenderLayerBacking.cpp: (WebCore::RenderLayerBacking::updateAncestorClippingStack): (WebCore::RenderLayerBacking::startAnimation): (WebCore::RenderLayerBacking::startTransition): * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::RenderLayerCompositor): (WebCore::RenderLayerCompositor::notifyFlushBeforeDisplayRefresh): (WebCore::LegacyWebKitScrollingLayerCoordinator::registerAllViewportConstrainedLayers): * rendering/RenderLayerModelObject.cpp: (WebCore::RenderLayerModelObject::createLayer): * rendering/RenderLineBreak.cpp: (WebCore::RenderLineBreak::createInlineBox): * rendering/RenderMultiColumnFlow.cpp: (WebCore::RenderMultiColumnFlow::RenderMultiColumnFlow): * rendering/RenderObject.cpp: (WebCore::RenderObject::ensureRareData): * rendering/RenderSnapshottedPlugIn.cpp: (WebCore::RenderSnapshottedPlugIn::RenderSnapshottedPlugIn): * rendering/RenderTable.cpp: (WebCore::RenderTable::styleDidChange): * rendering/RenderText.cpp: (WebCore::RenderText::createTextBox): (WebCore::RenderText::momentarilyRevealLastTypedCharacter): * rendering/RenderView.cpp: (WebCore::RenderView::repaintViewRectangle const): (WebCore::RenderView::compositor): (WebCore::RenderView::imageQualityController): (WebCore::RenderView::RepaintRegionAccumulator::RepaintRegionAccumulator): * rendering/RootInlineBox.cpp: (WebCore::RootInlineBox::placeEllipsis): * rendering/RootInlineBox.h: (WebCore::RootInlineBox::appendFloat): * rendering/SelectionRangeData.cpp: (WebCore::collect): (WebCore::SelectionRangeData::collectBounds const): (WebCore::SelectionRangeData::apply): * rendering/SimpleLineLayout.cpp: (WebCore::SimpleLineLayout::Layout::runResolver const): * rendering/SimpleLineLayoutFunctions.cpp: (WebCore::SimpleLineLayout::paintFlow): (WebCore::SimpleLineLayout::generateLineBoxTree): * rendering/TextAutoSizing.cpp: (WebCore::TextAutoSizing::addTextNode): * rendering/line/LineBreaker.cpp: (WebCore::LineBreaker::skipLeadingWhitespace): * rendering/shapes/RasterShape.cpp: (WebCore::RasterShapeIntervals::computeShapeMarginIntervals const): * rendering/shapes/Shape.cpp: (WebCore::createInsetShape): (WebCore::createCircleShape): (WebCore::createEllipseShape): (WebCore::createPolygonShape): (WebCore::Shape::createShape): (WebCore::Shape::createRasterShape): (WebCore::Shape::createBoxShape): * rendering/shapes/ShapeOutsideInfo.h: * rendering/style/BasicShapes.cpp: (WebCore::BasicShapePath::blend const): * rendering/style/ContentData.h: * rendering/style/FillLayer.cpp: (WebCore::FillLayer::FillLayer): (WebCore::FillLayer::operator=): * rendering/style/RenderStyle.cpp: (WebCore::RenderStyle::clonePtr): (WebCore::RenderStyle::addCachedPseudoStyle): (WebCore::RenderStyle::addCustomPaintWatchProperty): (WebCore::RenderStyle::setContent): (WebCore::RenderStyle::accessCounterDirectives): (WebCore::RenderStyle::ensureAnimations): (WebCore::RenderStyle::ensureTransitions): * rendering/style/SVGRenderStyleDefs.cpp: (WebCore::StyleShadowSVGData::StyleShadowSVGData): * rendering/style/ShadowData.cpp: (WebCore::ShadowData::ShadowData): * rendering/style/StyleRareInheritedData.cpp: (WebCore::StyleRareInheritedData::StyleRareInheritedData): * rendering/style/StyleRareNonInheritedData.cpp: (WebCore::StyleRareNonInheritedData::StyleRareNonInheritedData): * rendering/svg/RenderSVGImage.cpp: (WebCore::RenderSVGImage::RenderSVGImage): * rendering/svg/RenderSVGInline.cpp: (WebCore::RenderSVGInline::createInlineFlowBox): * rendering/svg/RenderSVGInlineText.cpp: (WebCore::RenderSVGInlineText::createTextBox): * rendering/svg/RenderSVGResourceFilter.cpp: (WebCore::RenderSVGResourceFilter::buildPrimitives const): (WebCore::RenderSVGResourceFilter::applyResource): * rendering/svg/RenderSVGResourceGradient.cpp: (WebCore::RenderSVGResourceGradient::applyResource): * rendering/svg/RenderSVGResourceMasker.cpp: (WebCore::RenderSVGResourceMasker::applyResource): * rendering/svg/RenderSVGResourcePattern.cpp: (WebCore::RenderSVGResourcePattern::buildPattern): * rendering/svg/RenderSVGShape.cpp: (WebCore::RenderSVGShape::updateShapeFromElement): * rendering/svg/SVGResources.cpp: (WebCore::SVGResources::setClipper): (WebCore::SVGResources::setFilter): (WebCore::SVGResources::setMarkerStart): (WebCore::SVGResources::setMarkerMid): (WebCore::SVGResources::setMarkerEnd): (WebCore::SVGResources::setMasker): (WebCore::SVGResources::setFill): (WebCore::SVGResources::setStroke): * rendering/svg/SVGResourcesCache.cpp: (WebCore::SVGResourcesCache::addResourcesFromRenderer): * rendering/svg/SVGTextMetricsBuilder.cpp: (WebCore::SVGTextMetricsBuilder::initializeMeasurementWithTextRenderer): * rendering/updating/RenderTreeBuilder.cpp: (WebCore::RenderTreeBuilder::RenderTreeBuilder): * rendering/updating/RenderTreeUpdater.cpp: (WebCore::RenderTreeUpdater::RenderTreeUpdater): * style/StyleInvalidator.cpp: (WebCore::Style::Invalidator::Invalidator): * style/StyleRelations.cpp: (WebCore::Style::commitRelationsToRenderStyle): * style/StyleScope.cpp: (WebCore::Style::Scope::resolver): (WebCore::Style::Scope::activeStyleSheetsContains const): * style/StyleTreeResolver.cpp: (WebCore::Style::TreeResolver::resolve): * svg/SVGDocumentExtensions.cpp: (WebCore::SVGDocumentExtensions::SVGDocumentExtensions): (WebCore::SVGDocumentExtensions::addPendingResource): (WebCore::SVGDocumentExtensions::addElementReferencingTarget): * svg/SVGElement.cpp: (WebCore::SVGElement::SVGElement): (WebCore::SVGElement::ensureSVGRareData): * svg/SVGGraphicsElement.cpp: (WebCore::SVGGraphicsElement::supplementalTransform): * svg/SVGPathByteStream.h: (WebCore::SVGPathByteStream::copy const): * svg/animation/SMILTimeContainer.cpp: (WebCore::SMILTimeContainer::schedule): * svg/graphics/SVGImage.cpp: (WebCore::SVGImage::dataChanged): * svg/properties/SVGAnimatedDecoratedProperty.h: (WebCore::SVGAnimatedDecoratedProperty::create): * svg/properties/SVGAnimatedPropertyAnimatorImpl.h: * svg/properties/SVGAnimatedPropertyPairAnimatorImpl.h: * svg/properties/SVGDecoratedEnumeration.h: (WebCore::SVGDecoratedEnumeration::create): * svg/properties/SVGPrimitivePropertyAnimator.h: (WebCore::SVGPrimitivePropertyAnimator::create): * svg/properties/SVGValuePropertyAnimatorImpl.h: * svg/properties/SVGValuePropertyListAnimatorImpl.h: * testing/InternalSettings.cpp: (WebCore::InternalSettings::from): * testing/Internals.cpp: (WebCore::InspectorStubFrontend::InspectorStubFrontend): (WebCore::Internals::Internals): (WebCore::Internals::enableMockSpeechSynthesizer): (WebCore::Internals::openDummyInspectorFrontend): (WebCore::Internals::setPrinting): (WebCore::Internals::initializeMockCDM): (WebCore::Internals::queueMicroTask): * testing/LegacyMockCDM.cpp: (WebCore::LegacyMockCDM::createSession): * testing/MockCDMFactory.cpp: (WebCore::MockCDMFactory::createCDM): * testing/MockContentFilter.cpp: (WebCore::MockContentFilter::create): * testing/MockGamepadProvider.cpp: (WebCore::MockGamepadProvider::setMockGamepadDetails): * workers/WorkerConsoleClient.cpp: (WebCore::WorkerConsoleClient::messageWithTypeAndLevel): * workers/WorkerEventQueue.cpp: (WebCore::WorkerEventQueue::enqueueEvent): * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::WorkerGlobalScope): (WebCore::WorkerGlobalScope::addMessage): * workers/WorkerMessagingProxy.cpp: (WebCore::WorkerMessagingProxy::WorkerMessagingProxy): (WebCore::WorkerMessagingProxy::postMessageToWorkerGlobalScope): * workers/WorkerRunLoop.cpp: (WebCore::WorkerRunLoop::WorkerRunLoop): (WebCore::WorkerRunLoop::postTaskAndTerminate): (WebCore::WorkerRunLoop::postTaskForMode): * workers/WorkerScriptLoader.cpp: (WebCore::WorkerScriptLoader::loadAsynchronously): (WebCore::WorkerScriptLoader::createResourceRequest): * workers/WorkerThread.cpp: (WebCore::WorkerThread::WorkerThread): * workers/service/ServiceWorkerContainer.cpp: (WebCore::ServiceWorkerContainer::ready): (WebCore::ServiceWorkerContainer::addRegistration): (WebCore::ServiceWorkerContainer::removeRegistration): (WebCore::ServiceWorkerContainer::updateRegistration): (WebCore::ServiceWorkerContainer::getRegistration): (WebCore::ServiceWorkerContainer::getRegistrations): * workers/service/context/SWContextManager.cpp: (WebCore::SWContextManager::terminateWorker): * workers/service/context/ServiceWorkerThreadProxy.cpp: (WebCore::ServiceWorkerThreadProxy::ServiceWorkerThreadProxy): (WebCore::ServiceWorkerThreadProxy::createBlobLoader): * workers/service/server/RegistrationDatabase.cpp: (WebCore::RegistrationDatabase::openSQLiteDatabase): * workers/service/server/SWServer.cpp: (WebCore::SWServer::addRegistrationFromStore): (WebCore::SWServer::SWServer): (WebCore::SWServer::scheduleJob): (WebCore::SWServer::unregisterServiceWorkerClient): * workers/service/server/SWServerJobQueue.cpp: (WebCore::SWServerJobQueue::runRegisterJob): * worklets/PaintWorkletGlobalScope.cpp: (WebCore::PaintWorkletGlobalScope::registerPaint): * worklets/WorkletConsoleClient.cpp: (WebCore::WorkletConsoleClient::messageWithTypeAndLevel): * worklets/WorkletGlobalScope.cpp: (WebCore::WorkletGlobalScope::WorkletGlobalScope): (WebCore::WorkletGlobalScope::addConsoleMessage): * worklets/WorkletScriptController.cpp: (WebCore::WorkletScriptController::initScriptWithSubclass): * xml/XMLHttpRequest.cpp: (WebCore::XMLHttpRequest::upload): * xml/XPathFunctions.cpp: * xml/XPathPredicate.cpp: (WebCore::XPath::evaluatePredicate): * xml/XSLStyleSheetLibxslt.cpp: (WebCore::XSLStyleSheet::loadChildSheet): * xml/parser/XMLDocumentParser.cpp: (WebCore::XMLDocumentParser::handleError): * xml/parser/XMLDocumentParserLibxml2.cpp: (WebCore::PendingCallbacks::appendStartElementNSCallback): (WebCore::PendingCallbacks::appendEndElementNSCallback): (WebCore::PendingCallbacks::appendCharactersCallback): (WebCore::PendingCallbacks::appendProcessingInstructionCallback): (WebCore::PendingCallbacks::appendCDATABlockCallback): (WebCore::PendingCallbacks::appendCommentCallback): (WebCore::PendingCallbacks::appendInternalSubsetCallback): (WebCore::PendingCallbacks::appendErrorCallback): (WebCore::XMLDocumentParser::XMLDocumentParser): (WebCore::XMLDocumentParser::doEnd): Source/WebCore/PAL: Reviewed by Geoffrey Garen. * pal/crypto/openssl/CryptoDigestOpenSSL.cpp: (PAL::CryptoDigestContextImpl::create): * pal/system/ClockGeneric.cpp: (PAL::Clock::create): * pal/system/mac/ClockCM.mm: (Clock::create): Source/WebDriver: Reviewed by Geoffrey Garen. * WebDriverService.cpp: (WebDriver::WebDriverService::connectToBrowser): * glib/SessionHostGlib.cpp: (WebDriver::SessionHost::launchBrowser): (WebDriver::SessionHost::sendMessageToBackend): Source/WebKit: Reviewed by Geoffrey Garen. * NetworkProcess/Classifier/ResourceLoadStatisticsPersistentStorage.cpp: (WebKit::ResourceLoadStatisticsPersistentStorage::startMonitoringDisk): (WebKit::ResourceLoadStatisticsPersistentStorage::monitorDirectoryForNewStatistics): * NetworkProcess/Classifier/WebResourceLoadStatisticsStore.cpp: (WebKit::WebResourceLoadStatisticsStore::WebResourceLoadStatisticsStore): * NetworkProcess/CustomProtocols/soup/LegacyCustomProtocolManagerSoup.cpp: * NetworkProcess/Downloads/DownloadManager.cpp: (WebKit::DownloadManager::startDownload): (WebKit::DownloadManager::convertNetworkLoadToDownload): (WebKit::DownloadManager::resumeDownload): * NetworkProcess/Downloads/DownloadMap.cpp: (WebKit::DownloadMap::add): * NetworkProcess/Downloads/PendingDownload.cpp: (WebKit::PendingDownload::PendingDownload): * NetworkProcess/NetworkConnectionToWebProcess.cpp: (WebKit::NetworkConnectionToWebProcess::establishSWServerConnection): * NetworkProcess/NetworkContentRuleListManager.cpp: (WebKit::NetworkContentRuleListManager::addContentRuleLists): * NetworkProcess/NetworkDataTaskBlob.cpp: (WebKit::NetworkDataTaskBlob::NetworkDataTaskBlob): (WebKit::NetworkDataTaskBlob::download): * NetworkProcess/NetworkHTTPSUpgradeChecker.cpp: (WebKit::NetworkHTTPSUpgradeChecker::NetworkHTTPSUpgradeChecker): * NetworkProcess/NetworkLoad.cpp: (WebKit::NetworkLoad::didReceiveResponse): * NetworkProcess/NetworkLoadChecker.cpp: (WebKit::NetworkLoadChecker::checkCORSRequestWithPreflight): (WebKit::NetworkLoadChecker::contentSecurityPolicy): * NetworkProcess/NetworkProcess.cpp: (WebKit::NetworkProcess::switchToNewTestingSession): (WebKit::NetworkProcess::ensureSession): (WebKit::NetworkProcess::swServerForSession): (WebKit::NetworkProcess::initializeQuotaUsers): (WebKit::NetworkProcess::storageQuotaManager): * NetworkProcess/NetworkProcess.h: (WebKit::NetworkProcess::addSupplement): * NetworkProcess/NetworkResourceLoader.cpp: (WebKit::m_shouldCaptureExtraNetworkLoadMetrics): (WebKit::NetworkResourceLoader::startNetworkLoad): * NetworkProcess/NetworkSocketChannel.cpp: (WebKit::NetworkSocketChannel::create): * NetworkProcess/PreconnectTask.cpp: * NetworkProcess/WebStorage/LocalStorageDatabase.cpp: (WebKit::LocalStorageDatabase::scheduleDatabaseUpdate): * NetworkProcess/WebStorage/LocalStorageNamespace.cpp: (WebKit::LocalStorageNamespace::getOrCreateStorageArea): * NetworkProcess/WebStorage/SessionStorageNamespace.cpp: (WebKit::SessionStorageNamespace::getOrCreateStorageArea): * NetworkProcess/WebStorage/StorageArea.cpp: (WebKit::StorageArea::clone const): * NetworkProcess/WebStorage/StorageManager.cpp: (WebKit::StorageManager::createSessionStorageNamespace): (WebKit::StorageManager::getOrCreateLocalStorageNamespace): (WebKit::StorageManager::getOrCreateTransientLocalStorageNamespace): (WebKit::StorageManager::getOrCreateSessionStorageNamespace): * NetworkProcess/WebStorage/StorageManagerSet.cpp: (WebKit::StorageManagerSet::add): * NetworkProcess/WebStorage/TransientLocalStorageNamespace.cpp: (WebKit::TransientLocalStorageNamespace::getOrCreateStorageArea): * NetworkProcess/cache/NetworkCache.cpp: (WebKit::NetworkCache::Cache::Cache): (WebKit::NetworkCache::Cache::makeEntry): (WebKit::NetworkCache::Cache::makeRedirectEntry): (WebKit::NetworkCache::Cache::update): * NetworkProcess/cache/NetworkCacheEntry.cpp: (WebKit::NetworkCache::Entry::decodeStorageRecord): * NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp: (WebKit::NetworkCache::SpeculativeLoad::SpeculativeLoad): * NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp: (WebKit::NetworkCache::SpeculativeLoadManager::PendingFrameLoad::registerSubresourceLoad): (WebKit::NetworkCache::SpeculativeLoadManager::retrieve): (WebKit::NetworkCache::SpeculativeLoadManager::addPreloadedEntry): (WebKit::NetworkCache::SpeculativeLoadManager::satisfyPendingRequests): (WebKit::NetworkCache::SpeculativeLoadManager::revalidateSubresource): (WebKit::NetworkCache::SpeculativeLoadManager::startSpeculativeRevalidation): * NetworkProcess/cache/NetworkCacheStorage.cpp: (WebKit::NetworkCache::Storage::synchronize): (WebKit::NetworkCache::Storage::readRecord): (WebKit::NetworkCache::retrieveFromMemory): (WebKit::NetworkCache::Storage::retrieve): (WebKit::NetworkCache::Storage::store): (WebKit::NetworkCache::Storage::traverse): * NetworkProcess/cache/NetworkCacheSubresourcesEntry.cpp: (WebKit::NetworkCache::SubresourcesEntry::decodeStorageRecord): * NetworkProcess/cache/PrefetchCache.cpp: (WebKit::PrefetchCache::store): (WebKit::PrefetchCache::storeRedirect): * NetworkProcess/cocoa/NetworkProcessCocoa.mm: (WebKit::NetworkProcess::platformCreateDefaultStorageSession const): (WebKit::NetworkProcess::networkHTTPSUpgradeChecker): * NetworkProcess/cocoa/NetworkSessionCocoa.mm: (-[WKNetworkSessionDelegate URLSession:dataTask:didBecomeDownloadTask:]): (WebKit::NetworkSessionCocoa::create): (WebKit::NetworkSessionCocoa::createWebSocketTask): * NetworkProcess/curl/NetworkProcessCurl.cpp: (WebKit::NetworkProcess::platformCreateDefaultStorageSession const): * NetworkProcess/curl/NetworkSessionCurl.h: * NetworkProcess/ios/NetworkConnectionToWebProcessIOS.mm: (WebKit::NetworkConnectionToWebProcess::paymentCoordinator): (WebKit::NetworkConnectionToWebProcess::paymentCoordinatorAuthorizationPresenter): * NetworkProcess/soup/NetworkDataTaskSoup.cpp: (WebKit::NetworkDataTaskSoup::download): * NetworkProcess/soup/NetworkProcessSoup.cpp: (WebKit::NetworkProcess::platformCreateDefaultStorageSession const): * NetworkProcess/soup/NetworkSessionSoup.cpp: (WebKit::NetworkSessionSoup::NetworkSessionSoup): (WebKit::NetworkSessionSoup::createWebSocketTask): * NetworkProcess/soup/NetworkSessionSoup.h: * NetworkProcess/soup/WebKitSoupRequestInputStream.cpp: (webkitSoupRequestInputStreamReadAsync): * NetworkProcess/webrtc/NetworkMDNSRegister.cpp: (WebKit::NetworkMDNSRegister::registerMDNSName): * NetworkProcess/webrtc/NetworkRTCMonitor.cpp: (WebKit::NetworkRTCMonitor::startUpdating): * NetworkProcess/webrtc/NetworkRTCProvider.cpp: (WebKit::NetworkRTCProvider::NetworkRTCProvider): (WebKit::NetworkRTCProvider::createSocket): (WebKit::NetworkRTCProvider::wrapNewTCPConnection): * Platform/IPC/Connection.cpp: (IPC::Connection::dispatchWorkQueueMessageReceiverMessage): (IPC::Connection::createSyncMessageEncoder): (IPC::Connection::enableIncomingMessagesThrottling): (IPC::Connection::dispatchSyncMessage): * Platform/IPC/Connection.h: (IPC::Connection::send): (IPC::Connection::sendWithAsyncReply): * Platform/IPC/Decoder.cpp: (IPC::Decoder::unwrapForTesting): * Platform/IPC/HandleMessage.h: (IPC::handleMessageAsync): * Platform/IPC/MessageSender.h: * Platform/IPC/cocoa/ConnectionCocoa.mm: (IPC::ConnectionTerminationWatchdog::ConnectionTerminationWatchdog): (IPC::Connection::open): (IPC::createMessageDecoder): (IPC::Connection::receiveSourceEventHandler): * Platform/IPC/unix/ConnectionUnix.cpp: (IPC::Connection::processMessage): (IPC::Connection::sendOutputMessage): * Platform/IPC/win/ConnectionWin.cpp: (IPC::Connection::readEventHandler): * Platform/mac/LayerHostingContext.mm: (WebKit::LayerHostingContext::createForPort): (WebKit::LayerHostingContext::createForExternalHostingProcess): (WebKit::LayerHostingContext::createForExternalPluginHostingProcess): * PluginProcess/WebProcessConnection.cpp: (WebKit::WebProcessConnection::createPluginInternal): * Shared/API/APIURL.h: (API::URL::create): (API::URL::parseURLIfNecessary const): * Shared/API/Cocoa/RemoteObjectInvocation.mm: (WebKit::RemoteObjectInvocation::decode): * Shared/API/Cocoa/_WKRemoteObjectRegistry.mm: (-[_WKRemoteObjectRegistry _initWithWebPage:]): (-[_WKRemoteObjectRegistry _initWithWebPageProxy:]): (-[_WKRemoteObjectRegistry _sendInvocation:interface:]): * Shared/API/glib/WebKitContextMenuItem.cpp: (webkitContextMenuItemCreate): (webkit_context_menu_item_new): (webkit_context_menu_item_new_from_gaction): (webkit_context_menu_item_new_from_stock_action): (webkit_context_menu_item_new_from_stock_action_with_label): (webkit_context_menu_item_new_with_submenu): (webkit_context_menu_item_new_separator): * Shared/ApplePay/mac/WebPaymentCoordinatorProxyMac.mm: (WebKit::WebPaymentCoordinatorProxy::platformShowPaymentUI): * Shared/Cocoa/SandboxExtensionCocoa.mm: (WebKit::SandboxExtension::Handle::decode): * Shared/CoordinatedGraphics/CoordinatedGraphicsScene.cpp: (WebKit::texmapLayer): (WebKit::CoordinatedGraphicsScene::ensureRootLayer): * Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp: (WebKit::ThreadedCompositor::ThreadedCompositor): * Shared/Plugins/NPRemoteObjectMap.cpp: (WebKit::NPRemoteObjectMap::registerNPObject): * Shared/Plugins/Netscape/NetscapePluginModule.cpp: (WebKit::NetscapePluginModule::tryLoad): * Shared/RemoteLayerTree/RemoteLayerTreeTransaction.mm: (WebKit::RemoteLayerTreeTransaction::LayerProperties::LayerProperties): (WebKit::RemoteLayerTreeTransaction::LayerProperties::decode): (WebKit::RemoteLayerTreeTransaction::decode): * Shared/RemoteLayerTree/RemoteScrollingCoordinatorTransaction.cpp: (WebKit::RemoteScrollingCoordinatorTransaction::decode): * Shared/cairo/ShareableBitmapCairo.cpp: (WebKit::ShareableBitmap::createGraphicsContext): * Shared/cg/ShareableBitmapCG.cpp: (WebKit::ShareableBitmap::createGraphicsContext): * Shared/win/ShareableBitmapDirect2D.cpp: (WebKit::ShareableBitmap::createGraphicsContext): * UIProcess/API/APIHTTPCookieStore.cpp: (API::HTTPCookieStore::registerObserver): * UIProcess/API/C/WKContext.cpp: (WKContextSetInjectedBundleClient): (WKContextSetHistoryClient): (WKContextSetDownloadClient): * UIProcess/API/C/WKGeolocationManager.cpp: (WKGeolocationManagerSetProvider): * UIProcess/API/C/WKNotificationManager.cpp: (WKNotificationManagerSetProvider): * UIProcess/API/C/WKPage.cpp: (WKPageSetPageContextMenuClient): (WKPageSetPageDiagnosticLoggingClient): (WKPageSetPageFindClient): (WKPageSetPageFindMatchesClient): (WKPageSetPageFormClient): (WKPageSetPageLoaderClient): (WKPageSetPagePolicyClient): (WKPageSetPageUIClient): (WKPageSetPageStateClient): * UIProcess/API/C/mac/WKPagePrivateMac.mm: (-[WKObservablePageState initWithPage:]): * UIProcess/API/C/wpe/WKView.cpp: (WKViewSetViewClient): * UIProcess/API/Cocoa/WKBrowsingContextController.mm: (-[WKBrowsingContextController _initWithPageRef:]): * UIProcess/API/Cocoa/WKHTTPCookieStore.mm: (-[WKHTTPCookieStore addObserver:]): * UIProcess/API/Cocoa/WKProcessPool.mm: (-[WKProcessPool _setDownloadDelegate:]): (-[WKProcessPool _setAutomationDelegate:]): * UIProcess/API/Cocoa/WKUserContentController.mm: (-[WKUserContentController addScriptMessageHandler:name:]): (-[WKUserContentController _addScriptMessageHandler:name:userContentWorld:]): * UIProcess/API/Cocoa/WKWebView.mm: (-[WKWebView _initializeWithConfiguration:]): (-[WKWebView setAllowsBackForwardNavigationGestures:]): (-[WKWebView _setInputDelegate:]): * UIProcess/API/Cocoa/_WKAutomationSession.mm: (-[_WKAutomationSession setDelegate:]): * UIProcess/API/Cocoa/_WKRemoteWebInspectorViewController.mm: (-[_WKRemoteWebInspectorViewController init]): * UIProcess/API/glib/IconDatabase.cpp: (WebKit::readySQLiteStatement): * UIProcess/API/glib/WebKitAutomationSession.cpp: (webkitAutomationSessionConstructed): * UIProcess/API/glib/WebKitContextMenuClient.cpp: (attachContextMenuClientToView): * UIProcess/API/glib/WebKitCustomProtocolManagerClient.cpp: (attachCustomProtocolManagerClientToContext): * UIProcess/API/glib/WebKitDownloadClient.cpp: (attachDownloadClientToContext): * UIProcess/API/glib/WebKitFaviconDatabase.cpp: (webkitFaviconDatabaseOpen): * UIProcess/API/glib/WebKitFindController.cpp: (webkitFindControllerConstructed): * UIProcess/API/glib/WebKitFormClient.cpp: (attachFormClientToView): * UIProcess/API/glib/WebKitGeolocationManager.cpp: (webkitGeolocationManagerCreate): * UIProcess/API/glib/WebKitIconLoadingClient.cpp: (attachIconLoadingClientToView): * UIProcess/API/glib/WebKitInjectedBundleClient.cpp: (attachInjectedBundleClientToContext): * UIProcess/API/glib/WebKitNotificationProvider.cpp: (WebKitNotificationProvider::WebKitNotificationProvider): * UIProcess/API/glib/WebKitUIClient.cpp: (attachUIClientToView): * UIProcess/API/glib/WebKitUserContentManager.cpp: (webkit_user_content_manager_register_script_message_handler): (webkit_user_content_manager_register_script_message_handler_in_world): * UIProcess/API/glib/WebKitWebContext.cpp: (webkitWebContextConstructed): (webkit_web_context_set_automation_allowed): * UIProcess/API/glib/WebKitWebView.cpp: (webkitWebViewConstructed): * UIProcess/API/gtk/PageClientImpl.cpp: (WebKit::PageClientImpl::createDrawingAreaProxy): * UIProcess/API/gtk/WebKitEmojiChooser.cpp: (webkitEmojiChooserSetupEmojiSections): * UIProcess/API/gtk/WebKitRemoteInspectorProtocolHandler.cpp: (WebKit::RemoteInspectorProtocolHandler::handleRequest): * UIProcess/API/gtk/WebKitWebInspector.cpp: (webkitWebInspectorCreate): * UIProcess/API/gtk/WebKitWebViewBase.cpp: (webkitWebViewBaseConstructed): (webkitWebViewBaseGestureController): (webkitWebViewBaseDragAndDropHandler): (webkitWebViewBaseDidRelaunchWebProcess): * UIProcess/API/mac/WKView.mm: (-[WKView maybeInstallIconLoadingClient]): (-[WKView initWithFrame:processPool:configuration:]): * UIProcess/API/wpe/PageClientImpl.cpp: (WebKit::PageClientImpl::PageClientImpl): (WebKit::PageClientImpl::createDrawingAreaProxy): * UIProcess/API/wpe/WPEView.cpp: (WKWPE::View::View): (WKWPE::View::setClient): * UIProcess/API/wpe/qt/WPEQtView.cpp: (WPEQtView::notifyLoadChangedCallback): (WPEQtView::notifyLoadFailedCallback): (WPEQtView::runJavaScript): * UIProcess/API/wpe/qt/WPEQtViewBackend.cpp: (WPEQtViewBackend::create): * UIProcess/Automation/WebAutomationSession.cpp: (WebKit::WebAutomationSession::WebAutomationSession): * UIProcess/AuxiliaryProcessProxy.h: (WebKit::AuxiliaryProcessProxy::send): * UIProcess/Cocoa/IconLoadingDelegate.mm: (WebKit::IconLoadingDelegate::createIconLoadingClient): * UIProcess/Cocoa/UIDelegate.mm: (WebKit::UIDelegate::createContextMenuClient): (WebKit::UIDelegate::createUIClient): * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp: (WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints): * UIProcess/Cocoa/WebProcessPoolCocoa.mm: (WebKit::WebProcessPool::platformInitialize): (WebKit::WebProcessPool::startDisplayLink): * UIProcess/Cocoa/WebProcessProxyCocoa.mm: (WebKit::WebProcessProxy::processWasUnexpectedlyUnsuspended): * UIProcess/Cocoa/WebViewImpl.mm: (WebKit::WebViewImpl::WebViewImpl): (WebKit::WebViewImpl::createDrawingAreaProxy): (WebKit::WebViewImpl::setTextIndicator): (WebKit::WebViewImpl::ensureGestureController): * UIProcess/CoordinatedGraphics/DrawingAreaProxyCoordinatedGraphics.cpp: (WebKit::DrawingAreaProxyCoordinatedGraphics::incorporateUpdate): (WebKit::DrawingAreaProxyCoordinatedGraphics::dispatchAfterEnsuringDrawing): * UIProcess/DeviceIdHashSaltStorage.cpp: (WebKit::DeviceIdHashSaltStorage::getDataFromDecoder const): (WebKit::DeviceIdHashSaltStorage::completeDeviceIdHashSaltForOriginCall): * UIProcess/Downloads/DownloadProxyMap.cpp: (WebKit::DownloadProxyMap::createDownloadProxy): * UIProcess/Gamepad/UIGamepadProvider.cpp: (WebKit::UIGamepadProvider::setInitialConnectedGamepads): (WebKit::UIGamepadProvider::platformGamepadConnected): * UIProcess/Network/NetworkProcessProxy.cpp: (WebKit::NetworkProcessProxy::createDownloadProxy): (WebKit::NetworkProcessProxy::takeUploadAssertion): * UIProcess/Notifications/WebNotificationManagerProxy.cpp: (WebKit::WebNotificationManagerProxy::WebNotificationManagerProxy): (WebKit::WebNotificationManagerProxy::setProvider): * UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp: (WebKit::pluginRequiresGtk2): * UIProcess/ProcessThrottler.cpp: (WebKit::ProcessThrottler::didConnectToProcess): * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm: (WebKit::RemoteLayerTreeDrawingAreaProxy::RemoteLayerTreeDrawingAreaProxy): (WebKit::RemoteLayerTreeDrawingAreaProxy::initializeDebugIndicator): * UIProcess/RemoteLayerTree/RemoteLayerTreeHost.mm: (WebKit::RemoteLayerTreeHost::makeNode): * UIProcess/RemoteLayerTree/RemoteLayerTreeNode.mm: (WebKit::RemoteLayerTreeNode::createWithPlainLayer): * UIProcess/RemoteLayerTree/ios/RemoteLayerTreeHostIOS.mm: (WebKit::RemoteLayerTreeHost::makeNode): * UIProcess/RemoteLayerTree/ios/ScrollingTreeFrameScrollingNodeRemoteIOS.mm: (WebKit::ScrollingTreeFrameScrollingNodeRemoteIOS::commitStateBeforeChildren): * UIProcess/RemoteLayerTree/ios/ScrollingTreeOverflowScrollingNodeIOS.mm: (WebKit::ScrollingTreeOverflowScrollingNodeIOS::ScrollingTreeOverflowScrollingNodeIOS): * UIProcess/RemoteLayerTree/mac/ScrollingTreeFrameScrollingNodeRemoteMac.cpp: (WebKit::ScrollingTreeFrameScrollingNodeRemoteMac::ScrollingTreeFrameScrollingNodeRemoteMac): * UIProcess/RemoteLayerTree/mac/ScrollingTreeOverflowScrollingNodeRemoteMac.cpp: (WebKit::ScrollingTreeOverflowScrollingNodeRemoteMac::ScrollingTreeOverflowScrollingNodeRemoteMac): * UIProcess/WebAuthentication/Cocoa/HidService.mm: (WebKit::HidService::deviceAdded): * UIProcess/WebGeolocationManagerProxy.cpp: (WebKit::WebGeolocationManagerProxy::WebGeolocationManagerProxy): (WebKit::WebGeolocationManagerProxy::setProvider): * UIProcess/WebMediaSessionFocusManager.cpp: (WebKit::WebMediaSessionFocusManager::setFocusedMediaElement): * UIProcess/WebPageInspectorController.cpp: (WebKit::WebPageInspectorController::WebPageInspectorController): * UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::WebPageProxy): (WebKit::m_resetRecentCrashCountTimer): (WebKit::WebPageProxy::setFormClient): (WebKit::WebPageProxy::setUIClient): (WebKit::WebPageProxy::setIconLoadingClient): (WebKit::WebPageProxy::setFindClient): (WebKit::WebPageProxy::setFindMatchesClient): (WebKit::WebPageProxy::setContextMenuClient): (WebKit::WebPageProxy::setInjectedBundleClient): (WebKit::WebPageProxy::suspendCurrentPageIfPossible): (WebKit::WebPageProxy::didAttachToRunningProcess): (WebKit::WebPageProxy::setDrawingArea): (WebKit::WebPageProxy::close): (WebKit::WebPageProxy::loadData): (WebKit::WebPageProxy::handleWheelEvent): (WebKit::WebPageProxy::processNextQueuedWheelEvent): (WebKit::WebPageProxy::continueNavigationInNewProcess): (WebKit::WebPageProxy::setFullscreenClient): (WebKit::WebPageProxy::userMediaPermissionRequestManager): (WebKit::WebPageProxy::setScrollPerformanceDataCollectionEnabled): (WebKit::WebPageProxy::speechSynthesisData): * UIProcess/WebProcessCache.cpp: (WebKit::WebProcessCache::addProcessIfPossible): * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::WebProcessPool): (WebKit::WebProcessPool::setInjectedBundleClient): (WebKit::WebProcessPool::setHistoryClient): (WebKit::WebProcessPool::setDownloadClient): (WebKit::WebProcessPool::setAutomationClient): (WebKit::WebProcessPool::setLegacyCustomProtocolManagerClient): (WebKit::WebProcessPool::ensureNetworkProcess): (WebKit::WebProcessPool::didCollectPrewarmInformation): (WebKit::WebProcessPool::setWebProcessHasUploads): (WebKit::WebProcessPool::setWebProcessIsPlayingAudibleMedia): * UIProcess/WebProcessProxy.cpp: * UIProcess/cairo/BackingStoreCairo.cpp: (WebKit::BackingStore::createBackend): * UIProcess/glib/RemoteInspectorClient.cpp: (WebKit::RemoteInspectorClient::inspect): * UIProcess/gtk/AcceleratedBackingStoreWayland.cpp: (WebKit::AcceleratedBackingStoreWayland::checkRequirements): * UIProcess/gtk/DragAndDropHandler.cpp: (WebKit::DragAndDropHandler::dragDataSelection): * UIProcess/gtk/WaylandCompositor.cpp: (WebKit::WaylandCompositor::initializeEGL): * UIProcess/ios/EditableImageController.mm: (WebKit::EditableImageController::ensureEditableImage): * UIProcess/ios/WKApplicationStateTrackingView.mm: (-[WKApplicationStateTrackingView didMoveToWindow]): * UIProcess/ios/WKContentView.mm: (-[WKContentView _commonInitializationWithProcessPool:configuration:]): (-[WKContentView initWithFrame:processPool:configuration:webView:]): (-[WKContentView _createDrawingAreaProxy:]): * UIProcess/ios/WKContentViewInteraction.mm: (-[WKContentView setupInteraction]): (-[WKContentView becomeFirstResponderForWebView]): (-[WKContentView _elementDidFocus:userIsInteracting:blurPreviousNode:activityStateChanges:userObject:]): * UIProcess/ios/WebPageProxyIOS.mm: (WebKit::WebPageProxy::elementDidFocus): (WebKit::WebPageProxy::paymentCoordinatorAuthorizationPresenter): * UIProcess/mac/PageClientImplMac.mm: (WebKit::PageClientImpl::PageClientImpl): * UIProcess/mac/WKFullScreenWindowController.mm: (-[WKFullScreenWindowController initWithWindow:webView:page:]): * UIProcess/mac/WKTextFinderClient.mm: (-[WKTextFinderClient initWithPage:view:usePlatformFindUI:]): * UIProcess/socket/RemoteInspectorClient.cpp: (WebKit::RemoteInspectorClient::inspect): * UIProcess/socket/RemoteInspectorProtocolHandler.cpp: (WebKit::RemoteInspectorProtocolHandler::platformStartTask): * UIProcess/win/BackingStoreDirect2D.cpp: (WebKit::BackingStore::createBackend): * UIProcess/win/PageClientImpl.cpp: (WebKit::PageClientImpl::createDrawingAreaProxy): * UIProcess/win/WebView.cpp: (WebKit::WebView::WebView): * WebProcess/Gamepad/WebGamepadProvider.cpp: (WebKit::WebGamepadProvider::setInitialGamepads): (WebKit::WebGamepadProvider::gamepadConnected): * WebProcess/InjectedBundle/API/c/WKBundle.cpp: (WKBundleSetClient): * WebProcess/InjectedBundle/API/c/WKBundlePage.cpp: (WKBundlePageSetContextMenuClient): (WKBundlePageSetEditorClient): (WKBundlePageSetFormClient): (WKBundlePageSetPageLoaderClient): (WKBundlePageSetResourceLoadClient): (WKBundlePageSetUIClient): * WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.cpp: (WKBundlePageOverlayCreate): * WebProcess/InjectedBundle/API/c/mac/WKBundlePageBannerMac.mm: (WKBundlePageBannerCreateBannerWithCALayer): * WebProcess/InjectedBundle/API/glib/DOM/DOMObjectCache.cpp: (WebKit::getOrCreateDOMObjectCacheFrameObserver): (WebKit::DOMObjectCache::put): * WebProcess/InjectedBundle/API/glib/WebKitExtensionManager.cpp: (WebKit::WebKitExtensionManager::initialize): * WebProcess/InjectedBundle/API/glib/WebKitWebEditor.cpp: (webkitWebEditorCreate): * WebProcess/InjectedBundle/API/glib/WebKitWebExtension.cpp: (webkitWebExtensionCreate): * WebProcess/InjectedBundle/API/glib/WebKitWebPage.cpp: (webkitFrameGetOrCreate): (webkitWebPageCreate): * WebProcess/InjectedBundle/API/mac/WKDOMTextIterator.mm: (-[WKDOMTextIterator initWithRange:]): * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm: (-[WKWebProcessPlugInBrowserContextController _setFormDelegate:]): (-[WKWebProcessPlugInBrowserContextController _setEditingDelegate:]): * WebProcess/InjectedBundle/InjectedBundle.cpp: (WebKit::InjectedBundle::InjectedBundle): (WebKit::InjectedBundle::setClient): * WebProcess/Network/WebSocketChannel.cpp: (WebKit::PendingMessage::PendingMessage): (WebKit::WebSocketChannel::send): * WebProcess/Network/webrtc/LibWebRTCProvider.cpp: (WebKit::LibWebRTCProvider::createPeerConnection): (WebKit::LibWebRTCProvider::createSocketFactory): * WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp: (WebKit::LibWebRTCSocketFactory::createServerTcpSocket): (WebKit::LibWebRTCSocketFactory::createUdpSocket): (WebKit::LibWebRTCSocketFactory::createClientTcpSocket): (WebKit::LibWebRTCSocketFactory::createNewConnectionSocket): (WebKit::LibWebRTCSocketFactory::createAsyncResolver): * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp: (WebKit::PluginDestructionProtector::PluginDestructionProtector): * WebProcess/Plugins/Netscape/NetscapePlugin.cpp: (WebKit::NetscapePlugin::scheduleTimer): * WebProcess/Plugins/Netscape/NetscapePluginStream.cpp: (WebKit::NetscapePluginStream::deliverData): * WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp: (WebKit::NetscapePluginX11::create): * WebProcess/Plugins/PluginProxy.cpp: (WebKit::PluginProxy::initialize): * WebProcess/Plugins/PluginView.cpp: (WebKit::PluginView::createWebEvent const): * WebProcess/Storage/WebSWContextManagerConnection.cpp: (WebKit::WebSWContextManagerConnection::installServiceWorker): * WebProcess/WebCoreSupport/WebChromeClient.cpp: (WebKit::WebChromeClient::createColorChooser): (WebKit::WebChromeClient::createDataListSuggestionPicker): * WebProcess/WebCoreSupport/WebInspectorClient.cpp: (WebKit::WebInspectorClient::showPaintRect): * WebProcess/WebCoreSupport/WebPasteboardOverrides.cpp: (WebKit::WebPasteboardOverrides::addOverride): * WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp: (WebKit::DrawingAreaCoordinatedGraphics::enterAcceleratedCompositingMode): * WebProcess/WebPage/DrawingArea.cpp: (WebKit::DrawingArea::create): * WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemote.cpp: (WebKit::PlatformCALayerRemote::ensureBackingStore): (WebKit::PlatformCALayerRemote::setTransform): (WebKit::PlatformCALayerRemote::setSublayerTransform): (WebKit::PlatformCALayerRemote::setFilters): (WebKit::PlatformCALayerRemote::setShapeRoundedRect): * WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemoteTiledBacking.cpp: (WebKit::PlatformCALayerRemoteTiledBacking::PlatformCALayerRemoteTiledBacking): * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::RemoteLayerTreeDrawingArea): (WebKit::RemoteLayerTreeDrawingArea::flushLayers): * WebProcess/WebPage/WebFrame.cpp: (WebKit::WebFrame::createSubframe): * WebProcess/WebPage/WebPage.cpp: (WebKit::m_textAutoSizingAdjustmentTimer): (WebKit::WebPage::setInjectedBundleContextMenuClient): (WebKit::WebPage::setInjectedBundleEditorClient): (WebKit::WebPage::setInjectedBundleFormClient): (WebKit::WebPage::setInjectedBundlePageLoaderClient): (WebKit::WebPage::setInjectedBundleResourceLoadClient): (WebKit::WebPage::setInjectedBundleUIClient): (WebKit::WebPage::close): (WebKit::WebPage::beginPrinting): * WebProcess/WebPage/gtk/WebPrintOperationGtk.cpp: (WebKit::WebPrintOperationGtk::print): * WebProcess/WebPage/ios/FindControllerIOS.mm: (WebKit::FindController::updateFindIndicator): * WebProcess/WebPage/mac/DrawingAreaMac.cpp: (WebKit::DisplayRefreshMonitorMac::requestRefreshCallback): * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::TiledCoreAnimationDrawingArea): * WebProcess/WebProcess.cpp: (WebKit::WebProcess::markAllLayersVolatile): (WebKit::WebProcess::ensureAutomationSessionProxy): (WebKit::WebProcess::libWebRTCNetwork): (WebKit::WebProcess::establishWorkerContextConnectionToNetworkProcess): * WebProcess/WebProcess.h: (WebKit::WebProcess::addSupplement): * WebProcess/cocoa/UserMediaCaptureManager.cpp: (WebKit::UserMediaCaptureManager::Source::Source): * WebProcess/cocoa/WebProcessCocoa.mm: (WebKit::WebProcess::processTaskStateDidChange): (WebKit::WebProcess::updateCPUMonitorState): Source/WebKitLegacy: Reviewed by Geoffrey Garen. * Storage/StorageSyncManager.cpp: (WebCore::StorageSyncManager::StorageSyncManager): * Storage/StorageThread.cpp: (WebCore::StorageThread::dispatch): (WebCore::StorageThread::terminate): * Storage/StorageTracker.cpp: (WebKit::StorageTracker::StorageTracker): * WebCoreSupport/NetworkStorageSessionMap.cpp: (NetworkStorageSessionMap::defaultStorageSession): (NetworkStorageSessionMap::switchToNewTestingSession): (NetworkStorageSessionMap::ensureSession): Source/WebKitLegacy/cf: Reviewed by Geoffrey Garen. * WebCoreSupport/WebInspectorClientCF.cpp: (WebInspectorClient::createFrontendSettings): Source/WebKitLegacy/ios: Reviewed by Geoffrey Garen. * WebCoreSupport/WebFixedPositionContent.mm: (-[WebFixedPositionContent setViewportConstrainedLayers:stickyContainerMap:]): Source/WebKitLegacy/mac: Reviewed by Geoffrey Garen. * History/WebHistory.mm: (-[WebHistoryPrivate init]): * History/WebHistoryItem.mm: (-[WebHistoryItem initFromDictionaryRepresentation:]): * Plugins/Hosted/NetscapePluginHostProxy.mm: (WKPCGetScriptableNPObjectReply): (WKPCBooleanReply): (WKPCBooleanAndDataReply): (WKPCInstantiatePluginReply): * Plugins/Hosted/ProxyInstance.mm: (WebKit::ProxyInstance::methodNamed): (WebKit::ProxyInstance::fieldNamed): * Plugins/Hosted/WebHostedNetscapePluginView.mm: (-[WebHostedNetscapePluginView createPlugin]): * Plugins/WebNetscapePluginEventHandler.mm: (WebNetscapePluginEventHandler::create): * Plugins/WebNetscapePluginView.mm: (-[WebNetscapePluginView scheduleTimerWithInterval:repeat:timerFunc:]): * Storage/WebDatabaseManagerClient.mm: (DidModifyOriginData::dispatchToMainThread): * WebCoreSupport/WebFrameLoaderClient.mm: (addRedirectURL): (WebFrameLoaderClient::savePlatformDataToCachedFrame): * WebCoreSupport/WebInspectorClient.mm: (WebInspectorClient::openLocalFrontend): * WebView/WebDeviceOrientationProviderMock.mm: * WebView/WebFrame.mm: (-[WebFrame _attachScriptDebugger]): * WebView/WebMediaPlaybackTargetPicker.mm: (WebMediaPlaybackTargetPicker::create): * WebView/WebTextIterator.mm: (-[WebTextIterator initWithRange:]): * WebView/WebView.mm: (-[WebView _injectOutlookQuirksScript]): (-[WebView _commonInitializationWithFrameName:groupName:]): (+[WebView _addUserScriptToGroup:world:source:url:whitelist:blacklist:injectionTime:injectedFrames:]): (+[WebView _addUserStyleSheetToGroup:world:source:url:whitelist:blacklist:injectedFrames:]): (-[WebView _selectionServiceController]): (-[WebView _setTextIndicator:withLifetime:]): * WebView/WebViewData.mm: (WebViewLayerFlushScheduler::WebViewLayerFlushScheduler): (-[WebViewPrivate init]): Source/WebKitLegacy/win: Reviewed by Geoffrey Garen. * FullscreenVideoController.cpp: (FullscreenVideoController::FullscreenVideoController): * Plugins/PluginStream.cpp: (WebCore::PluginStream::didReceiveData): * Plugins/PluginView.cpp: (WebCore::PluginView::load): * Plugins/PluginViewWin.cpp: (WebCore::PluginView::wndProc): * WebCoreSupport/WebChromeClient.cpp: (WebChromeClient::WebChromeClient): * WebCoreSupport/WebFrameLoaderClient.cpp: (WebFrameLoaderClient::WebFrameLoaderClient): (WebFrameLoaderClient::savePlatformDataToCachedFrame): * WebCoreSupport/WebInspectorClient.cpp: (WebInspectorClient::openLocalFrontend): (WebInspectorClient::highlight): * WebElementPropertyBag.cpp: (WebElementPropertyBag::WebElementPropertyBag): * WebHistoryItem.cpp: (WebHistoryItem::initFromDictionaryRepresentation): * WebKitQuartzCoreAdditions/CAD3DRenderer.cpp: (WKQCA::CAD3DRenderer::createD3DPostProcessingContext): * WebNotificationCenter.cpp: (WebNotificationCenter::WebNotificationCenter): * WebView.cpp: (WebView::handleMouseEvent): (WebView::registerEmbeddedViewMIMEType): (WebView::enterVideoFullscreenForVideoElement): (WebView::addUserScriptToGroup): (WebView::addUserStyleSheetToGroup): (WebView::setAcceleratedCompositing): Source/WTF: Reviewed by Geoff Garen. This patch is second part of bug 200620 patch. I split I split it into three pieces to make roll-out easy. his part, we convert std::make_unique to WTF::makeUnique or WTF::makeUniqueWithoutFastMallocCheck. In the third patch, we will add a static_assert to makeUnique, which ensures the given class T is FastMalloced or IsoHeaped. This patch adds `WTF::makeUnique<T>` and `WTF::makeUniqueWithoutFastMallocCheck<T>` as drop-in replacement for `std::make_unique<T>`. `WTF::makeUnique<T>` has one additional `static_assert` check which ensures `T` FastMalloc / IsoHeap annotated. If it is not, the compile error happens. In this patch, I tried using this everywhere in WebKit as much as possible. And we found that surprisingly many classes are missing FastMalloc annotation and allocated from system-malloc. Using WTF::makeUnique enforces classes / structs to use FastMalloc. WTF::makeUniqueWithoutFastMallocCheck is offered for the corner cases. This is identical to std::make_unique. We use this for classes that are offered by non-WebKit code base, like, zlib. This clear name can make us easily find this allocation is intentionally done by system-malloc. We do not take the following direction, `WTF::makeUnique` automatically allocates FastMalloc even if FastMalloc annotation is not attached. Since default deleter is performing `delete` and this is not what we want for FastMalloced ones, we need to return std::unique_ptr<T, FastFreeDeleter> for T if T does not have FastMalloc-annotation. Automatically doing this sounds a bit dangerous. auto pointer = WTF::makeUnique<T>(); // Super dangerous, but sometimes it is required... auto* rawPointer = pointer.release(); // Passing rawPointer to somewhere, and delete rawPointer; The above one becomes invalid because pointer may start requiring non `delete` destroying function. In the above case, the correct way becomes the following. rawPointer->~T(); fastFree(rawPointer); This looks non-intuitive. And having two ways to destroying objects (`delete` or the above one) can be error-prone. If we have WTF_MAKE_FAST_ALLOCATED for T, we do not need to care about this. "new" and "delete" operators are defined, and C++ way works. The simple invariant, "makeUnique just does `new` internally. And `delete` operator does `delete`. default deleter is just doing `delete`", is kept. While we need to annotate many classes with WTF_MAKE_FAST_ALLOCATED, it is one time cost when we add a class. And, by introducing `WTF::makeUnique<>`, we no longer forget adding this. makeUnique(...) static_assert(T is FastMalloced or IsoHeaped); return make_unique<T>(...) * benchmarks/LockFairnessTest.cpp: * benchmarks/LockSpeedTest.cpp: * wtf/ConcurrentVector.h: * wtf/CrossThreadTaskHandler.cpp: (WTF::CrossThreadTaskHandler::taskRunLoop): * wtf/FilePrintStream.cpp: (WTF::FilePrintStream::open): * wtf/Function.h: (WTF::Function<Out): * wtf/HashTable.h: (WTF::KeyTraits>::HashTable): * wtf/MemoryPressureHandler.cpp: (WTF::MemoryPressureHandler::setShouldUsePeriodicMemoryMonitor): * wtf/StdLibExtras.h: (WTF::makeUnique): (WTF::makeUniqueWithoutFastMallocCheck): * wtf/StreamBuffer.h: (WTF::StreamBuffer::append): * wtf/UniqueRef.h: (WTF::makeUniqueRefWithoutFastMallocCheck): (WTF::makeUniqueRef): * wtf/glib/RunLoopGLib.cpp: (WTF::RunLoop::dispatchAfter): * wtf/text/StringView.cpp: (WTF::StringView::GraphemeClusters::Iterator::Iterator): Tools: Reviewed by Geoffrey Garen. * DumpRenderTree/TestRunner.cpp: (addURLToRedirectCallback): (setWillSendRequestClearHeaderCallback): (TestRunner::setAccummulateLogsForChannel): (TestRunner::runUIScript): (TestRunner::setOpenPanelFiles): * DumpRenderTree/mac/DumpRenderTree.mm: (dumpFramesAsText): * DumpRenderTree/mac/EventSendingController.mm: (eventPressedMouseButtonsSwizzlerForViewAndEvent): * DumpRenderTree/win/DRTDataObject.cpp: (DRTDataObject::SetData): * DumpRenderTree/win/FrameLoadDelegate.cpp: (FrameLoadDelegate::FrameLoadDelegate): * DumpRenderTree/win/UIDelegate.cpp: (DRTUndoManager::DRTUndoManager): (UIDelegate::UIDelegate): (UIDelegate::resetUndoManager): * TestWebKitAPI/JavaScriptTest.cpp: (TestWebKitAPI::runJSTest): * TestWebKitAPI/PlatformUtilities.cpp: (TestWebKitAPI::Util::toSTD): * TestWebKitAPI/Tests/WTF/Expected.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/HashCountedSet.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/HashMap.cpp: (TestWebKitAPI::TEST): (TestWebKitAPI::testMovingUsingEnsure): (TestWebKitAPI::testMovingUsingAdd): * TestWebKitAPI/Tests/WTF/HashSet.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/ListHashSet.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/Lock.cpp: (TestWebKitAPI::runLockTest): * TestWebKitAPI/Tests/WTF/ParkingLot.cpp: * TestWebKitAPI/Tests/WTF/RefCounter.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/ThreadGroup.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/Variant.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WTF/WeakPtr.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WebCore/CARingBuffer.cpp: (TestWebKitAPI::CARingBufferTest::SetUp): * TestWebKitAPI/Tests/WebCore/CalculationValue.cpp: (TestWebKitAPI::createTestValue): * TestWebKitAPI/Tests/WebCore/FidoHidMessageTest.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WebCore/FileMonitor.cpp: (TestWebKitAPI::TEST_F): * TestWebKitAPI/Tests/WebCore/curl/Cookies.cpp: * TestWebKitAPI/Tests/WebKit/CloseFromWithinCreatePage.cpp: (TestWebKitAPI::createNewPage): * TestWebKitAPI/Tests/WebKit/ModalAlertsSPI.cpp: (TestWebKitAPI::createNewPage): * TestWebKitAPI/Tests/WebKit/TextFieldDidBeginAndEndEditing.cpp: * TestWebKitAPI/Tests/WebKit/UserMessage.cpp: (TestWebKitAPI::WebKit2UserMessageRoundTripTest::SetUp): * TestWebKitAPI/Tests/WebKit/WillLoad.cpp: (TestWebKitAPI::WebKit2WillLoadTest::SetUp): * TestWebKitAPI/Tests/WebKit/mac/ForceLightAppearanceInBundle_Bundle.mm: (TestWebKitAPI::ForceLightAppearanceInBundleTest::didReceiveMessage): * TestWebKitAPI/Tests/WebKitGLib/TestAuthentication.cpp: (serverCallback): (testWebViewAuthenticationProxyHTTPS): * TestWebKitAPI/Tests/WebKitGtk/DOMDOMWindowTest.cpp: (WebKitDOMDOMWindowTest::create): * TestWebKitAPI/cocoa/PlatformUtilitiesCocoa.mm: (TestWebKitAPI::Util::toSTD): * TestWebKitAPI/cocoa/TestWKWebView.mm: (applyWorkaroundToAllowWritingAttributedStringsToItemProviders): (-[TestWKWebView initWithFrame:configuration:addToWindow:]): * TestWebKitAPI/mac/TestFontOptions.mm: (-[TestFontOptions initWithFontOptions:]): * WebKitTestRunner/InjectedBundle/EventSendingController.cpp: (WTR::EventSendingController::callAfterScrollingCompletes): * WebKitTestRunner/InjectedBundle/InjectedBundle.cpp: (WTR::InjectedBundle::didCreatePage): * WebKitTestRunner/InjectedBundle/TestRunner.cpp: (WTR::TestRunner::setOpenPanelFiles): * WebKitTestRunner/InjectedBundle/atk/AccessibilityUIElementAtk.cpp: * WebKitTestRunner/StringFunctions.h: (WTR::toSTD): (WTR::toWTFString): * WebKitTestRunner/TestController.cpp: (WTR::TestController::initialize): (WTR::TestController::generatePageConfiguration): (WTR::TestController::resetStateToConsistentValues): (WTR::createTestURL): (WTR::TestController::runTest): (WTR::TestController::platformCreateWebView): * WebKitTestRunner/TestInvocation.cpp: (WTR::TestInvocation::runUISideScript): * WebKitTestRunner/cocoa/TestControllerCocoa.mm: (WTR::TestController::platformCreateWebView): (WTR::TestController::setDefaultCalendarType): * WebKitTestRunner/gtk/EventSenderProxyGtk.cpp: (WTR::getGDKKeySymForKeyRef): * WebKitTestRunner/ios/TestControllerIOS.mm: (WTR::TestController::platformResetStateToConsistentValues): (WTR::TestController::setKeyboardInputModeIdentifier): * WebKitTestRunner/mac/EventSenderProxy.mm: (WTR::EventSenderProxy::mouseDown): (WTR::EventSenderProxy::mouseUp): (WTR::EventSenderProxy::mouseMoveTo): * WebKitTestRunner/wpe/EventSenderProxyWPE.cpp: (WTR::wpeKeySymForKeyRef): Canonical link: https://commits.webkit.org/214609@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248846 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-08-19 06:59:40 +00:00
return makeUnique<RenderingUpdateScheduler>(page);
requestAnimationFrame should execute before the next frame https://bugs.webkit.org/show_bug.cgi?id=177484 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2019-04-10 Reviewed by Simon Fraser. LayoutTests/imported/w3c: Add trace points for the page RenderingUpdate. * web-platform-tests/resize-observer/resources/resizeTestHelper.js: Change ResizeTestHelper.TIMEOUT to be 1 second instead of 100 ms which is too short for layout tests. Source/WebCore: This change fixes these issues with animation timing: 1. Calling the requestAnimationFrame callbacks would have happened when the DisplayLink fires. This may have happened even if the frame is missed and no display is committed. 2. Style changes and layout triggered by script could trigger painting at more than 60fps. CoreAnimation commits could happen at more than 60fps, although WindowServer will throttle those, and only some will be shown on the screen. This change introduces a new paint scheduling model where painting is driven by a "RenderingUpdateScheduler", which only triggers paints once per 16.7ms frame. Code that previously scheduled a compositing layer flush now schedules a "RenderingUpdate", and that update is driven by a DisplayRefreshMonitor callback. When the render happens, we service requestAnimationFrame callbacks, Web Animations, intersection observations and resize observations per the "Update the rendering" step of the HTML Event Loop specification: <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. In the future, more rendering steps will be added to this code. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * accessibility/mac/AXObjectCacheMac.mm: (WebCore::AXObjectCache::platformHandleFocusedUIElementChanged): Fix layout tests by adding null check. * animation/DocumentAnimationScheduler.cpp: Removed. * animation/DocumentAnimationScheduler.h: Removed. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::updateThrottlingState): (WebCore::DocumentTimeline::suspendAnimations): (WebCore::DocumentTimeline::resumeAnimations): (WebCore::DocumentTimeline::liveCurrentTime const): (WebCore::DocumentTimeline::currentTime): (WebCore::DocumentTimeline::cacheCurrentTime): (WebCore::DocumentTimeline::animationTimingDidChange): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::unscheduleAnimationResolution): (WebCore::DocumentTimeline::updateAnimationsAndSendEvents): (WebCore::DocumentTimeline::internalUpdateAnimationsAndSendEvents): (WebCore::DocumentTimeline::scheduleNextTick): (WebCore::DocumentTimeline::updateListOfElementsWithRunningAcceleratedAnimationsForElement): Simplify this function by handling the case of no-animations separately. (WebCore::DocumentTimeline::resolveAnimationsForElement): Simplify the loop and delete hasPendingAcceleratedAnimations because it is initialized to true and is not changed inside the loop. (WebCore::DocumentTimeline::scheduleAnimationResolutionIfNeeded): Deleted. (WebCore::DocumentTimeline::animationResolutionTimerFired): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::resolveStyle): There is no need to force update in resolveStyle(). notifyFlushRequired() will be called eventually which will scheduleRenderingUpdate(). (WebCore::Document::prepareForDestruction): (WebCore::Document::updateAnimationsAndSendEvents): (WebCore::Document::serviceRequestAnimationFrameCallbacks): (WebCore::Document::windowScreenDidChange): (WebCore::Document::scheduleRenderingUpdate): (WebCore::Document::updateIntersectionObservations): (WebCore::Document::addResizeObserver): (WebCore::Document::updateResizeObservations): (WebCore::Document::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Document::scheduleResizeObservations): Deleted. (WebCore::Document::animationScheduler): Deleted. No need to schedule web-animations, intersection observations and resize observations updates separately. All of them will be updated through the "Update the rendering" step, i.e. Page::updateRendering(). * dom/Document.h: (WebCore::Document::numberOfIntersectionObservers const): * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::animationTimerFired): (WebCore::ScriptedAnimationController::serviceScriptedAnimations): Deleted. (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): Deleted. * dom/ScriptedAnimationController.h: * page/FrameView.cpp: (WebCore::FrameView::didLayout): (WebCore::FrameView::viewportContentsChanged): * page/FrameViewLayoutContext.cpp: (WebCore::FrameViewLayoutContext::layoutTimerFired): * page/IntersectionObserver.cpp: (WebCore::IntersectionObserver::observe): * page/Page.cpp: (WebCore::Page::Page): (WebCore::Page::layoutIfNeeded): (WebCore::Page::updateRendering): (WebCore::Page::renderingUpdateScheduler): (WebCore::Page::willDisplayPage): Deleted. (WebCore::Page::addDocumentNeedingIntersectionObservationUpdate): Deleted. (WebCore::Page::updateIntersectionObservations): Deleted. (WebCore::Page::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Page::hasResizeObservers const): Deleted. (WebCore::Page::gatherDocumentsNeedingResizeObservationCheck): Deleted. (WebCore::Page::checkResizeObservations): Deleted. (WebCore::Page::scheduleResizeObservations): Deleted. (WebCore::Page::notifyResizeObservers): Deleted. * page/Page.h: (WebCore::Page::setNeedsCheckResizeObservations): Deleted. (WebCore::Page::needsCheckResizeObservations const): Deleted. The IntersectionObserver and the ResizeObserver do not need to schedule their own timers. The RenderingUpdateScheduler will schedule the "Update the rendering" step in which these obverses will be served. * page/PageOverlayController.cpp: (WebCore::PageOverlayController::didChangeViewExposedRect): (WebCore::PageOverlayController::notifyFlushRequired): Force committing the layers to be 60 fps at maximum. * page/RenderingUpdateScheduler.cpp: Added. (WebCore::RenderingUpdateScheduler::RenderingUpdateScheduler): (WebCore::RenderingUpdateScheduler::scheduleRenderingUpdate): (WebCore::RenderingUpdateScheduler::isScheduled const): (WebCore::RenderingUpdateScheduler::startTimer): (WebCore::RenderingUpdateScheduler::clearScheduled): (WebCore::RenderingUpdateScheduler::createDisplayRefreshMonitor const): (WebCore::RenderingUpdateScheduler::windowScreenDidChange): (WebCore::RenderingUpdateScheduler::displayRefreshFired): (WebCore::RenderingUpdateScheduler::scheduleCompositingLayerFlush): * page/RenderingUpdateScheduler.h: Added. (WebCore::RenderingUpdateScheduler::create): * page/ResizeObserver.cpp: (WebCore::ResizeObserver::observe): (WebCore::ResizeObserver::scheduleObservations): Deleted. * page/ResizeObserver.h: (WebCore::ResizeObserver::hasActiveObservations const): * page/ios/ContentChangeObserver.h: * page/mac/ServicesOverlayController.mm: (WebCore::ServicesOverlayController::Highlight::notifyFlushRequired): * page/scrolling/ScrollingStateTree.cpp: * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::scheduleLayerFlushNow): (WebCore::RenderLayerCompositor::layerTreeAsText): Source/WebKit: Replace the calls to Page::layoutIfNeeded() and willDisplayPage() by a single call to Page::updateRendering(). This new function implements "Update the rendering" step of the HTML Event Loop specification <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. * WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp: (WebKit::DrawingAreaCoordinatedGraphics::scheduleCompositingLayerFlush): (WebKit::DrawingAreaCoordinatedGraphics::updateBackingStoreState): (WebKit::DrawingAreaCoordinatedGraphics::display): * WebProcess/WebPage/CoordinatedGraphics/LayerTreeHost.cpp: (WebKit::LayerTreeHost::layerFlushTimerFired): * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::flushLayers): -- Call Page::updateRendering() to make sure that "Update the rendering" happens immediately before updating the page. -- Move the call to RemoteLayerBackingStoreCollection::willFlushLayers() to be exactly before flushing the layers. This fixes the assertion ASSERT(m_inLayerFlush) which was firing when running a layout test. RemoteLayerTreeDrawingArea::flushLayers() now can call itself through TestRunner::notifyDone(). flushLayers() was calling willFlushLayers() twice before calling didFlushLayers(). * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::layoutIfNeeded): (WebKit::WebPage::updateRendering): (WebKit::WebPage::willDisplayPage): Deleted. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::flushLayers): Source/WebKitLegacy/mac: * WebView/WebView.mm: (-[WebView _viewWillDrawInternal]): (-[WebView _flushCompositingChanges]): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WebKitLegacy/win: * WebView.cpp: (WebView::updateBackingStore): (WebView::flushPendingGraphicsLayerChangesSoon): (WebView::flushPendingGraphicsLayerChanges): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WTF: Add trace points for the page RenderingUpdate. * wtf/SystemTracing.h: Tools: Add trace points for the page RenderingUpdate. * Tracing/SystemTracePoints.plist: LayoutTests: * TestExpectations: There is a slight difference between the actual DRT and the expected DRT due to animation timing change. But these two tests are not animating correctly if they are opened in Safari with web animation turned on. * accessibility/mac/selection-notification-focus-change-expected.txt: * accessibility/mac/selection-notification-focus-change.html: Remove the debug statements form notificationCallback() since the number of times this function is called back and the order of notifications are not defined. This test has been flaky and some trials were made to make it more reliable. With this change it became flaky again. * animations/animation-multiple-callbacks-timestamp.html: Fix variable names used by an error message. * animations/no-style-recalc-during-accelerated-animation-expected.txt: * animations/no-style-recalc-during-accelerated-animation.html: One extra styleReclc was incurred due to the document styleRecalcTimer. I think this timer is not needed anymore. I will look at removing it in a separate patch. * animations/resources/animation-test-helpers.js: (waitForAnimationToStart): The expectation that animation will start at the beginning of the next event loop is not true anymore. The animation will start at the time the requestAnimationFrame fires. * compositing/video/video-clip-change-src.html: This test loads a video data and pushes it to the encoder. Originally it used to wait 150 ms after receiving the second canplaythrough. I had to change this timing to 250 ms. * css3/filters/composited-during-animation.html: Ditto. setTimeout({...}, 0) versus requestAnimationFrame. * media/media-controls-accessibility.html: Updating the accessibility button happens asynchronously, see [WebAccessibilityObjectWrapper accessibilityPerformPressAction]. Due to changing the page update timing, this test became flaky. Originally it used to setTimeout({...}, 10) to ensure the stringValue of the mutate button was changed after it was pressed. The fix is to loop using rAF till the stringValue changes. * platform/mac-wk2/accessibility/mac/selection-notification-focus-change-expected.txt: Removed. The number of time notificationCallback() is called and the order of notifications are not defined. And this is why we have two expected files: one for WK1 and the other for WK2. Since the test is now simplified, we can get rid of this duplication. We will test the minimum reliable thing we can test. Canonical link: https://commits.webkit.org/211093@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244182 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-04-11 05:44:13 +00:00
}
Unreviewed, rolling out r242688, r242643, r242624. Caused multiple layout test failures and crashes on iOS and macOS. Reverted changeset: "requestAnimationFrame should execute before the next frame" https://bugs.webkit.org/show_bug.cgi?id=177484 https://trac.webkit.org/changeset/242624/webkit Source/WebCore: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * accessibility/mac/AXObjectCacheMac.mm: (WebCore::AXObjectCache::platformHandleFocusedUIElementChanged): * animation/DocumentAnimationScheduler.cpp: Added. (WebCore::DocumentAnimationScheduler::create): (WebCore::DocumentAnimationScheduler::DocumentAnimationScheduler): (WebCore::DocumentAnimationScheduler::detachFromDocument): (WebCore::DocumentAnimationScheduler::scheduleWebAnimationsResolution): (WebCore::DocumentAnimationScheduler::unscheduleWebAnimationsResolution): (WebCore::DocumentAnimationScheduler::scheduleScriptedAnimationResolution): (WebCore::DocumentAnimationScheduler::displayRefreshFired): (WebCore::DocumentAnimationScheduler::windowScreenDidChange): (WebCore::DocumentAnimationScheduler::createDisplayRefreshMonitor const): * animation/DocumentAnimationScheduler.h: Renamed from Source/WebCore/page/RenderingUpdateScheduler.h. (WebCore::DocumentAnimationScheduler::lastTimestamp): (WebCore::DocumentAnimationScheduler::isFiring const): * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::updateThrottlingState): (WebCore::DocumentTimeline::suspendAnimations): (WebCore::DocumentTimeline::resumeAnimations): (WebCore::DocumentTimeline::liveCurrentTime const): (WebCore::DocumentTimeline::currentTime): (WebCore::DocumentTimeline::cacheCurrentTime): (WebCore::DocumentTimeline::scheduleAnimationResolutionIfNeeded): (WebCore::DocumentTimeline::animationTimingDidChange): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::unscheduleAnimationResolution): (WebCore::DocumentTimeline::animationResolutionTimerFired): (WebCore::DocumentTimeline::updateAnimationsAndSendEvents): (WebCore::DocumentTimeline::scheduleNextTick): (WebCore::DocumentTimeline::updateListOfElementsWithRunningAcceleratedAnimationsForElement): (WebCore::DocumentTimeline::resolveAnimationsForElement): (WebCore::DocumentTimeline::internalUpdateAnimationsAndSendEvents): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::resolveStyle): (WebCore::Document::prepareForDestruction): (WebCore::Document::windowScreenDidChange): (WebCore::Document::updateIntersectionObservations): (WebCore::Document::scheduleForcedIntersectionObservationUpdate): (WebCore::Document::animationScheduler): (WebCore::Document::updateAnimationsAndSendEvents): Deleted. (WebCore::Document::serviceRequestAnimationFrameCallbacks): Deleted. * dom/Document.h: * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::serviceScriptedAnimations): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::animationTimerFired): (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): Deleted. * dom/ScriptedAnimationController.h: * page/FrameView.cpp: (WebCore::FrameView::viewportContentsChanged): * page/IntersectionObserver.cpp: (WebCore::IntersectionObserver::observe): * page/Page.cpp: (WebCore::Page::Page): (WebCore::Page::willDisplayPage): (WebCore::Page::addDocumentNeedingIntersectionObservationUpdate): (WebCore::Page::updateIntersectionObservations): (WebCore::Page::scheduleForcedIntersectionObservationUpdate): (WebCore::Page::layoutIfNeeded): Deleted. (WebCore::Page::renderingUpdate): Deleted. (WebCore::Page::renderingUpdateScheduler): Deleted. * page/Page.h: * page/PageOverlayController.cpp: (WebCore::PageOverlayController::didChangeViewExposedRect): (WebCore::PageOverlayController::notifyFlushRequired): * page/RenderingUpdateScheduler.cpp: Removed. * page/ios/ContentChangeObserver.h: * page/mac/ServicesOverlayController.mm: (WebCore::ServicesOverlayController::Highlight::notifyFlushRequired): * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::scheduleLayerFlushNow): Source/WebKit: * WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp: (WebKit::DrawingAreaCoordinatedGraphics::scheduleCompositingLayerFlush): (WebKit::DrawingAreaCoordinatedGraphics::updateBackingStoreState): (WebKit::DrawingAreaCoordinatedGraphics::display): * WebProcess/WebPage/CoordinatedGraphics/LayerTreeHost.cpp: (WebKit::LayerTreeHost::layerFlushTimerFired): * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::flushLayers): * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::layoutIfNeeded): (WebKit::WebPage::willDisplayPage): (WebKit::WebPage::renderingUpdate): Deleted. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::flushLayers): Source/WebKitLegacy/mac: * WebView/WebView.mm: (-[WebView _viewWillDrawInternal]): Source/WebKitLegacy/win: * WebView.cpp: (WebView::updateBackingStore): (WebView::flushPendingGraphicsLayerChangesSoon): (WebView::flushPendingGraphicsLayerChanges): Source/WTF: * wtf/SystemTracing.h: Tools: * Tracing/SystemTracePoints.plist: LayoutTests: * TestExpectations: * animations/animation-multiple-callbacks-timestamp.html: * animations/no-style-recalc-during-accelerated-animation-expected.txt: * animations/no-style-recalc-during-accelerated-animation.html: * platform/mac-wk2/TestExpectations: Canonical link: https://commits.webkit.org/209846@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242714 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-03-11 17:19:20 +00:00
requestAnimationFrame should execute before the next frame https://bugs.webkit.org/show_bug.cgi?id=177484 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2019-04-10 Reviewed by Simon Fraser. LayoutTests/imported/w3c: Add trace points for the page RenderingUpdate. * web-platform-tests/resize-observer/resources/resizeTestHelper.js: Change ResizeTestHelper.TIMEOUT to be 1 second instead of 100 ms which is too short for layout tests. Source/WebCore: This change fixes these issues with animation timing: 1. Calling the requestAnimationFrame callbacks would have happened when the DisplayLink fires. This may have happened even if the frame is missed and no display is committed. 2. Style changes and layout triggered by script could trigger painting at more than 60fps. CoreAnimation commits could happen at more than 60fps, although WindowServer will throttle those, and only some will be shown on the screen. This change introduces a new paint scheduling model where painting is driven by a "RenderingUpdateScheduler", which only triggers paints once per 16.7ms frame. Code that previously scheduled a compositing layer flush now schedules a "RenderingUpdate", and that update is driven by a DisplayRefreshMonitor callback. When the render happens, we service requestAnimationFrame callbacks, Web Animations, intersection observations and resize observations per the "Update the rendering" step of the HTML Event Loop specification: <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. In the future, more rendering steps will be added to this code. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * accessibility/mac/AXObjectCacheMac.mm: (WebCore::AXObjectCache::platformHandleFocusedUIElementChanged): Fix layout tests by adding null check. * animation/DocumentAnimationScheduler.cpp: Removed. * animation/DocumentAnimationScheduler.h: Removed. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::updateThrottlingState): (WebCore::DocumentTimeline::suspendAnimations): (WebCore::DocumentTimeline::resumeAnimations): (WebCore::DocumentTimeline::liveCurrentTime const): (WebCore::DocumentTimeline::currentTime): (WebCore::DocumentTimeline::cacheCurrentTime): (WebCore::DocumentTimeline::animationTimingDidChange): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::unscheduleAnimationResolution): (WebCore::DocumentTimeline::updateAnimationsAndSendEvents): (WebCore::DocumentTimeline::internalUpdateAnimationsAndSendEvents): (WebCore::DocumentTimeline::scheduleNextTick): (WebCore::DocumentTimeline::updateListOfElementsWithRunningAcceleratedAnimationsForElement): Simplify this function by handling the case of no-animations separately. (WebCore::DocumentTimeline::resolveAnimationsForElement): Simplify the loop and delete hasPendingAcceleratedAnimations because it is initialized to true and is not changed inside the loop. (WebCore::DocumentTimeline::scheduleAnimationResolutionIfNeeded): Deleted. (WebCore::DocumentTimeline::animationResolutionTimerFired): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::resolveStyle): There is no need to force update in resolveStyle(). notifyFlushRequired() will be called eventually which will scheduleRenderingUpdate(). (WebCore::Document::prepareForDestruction): (WebCore::Document::updateAnimationsAndSendEvents): (WebCore::Document::serviceRequestAnimationFrameCallbacks): (WebCore::Document::windowScreenDidChange): (WebCore::Document::scheduleRenderingUpdate): (WebCore::Document::updateIntersectionObservations): (WebCore::Document::addResizeObserver): (WebCore::Document::updateResizeObservations): (WebCore::Document::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Document::scheduleResizeObservations): Deleted. (WebCore::Document::animationScheduler): Deleted. No need to schedule web-animations, intersection observations and resize observations updates separately. All of them will be updated through the "Update the rendering" step, i.e. Page::updateRendering(). * dom/Document.h: (WebCore::Document::numberOfIntersectionObservers const): * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::animationTimerFired): (WebCore::ScriptedAnimationController::serviceScriptedAnimations): Deleted. (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): Deleted. * dom/ScriptedAnimationController.h: * page/FrameView.cpp: (WebCore::FrameView::didLayout): (WebCore::FrameView::viewportContentsChanged): * page/FrameViewLayoutContext.cpp: (WebCore::FrameViewLayoutContext::layoutTimerFired): * page/IntersectionObserver.cpp: (WebCore::IntersectionObserver::observe): * page/Page.cpp: (WebCore::Page::Page): (WebCore::Page::layoutIfNeeded): (WebCore::Page::updateRendering): (WebCore::Page::renderingUpdateScheduler): (WebCore::Page::willDisplayPage): Deleted. (WebCore::Page::addDocumentNeedingIntersectionObservationUpdate): Deleted. (WebCore::Page::updateIntersectionObservations): Deleted. (WebCore::Page::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Page::hasResizeObservers const): Deleted. (WebCore::Page::gatherDocumentsNeedingResizeObservationCheck): Deleted. (WebCore::Page::checkResizeObservations): Deleted. (WebCore::Page::scheduleResizeObservations): Deleted. (WebCore::Page::notifyResizeObservers): Deleted. * page/Page.h: (WebCore::Page::setNeedsCheckResizeObservations): Deleted. (WebCore::Page::needsCheckResizeObservations const): Deleted. The IntersectionObserver and the ResizeObserver do not need to schedule their own timers. The RenderingUpdateScheduler will schedule the "Update the rendering" step in which these obverses will be served. * page/PageOverlayController.cpp: (WebCore::PageOverlayController::didChangeViewExposedRect): (WebCore::PageOverlayController::notifyFlushRequired): Force committing the layers to be 60 fps at maximum. * page/RenderingUpdateScheduler.cpp: Added. (WebCore::RenderingUpdateScheduler::RenderingUpdateScheduler): (WebCore::RenderingUpdateScheduler::scheduleRenderingUpdate): (WebCore::RenderingUpdateScheduler::isScheduled const): (WebCore::RenderingUpdateScheduler::startTimer): (WebCore::RenderingUpdateScheduler::clearScheduled): (WebCore::RenderingUpdateScheduler::createDisplayRefreshMonitor const): (WebCore::RenderingUpdateScheduler::windowScreenDidChange): (WebCore::RenderingUpdateScheduler::displayRefreshFired): (WebCore::RenderingUpdateScheduler::scheduleCompositingLayerFlush): * page/RenderingUpdateScheduler.h: Added. (WebCore::RenderingUpdateScheduler::create): * page/ResizeObserver.cpp: (WebCore::ResizeObserver::observe): (WebCore::ResizeObserver::scheduleObservations): Deleted. * page/ResizeObserver.h: (WebCore::ResizeObserver::hasActiveObservations const): * page/ios/ContentChangeObserver.h: * page/mac/ServicesOverlayController.mm: (WebCore::ServicesOverlayController::Highlight::notifyFlushRequired): * page/scrolling/ScrollingStateTree.cpp: * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::scheduleLayerFlushNow): (WebCore::RenderLayerCompositor::layerTreeAsText): Source/WebKit: Replace the calls to Page::layoutIfNeeded() and willDisplayPage() by a single call to Page::updateRendering(). This new function implements "Update the rendering" step of the HTML Event Loop specification <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. * WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp: (WebKit::DrawingAreaCoordinatedGraphics::scheduleCompositingLayerFlush): (WebKit::DrawingAreaCoordinatedGraphics::updateBackingStoreState): (WebKit::DrawingAreaCoordinatedGraphics::display): * WebProcess/WebPage/CoordinatedGraphics/LayerTreeHost.cpp: (WebKit::LayerTreeHost::layerFlushTimerFired): * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::flushLayers): -- Call Page::updateRendering() to make sure that "Update the rendering" happens immediately before updating the page. -- Move the call to RemoteLayerBackingStoreCollection::willFlushLayers() to be exactly before flushing the layers. This fixes the assertion ASSERT(m_inLayerFlush) which was firing when running a layout test. RemoteLayerTreeDrawingArea::flushLayers() now can call itself through TestRunner::notifyDone(). flushLayers() was calling willFlushLayers() twice before calling didFlushLayers(). * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::layoutIfNeeded): (WebKit::WebPage::updateRendering): (WebKit::WebPage::willDisplayPage): Deleted. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::flushLayers): Source/WebKitLegacy/mac: * WebView/WebView.mm: (-[WebView _viewWillDrawInternal]): (-[WebView _flushCompositingChanges]): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WebKitLegacy/win: * WebView.cpp: (WebView::updateBackingStore): (WebView::flushPendingGraphicsLayerChangesSoon): (WebView::flushPendingGraphicsLayerChanges): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WTF: Add trace points for the page RenderingUpdate. * wtf/SystemTracing.h: Tools: Add trace points for the page RenderingUpdate. * Tracing/SystemTracePoints.plist: LayoutTests: * TestExpectations: There is a slight difference between the actual DRT and the expected DRT due to animation timing change. But these two tests are not animating correctly if they are opened in Safari with web animation turned on. * accessibility/mac/selection-notification-focus-change-expected.txt: * accessibility/mac/selection-notification-focus-change.html: Remove the debug statements form notificationCallback() since the number of times this function is called back and the order of notifications are not defined. This test has been flaky and some trials were made to make it more reliable. With this change it became flaky again. * animations/animation-multiple-callbacks-timestamp.html: Fix variable names used by an error message. * animations/no-style-recalc-during-accelerated-animation-expected.txt: * animations/no-style-recalc-during-accelerated-animation.html: One extra styleReclc was incurred due to the document styleRecalcTimer. I think this timer is not needed anymore. I will look at removing it in a separate patch. * animations/resources/animation-test-helpers.js: (waitForAnimationToStart): The expectation that animation will start at the beginning of the next event loop is not true anymore. The animation will start at the time the requestAnimationFrame fires. * compositing/video/video-clip-change-src.html: This test loads a video data and pushes it to the encoder. Originally it used to wait 150 ms after receiving the second canplaythrough. I had to change this timing to 250 ms. * css3/filters/composited-during-animation.html: Ditto. setTimeout({...}, 0) versus requestAnimationFrame. * media/media-controls-accessibility.html: Updating the accessibility button happens asynchronously, see [WebAccessibilityObjectWrapper accessibilityPerformPressAction]. Due to changing the page update timing, this test became flaky. Originally it used to setTimeout({...}, 10) to ensure the stringValue of the mutate button was changed after it was pressed. The fix is to loop using rAF till the stringValue changes. * platform/mac-wk2/accessibility/mac/selection-notification-focus-change-expected.txt: Removed. The number of time notificationCallback() is called and the order of notifications are not defined. And this is why we have two expected files: one for WK1 and the other for WK2. Since the test is now simplified, we can get rid of this duplication. We will test the minimum reliable thing we can test. Canonical link: https://commits.webkit.org/211093@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244182 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-04-11 05:44:13 +00:00
RenderingUpdateScheduler(Page&);
Throttling requestAnimationFrame should be controlled by RenderingUpdateScheduler https://bugs.webkit.org/show_bug.cgi?id=204713 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2020-05-04 Reviewed by Simon Fraser. Source/WebCore: rAF and Page rendering were managed by two different timers. Throttling rAF was implemented by changing its timer. After r242624, RenderingUpdate steps have been managed by RenderingUpdateScheduler. This means rAF is now serviced by the preferredFramesPerSecond which is 60 fps regardless it's throttled or not. Moreover the rAF throttling timer was mistakenly kept and it has been running under the old assumption which is: rAF is serviced by a timer only. This means rAF will be serviced by its timer and by the RenderingUpdate steps at the same time when it is supposed to throttle. This will make it fire more than 60 fps in cases which it is supposed to run less than 60 fps. The solution is to have two throttling types: 1) Page throttling (or full throttling): This slows down all the steps of RenderingUpdate for the main document and all the sub-documents. Page throttling reasons are: -- VisuallyIdle: Aggressive throttling. -- LowPowerMode: Half speed throttling. 2) Document throttling (or partial throttling): This only slows down the rAF of a certain document. Document throttling reasons are: -- OutsideViewport: Aggressive throttling. -- NonInteractedCrossOriginFrame: Half speed throttling. RenderingUpdate steps will still be managed by RenderingUpdateScheduler which can be throttled. The assumption is none of these steps will need to run faster than the Page preferredFramesPerSecond. If rAF wants to run slower than the Page because of a Document throttling reason, no rAF callbacks will be serviced before its preferredFrameInterval has elapsed. In this patch, "Half speed throttling" is only implemented for the Page and the Document throttling. The "Aggressive throttling" will be done in following patches. Page rendering was never throttled before. We need to make sure this is not going to affect PLT. Some tests need to be changed and new tests need to be written. All of the throttling tests checks the state of the code but none of them checks the real user's experience. * Headers.cmake: * WebCore.xcodeproj/project.pbxproj: * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::animationInterval const): (WebCore::DocumentTimeline::updateThrottlingState): Deleted. * animation/DocumentTimeline.h: There is no need to have DocumentTimeline throttling. It is already throttled when the page RenderingUpdate is throttled. * dom/Document.cpp: (WebCore::Document::requestAnimationFrame): (WebCore::Document::updateLastHandledUserGestureTimestamp): LowPowerMode throttling is now handled by the Page. So remove its handling from the Document. * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::ScriptedAnimationController): (WebCore::ScriptedAnimationController::page const): (WebCore::ScriptedAnimationController::interval const): (WebCore::ScriptedAnimationController::preferredScriptedAnimationInterval const): (WebCore::ScriptedAnimationController::throttlingReasons const): (WebCore::ScriptedAnimationController::isThrottledRelativeToPage const): (WebCore::ScriptedAnimationController::shouldRescheduleRequestAnimationFrame const): (WebCore::ScriptedAnimationController::registerCallback): (WebCore::ScriptedAnimationController::cancelCallback): (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::throttlingReasonToString): Deleted. (WebCore::throttlingReasonsToString): Deleted. (WebCore::ScriptedAnimationController::addThrottlingReason): Deleted. (WebCore::ScriptedAnimationController::removeThrottlingReason): Deleted. (WebCore::ScriptedAnimationController::isThrottled const): Deleted. (WebCore::ScriptedAnimationController::animationTimerFired): Deleted. * dom/ScriptedAnimationController.h: (WebCore::ScriptedAnimationController::addThrottlingReason): (WebCore::ScriptedAnimationController::removeThrottlingReason): Get rid of the rAF throttling timer. Service the rAF callback only when the period from the current time stamp till the last service time stamp is greater than the preferred rAF interval. * page/FrameView.cpp: (WebCore::FrameView::updateScriptedAnimationsAndTimersThrottlingState): ThrottlingReason is now defined outside ScriptedAnimationController. * page/Page.cpp: (WebCore::m_loadsFromNetwork): (WebCore::Page::setLowPowerModeEnabledOverrideForTesting): (WebCore::Page::preferredRenderingUpdateInterval const): Calculate the preferred RenderingUpdate interval from the throttling reasons. (WebCore::Page::setIsVisuallyIdleInternal): (WebCore::Page::handleLowModePowerChange): Call adjustRenderingUpdateFrequency() when isLowPowerModeEnabled or IsVisuallyIdle is toggled. (WebCore::Page::isLowPowerModeEnabled const): Deleted. (WebCore::updateScriptedAnimationsThrottlingReason): Deleted. * page/Page.h: (WebCore::Page::isLowPowerModeEnabled const): (WebCore::Page::throttlingReasons const): (WebCore::Page::canUpdateThrottlingReason const): * page/RenderingUpdateScheduler.cpp: (WebCore::RenderingUpdateScheduler::setPreferredFramesPerSecond): (WebCore::RenderingUpdateScheduler::scheduleAnimation): (WebCore::RenderingUpdateScheduler::adjustRenderingUpdateFrequency): Change the preferredFramesPerSecond of the DisplayRefreshMonitor if the throttling is not aggressive e.g. 10_s. Otherwise use the timer. (WebCore::RenderingUpdateScheduler::scheduleTimedRenderingUpdate): Call adjustFramesPerSecond() when DisplayRefreshMonitor is created. (WebCore::RenderingUpdateScheduler::startTimer): * page/RenderingUpdateScheduler.h: * platform/graphics/AnimationFrameRate.h: Added. (WebCore::preferredFrameInterval): (WebCore::preferredFramesPerSecond): (WebCore::operator<<): Push names of ThrottlingReasons to a TextStream. * platform/graphics/DisplayRefreshMonitor.h: (WebCore::DisplayRefreshMonitor::setPreferredFramesPerSecond): * platform/graphics/DisplayRefreshMonitorManager.cpp: (WebCore::DisplayRefreshMonitorManager::monitorForClient): Rename createMonitorForClient() to monitorForClient() since it may return a cached DisplayRefreshMonitor. (WebCore::DisplayRefreshMonitorManager::setPreferredFramesPerSecond): (WebCore::DisplayRefreshMonitorManager::scheduleAnimation): (WebCore::DisplayRefreshMonitorManager::windowScreenDidChange): No need to call registerClient(). This function was just ensuring the DisplayRefreshMonitor is created. scheduleAnimation() does the same thing. (WebCore::DisplayRefreshMonitorManager::createMonitorForClient): Deleted. (WebCore::DisplayRefreshMonitorManager::registerClient): Deleted. * platform/graphics/DisplayRefreshMonitorManager.h: (WebCore::DisplayRefreshMonitorManager::DisplayRefreshMonitorManager): Deleted. * platform/graphics/GraphicsLayerUpdater.cpp: (WebCore::GraphicsLayerUpdater::GraphicsLayerUpdater): * platform/graphics/ios/DisplayRefreshMonitorIOS.mm: (-[WebDisplayLinkHandler setPreferredFramesPerSecond:]): Set the preferredFramesPerSecond of the CADisplayLink. * testing/Internals.cpp: (WebCore::Internals::requestAnimationFrameThrottlingReasons const): (WebCore::Internals::isRequestAnimationFrameThrottled const): Deleted. * testing/Internals.h: * testing/Internals.idl: Replace isRequestAnimationFrameThrottled() which returns a boolean by requestAnimationFrameThrottlingReasons() which returns a string. The string represents the throttling reasons. Source/WebKit: Create an IPC message on the DrawingArea to send a message from the WebProcess to the UIProcess to setPreferredFramesPerSecond of the DisplayRefreshMonitor. * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.h: * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.messages.in: * UIProcess/RemoteLayerTree/RemoteLayerTreeDrawingAreaProxy.mm: (-[WKOneShotDisplayLinkHandler setPreferredFramesPerSecond:]): (WebKit::RemoteLayerTreeDrawingAreaProxy::setPreferredFramesPerSecond): Set the preferredFramesPerSecond of the CADisplayLink. * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDisplayRefreshMonitor.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDisplayRefreshMonitor.mm: (WebKit::RemoteLayerTreeDisplayRefreshMonitor::setPreferredFramesPerSecond): Forward the call to RemoteLayerTreeDrawingArea. * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::setPreferredFramesPerSecond): Send the IPC message from the WebProcess to the UIProcess. LayoutTests: * fast/animation/request-animation-frame-throttle-inside-overflow-scroll-expected.txt: * fast/animation/request-animation-frame-throttle-inside-overflow-scroll.html: * fast/animation/request-animation-frame-throttle-subframe-display-none-expected.txt: * fast/animation/request-animation-frame-throttle-subframe-display-none.html: * fast/animation/request-animation-frame-throttle-subframe-expected.txt: * fast/animation/request-animation-frame-throttle-subframe-zero-size-expected.txt: * fast/animation/request-animation-frame-throttle-subframe-zero-size.html: * fast/animation/request-animation-frame-throttle-subframe.html: * fast/animation/request-animation-frame-throttling-detached-iframe-expected.txt: * fast/animation/request-animation-frame-throttling-detached-iframe.html: Replace the call isRequestAnimationFrameThrottled() by requestAnimationFrameThrottlingReasons(). * fast/animation/request-animation-frame-throttling-lowPowerMode-expected.txt: * fast/animation/request-animation-frame-throttling-lowPowerMode.html: Ensure the actual rAF interval is > 30ms for lowPowerMode. * http/tests/frame-throttling/raf-throttle-in-cross-origin-subframe-expected.txt: * http/tests/frame-throttling/raf-throttle-in-cross-origin-subframe.html: * http/tests/frame-throttling/resources/requestAnimationFrame-frame.html: Replace the call isRequestAnimationFrameThrottled() by requestAnimationFrameThrottlingReasons(). Canonical link: https://commits.webkit.org/224287@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@261113 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-05-04 21:24:49 +00:00
void adjustRenderingUpdateFrequency();
requestAnimationFrame should execute before the next frame https://bugs.webkit.org/show_bug.cgi?id=177484 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2019-04-10 Reviewed by Simon Fraser. LayoutTests/imported/w3c: Add trace points for the page RenderingUpdate. * web-platform-tests/resize-observer/resources/resizeTestHelper.js: Change ResizeTestHelper.TIMEOUT to be 1 second instead of 100 ms which is too short for layout tests. Source/WebCore: This change fixes these issues with animation timing: 1. Calling the requestAnimationFrame callbacks would have happened when the DisplayLink fires. This may have happened even if the frame is missed and no display is committed. 2. Style changes and layout triggered by script could trigger painting at more than 60fps. CoreAnimation commits could happen at more than 60fps, although WindowServer will throttle those, and only some will be shown on the screen. This change introduces a new paint scheduling model where painting is driven by a "RenderingUpdateScheduler", which only triggers paints once per 16.7ms frame. Code that previously scheduled a compositing layer flush now schedules a "RenderingUpdate", and that update is driven by a DisplayRefreshMonitor callback. When the render happens, we service requestAnimationFrame callbacks, Web Animations, intersection observations and resize observations per the "Update the rendering" step of the HTML Event Loop specification: <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. In the future, more rendering steps will be added to this code. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * accessibility/mac/AXObjectCacheMac.mm: (WebCore::AXObjectCache::platformHandleFocusedUIElementChanged): Fix layout tests by adding null check. * animation/DocumentAnimationScheduler.cpp: Removed. * animation/DocumentAnimationScheduler.h: Removed. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::updateThrottlingState): (WebCore::DocumentTimeline::suspendAnimations): (WebCore::DocumentTimeline::resumeAnimations): (WebCore::DocumentTimeline::liveCurrentTime const): (WebCore::DocumentTimeline::currentTime): (WebCore::DocumentTimeline::cacheCurrentTime): (WebCore::DocumentTimeline::animationTimingDidChange): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::unscheduleAnimationResolution): (WebCore::DocumentTimeline::updateAnimationsAndSendEvents): (WebCore::DocumentTimeline::internalUpdateAnimationsAndSendEvents): (WebCore::DocumentTimeline::scheduleNextTick): (WebCore::DocumentTimeline::updateListOfElementsWithRunningAcceleratedAnimationsForElement): Simplify this function by handling the case of no-animations separately. (WebCore::DocumentTimeline::resolveAnimationsForElement): Simplify the loop and delete hasPendingAcceleratedAnimations because it is initialized to true and is not changed inside the loop. (WebCore::DocumentTimeline::scheduleAnimationResolutionIfNeeded): Deleted. (WebCore::DocumentTimeline::animationResolutionTimerFired): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::resolveStyle): There is no need to force update in resolveStyle(). notifyFlushRequired() will be called eventually which will scheduleRenderingUpdate(). (WebCore::Document::prepareForDestruction): (WebCore::Document::updateAnimationsAndSendEvents): (WebCore::Document::serviceRequestAnimationFrameCallbacks): (WebCore::Document::windowScreenDidChange): (WebCore::Document::scheduleRenderingUpdate): (WebCore::Document::updateIntersectionObservations): (WebCore::Document::addResizeObserver): (WebCore::Document::updateResizeObservations): (WebCore::Document::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Document::scheduleResizeObservations): Deleted. (WebCore::Document::animationScheduler): Deleted. No need to schedule web-animations, intersection observations and resize observations updates separately. All of them will be updated through the "Update the rendering" step, i.e. Page::updateRendering(). * dom/Document.h: (WebCore::Document::numberOfIntersectionObservers const): * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::animationTimerFired): (WebCore::ScriptedAnimationController::serviceScriptedAnimations): Deleted. (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): Deleted. * dom/ScriptedAnimationController.h: * page/FrameView.cpp: (WebCore::FrameView::didLayout): (WebCore::FrameView::viewportContentsChanged): * page/FrameViewLayoutContext.cpp: (WebCore::FrameViewLayoutContext::layoutTimerFired): * page/IntersectionObserver.cpp: (WebCore::IntersectionObserver::observe): * page/Page.cpp: (WebCore::Page::Page): (WebCore::Page::layoutIfNeeded): (WebCore::Page::updateRendering): (WebCore::Page::renderingUpdateScheduler): (WebCore::Page::willDisplayPage): Deleted. (WebCore::Page::addDocumentNeedingIntersectionObservationUpdate): Deleted. (WebCore::Page::updateIntersectionObservations): Deleted. (WebCore::Page::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Page::hasResizeObservers const): Deleted. (WebCore::Page::gatherDocumentsNeedingResizeObservationCheck): Deleted. (WebCore::Page::checkResizeObservations): Deleted. (WebCore::Page::scheduleResizeObservations): Deleted. (WebCore::Page::notifyResizeObservers): Deleted. * page/Page.h: (WebCore::Page::setNeedsCheckResizeObservations): Deleted. (WebCore::Page::needsCheckResizeObservations const): Deleted. The IntersectionObserver and the ResizeObserver do not need to schedule their own timers. The RenderingUpdateScheduler will schedule the "Update the rendering" step in which these obverses will be served. * page/PageOverlayController.cpp: (WebCore::PageOverlayController::didChangeViewExposedRect): (WebCore::PageOverlayController::notifyFlushRequired): Force committing the layers to be 60 fps at maximum. * page/RenderingUpdateScheduler.cpp: Added. (WebCore::RenderingUpdateScheduler::RenderingUpdateScheduler): (WebCore::RenderingUpdateScheduler::scheduleRenderingUpdate): (WebCore::RenderingUpdateScheduler::isScheduled const): (WebCore::RenderingUpdateScheduler::startTimer): (WebCore::RenderingUpdateScheduler::clearScheduled): (WebCore::RenderingUpdateScheduler::createDisplayRefreshMonitor const): (WebCore::RenderingUpdateScheduler::windowScreenDidChange): (WebCore::RenderingUpdateScheduler::displayRefreshFired): (WebCore::RenderingUpdateScheduler::scheduleCompositingLayerFlush): * page/RenderingUpdateScheduler.h: Added. (WebCore::RenderingUpdateScheduler::create): * page/ResizeObserver.cpp: (WebCore::ResizeObserver::observe): (WebCore::ResizeObserver::scheduleObservations): Deleted. * page/ResizeObserver.h: (WebCore::ResizeObserver::hasActiveObservations const): * page/ios/ContentChangeObserver.h: * page/mac/ServicesOverlayController.mm: (WebCore::ServicesOverlayController::Highlight::notifyFlushRequired): * page/scrolling/ScrollingStateTree.cpp: * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::scheduleLayerFlushNow): (WebCore::RenderLayerCompositor::layerTreeAsText): Source/WebKit: Replace the calls to Page::layoutIfNeeded() and willDisplayPage() by a single call to Page::updateRendering(). This new function implements "Update the rendering" step of the HTML Event Loop specification <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. * WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp: (WebKit::DrawingAreaCoordinatedGraphics::scheduleCompositingLayerFlush): (WebKit::DrawingAreaCoordinatedGraphics::updateBackingStoreState): (WebKit::DrawingAreaCoordinatedGraphics::display): * WebProcess/WebPage/CoordinatedGraphics/LayerTreeHost.cpp: (WebKit::LayerTreeHost::layerFlushTimerFired): * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::flushLayers): -- Call Page::updateRendering() to make sure that "Update the rendering" happens immediately before updating the page. -- Move the call to RemoteLayerBackingStoreCollection::willFlushLayers() to be exactly before flushing the layers. This fixes the assertion ASSERT(m_inLayerFlush) which was firing when running a layout test. RemoteLayerTreeDrawingArea::flushLayers() now can call itself through TestRunner::notifyDone(). flushLayers() was calling willFlushLayers() twice before calling didFlushLayers(). * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::layoutIfNeeded): (WebKit::WebPage::updateRendering): (WebKit::WebPage::willDisplayPage): Deleted. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::flushLayers): Source/WebKitLegacy/mac: * WebView/WebView.mm: (-[WebView _viewWillDrawInternal]): (-[WebView _flushCompositingChanges]): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WebKitLegacy/win: * WebView.cpp: (WebView::updateBackingStore): (WebView::flushPendingGraphicsLayerChangesSoon): (WebView::flushPendingGraphicsLayerChanges): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WTF: Add trace points for the page RenderingUpdate. * wtf/SystemTracing.h: Tools: Add trace points for the page RenderingUpdate. * Tracing/SystemTracePoints.plist: LayoutTests: * TestExpectations: There is a slight difference between the actual DRT and the expected DRT due to animation timing change. But these two tests are not animating correctly if they are opened in Safari with web animation turned on. * accessibility/mac/selection-notification-focus-change-expected.txt: * accessibility/mac/selection-notification-focus-change.html: Remove the debug statements form notificationCallback() since the number of times this function is called back and the order of notifications are not defined. This test has been flaky and some trials were made to make it more reliable. With this change it became flaky again. * animations/animation-multiple-callbacks-timestamp.html: Fix variable names used by an error message. * animations/no-style-recalc-during-accelerated-animation-expected.txt: * animations/no-style-recalc-during-accelerated-animation.html: One extra styleReclc was incurred due to the document styleRecalcTimer. I think this timer is not needed anymore. I will look at removing it in a separate patch. * animations/resources/animation-test-helpers.js: (waitForAnimationToStart): The expectation that animation will start at the beginning of the next event loop is not true anymore. The animation will start at the time the requestAnimationFrame fires. * compositing/video/video-clip-change-src.html: This test loads a video data and pushes it to the encoder. Originally it used to wait 150 ms after receiving the second canplaythrough. I had to change this timing to 250 ms. * css3/filters/composited-during-animation.html: Ditto. setTimeout({...}, 0) versus requestAnimationFrame. * media/media-controls-accessibility.html: Updating the accessibility button happens asynchronously, see [WebAccessibilityObjectWrapper accessibilityPerformPressAction]. Due to changing the page update timing, this test became flaky. Originally it used to setTimeout({...}, 10) to ensure the stringValue of the mutate button was changed after it was pressed. The fix is to loop using rAF till the stringValue changes. * platform/mac-wk2/accessibility/mac/selection-notification-focus-change-expected.txt: Removed. The number of time notificationCallback() is called and the order of notifications are not defined. And this is why we have two expected files: one for WK1 and the other for WK2. Since the test is now simplified, we can get rid of this duplication. We will test the minimum reliable thing we can test. Canonical link: https://commits.webkit.org/211093@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244182 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-04-11 05:44:13 +00:00
void scheduleRenderingUpdate();
[Web Animations] Make WPT test at timing-model/timelines/document-timelines.html pass reliably https://bugs.webkit.org/show_bug.cgi?id=186507 <rdar://problem/41000257> Reviewed by Dean Jackson. LayoutTests/imported/w3c: Record WPT test progressions. * web-platform-tests/web-animations/timing-model/timelines/document-timelines-expected.txt: Source/WebCore: The Web Animations spec, along with the HTML5 event loop spec, specify some assumptions on the time reported by document.timeline.currentTime: - it should only increase once per frame - it should have the same value as the timestamp passed to requestAnimationFrame() callbacks The WPT test at web-platform-tests/web-animations/timing-model/timelines/document-timelines.html relies on these assumptions to be true so that we check that the start time of a new animation is not the same as the timeline time when it was created, since it will be in the "play-pending" state for a frame. In order to support this, we add two new methods on DocumentAnimationScheduler. First, when a scheduled display update fires, we record the timestamp and expose it via lastTimestamp() such that DocumentTimeline and ScriptedAnimationController can use the same value when updating animations. Then, to know whether code is run as a result of a display update, we expose isFiring(). Now, within DocumentTimeline::currentTime(), we can cache the current time this way: - if we're in the middle of a display update, use the value returned by lastTimestamp(). - otherwise, compute what would have been the ideal number of frames (at 60fps or less if throttled) and add those to the lastTimestamp() value. Then, we remove this cached current time when both currently-running JavaScript has completed and all animation update code has completed by waiting on the invalidation task to run. * animation/DocumentAnimationScheduler.cpp: (WebCore::DocumentAnimationScheduler::displayRefreshFired): * animation/DocumentAnimationScheduler.h: (WebCore::DocumentAnimationScheduler::lastTimestamp): (WebCore::DocumentAnimationScheduler::isFiring const): * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::currentTime): (WebCore::DocumentTimeline::performInvalidationTask): (WebCore::DocumentTimeline::maybeClearCachedCurrentTime): * animation/DocumentTimeline.h: * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::serviceScriptedAnimations): (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): LayoutTests: This test now passes reliably. * TestExpectations: Canonical link: https://commits.webkit.org/202479@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233394 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-06-30 13:43:26 +00:00
void triggerRenderingUpdateForTesting();
2019-12-19 09:44:47 +00:00
void windowScreenDidChange(PlatformDisplayID);
[Web Animations] Ensure animations are updated prior to requestAnimationFrame callbacks https://bugs.webkit.org/show_bug.cgi?id=186997 <rdar://problem/41419414> Reviewed by Dean Jackson. LayoutTests/imported/mozilla: Mark progressions in the Mozilla CSS Animations tests. * css-animations/test_animation-pausing-expected.txt: Source/WebCore: Some sub-tests of imported/mozilla/css-animations/test_animation-pausing.html clearly expect that animations would be resolved prior to firing a requestAnimationFrame() callback, as the HTML5 event loop mandates. But until now, both DocumentTimeline and ScriptedAnimationController would make calls to DisplayRefreshMonitorManager::scheduleAnimation() that were not coordinated and so the order in which the DocumentTimeline and ScriptedAnimationController callbacks were performed was not guaranteed. In this patch we add a new DocumentAnimationScheduler class which is created by a Document to manage this specific situation. Now DocumentTimeline and ScriptedAnimationController use this supporting object instead of being their own DisplayRefreshMonitorClient and call scheduleWebAnimationsResolution() and scheduleScriptedAnimationResolution() respectively to indicate the need to schedule an animation through the DisplayRefreshMonitorManager to serve the specific needs of either, or both, classes. Then DocumentAnimationScheduler ensures that Web Animations resolution happens prior to requestAnimationFrame callbacks when both are scheduled. In the future we should be able to move more code from DocumentTimeline and ScriptedAnimationController over to DocumentAnimationScheduler, such as support for throttling and using a timer-based fallback, but this patch provides the minimal functionality required to provide a sounder foundation. * Modules/webvr/VRDisplay.cpp: (WebCore::VRDisplay::requestAnimationFrame): * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * animation/DocumentAnimationScheduler.cpp: Added. (WebCore::DocumentAnimationScheduler::create): (WebCore::DocumentAnimationScheduler::DocumentAnimationScheduler): (WebCore::DocumentAnimationScheduler::detachFromDocument): (WebCore::DocumentAnimationScheduler::scheduleWebAnimationsResolution): (WebCore::DocumentAnimationScheduler::scheduleScriptedAnimationResolution): (WebCore::DocumentAnimationScheduler::displayRefreshFired): (WebCore::DocumentAnimationScheduler::windowScreenDidChange): (WebCore::DocumentAnimationScheduler::createDisplayRefreshMonitor const): * animation/DocumentAnimationScheduler.h: Copied from Source/WebCore/animation/CSSAnimation.h. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::create): (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::windowScreenDidChange): Deleted. (WebCore::DocumentTimeline::createDisplayRefreshMonitor const): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::prepareForDestruction): (WebCore::Document::windowScreenDidChange): (WebCore::Document::requestAnimationFrame): (WebCore::Document::animationScheduler): (WebCore::Document::timeline): * dom/Document.h: * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::ScriptedAnimationController): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): (WebCore::ScriptedAnimationController::windowScreenDidChange): Deleted. (WebCore::ScriptedAnimationController::displayRefreshFired): Deleted. (WebCore::ScriptedAnimationController::createDisplayRefreshMonitor const): Deleted. * dom/ScriptedAnimationController.h: (WebCore::ScriptedAnimationController::create): Canonical link: https://commits.webkit.org/202231@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233140 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-06-25 09:54:34 +00:00
private:
Allow non-60fps display updates to be driven by DisplayRefreshMonitor https://bugs.webkit.org/show_bug.cgi?id=223912 Reviewed by Sam Weinig. Source/WebCore: Previously, RenderingUpdateScheduler::scheduleAnimation() would return false for any preferredFramesPerSecond which is not 60fps, causing RenderingUpdateScheduler to fall back to its timer mechanism. This meant that throttled (e.g. by low power) pages and display updates on non-60fps display would all use timers. This is undesirable because we want alignment with display refresh, and to avoid timer drift between multiple throttled documents. The fix has two parts. First, we need to fix RenderingUpdateScheduler and ScriptedAnimationController to compute their frame rates in terms of FramesPerSecond, rather than Seconds, because using the latter requires conversion to Seconds and back via m_page.preferredRenderingUpdateInterval() which was awkward. So have Page expose preferredRenderingUpdateFramesPerSecond(). Also add preferredFramesPerSecond(), and have both it and preferredFrameInterval() take the "near 60fps" flag as an argument, so doing the common math in AnimationFrameRate. The second part of the fix is to move "preferredFramesPerSecond" from RenderingUpdateScheduler to DisplayRefreshMonitorClient, since clients should be able to request different frame rates. Then we pass the DisplayUpdate to DisplayRefreshMonitorClient::fireDisplayRefreshIfNeeded(), and finally use it to do the math of whether to skip an update for this client. Tested by API tests in AnimationFrameRate.cpp, and by fast/animation/request-animation-frame-throttling-lowPowerMode.html * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::interval const): This function (used for testing) is just a synonym for preferredScriptedAnimationInterval(), but left here because it's exported and maybe the compiler can inline preferredScriptedAnimationInterval(). (WebCore::ScriptedAnimationController::preferredScriptedAnimationInterval const): Just call preferredFrameInterval() with throttlingReasons(), which is the union of the reasons for the page and for this ScriptedAnimationController. (WebCore::ScriptedAnimationController::throttlingReasons const): No reason not to return m_throttlingReasons if we don't have a page. Should never happen. (WebCore::ScriptedAnimationController::shouldRescheduleRequestAnimationFrame const): Logging. (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): Logging. * page/Page.cpp: (WebCore::Page::windowScreenDidChange): The display nominal FPS may have changed so recompute the update frequency. (WebCore::Page::preferredRenderingUpdateFramesPerSecond const): Return the preferred update in FramesPerSecond. Will return null if throttling results in a < 1fps update. (WebCore::Page::preferredRenderingUpdateInterval const): Push the "near 60fps" logic into the helper function. (WebCore::Page::setIsVisuallyIdleInternal): Clearer to use OptionSet<>::set(). (WebCore::Page::handleLowModePowerChange): Ditto. * page/Page.h: (WebCore::Page::displayNominalFramesPerSecond const): (WebCore::Page::throttlingReasons const): * page/RenderingUpdateScheduler.cpp: (WebCore::RenderingUpdateScheduler::scheduleAnimation): Remove code that fell back to a timer for any non-60fps rate. (WebCore::RenderingUpdateScheduler::adjustRenderingUpdateFrequency): Compute if we have to use a timer. (WebCore::RenderingUpdateScheduler::scheduleRenderingUpdate): (WebCore::RenderingUpdateScheduler::setPreferredFramesPerSecond): Deleted. * page/RenderingUpdateScheduler.h: * platform/graphics/AnimationFrameRate.cpp: Simplify some code with halfSpeedThrottlingReasons. (WebCore::preferredFramesPerSecond): Similar logic to preferredFrameInterval, but for FramesPerSecond values. (WebCore::preferredFrameInterval): * platform/graphics/AnimationFrameRate.h: * platform/graphics/DisplayRefreshMonitor.cpp: (WebCore::DisplayRefreshMonitor::displayDidRefresh): * platform/graphics/DisplayRefreshMonitorClient.cpp: (WebCore::DisplayRefreshMonitorClient::setPreferredFramesPerSecond): (WebCore::DisplayRefreshMonitorClient::fireDisplayRefreshIfNeeded): * platform/graphics/DisplayRefreshMonitorClient.h: (WebCore::DisplayRefreshMonitorClient::preferredFramesPerSecond const): * platform/graphics/DisplayUpdate.cpp: (WebCore::DisplayUpdate::relevantForUpdateFrequency const): Compute whether this update is relevant for a client who wants updates at 'preferredFramesPerSecond'. * platform/graphics/DisplayUpdate.h: Source/WebKit: Improve the logging. * UIProcess/mac/DisplayLink.cpp: (WebKit::DisplayLink::DisplayLink): (WebKit::DisplayLink::addObserver): Tools: New API tests for preferredFramesPerSecond() and DisplayUpdate::relevantForUpdateFrequency(), and duplicate existing tests for the "use display nominal FPS" vs "use near-60 FPS" settings. * TestWebKitAPI/Tests/WebCore/AnimationFrameRate.cpp: (TestWebKitAPI::TEST): git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275215 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235909@main
2021-03-30 18:14:26 +00:00
bool scheduleAnimation();
Add DisplayRefreshMonitorFactory. https://bugs.webkit.org/show_bug.cgi?id=223648 Reviewed by Chris Dumez. Future work will require that it's possible to create a DisplayRefreshMonitor without having a DisplayRefreshMonitorClient. It was also weird that the way to create a DisplayRefreshMonitor was via the DisplayRefreshMonitorClient, so this change fixes both by adding DisplayRefreshMonitorFactory. In WK2, the drawing areas are DisplayRefreshMonitorFactories. If there is no factory, we fall back to the default implementations. Source/WebCore: * Headers.cmake: * WebCore.xcodeproj/project.pbxproj: * loader/EmptyClients.cpp: (WebCore::EmptyDisplayRefreshMonitorFactory::sharedEmptyDisplayRefreshMonitorFactory): (WebCore::EmptyChromeClient::displayRefreshMonitorFactory const): (WebCore::EmptyChromeClient::createDisplayRefreshMonitor const): Deleted. * loader/EmptyClients.h: * page/ChromeClient.h: (WebCore::ChromeClient::displayRefreshMonitorFactory const): (WebCore::ChromeClient::createDisplayRefreshMonitor const): Deleted. * page/RenderingUpdateScheduler.cpp: (WebCore::RenderingUpdateScheduler::displayRefreshMonitorFactory const): (WebCore::RenderingUpdateScheduler::createDisplayRefreshMonitor const): Deleted. * page/RenderingUpdateScheduler.h: * platform/graphics/DisplayRefreshMonitor.cpp: (WebCore::DisplayRefreshMonitor::create): * platform/graphics/DisplayRefreshMonitor.h: * platform/graphics/DisplayRefreshMonitorClient.cpp: (WebCore::DisplayRefreshMonitorClient::DisplayRefreshMonitorClient): Deleted. * platform/graphics/DisplayRefreshMonitorClient.h: * platform/graphics/DisplayRefreshMonitorFactory.h: Copied from Source/WebCore/platform/graphics/DisplayRefreshMonitorClient.cpp. * platform/graphics/DisplayRefreshMonitorManager.cpp: (WebCore::DisplayRefreshMonitorManager::monitorForClient): * platform/graphics/GraphicsLayerUpdater.cpp: (WebCore::GraphicsLayerUpdater::GraphicsLayerUpdater): (WebCore::GraphicsLayerUpdater::displayRefreshMonitorFactory const): (WebCore::GraphicsLayerUpdater::createDisplayRefreshMonitor const): Deleted. * platform/graphics/GraphicsLayerUpdater.h: * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::displayRefreshMonitorFactory): (WebCore::RenderLayerCompositor::createDisplayRefreshMonitor const): Deleted. * rendering/RenderLayerCompositor.h: Source/WebKit: Remove DrawingAreaMac.cpp since its code was entirely related to creating DisplayRefreshMonitorMac objects. * SourcesCocoa.txt: * WebKit.xcodeproj/project.pbxproj: * WebProcess/WebCoreSupport/WebChromeClient.cpp: (WebKit::WebChromeClient::displayRefreshMonitorFactory const): (WebKit::WebChromeClient::createDisplayRefreshMonitor const): Deleted. * WebProcess/WebCoreSupport/WebChromeClient.h: * WebProcess/WebPage/DrawingArea.cpp: (WebKit::DrawingArea::createDisplayRefreshMonitor): Deleted. * WebProcess/WebPage/DrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::createDisplayRefreshMonitor): * WebProcess/WebPage/mac/DisplayRefreshMonitorMac.cpp: Renamed from Source/WebKit/WebProcess/WebPage/mac/DrawingAreaMac.cpp. (WebKit::DisplayRefreshMonitorMac::DisplayRefreshMonitorMac): (WebKit::DisplayRefreshMonitorMac::~DisplayRefreshMonitorMac): (WebKit::DisplayRefreshMonitorMac::requestRefreshCallback): (WebKit::DisplayRefreshMonitorMac::displayLinkFired): * WebProcess/WebPage/mac/DisplayRefreshMonitorMac.h: Copied from Source/WebCore/platform/graphics/GraphicsLayerUpdater.h. (WebKit::DisplayRefreshMonitorMac::create): * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::createDisplayRefreshMonitor): Canonical link: https://commits.webkit.org/235687@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274929 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 02:35:26 +00:00
requestAnimationFrame should execute before the next frame https://bugs.webkit.org/show_bug.cgi?id=177484 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2019-04-10 Reviewed by Simon Fraser. LayoutTests/imported/w3c: Add trace points for the page RenderingUpdate. * web-platform-tests/resize-observer/resources/resizeTestHelper.js: Change ResizeTestHelper.TIMEOUT to be 1 second instead of 100 ms which is too short for layout tests. Source/WebCore: This change fixes these issues with animation timing: 1. Calling the requestAnimationFrame callbacks would have happened when the DisplayLink fires. This may have happened even if the frame is missed and no display is committed. 2. Style changes and layout triggered by script could trigger painting at more than 60fps. CoreAnimation commits could happen at more than 60fps, although WindowServer will throttle those, and only some will be shown on the screen. This change introduces a new paint scheduling model where painting is driven by a "RenderingUpdateScheduler", which only triggers paints once per 16.7ms frame. Code that previously scheduled a compositing layer flush now schedules a "RenderingUpdate", and that update is driven by a DisplayRefreshMonitor callback. When the render happens, we service requestAnimationFrame callbacks, Web Animations, intersection observations and resize observations per the "Update the rendering" step of the HTML Event Loop specification: <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. In the future, more rendering steps will be added to this code. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * accessibility/mac/AXObjectCacheMac.mm: (WebCore::AXObjectCache::platformHandleFocusedUIElementChanged): Fix layout tests by adding null check. * animation/DocumentAnimationScheduler.cpp: Removed. * animation/DocumentAnimationScheduler.h: Removed. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::updateThrottlingState): (WebCore::DocumentTimeline::suspendAnimations): (WebCore::DocumentTimeline::resumeAnimations): (WebCore::DocumentTimeline::liveCurrentTime const): (WebCore::DocumentTimeline::currentTime): (WebCore::DocumentTimeline::cacheCurrentTime): (WebCore::DocumentTimeline::animationTimingDidChange): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::unscheduleAnimationResolution): (WebCore::DocumentTimeline::updateAnimationsAndSendEvents): (WebCore::DocumentTimeline::internalUpdateAnimationsAndSendEvents): (WebCore::DocumentTimeline::scheduleNextTick): (WebCore::DocumentTimeline::updateListOfElementsWithRunningAcceleratedAnimationsForElement): Simplify this function by handling the case of no-animations separately. (WebCore::DocumentTimeline::resolveAnimationsForElement): Simplify the loop and delete hasPendingAcceleratedAnimations because it is initialized to true and is not changed inside the loop. (WebCore::DocumentTimeline::scheduleAnimationResolutionIfNeeded): Deleted. (WebCore::DocumentTimeline::animationResolutionTimerFired): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::resolveStyle): There is no need to force update in resolveStyle(). notifyFlushRequired() will be called eventually which will scheduleRenderingUpdate(). (WebCore::Document::prepareForDestruction): (WebCore::Document::updateAnimationsAndSendEvents): (WebCore::Document::serviceRequestAnimationFrameCallbacks): (WebCore::Document::windowScreenDidChange): (WebCore::Document::scheduleRenderingUpdate): (WebCore::Document::updateIntersectionObservations): (WebCore::Document::addResizeObserver): (WebCore::Document::updateResizeObservations): (WebCore::Document::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Document::scheduleResizeObservations): Deleted. (WebCore::Document::animationScheduler): Deleted. No need to schedule web-animations, intersection observations and resize observations updates separately. All of them will be updated through the "Update the rendering" step, i.e. Page::updateRendering(). * dom/Document.h: (WebCore::Document::numberOfIntersectionObservers const): * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::animationTimerFired): (WebCore::ScriptedAnimationController::serviceScriptedAnimations): Deleted. (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): Deleted. * dom/ScriptedAnimationController.h: * page/FrameView.cpp: (WebCore::FrameView::didLayout): (WebCore::FrameView::viewportContentsChanged): * page/FrameViewLayoutContext.cpp: (WebCore::FrameViewLayoutContext::layoutTimerFired): * page/IntersectionObserver.cpp: (WebCore::IntersectionObserver::observe): * page/Page.cpp: (WebCore::Page::Page): (WebCore::Page::layoutIfNeeded): (WebCore::Page::updateRendering): (WebCore::Page::renderingUpdateScheduler): (WebCore::Page::willDisplayPage): Deleted. (WebCore::Page::addDocumentNeedingIntersectionObservationUpdate): Deleted. (WebCore::Page::updateIntersectionObservations): Deleted. (WebCore::Page::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Page::hasResizeObservers const): Deleted. (WebCore::Page::gatherDocumentsNeedingResizeObservationCheck): Deleted. (WebCore::Page::checkResizeObservations): Deleted. (WebCore::Page::scheduleResizeObservations): Deleted. (WebCore::Page::notifyResizeObservers): Deleted. * page/Page.h: (WebCore::Page::setNeedsCheckResizeObservations): Deleted. (WebCore::Page::needsCheckResizeObservations const): Deleted. The IntersectionObserver and the ResizeObserver do not need to schedule their own timers. The RenderingUpdateScheduler will schedule the "Update the rendering" step in which these obverses will be served. * page/PageOverlayController.cpp: (WebCore::PageOverlayController::didChangeViewExposedRect): (WebCore::PageOverlayController::notifyFlushRequired): Force committing the layers to be 60 fps at maximum. * page/RenderingUpdateScheduler.cpp: Added. (WebCore::RenderingUpdateScheduler::RenderingUpdateScheduler): (WebCore::RenderingUpdateScheduler::scheduleRenderingUpdate): (WebCore::RenderingUpdateScheduler::isScheduled const): (WebCore::RenderingUpdateScheduler::startTimer): (WebCore::RenderingUpdateScheduler::clearScheduled): (WebCore::RenderingUpdateScheduler::createDisplayRefreshMonitor const): (WebCore::RenderingUpdateScheduler::windowScreenDidChange): (WebCore::RenderingUpdateScheduler::displayRefreshFired): (WebCore::RenderingUpdateScheduler::scheduleCompositingLayerFlush): * page/RenderingUpdateScheduler.h: Added. (WebCore::RenderingUpdateScheduler::create): * page/ResizeObserver.cpp: (WebCore::ResizeObserver::observe): (WebCore::ResizeObserver::scheduleObservations): Deleted. * page/ResizeObserver.h: (WebCore::ResizeObserver::hasActiveObservations const): * page/ios/ContentChangeObserver.h: * page/mac/ServicesOverlayController.mm: (WebCore::ServicesOverlayController::Highlight::notifyFlushRequired): * page/scrolling/ScrollingStateTree.cpp: * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::scheduleLayerFlushNow): (WebCore::RenderLayerCompositor::layerTreeAsText): Source/WebKit: Replace the calls to Page::layoutIfNeeded() and willDisplayPage() by a single call to Page::updateRendering(). This new function implements "Update the rendering" step of the HTML Event Loop specification <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. * WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp: (WebKit::DrawingAreaCoordinatedGraphics::scheduleCompositingLayerFlush): (WebKit::DrawingAreaCoordinatedGraphics::updateBackingStoreState): (WebKit::DrawingAreaCoordinatedGraphics::display): * WebProcess/WebPage/CoordinatedGraphics/LayerTreeHost.cpp: (WebKit::LayerTreeHost::layerFlushTimerFired): * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::flushLayers): -- Call Page::updateRendering() to make sure that "Update the rendering" happens immediately before updating the page. -- Move the call to RemoteLayerBackingStoreCollection::willFlushLayers() to be exactly before flushing the layers. This fixes the assertion ASSERT(m_inLayerFlush) which was firing when running a layout test. RemoteLayerTreeDrawingArea::flushLayers() now can call itself through TestRunner::notifyDone(). flushLayers() was calling willFlushLayers() twice before calling didFlushLayers(). * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::layoutIfNeeded): (WebKit::WebPage::updateRendering): (WebKit::WebPage::willDisplayPage): Deleted. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::flushLayers): Source/WebKitLegacy/mac: * WebView/WebView.mm: (-[WebView _viewWillDrawInternal]): (-[WebView _flushCompositingChanges]): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WebKitLegacy/win: * WebView.cpp: (WebView::updateBackingStore): (WebView::flushPendingGraphicsLayerChangesSoon): (WebView::flushPendingGraphicsLayerChanges): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WTF: Add trace points for the page RenderingUpdate. * wtf/SystemTracing.h: Tools: Add trace points for the page RenderingUpdate. * Tracing/SystemTracePoints.plist: LayoutTests: * TestExpectations: There is a slight difference between the actual DRT and the expected DRT due to animation timing change. But these two tests are not animating correctly if they are opened in Safari with web animation turned on. * accessibility/mac/selection-notification-focus-change-expected.txt: * accessibility/mac/selection-notification-focus-change.html: Remove the debug statements form notificationCallback() since the number of times this function is called back and the order of notifications are not defined. This test has been flaky and some trials were made to make it more reliable. With this change it became flaky again. * animations/animation-multiple-callbacks-timestamp.html: Fix variable names used by an error message. * animations/no-style-recalc-during-accelerated-animation-expected.txt: * animations/no-style-recalc-during-accelerated-animation.html: One extra styleReclc was incurred due to the document styleRecalcTimer. I think this timer is not needed anymore. I will look at removing it in a separate patch. * animations/resources/animation-test-helpers.js: (waitForAnimationToStart): The expectation that animation will start at the beginning of the next event loop is not true anymore. The animation will start at the time the requestAnimationFrame fires. * compositing/video/video-clip-change-src.html: This test loads a video data and pushes it to the encoder. Originally it used to wait 150 ms after receiving the second canplaythrough. I had to change this timing to 250 ms. * css3/filters/composited-during-animation.html: Ditto. setTimeout({...}, 0) versus requestAnimationFrame. * media/media-controls-accessibility.html: Updating the accessibility button happens asynchronously, see [WebAccessibilityObjectWrapper accessibilityPerformPressAction]. Due to changing the page update timing, this test became flaky. Originally it used to setTimeout({...}, 10) to ensure the stringValue of the mutate button was changed after it was pressed. The fix is to loop using rAF till the stringValue changes. * platform/mac-wk2/accessibility/mac/selection-notification-focus-change-expected.txt: Removed. The number of time notificationCallback() is called and the order of notifications are not defined. And this is why we have two expected files: one for WK1 and the other for WK2. Since the test is now simplified, we can get rid of this duplication. We will test the minimum reliable thing we can test. Canonical link: https://commits.webkit.org/211093@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244182 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-04-11 05:44:13 +00:00
void displayRefreshFired() final;
Add DisplayRefreshMonitorFactory. https://bugs.webkit.org/show_bug.cgi?id=223648 Reviewed by Chris Dumez. Future work will require that it's possible to create a DisplayRefreshMonitor without having a DisplayRefreshMonitorClient. It was also weird that the way to create a DisplayRefreshMonitor was via the DisplayRefreshMonitorClient, so this change fixes both by adding DisplayRefreshMonitorFactory. In WK2, the drawing areas are DisplayRefreshMonitorFactories. If there is no factory, we fall back to the default implementations. Source/WebCore: * Headers.cmake: * WebCore.xcodeproj/project.pbxproj: * loader/EmptyClients.cpp: (WebCore::EmptyDisplayRefreshMonitorFactory::sharedEmptyDisplayRefreshMonitorFactory): (WebCore::EmptyChromeClient::displayRefreshMonitorFactory const): (WebCore::EmptyChromeClient::createDisplayRefreshMonitor const): Deleted. * loader/EmptyClients.h: * page/ChromeClient.h: (WebCore::ChromeClient::displayRefreshMonitorFactory const): (WebCore::ChromeClient::createDisplayRefreshMonitor const): Deleted. * page/RenderingUpdateScheduler.cpp: (WebCore::RenderingUpdateScheduler::displayRefreshMonitorFactory const): (WebCore::RenderingUpdateScheduler::createDisplayRefreshMonitor const): Deleted. * page/RenderingUpdateScheduler.h: * platform/graphics/DisplayRefreshMonitor.cpp: (WebCore::DisplayRefreshMonitor::create): * platform/graphics/DisplayRefreshMonitor.h: * platform/graphics/DisplayRefreshMonitorClient.cpp: (WebCore::DisplayRefreshMonitorClient::DisplayRefreshMonitorClient): Deleted. * platform/graphics/DisplayRefreshMonitorClient.h: * platform/graphics/DisplayRefreshMonitorFactory.h: Copied from Source/WebCore/platform/graphics/DisplayRefreshMonitorClient.cpp. * platform/graphics/DisplayRefreshMonitorManager.cpp: (WebCore::DisplayRefreshMonitorManager::monitorForClient): * platform/graphics/GraphicsLayerUpdater.cpp: (WebCore::GraphicsLayerUpdater::GraphicsLayerUpdater): (WebCore::GraphicsLayerUpdater::displayRefreshMonitorFactory const): (WebCore::GraphicsLayerUpdater::createDisplayRefreshMonitor const): Deleted. * platform/graphics/GraphicsLayerUpdater.h: * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::displayRefreshMonitorFactory): (WebCore::RenderLayerCompositor::createDisplayRefreshMonitor const): Deleted. * rendering/RenderLayerCompositor.h: Source/WebKit: Remove DrawingAreaMac.cpp since its code was entirely related to creating DisplayRefreshMonitorMac objects. * SourcesCocoa.txt: * WebKit.xcodeproj/project.pbxproj: * WebProcess/WebCoreSupport/WebChromeClient.cpp: (WebKit::WebChromeClient::displayRefreshMonitorFactory const): (WebKit::WebChromeClient::createDisplayRefreshMonitor const): Deleted. * WebProcess/WebCoreSupport/WebChromeClient.h: * WebProcess/WebPage/DrawingArea.cpp: (WebKit::DrawingArea::createDisplayRefreshMonitor): Deleted. * WebProcess/WebPage/DrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h: * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::createDisplayRefreshMonitor): * WebProcess/WebPage/mac/DisplayRefreshMonitorMac.cpp: Renamed from Source/WebKit/WebProcess/WebPage/mac/DrawingAreaMac.cpp. (WebKit::DisplayRefreshMonitorMac::DisplayRefreshMonitorMac): (WebKit::DisplayRefreshMonitorMac::~DisplayRefreshMonitorMac): (WebKit::DisplayRefreshMonitorMac::requestRefreshCallback): (WebKit::DisplayRefreshMonitorMac::displayLinkFired): * WebProcess/WebPage/mac/DisplayRefreshMonitorMac.h: Copied from Source/WebCore/platform/graphics/GraphicsLayerUpdater.h. (WebKit::DisplayRefreshMonitorMac::create): * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::createDisplayRefreshMonitor): Canonical link: https://commits.webkit.org/235687@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274929 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-24 02:35:26 +00:00
DisplayRefreshMonitorFactory* displayRefreshMonitorFactory() const final;
[Web Animations] Ensure animations are updated prior to requestAnimationFrame callbacks https://bugs.webkit.org/show_bug.cgi?id=186997 <rdar://problem/41419414> Reviewed by Dean Jackson. LayoutTests/imported/mozilla: Mark progressions in the Mozilla CSS Animations tests. * css-animations/test_animation-pausing-expected.txt: Source/WebCore: Some sub-tests of imported/mozilla/css-animations/test_animation-pausing.html clearly expect that animations would be resolved prior to firing a requestAnimationFrame() callback, as the HTML5 event loop mandates. But until now, both DocumentTimeline and ScriptedAnimationController would make calls to DisplayRefreshMonitorManager::scheduleAnimation() that were not coordinated and so the order in which the DocumentTimeline and ScriptedAnimationController callbacks were performed was not guaranteed. In this patch we add a new DocumentAnimationScheduler class which is created by a Document to manage this specific situation. Now DocumentTimeline and ScriptedAnimationController use this supporting object instead of being their own DisplayRefreshMonitorClient and call scheduleWebAnimationsResolution() and scheduleScriptedAnimationResolution() respectively to indicate the need to schedule an animation through the DisplayRefreshMonitorManager to serve the specific needs of either, or both, classes. Then DocumentAnimationScheduler ensures that Web Animations resolution happens prior to requestAnimationFrame callbacks when both are scheduled. In the future we should be able to move more code from DocumentTimeline and ScriptedAnimationController over to DocumentAnimationScheduler, such as support for throttling and using a timer-based fallback, but this patch provides the minimal functionality required to provide a sounder foundation. * Modules/webvr/VRDisplay.cpp: (WebCore::VRDisplay::requestAnimationFrame): * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * animation/DocumentAnimationScheduler.cpp: Added. (WebCore::DocumentAnimationScheduler::create): (WebCore::DocumentAnimationScheduler::DocumentAnimationScheduler): (WebCore::DocumentAnimationScheduler::detachFromDocument): (WebCore::DocumentAnimationScheduler::scheduleWebAnimationsResolution): (WebCore::DocumentAnimationScheduler::scheduleScriptedAnimationResolution): (WebCore::DocumentAnimationScheduler::displayRefreshFired): (WebCore::DocumentAnimationScheduler::windowScreenDidChange): (WebCore::DocumentAnimationScheduler::createDisplayRefreshMonitor const): * animation/DocumentAnimationScheduler.h: Copied from Source/WebCore/animation/CSSAnimation.h. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::create): (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::windowScreenDidChange): Deleted. (WebCore::DocumentTimeline::createDisplayRefreshMonitor const): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::prepareForDestruction): (WebCore::Document::windowScreenDidChange): (WebCore::Document::requestAnimationFrame): (WebCore::Document::animationScheduler): (WebCore::Document::timeline): * dom/Document.h: * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::ScriptedAnimationController): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): (WebCore::ScriptedAnimationController::windowScreenDidChange): Deleted. (WebCore::ScriptedAnimationController::displayRefreshFired): Deleted. (WebCore::ScriptedAnimationController::createDisplayRefreshMonitor const): Deleted. * dom/ScriptedAnimationController.h: (WebCore::ScriptedAnimationController::create): Canonical link: https://commits.webkit.org/202231@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233140 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-06-25 09:54:34 +00:00
requestAnimationFrame should execute before the next frame https://bugs.webkit.org/show_bug.cgi?id=177484 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2019-04-10 Reviewed by Simon Fraser. LayoutTests/imported/w3c: Add trace points for the page RenderingUpdate. * web-platform-tests/resize-observer/resources/resizeTestHelper.js: Change ResizeTestHelper.TIMEOUT to be 1 second instead of 100 ms which is too short for layout tests. Source/WebCore: This change fixes these issues with animation timing: 1. Calling the requestAnimationFrame callbacks would have happened when the DisplayLink fires. This may have happened even if the frame is missed and no display is committed. 2. Style changes and layout triggered by script could trigger painting at more than 60fps. CoreAnimation commits could happen at more than 60fps, although WindowServer will throttle those, and only some will be shown on the screen. This change introduces a new paint scheduling model where painting is driven by a "RenderingUpdateScheduler", which only triggers paints once per 16.7ms frame. Code that previously scheduled a compositing layer flush now schedules a "RenderingUpdate", and that update is driven by a DisplayRefreshMonitor callback. When the render happens, we service requestAnimationFrame callbacks, Web Animations, intersection observations and resize observations per the "Update the rendering" step of the HTML Event Loop specification: <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. In the future, more rendering steps will be added to this code. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * accessibility/mac/AXObjectCacheMac.mm: (WebCore::AXObjectCache::platformHandleFocusedUIElementChanged): Fix layout tests by adding null check. * animation/DocumentAnimationScheduler.cpp: Removed. * animation/DocumentAnimationScheduler.h: Removed. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::updateThrottlingState): (WebCore::DocumentTimeline::suspendAnimations): (WebCore::DocumentTimeline::resumeAnimations): (WebCore::DocumentTimeline::liveCurrentTime const): (WebCore::DocumentTimeline::currentTime): (WebCore::DocumentTimeline::cacheCurrentTime): (WebCore::DocumentTimeline::animationTimingDidChange): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::unscheduleAnimationResolution): (WebCore::DocumentTimeline::updateAnimationsAndSendEvents): (WebCore::DocumentTimeline::internalUpdateAnimationsAndSendEvents): (WebCore::DocumentTimeline::scheduleNextTick): (WebCore::DocumentTimeline::updateListOfElementsWithRunningAcceleratedAnimationsForElement): Simplify this function by handling the case of no-animations separately. (WebCore::DocumentTimeline::resolveAnimationsForElement): Simplify the loop and delete hasPendingAcceleratedAnimations because it is initialized to true and is not changed inside the loop. (WebCore::DocumentTimeline::scheduleAnimationResolutionIfNeeded): Deleted. (WebCore::DocumentTimeline::animationResolutionTimerFired): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::resolveStyle): There is no need to force update in resolveStyle(). notifyFlushRequired() will be called eventually which will scheduleRenderingUpdate(). (WebCore::Document::prepareForDestruction): (WebCore::Document::updateAnimationsAndSendEvents): (WebCore::Document::serviceRequestAnimationFrameCallbacks): (WebCore::Document::windowScreenDidChange): (WebCore::Document::scheduleRenderingUpdate): (WebCore::Document::updateIntersectionObservations): (WebCore::Document::addResizeObserver): (WebCore::Document::updateResizeObservations): (WebCore::Document::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Document::scheduleResizeObservations): Deleted. (WebCore::Document::animationScheduler): Deleted. No need to schedule web-animations, intersection observations and resize observations updates separately. All of them will be updated through the "Update the rendering" step, i.e. Page::updateRendering(). * dom/Document.h: (WebCore::Document::numberOfIntersectionObservers const): * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::animationTimerFired): (WebCore::ScriptedAnimationController::serviceScriptedAnimations): Deleted. (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): Deleted. * dom/ScriptedAnimationController.h: * page/FrameView.cpp: (WebCore::FrameView::didLayout): (WebCore::FrameView::viewportContentsChanged): * page/FrameViewLayoutContext.cpp: (WebCore::FrameViewLayoutContext::layoutTimerFired): * page/IntersectionObserver.cpp: (WebCore::IntersectionObserver::observe): * page/Page.cpp: (WebCore::Page::Page): (WebCore::Page::layoutIfNeeded): (WebCore::Page::updateRendering): (WebCore::Page::renderingUpdateScheduler): (WebCore::Page::willDisplayPage): Deleted. (WebCore::Page::addDocumentNeedingIntersectionObservationUpdate): Deleted. (WebCore::Page::updateIntersectionObservations): Deleted. (WebCore::Page::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Page::hasResizeObservers const): Deleted. (WebCore::Page::gatherDocumentsNeedingResizeObservationCheck): Deleted. (WebCore::Page::checkResizeObservations): Deleted. (WebCore::Page::scheduleResizeObservations): Deleted. (WebCore::Page::notifyResizeObservers): Deleted. * page/Page.h: (WebCore::Page::setNeedsCheckResizeObservations): Deleted. (WebCore::Page::needsCheckResizeObservations const): Deleted. The IntersectionObserver and the ResizeObserver do not need to schedule their own timers. The RenderingUpdateScheduler will schedule the "Update the rendering" step in which these obverses will be served. * page/PageOverlayController.cpp: (WebCore::PageOverlayController::didChangeViewExposedRect): (WebCore::PageOverlayController::notifyFlushRequired): Force committing the layers to be 60 fps at maximum. * page/RenderingUpdateScheduler.cpp: Added. (WebCore::RenderingUpdateScheduler::RenderingUpdateScheduler): (WebCore::RenderingUpdateScheduler::scheduleRenderingUpdate): (WebCore::RenderingUpdateScheduler::isScheduled const): (WebCore::RenderingUpdateScheduler::startTimer): (WebCore::RenderingUpdateScheduler::clearScheduled): (WebCore::RenderingUpdateScheduler::createDisplayRefreshMonitor const): (WebCore::RenderingUpdateScheduler::windowScreenDidChange): (WebCore::RenderingUpdateScheduler::displayRefreshFired): (WebCore::RenderingUpdateScheduler::scheduleCompositingLayerFlush): * page/RenderingUpdateScheduler.h: Added. (WebCore::RenderingUpdateScheduler::create): * page/ResizeObserver.cpp: (WebCore::ResizeObserver::observe): (WebCore::ResizeObserver::scheduleObservations): Deleted. * page/ResizeObserver.h: (WebCore::ResizeObserver::hasActiveObservations const): * page/ios/ContentChangeObserver.h: * page/mac/ServicesOverlayController.mm: (WebCore::ServicesOverlayController::Highlight::notifyFlushRequired): * page/scrolling/ScrollingStateTree.cpp: * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::scheduleLayerFlushNow): (WebCore::RenderLayerCompositor::layerTreeAsText): Source/WebKit: Replace the calls to Page::layoutIfNeeded() and willDisplayPage() by a single call to Page::updateRendering(). This new function implements "Update the rendering" step of the HTML Event Loop specification <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. * WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp: (WebKit::DrawingAreaCoordinatedGraphics::scheduleCompositingLayerFlush): (WebKit::DrawingAreaCoordinatedGraphics::updateBackingStoreState): (WebKit::DrawingAreaCoordinatedGraphics::display): * WebProcess/WebPage/CoordinatedGraphics/LayerTreeHost.cpp: (WebKit::LayerTreeHost::layerFlushTimerFired): * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::flushLayers): -- Call Page::updateRendering() to make sure that "Update the rendering" happens immediately before updating the page. -- Move the call to RemoteLayerBackingStoreCollection::willFlushLayers() to be exactly before flushing the layers. This fixes the assertion ASSERT(m_inLayerFlush) which was firing when running a layout test. RemoteLayerTreeDrawingArea::flushLayers() now can call itself through TestRunner::notifyDone(). flushLayers() was calling willFlushLayers() twice before calling didFlushLayers(). * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::layoutIfNeeded): (WebKit::WebPage::updateRendering): (WebKit::WebPage::willDisplayPage): Deleted. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::flushLayers): Source/WebKitLegacy/mac: * WebView/WebView.mm: (-[WebView _viewWillDrawInternal]): (-[WebView _flushCompositingChanges]): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WebKitLegacy/win: * WebView.cpp: (WebView::updateBackingStore): (WebView::flushPendingGraphicsLayerChangesSoon): (WebView::flushPendingGraphicsLayerChanges): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WTF: Add trace points for the page RenderingUpdate. * wtf/SystemTracing.h: Tools: Add trace points for the page RenderingUpdate. * Tracing/SystemTracePoints.plist: LayoutTests: * TestExpectations: There is a slight difference between the actual DRT and the expected DRT due to animation timing change. But these two tests are not animating correctly if they are opened in Safari with web animation turned on. * accessibility/mac/selection-notification-focus-change-expected.txt: * accessibility/mac/selection-notification-focus-change.html: Remove the debug statements form notificationCallback() since the number of times this function is called back and the order of notifications are not defined. This test has been flaky and some trials were made to make it more reliable. With this change it became flaky again. * animations/animation-multiple-callbacks-timestamp.html: Fix variable names used by an error message. * animations/no-style-recalc-during-accelerated-animation-expected.txt: * animations/no-style-recalc-during-accelerated-animation.html: One extra styleReclc was incurred due to the document styleRecalcTimer. I think this timer is not needed anymore. I will look at removing it in a separate patch. * animations/resources/animation-test-helpers.js: (waitForAnimationToStart): The expectation that animation will start at the beginning of the next event loop is not true anymore. The animation will start at the time the requestAnimationFrame fires. * compositing/video/video-clip-change-src.html: This test loads a video data and pushes it to the encoder. Originally it used to wait 150 ms after receiving the second canplaythrough. I had to change this timing to 250 ms. * css3/filters/composited-during-animation.html: Ditto. setTimeout({...}, 0) versus requestAnimationFrame. * media/media-controls-accessibility.html: Updating the accessibility button happens asynchronously, see [WebAccessibilityObjectWrapper accessibilityPerformPressAction]. Due to changing the page update timing, this test became flaky. Originally it used to setTimeout({...}, 10) to ensure the stringValue of the mutate button was changed after it was pressed. The fix is to loop using rAF till the stringValue changes. * platform/mac-wk2/accessibility/mac/selection-notification-focus-change-expected.txt: Removed. The number of time notificationCallback() is called and the order of notifications are not defined. And this is why we have two expected files: one for WK1 and the other for WK2. Since the test is now simplified, we can get rid of this duplication. We will test the minimum reliable thing we can test. Canonical link: https://commits.webkit.org/211093@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244182 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-04-11 05:44:13 +00:00
bool isScheduled() const;
void startTimer(Seconds);
void clearScheduled();
[Web Animations] Ensure animations are updated prior to requestAnimationFrame callbacks https://bugs.webkit.org/show_bug.cgi?id=186997 <rdar://problem/41419414> Reviewed by Dean Jackson. LayoutTests/imported/mozilla: Mark progressions in the Mozilla CSS Animations tests. * css-animations/test_animation-pausing-expected.txt: Source/WebCore: Some sub-tests of imported/mozilla/css-animations/test_animation-pausing.html clearly expect that animations would be resolved prior to firing a requestAnimationFrame() callback, as the HTML5 event loop mandates. But until now, both DocumentTimeline and ScriptedAnimationController would make calls to DisplayRefreshMonitorManager::scheduleAnimation() that were not coordinated and so the order in which the DocumentTimeline and ScriptedAnimationController callbacks were performed was not guaranteed. In this patch we add a new DocumentAnimationScheduler class which is created by a Document to manage this specific situation. Now DocumentTimeline and ScriptedAnimationController use this supporting object instead of being their own DisplayRefreshMonitorClient and call scheduleWebAnimationsResolution() and scheduleScriptedAnimationResolution() respectively to indicate the need to schedule an animation through the DisplayRefreshMonitorManager to serve the specific needs of either, or both, classes. Then DocumentAnimationScheduler ensures that Web Animations resolution happens prior to requestAnimationFrame callbacks when both are scheduled. In the future we should be able to move more code from DocumentTimeline and ScriptedAnimationController over to DocumentAnimationScheduler, such as support for throttling and using a timer-based fallback, but this patch provides the minimal functionality required to provide a sounder foundation. * Modules/webvr/VRDisplay.cpp: (WebCore::VRDisplay::requestAnimationFrame): * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * animation/DocumentAnimationScheduler.cpp: Added. (WebCore::DocumentAnimationScheduler::create): (WebCore::DocumentAnimationScheduler::DocumentAnimationScheduler): (WebCore::DocumentAnimationScheduler::detachFromDocument): (WebCore::DocumentAnimationScheduler::scheduleWebAnimationsResolution): (WebCore::DocumentAnimationScheduler::scheduleScriptedAnimationResolution): (WebCore::DocumentAnimationScheduler::displayRefreshFired): (WebCore::DocumentAnimationScheduler::windowScreenDidChange): (WebCore::DocumentAnimationScheduler::createDisplayRefreshMonitor const): * animation/DocumentAnimationScheduler.h: Copied from Source/WebCore/animation/CSSAnimation.h. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::create): (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::windowScreenDidChange): Deleted. (WebCore::DocumentTimeline::createDisplayRefreshMonitor const): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::prepareForDestruction): (WebCore::Document::windowScreenDidChange): (WebCore::Document::requestAnimationFrame): (WebCore::Document::animationScheduler): (WebCore::Document::timeline): * dom/Document.h: * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::ScriptedAnimationController): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): (WebCore::ScriptedAnimationController::windowScreenDidChange): Deleted. (WebCore::ScriptedAnimationController::displayRefreshFired): Deleted. (WebCore::ScriptedAnimationController::createDisplayRefreshMonitor const): Deleted. * dom/ScriptedAnimationController.h: (WebCore::ScriptedAnimationController::create): Canonical link: https://commits.webkit.org/202231@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233140 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-06-25 09:54:34 +00:00
void triggerRenderingUpdate();
requestAnimationFrame should execute before the next frame https://bugs.webkit.org/show_bug.cgi?id=177484 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2019-04-10 Reviewed by Simon Fraser. LayoutTests/imported/w3c: Add trace points for the page RenderingUpdate. * web-platform-tests/resize-observer/resources/resizeTestHelper.js: Change ResizeTestHelper.TIMEOUT to be 1 second instead of 100 ms which is too short for layout tests. Source/WebCore: This change fixes these issues with animation timing: 1. Calling the requestAnimationFrame callbacks would have happened when the DisplayLink fires. This may have happened even if the frame is missed and no display is committed. 2. Style changes and layout triggered by script could trigger painting at more than 60fps. CoreAnimation commits could happen at more than 60fps, although WindowServer will throttle those, and only some will be shown on the screen. This change introduces a new paint scheduling model where painting is driven by a "RenderingUpdateScheduler", which only triggers paints once per 16.7ms frame. Code that previously scheduled a compositing layer flush now schedules a "RenderingUpdate", and that update is driven by a DisplayRefreshMonitor callback. When the render happens, we service requestAnimationFrame callbacks, Web Animations, intersection observations and resize observations per the "Update the rendering" step of the HTML Event Loop specification: <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. In the future, more rendering steps will be added to this code. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * accessibility/mac/AXObjectCacheMac.mm: (WebCore::AXObjectCache::platformHandleFocusedUIElementChanged): Fix layout tests by adding null check. * animation/DocumentAnimationScheduler.cpp: Removed. * animation/DocumentAnimationScheduler.h: Removed. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::updateThrottlingState): (WebCore::DocumentTimeline::suspendAnimations): (WebCore::DocumentTimeline::resumeAnimations): (WebCore::DocumentTimeline::liveCurrentTime const): (WebCore::DocumentTimeline::currentTime): (WebCore::DocumentTimeline::cacheCurrentTime): (WebCore::DocumentTimeline::animationTimingDidChange): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::unscheduleAnimationResolution): (WebCore::DocumentTimeline::updateAnimationsAndSendEvents): (WebCore::DocumentTimeline::internalUpdateAnimationsAndSendEvents): (WebCore::DocumentTimeline::scheduleNextTick): (WebCore::DocumentTimeline::updateListOfElementsWithRunningAcceleratedAnimationsForElement): Simplify this function by handling the case of no-animations separately. (WebCore::DocumentTimeline::resolveAnimationsForElement): Simplify the loop and delete hasPendingAcceleratedAnimations because it is initialized to true and is not changed inside the loop. (WebCore::DocumentTimeline::scheduleAnimationResolutionIfNeeded): Deleted. (WebCore::DocumentTimeline::animationResolutionTimerFired): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::resolveStyle): There is no need to force update in resolveStyle(). notifyFlushRequired() will be called eventually which will scheduleRenderingUpdate(). (WebCore::Document::prepareForDestruction): (WebCore::Document::updateAnimationsAndSendEvents): (WebCore::Document::serviceRequestAnimationFrameCallbacks): (WebCore::Document::windowScreenDidChange): (WebCore::Document::scheduleRenderingUpdate): (WebCore::Document::updateIntersectionObservations): (WebCore::Document::addResizeObserver): (WebCore::Document::updateResizeObservations): (WebCore::Document::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Document::scheduleResizeObservations): Deleted. (WebCore::Document::animationScheduler): Deleted. No need to schedule web-animations, intersection observations and resize observations updates separately. All of them will be updated through the "Update the rendering" step, i.e. Page::updateRendering(). * dom/Document.h: (WebCore::Document::numberOfIntersectionObservers const): * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::animationTimerFired): (WebCore::ScriptedAnimationController::serviceScriptedAnimations): Deleted. (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): Deleted. * dom/ScriptedAnimationController.h: * page/FrameView.cpp: (WebCore::FrameView::didLayout): (WebCore::FrameView::viewportContentsChanged): * page/FrameViewLayoutContext.cpp: (WebCore::FrameViewLayoutContext::layoutTimerFired): * page/IntersectionObserver.cpp: (WebCore::IntersectionObserver::observe): * page/Page.cpp: (WebCore::Page::Page): (WebCore::Page::layoutIfNeeded): (WebCore::Page::updateRendering): (WebCore::Page::renderingUpdateScheduler): (WebCore::Page::willDisplayPage): Deleted. (WebCore::Page::addDocumentNeedingIntersectionObservationUpdate): Deleted. (WebCore::Page::updateIntersectionObservations): Deleted. (WebCore::Page::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Page::hasResizeObservers const): Deleted. (WebCore::Page::gatherDocumentsNeedingResizeObservationCheck): Deleted. (WebCore::Page::checkResizeObservations): Deleted. (WebCore::Page::scheduleResizeObservations): Deleted. (WebCore::Page::notifyResizeObservers): Deleted. * page/Page.h: (WebCore::Page::setNeedsCheckResizeObservations): Deleted. (WebCore::Page::needsCheckResizeObservations const): Deleted. The IntersectionObserver and the ResizeObserver do not need to schedule their own timers. The RenderingUpdateScheduler will schedule the "Update the rendering" step in which these obverses will be served. * page/PageOverlayController.cpp: (WebCore::PageOverlayController::didChangeViewExposedRect): (WebCore::PageOverlayController::notifyFlushRequired): Force committing the layers to be 60 fps at maximum. * page/RenderingUpdateScheduler.cpp: Added. (WebCore::RenderingUpdateScheduler::RenderingUpdateScheduler): (WebCore::RenderingUpdateScheduler::scheduleRenderingUpdate): (WebCore::RenderingUpdateScheduler::isScheduled const): (WebCore::RenderingUpdateScheduler::startTimer): (WebCore::RenderingUpdateScheduler::clearScheduled): (WebCore::RenderingUpdateScheduler::createDisplayRefreshMonitor const): (WebCore::RenderingUpdateScheduler::windowScreenDidChange): (WebCore::RenderingUpdateScheduler::displayRefreshFired): (WebCore::RenderingUpdateScheduler::scheduleCompositingLayerFlush): * page/RenderingUpdateScheduler.h: Added. (WebCore::RenderingUpdateScheduler::create): * page/ResizeObserver.cpp: (WebCore::ResizeObserver::observe): (WebCore::ResizeObserver::scheduleObservations): Deleted. * page/ResizeObserver.h: (WebCore::ResizeObserver::hasActiveObservations const): * page/ios/ContentChangeObserver.h: * page/mac/ServicesOverlayController.mm: (WebCore::ServicesOverlayController::Highlight::notifyFlushRequired): * page/scrolling/ScrollingStateTree.cpp: * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::scheduleLayerFlushNow): (WebCore::RenderLayerCompositor::layerTreeAsText): Source/WebKit: Replace the calls to Page::layoutIfNeeded() and willDisplayPage() by a single call to Page::updateRendering(). This new function implements "Update the rendering" step of the HTML Event Loop specification <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. * WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp: (WebKit::DrawingAreaCoordinatedGraphics::scheduleCompositingLayerFlush): (WebKit::DrawingAreaCoordinatedGraphics::updateBackingStoreState): (WebKit::DrawingAreaCoordinatedGraphics::display): * WebProcess/WebPage/CoordinatedGraphics/LayerTreeHost.cpp: (WebKit::LayerTreeHost::layerFlushTimerFired): * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::flushLayers): -- Call Page::updateRendering() to make sure that "Update the rendering" happens immediately before updating the page. -- Move the call to RemoteLayerBackingStoreCollection::willFlushLayers() to be exactly before flushing the layers. This fixes the assertion ASSERT(m_inLayerFlush) which was firing when running a layout test. RemoteLayerTreeDrawingArea::flushLayers() now can call itself through TestRunner::notifyDone(). flushLayers() was calling willFlushLayers() twice before calling didFlushLayers(). * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::layoutIfNeeded): (WebKit::WebPage::updateRendering): (WebKit::WebPage::willDisplayPage): Deleted. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::flushLayers): Source/WebKitLegacy/mac: * WebView/WebView.mm: (-[WebView _viewWillDrawInternal]): (-[WebView _flushCompositingChanges]): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WebKitLegacy/win: * WebView.cpp: (WebView::updateBackingStore): (WebView::flushPendingGraphicsLayerChangesSoon): (WebView::flushPendingGraphicsLayerChanges): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WTF: Add trace points for the page RenderingUpdate. * wtf/SystemTracing.h: Tools: Add trace points for the page RenderingUpdate. * Tracing/SystemTracePoints.plist: LayoutTests: * TestExpectations: There is a slight difference between the actual DRT and the expected DRT due to animation timing change. But these two tests are not animating correctly if they are opened in Safari with web animation turned on. * accessibility/mac/selection-notification-focus-change-expected.txt: * accessibility/mac/selection-notification-focus-change.html: Remove the debug statements form notificationCallback() since the number of times this function is called back and the order of notifications are not defined. This test has been flaky and some trials were made to make it more reliable. With this change it became flaky again. * animations/animation-multiple-callbacks-timestamp.html: Fix variable names used by an error message. * animations/no-style-recalc-during-accelerated-animation-expected.txt: * animations/no-style-recalc-during-accelerated-animation.html: One extra styleReclc was incurred due to the document styleRecalcTimer. I think this timer is not needed anymore. I will look at removing it in a separate patch. * animations/resources/animation-test-helpers.js: (waitForAnimationToStart): The expectation that animation will start at the beginning of the next event loop is not true anymore. The animation will start at the time the requestAnimationFrame fires. * compositing/video/video-clip-change-src.html: This test loads a video data and pushes it to the encoder. Originally it used to wait 150 ms after receiving the second canplaythrough. I had to change this timing to 250 ms. * css3/filters/composited-during-animation.html: Ditto. setTimeout({...}, 0) versus requestAnimationFrame. * media/media-controls-accessibility.html: Updating the accessibility button happens asynchronously, see [WebAccessibilityObjectWrapper accessibilityPerformPressAction]. Due to changing the page update timing, this test became flaky. Originally it used to setTimeout({...}, 10) to ensure the stringValue of the mutate button was changed after it was pressed. The fix is to loop using rAF till the stringValue changes. * platform/mac-wk2/accessibility/mac/selection-notification-focus-change-expected.txt: Removed. The number of time notificationCallback() is called and the order of notifications are not defined. And this is why we have two expected files: one for WK1 and the other for WK2. Since the test is now simplified, we can get rid of this duplication. We will test the minimum reliable thing we can test. Canonical link: https://commits.webkit.org/211093@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244182 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-04-11 05:44:13 +00:00
Page& m_page;
std::unique_ptr<Timer> m_refreshTimer;
Regulate the WebPage RenderingUpdates from the WebProcess to the GPUProcess https://bugs.webkit.org/show_bug.cgi?id=227791 <rdar://78430639> Reviewed by Simon Fraser. Source/WebCore: Make ChromeClient decide whether a RenderingUpdate can be triggered or should be rescheduled. Keep track of how many times RenderingUpdate was rescheduled to ensure RenderingUpdate will be triggered anyway after a certain number of reschedules. * page/ChromeClient.h: (WebCore::ChromeClient::canTriggerRenderingUpdate const): * page/RenderingUpdateScheduler.cpp: (WebCore::RenderingUpdateScheduler::displayRefreshFired): * page/RenderingUpdateScheduler.h: Source/WebKit: This is the workflow to regulate the WebPage RenderingUpdates: -- WebPage::finalizeRenderingUpdate() calls RemoteRenderingBackendProxy:: finalizeRenderingUpdate(). -- RemoteRenderingBackendProxy::finalizeRenderingUpdate() sends its renderingUpdateID to GPUPProcess and asks it to process all the pending DisplayList items. -- RemoteRenderingBackend::finalizeRenderingUpdate) processes all the pending items and sends the received renderingUpdateID back to the WebProcess. -- RemoteRenderingBackendProxy::didFinalizeRenderingUpdate() stores the received didRenderingUpdateID. -- RemoteRenderingBackendProxy::delayedRenderingUpdateCount() returns 'renderingUpdateID - didRenderingUpdateID' which is the number of un-processed finalizeRenderingUpdate by GPUP. -- WebPage::canTriggerRenderingUpdate() uses delayedRenderingUpdateCount() to decides whether the current RenderingUpdate can be triggered or should be rescheduled. -- RenderingUpdateScheduler::displayRefreshFired() calls WebPage::canTriggerRenderingUpdate() through the page chrome client. * GPUProcess/graphics/RemoteRenderingBackend.cpp: (WebKit::RemoteRenderingBackend::submit): (WebKit::RemoteRenderingBackend::finalizeRenderingUpdate): * GPUProcess/graphics/RemoteRenderingBackend.h: * GPUProcess/graphics/RemoteRenderingBackend.messages.in: * Scripts/webkit/messages.py: (types_that_cannot_be_forward_declared): * Shared/MonotonicObjectIdentifier.h: Copied from Source/WebKit/Shared/TransactionID.h. (WebKit::MonotonicObjectIdentifier::MonotonicObjectIdentifier): (WebKit::MonotonicObjectIdentifier::isHashTableDeletedValue const): (WebKit::MonotonicObjectIdentifier::encode const): (WebKit::MonotonicObjectIdentifier::decode): (WebKit::MonotonicObjectIdentifier::operator== const): (WebKit::MonotonicObjectIdentifier::operator> const): (WebKit::MonotonicObjectIdentifier::operator>= const): (WebKit::MonotonicObjectIdentifier::operator< const): (WebKit::MonotonicObjectIdentifier::operator<= const): (WebKit::MonotonicObjectIdentifier::operator!= const): (WebKit::MonotonicObjectIdentifier::increment): (WebKit::MonotonicObjectIdentifier::next const): (WebKit::MonotonicObjectIdentifier::toUInt64 const): (WebKit::MonotonicObjectIdentifier::operator bool const): (WebKit::MonotonicObjectIdentifier::loggingString const): (WebKit::MonotonicObjectIdentifier::hashTableDeletedValue): (WebKit::MonotonicObjectIdentifier::isValidIdentifier): (WebKit::operator<<): * Shared/RenderingUpdateID.h: Added. * Shared/TransactionID.h: (WebKit::MonotonicObjectIdentifier::MonotonicObjectIdentifier): Deleted. (WebKit::MonotonicObjectIdentifier::isHashTableDeletedValue const): Deleted. (WebKit::MonotonicObjectIdentifier::encode const): Deleted. (WebKit::MonotonicObjectIdentifier::decode): Deleted. (WebKit::MonotonicObjectIdentifier::operator== const): Deleted. (WebKit::MonotonicObjectIdentifier::operator> const): Deleted. (WebKit::MonotonicObjectIdentifier::operator>= const): Deleted. (WebKit::MonotonicObjectIdentifier::operator< const): Deleted. (WebKit::MonotonicObjectIdentifier::operator<= const): Deleted. (WebKit::MonotonicObjectIdentifier::operator!= const): Deleted. (WebKit::MonotonicObjectIdentifier::increment): Deleted. (WebKit::MonotonicObjectIdentifier::next const): Deleted. (WebKit::MonotonicObjectIdentifier::toUInt64 const): Deleted. (WebKit::MonotonicObjectIdentifier::operator bool const): Deleted. (WebKit::MonotonicObjectIdentifier::loggingString const): Deleted. (WebKit::MonotonicObjectIdentifier::hashTableDeletedValue): Deleted. (WebKit::MonotonicObjectIdentifier::isValidIdentifier): Deleted. (WebKit::operator<<): Deleted. * WebKit.xcodeproj/project.pbxproj: * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp: (WebKit::RemoteRenderingBackendProxy::gpuProcessConnectionDidClose): (WebKit::RemoteRenderingBackendProxy::finalizeRenderingUpdate): (WebKit::RemoteRenderingBackendProxy::didFinalizeRenderingUpdate): * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h: (WebKit::RemoteRenderingBackendProxy::renderingUpdateID const): (WebKit::RemoteRenderingBackendProxy::delayedRenderingUpdateCount const): * WebProcess/GPU/graphics/RemoteRenderingBackendProxy.messages.in: * WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp: (WebKit::RemoteResourceCacheProxy::cacheFont): (WebKit::RemoteResourceCacheProxy::prepareForNextRenderingUpdate): (WebKit::RemoteResourceCacheProxy::clearFontMap): (WebKit::RemoteResourceCacheProxy::finalizeRenderingUpdateForFonts): (WebKit::RemoteResourceCacheProxy::finalizeRenderingUpdate): (WebKit::RemoteResourceCacheProxy::didFinalizeRenderingUpdate): Deleted. * WebProcess/GPU/graphics/RemoteResourceCacheProxy.h: * WebProcess/WebCoreSupport/WebChromeClient.cpp: (WebKit::WebChromeClient::canTriggerRenderingUpdate const): * WebProcess/WebCoreSupport/WebChromeClient.h: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::canTriggerRenderingUpdate const): (WebKit::WebPage::finalizeRenderingUpdate): * WebProcess/WebPage/WebPage.h: Canonical link: https://commits.webkit.org/239984@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@280337 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-07-27 04:42:55 +00:00
unsigned m_rescheduledRenderingUpdateCount { 0 };
Allow non-60fps display updates to be driven by DisplayRefreshMonitor https://bugs.webkit.org/show_bug.cgi?id=223912 Reviewed by Sam Weinig. Source/WebCore: Previously, RenderingUpdateScheduler::scheduleAnimation() would return false for any preferredFramesPerSecond which is not 60fps, causing RenderingUpdateScheduler to fall back to its timer mechanism. This meant that throttled (e.g. by low power) pages and display updates on non-60fps display would all use timers. This is undesirable because we want alignment with display refresh, and to avoid timer drift between multiple throttled documents. The fix has two parts. First, we need to fix RenderingUpdateScheduler and ScriptedAnimationController to compute their frame rates in terms of FramesPerSecond, rather than Seconds, because using the latter requires conversion to Seconds and back via m_page.preferredRenderingUpdateInterval() which was awkward. So have Page expose preferredRenderingUpdateFramesPerSecond(). Also add preferredFramesPerSecond(), and have both it and preferredFrameInterval() take the "near 60fps" flag as an argument, so doing the common math in AnimationFrameRate. The second part of the fix is to move "preferredFramesPerSecond" from RenderingUpdateScheduler to DisplayRefreshMonitorClient, since clients should be able to request different frame rates. Then we pass the DisplayUpdate to DisplayRefreshMonitorClient::fireDisplayRefreshIfNeeded(), and finally use it to do the math of whether to skip an update for this client. Tested by API tests in AnimationFrameRate.cpp, and by fast/animation/request-animation-frame-throttling-lowPowerMode.html * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::interval const): This function (used for testing) is just a synonym for preferredScriptedAnimationInterval(), but left here because it's exported and maybe the compiler can inline preferredScriptedAnimationInterval(). (WebCore::ScriptedAnimationController::preferredScriptedAnimationInterval const): Just call preferredFrameInterval() with throttlingReasons(), which is the union of the reasons for the page and for this ScriptedAnimationController. (WebCore::ScriptedAnimationController::throttlingReasons const): No reason not to return m_throttlingReasons if we don't have a page. Should never happen. (WebCore::ScriptedAnimationController::shouldRescheduleRequestAnimationFrame const): Logging. (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): Logging. * page/Page.cpp: (WebCore::Page::windowScreenDidChange): The display nominal FPS may have changed so recompute the update frequency. (WebCore::Page::preferredRenderingUpdateFramesPerSecond const): Return the preferred update in FramesPerSecond. Will return null if throttling results in a < 1fps update. (WebCore::Page::preferredRenderingUpdateInterval const): Push the "near 60fps" logic into the helper function. (WebCore::Page::setIsVisuallyIdleInternal): Clearer to use OptionSet<>::set(). (WebCore::Page::handleLowModePowerChange): Ditto. * page/Page.h: (WebCore::Page::displayNominalFramesPerSecond const): (WebCore::Page::throttlingReasons const): * page/RenderingUpdateScheduler.cpp: (WebCore::RenderingUpdateScheduler::scheduleAnimation): Remove code that fell back to a timer for any non-60fps rate. (WebCore::RenderingUpdateScheduler::adjustRenderingUpdateFrequency): Compute if we have to use a timer. (WebCore::RenderingUpdateScheduler::scheduleRenderingUpdate): (WebCore::RenderingUpdateScheduler::setPreferredFramesPerSecond): Deleted. * page/RenderingUpdateScheduler.h: * platform/graphics/AnimationFrameRate.cpp: Simplify some code with halfSpeedThrottlingReasons. (WebCore::preferredFramesPerSecond): Similar logic to preferredFrameInterval, but for FramesPerSecond values. (WebCore::preferredFrameInterval): * platform/graphics/AnimationFrameRate.h: * platform/graphics/DisplayRefreshMonitor.cpp: (WebCore::DisplayRefreshMonitor::displayDidRefresh): * platform/graphics/DisplayRefreshMonitorClient.cpp: (WebCore::DisplayRefreshMonitorClient::setPreferredFramesPerSecond): (WebCore::DisplayRefreshMonitorClient::fireDisplayRefreshIfNeeded): * platform/graphics/DisplayRefreshMonitorClient.h: (WebCore::DisplayRefreshMonitorClient::preferredFramesPerSecond const): * platform/graphics/DisplayUpdate.cpp: (WebCore::DisplayUpdate::relevantForUpdateFrequency const): Compute whether this update is relevant for a client who wants updates at 'preferredFramesPerSecond'. * platform/graphics/DisplayUpdate.h: Source/WebKit: Improve the logging. * UIProcess/mac/DisplayLink.cpp: (WebKit::DisplayLink::DisplayLink): (WebKit::DisplayLink::addObserver): Tools: New API tests for preferredFramesPerSecond() and DisplayUpdate::relevantForUpdateFrequency(), and duplicate existing tests for the "use display nominal FPS" vs "use near-60 FPS" settings. * TestWebKitAPI/Tests/WebCore/AnimationFrameRate.cpp: (TestWebKitAPI::TEST): git-svn-id: https://svn.webkit.org/repository/webkit/trunk@275215 268f45cc-cd09-0410-ab3c-d52691b4dbfc Canonical link: https://commits.webkit.org/235909@main
2021-03-30 18:14:26 +00:00
bool m_useTimer { false };
Redundant rendering updates can be scheduled from inside Page::updateRendering() https://bugs.webkit.org/show_bug.cgi?id=216726 Reviewed by Tim Horton. Source/WebCore: The basic model for scheduling rendering updates is that code that needs to trigger an update just calls Page::schedule[Timed]RenderingUpdate(). However, if Page::updateRendering() is already on the stack, and the work to be scheduled will happen later in the current update, we don't have to schedule a new one. To fix this Page::updateRendering() and related functions track which steps remain in the current update, and callers of schedule[Timed]RenderingUpdate() pass the update steps for the work they need to trigger. If the requested steps are included in the remaining steps no new update needs to be scheduled. Note that requesting a step while that step is being executed has to schedule an upate (e.g. requestAnimationFrame inside its own callback has to schedule). At the end of an update, if there are any unfulfilled steps, then we schedule a new update. Add a log channel for EventLoop and and log from various places. In my brief testing, this reduces the number of calls to Page::updateRendering() by 10-25% on some real pages, which could be a significant power saving. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::scheduleAnimationResolution): * display/DisplayLayerController.cpp: (WebCore::Display::LayerController::scheduleRenderingUpdate): * dom/Document.cpp: (WebCore::Document::setNeedsDOMWindowResizeEvent): (WebCore::Document::setNeedsVisualViewportResize): (WebCore::Document::addPendingScrollEventTarget): (WebCore::Document::setNeedsVisualViewportScrollEvent): (WebCore::Document::serviceRequestAnimationFrameCallbacks): (WebCore::Document::intersectionObserversInitialUpdateTimerFired): (WebCore::Document::scheduleRenderingUpdate): (WebCore::Document::scheduleInitialIntersectionObservationUpdate): (WebCore::Document::updateResizeObservations): (WebCore::Document::updateAnimationsAndSendEvents): * dom/Document.h: * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::scheduleAnimation): * page/EventHandler.cpp: (WebCore::EventHandler::scheduleCursorUpdate): * page/FrameView.cpp: (WebCore::FrameView::setViewExposedRect): * page/Page.cpp: (WebCore::Page::updateStyleAfterChangeInEnvironment): (WebCore::Page::scheduleRenderingUpdate): (WebCore::Page::computeUnfulfilledRenderingSteps): (WebCore::Page::triggerRenderingUpdateForTesting): (WebCore::Page::updateRendering): (WebCore::Page::isolatedUpdateRendering): (WebCore::Page::doAfterUpdateRendering): (WebCore::Page::finalizeRenderingUpdate): (WebCore::Page::renderingUpdateCompleted): (WebCore::Page::accessibilitySettingsDidChange): (WebCore::Page::appearanceDidChange): (WebCore::operator<<): * page/Page.h: * page/PageOverlayController.cpp: (WebCore::PageOverlayController::didChangeViewExposedRect): (WebCore::PageOverlayController::notifyFlushRequired): * page/RenderingUpdateScheduler.cpp: (WebCore::RenderingUpdateScheduler::scheduleAnimation): (WebCore::RenderingUpdateScheduler::scheduleRenderingUpdate): (WebCore::RenderingUpdateScheduler::startTimer): (WebCore::RenderingUpdateScheduler::displayRefreshFired): * page/RenderingUpdateScheduler.h: * page/ResizeObserver.cpp: (WebCore::ResizeObserver::observe): * page/WheelEventTestMonitor.cpp: (WebCore::WheelEventTestMonitor::setTestCallbackAndStartMonitoring): (WebCore::WheelEventTestMonitor::scheduleCallbackCheck): * page/mac/ServicesOverlayController.mm: (WebCore::ServicesOverlayController::Highlight::notifyFlushRequired): * page/scrolling/AsyncScrollingCoordinator.cpp: (WebCore::AsyncScrollingCoordinator::setEventTrackingRegionsDirty): * page/scrolling/mac/ScrollingCoordinatorMac.mm: (WebCore::ScrollingCoordinatorMac::scheduleTreeStateCommit): * platform/Logging.cpp: (WebCore::initializeLogChannelsIfNecessary): * platform/Logging.h: * rendering/RenderElement.cpp: (WebCore::RenderElement::scheduleRenderingUpdateForImage): * rendering/RenderLayerBacking.cpp: (WebCore::RenderLayerBacking::notifyFlushRequired): * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::scheduleRenderingUpdate): * rendering/RenderLayerCompositor.h: Source/WebKit: Schedule for layer flush. * WebProcess/WebPage/CoordinatedGraphics/LayerTreeHostTextureMapper.cpp: (WebKit::LayerTreeHost::layerFlushTimerFired): Source/WebKitLegacy/mac: Provide the flags. * WebView/WebView.mm: (-[WebView _scheduleRenderingUpdateForPendingTileCacheRepaint]): Source/WTF: Make it possible to dump Vectors with inline capacity. * wtf/text/TextStream.h: (WTF::operator<<): Canonical link: https://commits.webkit.org/230165@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@268075 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-10-06 21:33:42 +00:00
bool m_scheduled { false };
[Web Animations] Ensure animations are updated prior to requestAnimationFrame callbacks https://bugs.webkit.org/show_bug.cgi?id=186997 <rdar://problem/41419414> Reviewed by Dean Jackson. LayoutTests/imported/mozilla: Mark progressions in the Mozilla CSS Animations tests. * css-animations/test_animation-pausing-expected.txt: Source/WebCore: Some sub-tests of imported/mozilla/css-animations/test_animation-pausing.html clearly expect that animations would be resolved prior to firing a requestAnimationFrame() callback, as the HTML5 event loop mandates. But until now, both DocumentTimeline and ScriptedAnimationController would make calls to DisplayRefreshMonitorManager::scheduleAnimation() that were not coordinated and so the order in which the DocumentTimeline and ScriptedAnimationController callbacks were performed was not guaranteed. In this patch we add a new DocumentAnimationScheduler class which is created by a Document to manage this specific situation. Now DocumentTimeline and ScriptedAnimationController use this supporting object instead of being their own DisplayRefreshMonitorClient and call scheduleWebAnimationsResolution() and scheduleScriptedAnimationResolution() respectively to indicate the need to schedule an animation through the DisplayRefreshMonitorManager to serve the specific needs of either, or both, classes. Then DocumentAnimationScheduler ensures that Web Animations resolution happens prior to requestAnimationFrame callbacks when both are scheduled. In the future we should be able to move more code from DocumentTimeline and ScriptedAnimationController over to DocumentAnimationScheduler, such as support for throttling and using a timer-based fallback, but this patch provides the minimal functionality required to provide a sounder foundation. * Modules/webvr/VRDisplay.cpp: (WebCore::VRDisplay::requestAnimationFrame): * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * animation/DocumentAnimationScheduler.cpp: Added. (WebCore::DocumentAnimationScheduler::create): (WebCore::DocumentAnimationScheduler::DocumentAnimationScheduler): (WebCore::DocumentAnimationScheduler::detachFromDocument): (WebCore::DocumentAnimationScheduler::scheduleWebAnimationsResolution): (WebCore::DocumentAnimationScheduler::scheduleScriptedAnimationResolution): (WebCore::DocumentAnimationScheduler::displayRefreshFired): (WebCore::DocumentAnimationScheduler::windowScreenDidChange): (WebCore::DocumentAnimationScheduler::createDisplayRefreshMonitor const): * animation/DocumentAnimationScheduler.h: Copied from Source/WebCore/animation/CSSAnimation.h. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::create): (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::windowScreenDidChange): Deleted. (WebCore::DocumentTimeline::createDisplayRefreshMonitor const): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::prepareForDestruction): (WebCore::Document::windowScreenDidChange): (WebCore::Document::requestAnimationFrame): (WebCore::Document::animationScheduler): (WebCore::Document::timeline): * dom/Document.h: * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::ScriptedAnimationController): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): (WebCore::ScriptedAnimationController::windowScreenDidChange): Deleted. (WebCore::ScriptedAnimationController::displayRefreshFired): Deleted. (WebCore::ScriptedAnimationController::createDisplayRefreshMonitor const): Deleted. * dom/ScriptedAnimationController.h: (WebCore::ScriptedAnimationController::create): Canonical link: https://commits.webkit.org/202231@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233140 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-06-25 09:54:34 +00:00
};
requestAnimationFrame should execute before the next frame https://bugs.webkit.org/show_bug.cgi?id=177484 Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2019-04-10 Reviewed by Simon Fraser. LayoutTests/imported/w3c: Add trace points for the page RenderingUpdate. * web-platform-tests/resize-observer/resources/resizeTestHelper.js: Change ResizeTestHelper.TIMEOUT to be 1 second instead of 100 ms which is too short for layout tests. Source/WebCore: This change fixes these issues with animation timing: 1. Calling the requestAnimationFrame callbacks would have happened when the DisplayLink fires. This may have happened even if the frame is missed and no display is committed. 2. Style changes and layout triggered by script could trigger painting at more than 60fps. CoreAnimation commits could happen at more than 60fps, although WindowServer will throttle those, and only some will be shown on the screen. This change introduces a new paint scheduling model where painting is driven by a "RenderingUpdateScheduler", which only triggers paints once per 16.7ms frame. Code that previously scheduled a compositing layer flush now schedules a "RenderingUpdate", and that update is driven by a DisplayRefreshMonitor callback. When the render happens, we service requestAnimationFrame callbacks, Web Animations, intersection observations and resize observations per the "Update the rendering" step of the HTML Event Loop specification: <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. In the future, more rendering steps will be added to this code. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * accessibility/mac/AXObjectCacheMac.mm: (WebCore::AXObjectCache::platformHandleFocusedUIElementChanged): Fix layout tests by adding null check. * animation/DocumentAnimationScheduler.cpp: Removed. * animation/DocumentAnimationScheduler.h: Removed. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::DocumentTimeline): (WebCore::DocumentTimeline::updateThrottlingState): (WebCore::DocumentTimeline::suspendAnimations): (WebCore::DocumentTimeline::resumeAnimations): (WebCore::DocumentTimeline::liveCurrentTime const): (WebCore::DocumentTimeline::currentTime): (WebCore::DocumentTimeline::cacheCurrentTime): (WebCore::DocumentTimeline::animationTimingDidChange): (WebCore::DocumentTimeline::scheduleAnimationResolution): (WebCore::DocumentTimeline::unscheduleAnimationResolution): (WebCore::DocumentTimeline::updateAnimationsAndSendEvents): (WebCore::DocumentTimeline::internalUpdateAnimationsAndSendEvents): (WebCore::DocumentTimeline::scheduleNextTick): (WebCore::DocumentTimeline::updateListOfElementsWithRunningAcceleratedAnimationsForElement): Simplify this function by handling the case of no-animations separately. (WebCore::DocumentTimeline::resolveAnimationsForElement): Simplify the loop and delete hasPendingAcceleratedAnimations because it is initialized to true and is not changed inside the loop. (WebCore::DocumentTimeline::scheduleAnimationResolutionIfNeeded): Deleted. (WebCore::DocumentTimeline::animationResolutionTimerFired): Deleted. * animation/DocumentTimeline.h: * dom/Document.cpp: (WebCore::Document::resolveStyle): There is no need to force update in resolveStyle(). notifyFlushRequired() will be called eventually which will scheduleRenderingUpdate(). (WebCore::Document::prepareForDestruction): (WebCore::Document::updateAnimationsAndSendEvents): (WebCore::Document::serviceRequestAnimationFrameCallbacks): (WebCore::Document::windowScreenDidChange): (WebCore::Document::scheduleRenderingUpdate): (WebCore::Document::updateIntersectionObservations): (WebCore::Document::addResizeObserver): (WebCore::Document::updateResizeObservations): (WebCore::Document::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Document::scheduleResizeObservations): Deleted. (WebCore::Document::animationScheduler): Deleted. No need to schedule web-animations, intersection observations and resize observations updates separately. All of them will be updated through the "Update the rendering" step, i.e. Page::updateRendering(). * dom/Document.h: (WebCore::Document::numberOfIntersectionObservers const): * dom/ScriptedAnimationController.cpp: (WebCore::ScriptedAnimationController::serviceRequestAnimationFrameCallbacks): (WebCore::ScriptedAnimationController::scheduleAnimation): (WebCore::ScriptedAnimationController::animationTimerFired): (WebCore::ScriptedAnimationController::serviceScriptedAnimations): Deleted. (WebCore::ScriptedAnimationController::documentAnimationSchedulerDidFire): Deleted. * dom/ScriptedAnimationController.h: * page/FrameView.cpp: (WebCore::FrameView::didLayout): (WebCore::FrameView::viewportContentsChanged): * page/FrameViewLayoutContext.cpp: (WebCore::FrameViewLayoutContext::layoutTimerFired): * page/IntersectionObserver.cpp: (WebCore::IntersectionObserver::observe): * page/Page.cpp: (WebCore::Page::Page): (WebCore::Page::layoutIfNeeded): (WebCore::Page::updateRendering): (WebCore::Page::renderingUpdateScheduler): (WebCore::Page::willDisplayPage): Deleted. (WebCore::Page::addDocumentNeedingIntersectionObservationUpdate): Deleted. (WebCore::Page::updateIntersectionObservations): Deleted. (WebCore::Page::scheduleForcedIntersectionObservationUpdate): Deleted. (WebCore::Page::hasResizeObservers const): Deleted. (WebCore::Page::gatherDocumentsNeedingResizeObservationCheck): Deleted. (WebCore::Page::checkResizeObservations): Deleted. (WebCore::Page::scheduleResizeObservations): Deleted. (WebCore::Page::notifyResizeObservers): Deleted. * page/Page.h: (WebCore::Page::setNeedsCheckResizeObservations): Deleted. (WebCore::Page::needsCheckResizeObservations const): Deleted. The IntersectionObserver and the ResizeObserver do not need to schedule their own timers. The RenderingUpdateScheduler will schedule the "Update the rendering" step in which these obverses will be served. * page/PageOverlayController.cpp: (WebCore::PageOverlayController::didChangeViewExposedRect): (WebCore::PageOverlayController::notifyFlushRequired): Force committing the layers to be 60 fps at maximum. * page/RenderingUpdateScheduler.cpp: Added. (WebCore::RenderingUpdateScheduler::RenderingUpdateScheduler): (WebCore::RenderingUpdateScheduler::scheduleRenderingUpdate): (WebCore::RenderingUpdateScheduler::isScheduled const): (WebCore::RenderingUpdateScheduler::startTimer): (WebCore::RenderingUpdateScheduler::clearScheduled): (WebCore::RenderingUpdateScheduler::createDisplayRefreshMonitor const): (WebCore::RenderingUpdateScheduler::windowScreenDidChange): (WebCore::RenderingUpdateScheduler::displayRefreshFired): (WebCore::RenderingUpdateScheduler::scheduleCompositingLayerFlush): * page/RenderingUpdateScheduler.h: Added. (WebCore::RenderingUpdateScheduler::create): * page/ResizeObserver.cpp: (WebCore::ResizeObserver::observe): (WebCore::ResizeObserver::scheduleObservations): Deleted. * page/ResizeObserver.h: (WebCore::ResizeObserver::hasActiveObservations const): * page/ios/ContentChangeObserver.h: * page/mac/ServicesOverlayController.mm: (WebCore::ServicesOverlayController::Highlight::notifyFlushRequired): * page/scrolling/ScrollingStateTree.cpp: * rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::scheduleLayerFlushNow): (WebCore::RenderLayerCompositor::layerTreeAsText): Source/WebKit: Replace the calls to Page::layoutIfNeeded() and willDisplayPage() by a single call to Page::updateRendering(). This new function implements "Update the rendering" step of the HTML Event Loop specification <https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering>. * WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp: (WebKit::DrawingAreaCoordinatedGraphics::scheduleCompositingLayerFlush): (WebKit::DrawingAreaCoordinatedGraphics::updateBackingStoreState): (WebKit::DrawingAreaCoordinatedGraphics::display): * WebProcess/WebPage/CoordinatedGraphics/LayerTreeHost.cpp: (WebKit::LayerTreeHost::layerFlushTimerFired): * WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm: (WebKit::RemoteLayerTreeDrawingArea::flushLayers): -- Call Page::updateRendering() to make sure that "Update the rendering" happens immediately before updating the page. -- Move the call to RemoteLayerBackingStoreCollection::willFlushLayers() to be exactly before flushing the layers. This fixes the assertion ASSERT(m_inLayerFlush) which was firing when running a layout test. RemoteLayerTreeDrawingArea::flushLayers() now can call itself through TestRunner::notifyDone(). flushLayers() was calling willFlushLayers() twice before calling didFlushLayers(). * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::layoutIfNeeded): (WebKit::WebPage::updateRendering): (WebKit::WebPage::willDisplayPage): Deleted. * WebProcess/WebPage/WebPage.h: * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: (WebKit::TiledCoreAnimationDrawingArea::flushLayers): Source/WebKitLegacy/mac: * WebView/WebView.mm: (-[WebView _viewWillDrawInternal]): (-[WebView _flushCompositingChanges]): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WebKitLegacy/win: * WebView.cpp: (WebView::updateBackingStore): (WebView::flushPendingGraphicsLayerChangesSoon): (WebView::flushPendingGraphicsLayerChanges): Call Page::updateRendering() which implements "Update the rendering" step of the HTML Event Loop specification. Source/WTF: Add trace points for the page RenderingUpdate. * wtf/SystemTracing.h: Tools: Add trace points for the page RenderingUpdate. * Tracing/SystemTracePoints.plist: LayoutTests: * TestExpectations: There is a slight difference between the actual DRT and the expected DRT due to animation timing change. But these two tests are not animating correctly if they are opened in Safari with web animation turned on. * accessibility/mac/selection-notification-focus-change-expected.txt: * accessibility/mac/selection-notification-focus-change.html: Remove the debug statements form notificationCallback() since the number of times this function is called back and the order of notifications are not defined. This test has been flaky and some trials were made to make it more reliable. With this change it became flaky again. * animations/animation-multiple-callbacks-timestamp.html: Fix variable names used by an error message. * animations/no-style-recalc-during-accelerated-animation-expected.txt: * animations/no-style-recalc-during-accelerated-animation.html: One extra styleReclc was incurred due to the document styleRecalcTimer. I think this timer is not needed anymore. I will look at removing it in a separate patch. * animations/resources/animation-test-helpers.js: (waitForAnimationToStart): The expectation that animation will start at the beginning of the next event loop is not true anymore. The animation will start at the time the requestAnimationFrame fires. * compositing/video/video-clip-change-src.html: This test loads a video data and pushes it to the encoder. Originally it used to wait 150 ms after receiving the second canplaythrough. I had to change this timing to 250 ms. * css3/filters/composited-during-animation.html: Ditto. setTimeout({...}, 0) versus requestAnimationFrame. * media/media-controls-accessibility.html: Updating the accessibility button happens asynchronously, see [WebAccessibilityObjectWrapper accessibilityPerformPressAction]. Due to changing the page update timing, this test became flaky. Originally it used to setTimeout({...}, 10) to ensure the stringValue of the mutate button was changed after it was pressed. The fix is to loop using rAF till the stringValue changes. * platform/mac-wk2/accessibility/mac/selection-notification-focus-change-expected.txt: Removed. The number of time notificationCallback() is called and the order of notifications are not defined. And this is why we have two expected files: one for WK1 and the other for WK2. Since the test is now simplified, we can get rid of this duplication. We will test the minimum reliable thing we can test. Canonical link: https://commits.webkit.org/211093@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@244182 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-04-11 05:44:13 +00:00
}