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