Compositing layer sync should cause deferred repaints to be fired immediately
authortimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 2 Jul 2012 22:14:54 +0000 (22:14 +0000)
committertimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 2 Jul 2012 22:14:54 +0000 (22:14 +0000)
https://bugs.webkit.org/show_bug.cgi?id=90401
<rdar://problem/11792028>

Reviewed by Simon Fraser and Antti Koivisto.

If we sync compositing layers and allow the repaint to be deferred, there is time for a
visible flash to occur. Instead, stop the deferred repaint timer and repaint immediately.

No new tests, configuration and timing dependent.

* page/FrameView.cpp:
(WebCore::FrameView::syncCompositingStateForThisFrame):
(WebCore::FrameView::checkStopDelayingDeferredRepaints):
(WebCore::FrameView::stopDelayingDeferredRepaints): Split off from checkStopDelayingDeferredRepaints.
* page/FrameView.h:
(FrameView): Add stopDelayingDeferredRepaints.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@121708 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/page/FrameView.cpp
Source/WebCore/page/FrameView.h

index fe21fbd..19e806a 100644 (file)
@@ -1,3 +1,23 @@
+2012-07-02  Tim Horton  <timothy_horton@apple.com>
+
+        Compositing layer sync should cause deferred repaints to be fired immediately
+        https://bugs.webkit.org/show_bug.cgi?id=90401
+        <rdar://problem/11792028>
+
+        Reviewed by Simon Fraser and Antti Koivisto.
+
+        If we sync compositing layers and allow the repaint to be deferred, there is time for a
+        visible flash to occur. Instead, stop the deferred repaint timer and repaint immediately.
+
+        No new tests, configuration and timing dependent.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::syncCompositingStateForThisFrame):
+        (WebCore::FrameView::checkStopDelayingDeferredRepaints):
+        (WebCore::FrameView::stopDelayingDeferredRepaints): Split off from checkStopDelayingDeferredRepaints.
+        * page/FrameView.h:
+        (FrameView): Add stopDelayingDeferredRepaints.
+
 2012-07-02  Benjamin Poulain  <bpoulain@apple.com>
 
         Do not do any logging initialization when logging is disabled
index 910463f..90ce8d3 100644 (file)
@@ -745,6 +745,10 @@ bool FrameView::syncCompositingStateForThisFrame(Frame* rootFrameForSync)
     if (needsLayout())
         return false;
 
+    // If we sync compositing layers and allow the repaint to be deferred, there is time for a
+    // visible flash to occur. Instead, stop the deferred repaint timer and repaint immediately.
+    stopDelayingDeferredRepaints();
+
     root->compositor()->flushPendingLayerChanges(rootFrameForSync == m_frame);
 
     return true;
@@ -1929,13 +1933,18 @@ void FrameView::startDeferredRepaintTimer(double delay)
 
 void FrameView::checkStopDelayingDeferredRepaints()
 {
-    if (!m_deferredRepaintTimer.isActive())
-        return;
-
     Document* document = m_frame->document();
     if (document && (document->parsing() || document->cachedResourceLoader()->requestCount()))
         return;
+
+    stopDelayingDeferredRepaints();
+}
     
+void FrameView::stopDelayingDeferredRepaints()
+{
+    if (!m_deferredRepaintTimer.isActive())
+        return;
+
     m_deferredRepaintTimer.stop();
 
     doDeferredRepaints();
index 8ccbe8c..08ceeff 100644 (file)
@@ -209,6 +209,7 @@ public:
     void beginDeferredRepaints();
     void endDeferredRepaints();
     void checkStopDelayingDeferredRepaints();
+    void stopDelayingDeferredRepaints();
     void startDeferredRepaintTimer(double delay);
     void resetDeferredRepaintDelay();