+2015-05-08 Commit Queue <commit-queue@webkit.org>
+
+ Unreviewed, rolling out r183985.
+ https://bugs.webkit.org/show_bug.cgi?id=144796
+
+ broke loader/go-back-to-different-window-size.html (Requested
+ by kling on #webkit).
+
+ Reverted changeset:
+
+ "Throttle RequestAnimationFrame in subframes that are outside
+ the viewport"
+ https://bugs.webkit.org/show_bug.cgi?id=144718
+ http://trac.webkit.org/changeset/183985
+
2015-05-08 Csaba Osztrogonác <ossy@webkit.org>
REGRESSION(r183072): dfg-put-by-id-prototype-check.js.layout-dfg-eager-no-cjit fails on AArch64 Linux
+++ /dev/null
-Tests that requestAnimationFrame is throttled in subframes that are display:none
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-Frame is initially visibile so requestAnimationFrame should not be throttled
-PASS testFrame.contentWindow.internals.isRequestAnimationFrameThrottled() became false
-PASS testFrame.contentWindow.internals.isRequestAnimationFrameThrottled() is false
-Hiding subframe.
-testFrame.style.display = 'none';
-PASS testFrame.contentWindow.internals.isRequestAnimationFrameThrottled() became true
-PASS testFrame.contentWindow.internals.isRequestAnimationFrameThrottled() is true
-Show subframe again
-testFrame.style.display = 'block';
-PASS testFrame.contentWindow.internals.isRequestAnimationFrameThrottled() became false
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
+++ /dev/null
-<!DOCTYPE html>
-<html>
-<body>
-<script src="../../resources/js-test-pre.js"></script>
-<script>
-description("Tests that requestAnimationFrame is throttled in subframes that are display:none");
-window.jsTestIsAsync = true;
-
-function checkSubframeThrottled()
-{
- shouldBeTrue("testFrame.contentWindow.internals.isRequestAnimationFrameThrottled()");
-
- debug("Show subframe again");
- evalAndLog("testFrame.style.display = 'block';");
-
- shouldBecomeEqual("testFrame.contentWindow.internals.isRequestAnimationFrameThrottled()", "false", finishJSTest);
-}
-
-function hideFrame()
-{
- shouldBeFalse("testFrame.contentWindow.internals.isRequestAnimationFrameThrottled()");
-
- debug("Hiding subframe.");
- evalAndLog("testFrame.style.display = 'none';");
-
- shouldBecomeEqual("testFrame.contentWindow.internals.isRequestAnimationFrameThrottled()", "true", checkSubframeThrottled);
-}
-
-function runTest()
-{
- testFrame = document.getElementById("testFrame");
- debug("Frame is initially visibile so requestAnimationFrame should not be throttled");
- shouldBecomeEqual("testFrame.contentWindow.internals.isRequestAnimationFrameThrottled()", "false", hideFrame);
-}
-
-var i = 0;
-requestAnimationFrame(function() {
- i++;
-});
-</script>
-<iframe id="testFrame" src="resources/requestAnimationFrame-frame.html" onload="runTest()"></iframe>
-<script src="../../resources/js-test-post.js"></script>
-</body>
-</html>
+++ /dev/null
-Tests that requestAnimationFrame is throttled in subframes that are outside the viewport
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-Frame is initially outside the viewport so requestAnimationFrame should be throttled
-PASS testFrame.contentWindow.internals.isRequestAnimationFrameThrottled() became true
-PASS internals.isRequestAnimationFrameThrottled() is false
-PASS testFrame.contentWindow.internals.isRequestAnimationFrameThrottled() is true
-PASS grandChildFrame.contentWindow.internals.isRequestAnimationFrameThrottled() is true
-Scrolling frame into view.
-RequestAnimationFrame should no longer be throttled
-PASS internals.isRequestAnimationFrameThrottled() is false
-PASS grandChildFrame.contentWindow.internals.isRequestAnimationFrameThrottled() is false
-PASS testFrame.contentWindow.internals.isRequestAnimationFrameThrottled() is false
-Scrolling frame out of view again.
-PASS internals.isRequestAnimationFrameThrottled() is false
-PASS testFrame.contentWindow.internals.isRequestAnimationFrameThrottled() became true
-PASS testFrame.contentWindow.internals.isRequestAnimationFrameThrottled() is true
-PASS grandChildFrame.contentWindow.internals.isRequestAnimationFrameThrottled() is true
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
+++ /dev/null
-<!DOCTYPE html>
-<html>
-<body>
-<script src="../../resources/js-test-pre.js"></script>
-<script>
-description("Tests that requestAnimationFrame is throttled in subframes that are outside the viewport");
-window.jsTestIsAsync = true;
-
-function checkSubframesThrottled()
-{
- shouldBeTrue("testFrame.contentWindow.internals.isRequestAnimationFrameThrottled()");
- shouldBeTrue("grandChildFrame.contentWindow.internals.isRequestAnimationFrameThrottled()");
-
- finishJSTest();
-}
-
-function scrollFrameOutOfView()
-{
- debug("Scrolling frame out of view again.");
- window.scroll(0, 0);
-
- shouldBeFalse("internals.isRequestAnimationFrameThrottled()");
- shouldBecomeEqual("testFrame.contentWindow.internals.isRequestAnimationFrameThrottled()", "true", checkSubframesThrottled);
-}
-
-function scrollFrameIntoView()
-{
- shouldBeFalse("internals.isRequestAnimationFrameThrottled()");
- shouldBeTrue("testFrame.contentWindow.internals.isRequestAnimationFrameThrottled()");
- shouldBeTrue("grandChildFrame.contentWindow.internals.isRequestAnimationFrameThrottled()");
-
- debug("Scrolling frame into view.");
- window.internals.scrollElementToRect(testFrame, 0, 0, 300, 300);
-
- debug("RequestAnimationFrame should no longer be throttled");
- shouldBeFalse("internals.isRequestAnimationFrameThrottled()");
- shouldBeFalse("grandChildFrame.contentWindow.internals.isRequestAnimationFrameThrottled()");
- shouldBeFalse("testFrame.contentWindow.internals.isRequestAnimationFrameThrottled()");
-
- scrollFrameOutOfView();
-}
-
-function runTest()
-{
- testFrame = document.getElementById("testFrame");
- grandChildFrame = testFrame.contentDocument.getElementById("grandChildFrame");
- debug("Frame is initially outside the viewport so requestAnimationFrame should be throttled");
- shouldBecomeEqual("testFrame.contentWindow.internals.isRequestAnimationFrameThrottled()", "true", scrollFrameIntoView);
-}
-
-var i = 0;
-requestAnimationFrame(function() {
- i++;
-});
-</script>
-<div style="position: relative; width: 1600px; height: 2400px; background-color: green;">
- <iframe id="testFrame" src="resources/requestAnimationFrame-frame.html" style="position:absolute; left: 600px; top: 800px;" onload="runTest()"></iframe>
-</div>
-<script src="../../resources/js-test-post.js"></script>
-</body>
-</html>
+++ /dev/null
-<!DOCTYPE html>
-<html>
-<body>
-<script>
-var i = 0;
-requestAnimationFrame(function() {
- i++;
-});
-</script>
-</body>
-</html>
+++ /dev/null
-<!DOCTYPE html>
-<html>
-<body>
-<iframe id="grandChildFrame" src="requestAnimationFrame-frame-2.html"></iframe>
-<script>
-var i = 0;
-requestAnimationFrame(function() {
- i++;
-});
-</script>
-</body>
-</html>
+2015-05-08 Commit Queue <commit-queue@webkit.org>
+
+ Unreviewed, rolling out r183985.
+ https://bugs.webkit.org/show_bug.cgi?id=144796
+
+ broke loader/go-back-to-different-window-size.html (Requested
+ by kling on #webkit).
+
+ Reverted changeset:
+
+ "Throttle RequestAnimationFrame in subframes that are outside
+ the viewport"
+ https://bugs.webkit.org/show_bug.cgi?id=144718
+ http://trac.webkit.org/changeset/183985
+
2015-05-08 Youenn Fablet <youenn.fablet@crf.canon.fr>
SharedBuffer::m_size should be initialized to 0 when defining it
virtual void postTask(Task) override final; // Executes the task on context's thread asynchronously.
-#if ENABLE(REQUEST_ANIMATION_FRAME)
- ScriptedAnimationController* scriptedAnimationController() { return m_scriptedAnimationController.get(); }
-#endif
void suspendScriptedAnimationControllerCallbacks();
void resumeScriptedAnimationControllerCallbacks();
void scriptedAnimationControllerSetThrottled(bool);
#include "DocumentLoader.h"
#include "FrameView.h"
#include "InspectorInstrumentation.h"
-#include "Logging.h"
-#include "MainFrame.h"
#include "RequestAnimationFrameCallback.h"
#include "Settings.h"
#include <wtf/Ref.h>
if (m_isThrottled == isThrottled)
return;
- LOG(Animations, "%p - Setting RequestAnimationFrame throttling state to %d in frame %p (isMainFrame: %d)", this, isThrottled, m_document->frame(), m_document->frame() ? m_document->frame()->isMainFrame() : 0);
-
m_isThrottled = isThrottled;
if (m_animationTimer.isActive()) {
m_animationTimer.stop();
#endif
}
-bool ScriptedAnimationController::isThrottled() const
-{
-#if USE(REQUEST_ANIMATION_FRAME_TIMER) && USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
- return m_isThrottled;
-#else
- return false;
-#endif
-}
-
ScriptedAnimationController::CallbackId ScriptedAnimationController::registerCallback(PassRefPtr<RequestAnimationFrameCallback> callback)
{
ScriptedAnimationController::CallbackId id = ++m_nextCallbackId;
void suspend();
void resume();
void setThrottled(bool);
- WEBCORE_EXPORT bool isThrottled() const;
void windowScreenDidChange(PlatformDisplayID);
#include "RenderWidget.h"
#include "SVGDocument.h"
#include "SVGSVGElement.h"
-#include "ScriptedAnimationController.h"
#include "ScrollAnimator.h"
#include "ScrollingCoordinator.h"
#include "Settings.h"
void FrameView::viewportContentsChanged()
{
- if (!frame().view()) {
- // The frame is being destroyed.
- return;
- }
-
// When the viewport contents changes (scroll, resize, style recalc, layout, ...),
// check if we should resume animated images or unthrottle DOM timers.
- applyRecursivelyWithVisibleRect([] (FrameView& frameView, const IntRect& visibleRect) {
- frameView.resumeVisibleImageAnimations(visibleRect);
- frameView.updateThrottledDOMTimersState(visibleRect);
- frameView.updateScriptedAnimationsThrottlingState(visibleRect);
- });
+ resumeVisibleImageAnimationsIncludingSubframes();
+ updateThrottledDOMTimersState();
}
bool FrameView::fixedElementsLayoutRelativeToFrame() const
viewportContentsChanged();
}
-void FrameView::applyRecursivelyWithVisibleRect(const std::function<void (FrameView& frameView, const IntRect& visibleRect)>& apply)
+void FrameView::resumeVisibleImageAnimationsIncludingSubframes()
{
+ auto* renderView = frame().contentRenderer();
+ if (!renderView)
+ return;
+
IntRect windowClipRect = this->windowClipRect();
auto visibleRect = windowToContents(windowClipRect);
- apply(*this, visibleRect);
+ if (visibleRect.isEmpty())
+ return;
+
+ // Resume paused image animations in this frame.
+ renderView->resumePausedImageAnimationsIfNeeded(visibleRect);
// Recursive call for subframes. We cache the current FrameView's windowClipRect to avoid recomputing it for every subframe.
TemporaryChange<IntRect*> windowClipRectCache(m_cachedWindowClipRect, &windowClipRect);
for (Frame* childFrame = frame().tree().firstChild(); childFrame; childFrame = childFrame->tree().nextSibling()) {
if (auto* childView = childFrame->view())
- childView->applyRecursivelyWithVisibleRect(apply);
+ childView->resumeVisibleImageAnimationsIncludingSubframes();
}
}
-void FrameView::resumeVisibleImageAnimations(const IntRect& visibleRect)
-{
- if (visibleRect.isEmpty())
- return;
-
- if (auto* renderView = frame().contentRenderer())
- renderView->resumePausedImageAnimationsIfNeeded(visibleRect);
-}
-
-void FrameView::updateScriptedAnimationsThrottlingState(const IntRect& visibleRect)
-{
-#if ENABLE(REQUEST_ANIMATION_FRAME)
- if (frame().isMainFrame())
- return;
-
- auto* document = frame().document();
- if (!document)
- return;
-
- auto* scriptedAnimationController = document->scriptedAnimationController();
- if (!scriptedAnimationController)
- return;
-
- // FIXME: This doesn't work for subframes of a "display: none" frame because
- // they have a non-null ownerRenderer.
- bool shouldThrottle = !frame().ownerRenderer() || visibleRect.isEmpty();
- scriptedAnimationController->setThrottled(shouldThrottle);
-#else
- UNUSED_PARAM(visibleRect);
-#endif
-}
-
-
-void FrameView::resumeVisibleImageAnimationsIncludingSubframes()
-{
- applyRecursivelyWithVisibleRect([] (FrameView& frameView, const IntRect& visibleRect) {
- frameView.resumeVisibleImageAnimations(visibleRect);
- });
-}
-
void FrameView::updateLayerPositionsAfterScrolling()
{
// If we're scrolling as a result of updating the view size after layout, we'll update widgets and layer positions soon anyway.
m_throttledTimers.remove(timer);
}
-void FrameView::updateThrottledDOMTimersState(const IntRect& visibleRect)
+void FrameView::updateThrottledDOMTimersState()
{
if (m_throttledTimers.isEmpty())
return;
+ IntRect visibleRect = windowToContents(windowClipRect());
+
// Do not iterate over the HashSet because calling DOMTimer::updateThrottlingStateAfterViewportChange()
// may cause timers to remove themselves from it while we are iterating.
Vector<DOMTimer*> timers;
void forceLayoutParentViewIfNeeded();
void performPostLayoutTasks();
void autoSizeIfEnabled();
-
- void applyRecursivelyWithVisibleRect(const std::function<void (FrameView& frameView, const IntRect& visibleRect)>&);
- void updateThrottledDOMTimersState(const IntRect& visibleRect);
- void resumeVisibleImageAnimations(const IntRect& visibleRect);
- void updateScriptedAnimationsThrottlingState(const IntRect& visibleRect);
+ void updateThrottledDOMTimersState();
void updateLayerFlushThrottling();
WEBCORE_EXPORT void adjustTiledBackingCoverage();
#include "RenderedDocumentMarker.h"
#include "RuntimeEnabledFeatures.h"
#include "SchemeRegistry.h"
-#include "ScriptedAnimationController.h"
#include "ScrollingCoordinator.h"
#include "SerializedScriptValue.h"
#include "Settings.h"
return timer->m_throttleState == DOMTimer::ShouldThrottle;
}
-bool Internals::isRequestAnimationFrameThrottled() const
-{
-#if ENABLE(REQUEST_ANIMATION_FRAME)
- auto* scriptedAnimationController = contextDocument()->scriptedAnimationController();
- if (!scriptedAnimationController)
- return false;
- return scriptedAnimationController->isThrottled();
-#else
- return false;
-#endif
-}
-
String Internals::visiblePlaceholder(Element* element)
{
if (is<HTMLTextFormControlElement>(element)) {
// DOMTimers throttling testing.
bool isTimerThrottled(int timeoutId, ExceptionCode&);
- bool isRequestAnimationFrameThrottled() const;
// Spatial Navigation testing.
unsigned lastSpatialNavigationCandidateCount(ExceptionCode&) const;
// Query if a timer is currently throttled, to debug timer throttling.
[RaisesException] boolean isTimerThrottled(long timerHandle);
- boolean isRequestAnimationFrameThrottled();
-
[RaisesException] void startTrackingStyleRecalcs();
[RaisesException] unsigned long styleRecalcCount();