Title: [162640] trunk/Source/WebCore
Revision
162640
Author
an...@apple.com
Date
2014-01-23 14:03:27 -0800 (Thu, 23 Jan 2014)

Log Message

Don't enable speculative tiles immediately after main load stops progressing
https://bugs.webkit.org/show_bug.cgi?id=127507

Reviewed by Andreas Kling.

It is common for timers and events to trigger more loading after the initial main frame loading
has completed. We should delay a bit before enabling speculative tiles and keep them disabled 
if loading still continues.

* page/FrameView.cpp:
(WebCore::FrameView::FrameView):
(WebCore::FrameView::adjustTiledBackingCoverage):
(WebCore::shouldEnableSpeculativeTilingDuringLoading):
(WebCore::FrameView::enableSpeculativeTilingIfNeeded):
        
    When load progression stops wait 0.5s before enabling speculative tiles.

(WebCore::FrameView::speculativeTilingEnableTimerFired):
        
    Don't enable speculative tiles if the progression has started again. Instead restart the timer.

* page/FrameView.h:
* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::RenderLayerBacking):
(WebCore::computeTileCoverage):
        
    Move the FrameView level code to FrameView (so we don't need to add a timer to every RenderLayerBacking).

* rendering/RenderLayerBacking.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (162639 => 162640)


--- trunk/Source/WebCore/ChangeLog	2014-01-23 22:01:23 UTC (rev 162639)
+++ trunk/Source/WebCore/ChangeLog	2014-01-23 22:03:27 UTC (rev 162640)
@@ -1,5 +1,37 @@
 2014-01-23  Antti Koivisto  <an...@apple.com>
 
+        Don't enable speculative tiles immediately after main load stops progressing
+        https://bugs.webkit.org/show_bug.cgi?id=127507
+
+        Reviewed by Andreas Kling.
+
+        It is common for timers and events to trigger more loading after the initial main frame loading
+        has completed. We should delay a bit before enabling speculative tiles and keep them disabled 
+        if loading still continues.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::FrameView):
+        (WebCore::FrameView::adjustTiledBackingCoverage):
+        (WebCore::shouldEnableSpeculativeTilingDuringLoading):
+        (WebCore::FrameView::enableSpeculativeTilingIfNeeded):
+        
+            When load progression stops wait 0.5s before enabling speculative tiles.
+
+        (WebCore::FrameView::speculativeTilingEnableTimerFired):
+        
+            Don't enable speculative tiles if the progression has started again. Instead restart the timer.
+
+        * page/FrameView.h:
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::RenderLayerBacking::RenderLayerBacking):
+        (WebCore::computeTileCoverage):
+        
+            Move the FrameView level code to FrameView (so we don't need to add a timer to every RenderLayerBacking).
+
+        * rendering/RenderLayerBacking.h:
+
+2014-01-23  Antti Koivisto  <an...@apple.com>
+
         Loads started soon after main frame completion should be considered part of the main load
         https://bugs.webkit.org/show_bug.cgi?id=127504
 

Modified: trunk/Source/WebCore/page/FrameView.cpp (162639 => 162640)


--- trunk/Source/WebCore/page/FrameView.cpp	2014-01-23 22:01:23 UTC (rev 162639)
+++ trunk/Source/WebCore/page/FrameView.cpp	2014-01-23 22:03:27 UTC (rev 162640)
@@ -204,6 +204,8 @@
     , m_exposedRect(FloatRect::infiniteRect())
     , m_deferSetNeedsLayouts(0)
     , m_setNeedsLayoutWasDeferred(false)
+    , m_speculativeTilingEnabled(false)
+    , m_speculativeTilingEnableTimer(this, &FrameView::speculativeTilingEnableTimerFired)
 #if PLATFORM(IOS)
     , m_useCustomFixedPositionLayoutRect(false)
 #endif
@@ -2426,6 +2428,9 @@
 
 void FrameView::adjustTiledBackingCoverage()
 {
+    if (!m_speculativeTilingEnabled)
+        enableSpeculativeTilingIfNeeded();
+
 #if USE(ACCELERATED_COMPOSITING)
     RenderView* renderView = this->renderView();
     if (renderView && renderView->layer()->backing())
@@ -2433,10 +2438,39 @@
 #endif
 #if PLATFORM(IOS)
     if (TileCache* tileCache = this->tileCache())
-        tileCache->setSpeculativeTileCreationEnabled(!m_frame->page()->progress().isMainLoadProgressing());
+        tileCache->setSpeculativeTileCreationEnabled(m_speculativeTilingEnabled);
 #endif
 }
 
+static bool shouldEnableSpeculativeTilingDuringLoading(const FrameView& view)
+{
+    return view.isVisuallyNonEmpty() && !view.frame().page()->progress().isMainLoadProgressing();
+}
+
+void FrameView::enableSpeculativeTilingIfNeeded()
+{
+    ASSERT(!m_speculativeTilingEnabled);
+    if (m_wasScrolledByUser) {
+        m_speculativeTilingEnabled = true;
+        return;
+    }
+    if (!shouldEnableSpeculativeTilingDuringLoading(*this))
+        return;
+    if (m_speculativeTilingEnableTimer.isActive())
+        return;
+    // Delay enabling a bit as load completion may trigger further loading from scripts.
+    static const double speculativeTilingEnableDelay = 0.5;
+    m_speculativeTilingEnableTimer.startOneShot(speculativeTilingEnableDelay);
+}
+
+void FrameView::speculativeTilingEnableTimerFired(Timer<FrameView>&)
+{
+    if (m_speculativeTilingEnabled)
+        return;
+    m_speculativeTilingEnabled = shouldEnableSpeculativeTilingDuringLoading(*this);
+    adjustTiledBackingCoverage();
+}
+
 void FrameView::layoutTimerFired(Timer<FrameView>&)
 {
 #ifdef INSTRUMENT_LAYOUT_SCHEDULING

Modified: trunk/Source/WebCore/page/FrameView.h (162639 => 162640)


--- trunk/Source/WebCore/page/FrameView.h	2014-01-23 22:01:23 UTC (rev 162639)
+++ trunk/Source/WebCore/page/FrameView.h	2014-01-23 22:03:27 UTC (rev 162640)
@@ -269,6 +269,7 @@
 
     void updateLayerFlushThrottlingInAllFrames();
     void adjustTiledBackingCoverage();
+    bool speculativeTilingEnabled() const { return m_speculativeTilingEnabled; }
 
 #if ENABLE(DASHBOARD_SUPPORT) || ENABLE(DRAGGABLE_REGION)
     void updateAnnotatedRegions();
@@ -557,6 +558,9 @@
     void updateDeferredRepaintDelayAfterRepaint();
     double adjustedDeferredRepaintDelay() const;
 
+    void enableSpeculativeTilingIfNeeded();
+    void speculativeTilingEnableTimerFired(Timer<FrameView>&);
+
     bool updateEmbeddedObjects();
     void updateEmbeddedObject(RenderEmbeddedObject&);
     void scrollToAnchor();
@@ -664,6 +668,9 @@
     // Renderer to hold our custom scroll corner.
     RenderPtr<RenderScrollbarPart> m_scrollCorner;
 
+    bool m_speculativeTilingEnabled;
+    Timer<FrameView> m_speculativeTilingEnableTimer;
+
 #if PLATFORM(IOS)
     bool m_useCustomFixedPositionLayoutRect;
     IntRect m_customFixedPositionLayoutRect;

Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (162639 => 162640)


--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2014-01-23 22:01:23 UTC (rev 162639)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2014-01-23 22:03:27 UTC (rev 162640)
@@ -123,7 +123,6 @@
     , m_canCompositeFilters(false)
 #endif
     , m_backgroundLayerPaintsFixedRootBackground(false)
-    , m_didSwitchToFullTileCoverageDuringLoading(false)
 {
     Page* page = renderer().frame().page();
 
@@ -220,14 +219,7 @@
 
     TiledBacking::TileCoverage tileCoverage = TiledBacking::CoverageForVisibleArea;
     bool useMinimalTilesDuringLiveResize = frameView.inLiveResize();
-    bool useMinimalTilesDuringLoading = false;
-    // Avoid churn.
-    if (!backing->didSwitchToFullTileCoverageDuringLoading()) {
-        useMinimalTilesDuringLoading = !frameView.isVisuallyNonEmpty() || (frameView.frame().page()->progress().isMainLoadProgressing() && !frameView.wasScrolledByUser());
-        if (!useMinimalTilesDuringLoading)
-            backing->setDidSwitchToFullTileCoverageDuringLoading();
-    }
-    if (!(useMinimalTilesDuringLoading || useMinimalTilesDuringLiveResize)) {
+    if (frameView.speculativeTilingEnabled() && !useMinimalTilesDuringLiveResize) {
         bool clipsToExposedRect = !frameView.exposedRect().isInfinite();
         if (frameView.horizontalScrollbarMode() != ScrollbarAlwaysOff || clipsToExposedRect)
             tileCoverage |= TiledBacking::CoverageForHorizontalScrolling;

Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.h (162639 => 162640)


--- trunk/Source/WebCore/rendering/RenderLayerBacking.h	2014-01-23 22:01:23 UTC (rev 162639)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.h	2014-01-23 22:03:27 UTC (rev 162640)
@@ -202,9 +202,6 @@
     // Return an estimate of the backing store area (in pixels) allocated by this object's GraphicsLayers.
     double backingStoreMemoryEstimate() const;
 
-    bool didSwitchToFullTileCoverageDuringLoading() const { return m_didSwitchToFullTileCoverageDuringLoading; }
-    void setDidSwitchToFullTileCoverageDuringLoading() { m_didSwitchToFullTileCoverageDuringLoading = true; }
-
 #if ENABLE(CSS_COMPOSITING)
     void setBlendMode(BlendMode);
 #endif
@@ -324,7 +321,6 @@
     bool m_canCompositeFilters;
 #endif
     bool m_backgroundLayerPaintsFixedRootBackground;
-    bool m_didSwitchToFullTileCoverageDuringLoading;
 
     static bool m_creatingPrimaryGraphicsLayer;
 };
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to