Should reduce tile coverage for the first paint after a tab switch.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 24 Jun 2015 02:09:24 +0000 (02:09 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 24 Jun 2015 02:09:24 +0000 (02:09 +0000)
<https://webkit.org/b/146252>
<rdar://problem/19821583>

Reviewed by Darin Adler.

Reduce the number of tiles we need to paint after switching tabs,
to shorten the time it takes before we can flush pixels to screen.

We accomplish this by piggybacking on the "speculative tiling enabled"
mode of FrameView, which was previously only used to throttle painting
and layer flushes during page load.

When a FrameView becomes visible, which is what happens when you
switch to its tab, we revert the speculative tiling optimization to
its initial state, and reset the "scrolled by user" flag.

In practice this means that after switching tabs, we only generate
enough tiles to fill the viewport. Then, after 500ms has passed
or the user scrolls the page, we go back to the usual speculative
tiling mode.

* page/FrameView.cpp:
(WebCore::FrameView::show):

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

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

index 485536c..4d6d7a6 100644 (file)
@@ -1,3 +1,30 @@
+2015-06-23  Andreas Kling  <akling@apple.com>
+
+        Should reduce tile coverage for the first paint after a tab switch.
+        <https://webkit.org/b/146252>
+        <rdar://problem/19821583>
+
+        Reviewed by Darin Adler.
+
+        Reduce the number of tiles we need to paint after switching tabs,
+        to shorten the time it takes before we can flush pixels to screen.
+
+        We accomplish this by piggybacking on the "speculative tiling enabled"
+        mode of FrameView, which was previously only used to throttle painting
+        and layer flushes during page load.
+
+        When a FrameView becomes visible, which is what happens when you
+        switch to its tab, we revert the speculative tiling optimization to
+        its initial state, and reset the "scrolled by user" flag.
+
+        In practice this means that after switching tabs, we only generate
+        enough tiles to fill the viewport. Then, after 500ms has passed
+        or the user scrolls the page, we go back to the usual speculative
+        tiling mode.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::show):
+
 2015-06-23  Anders Carlsson  <andersca@apple.com>
 
         Remove windowResizerRect code, nobody is using it anymore
index 37599ea..24c2592 100644 (file)
@@ -2485,6 +2485,19 @@ void FrameView::speculativeTilingEnableTimerFired()
     adjustTiledBackingCoverage();
 }
 
+void FrameView::show()
+{
+    ScrollView::show();
+
+    if (frame().isMainFrame()) {
+        // Turn off speculative tiling for a brief moment after a FrameView appears on screen.
+        // Note that adjustTiledBackingCoverage() kicks the (500ms) timer to re-enable it.
+        m_speculativeTilingEnabled = false;
+        m_wasScrolledByUser = false;
+        adjustTiledBackingCoverage();
+    }
+}
+
 void FrameView::layoutTimerFired()
 {
 #ifdef INSTRUMENT_LAYOUT_SCHEDULING
index 451007d..aec16da 100644 (file)
@@ -544,6 +544,8 @@ public:
 
     void didChangeScrollOffset();
 
+    void show() override;
+
 protected:
     virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect) override;
     virtual void scrollContentsSlowPath(const IntRect& updateRect) override;