Recode.net gets into a continual resize loop in split fullscreen
authorsimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 24 Jul 2015 17:51:05 +0000 (17:51 +0000)
committersimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 24 Jul 2015 17:51:05 +0000 (17:51 +0000)
https://bugs.webkit.org/show_bug.cgi?id=147266
rdar://problem/21409047

Reviewed by Tim Horton.

In split fullscreen, we use fixed layout and scale to shrink pages down to
fit a given width. This is re-evaluated every time the document width changes.
However some pages, like recode.net, end up continually resizing because
when laid out unconstrained they use a narrower width than when laid out with
a fixed layout size. In fixed layout, they actually use more width than the fixed
layout size.

Detect and break this cycle by just not re-scaling when we've done one fixed layout,
and the document is now taking more width than the fixed layout width.

* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
(WebKit::TiledCoreAnimationDrawingArea::scaleViewToFitDocumentIfNeeded):

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

Source/WebKit2/ChangeLog
Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm

index d433627..2e51545 100644 (file)
@@ -1,3 +1,24 @@
+2015-07-24  Simon Fraser  <simon.fraser@apple.com>
+
+        Recode.net gets into a continual resize loop in split fullscreen
+        https://bugs.webkit.org/show_bug.cgi?id=147266
+        rdar://problem/21409047
+
+        Reviewed by Tim Horton.
+        
+        In split fullscreen, we use fixed layout and scale to shrink pages down to
+        fit a given width. This is re-evaluated every time the document width changes.
+        However some pages, like recode.net, end up continually resizing because
+        when laid out unconstrained they use a narrower width than when laid out with
+        a fixed layout size. In fixed layout, they actually use more width than the fixed
+        layout size.
+        
+        Detect and break this cycle by just not re-scaling when we've done one fixed layout,
+        and the document is now taking more width than the fixed layout width.
+
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
+        (WebKit::TiledCoreAnimationDrawingArea::scaleViewToFitDocumentIfNeeded):
+
 2015-07-24  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [GStreamer] Crashes during plugin installation
index cef63bb..bdeb365 100644 (file)
@@ -301,22 +301,29 @@ void TiledCoreAnimationDrawingArea::scaleViewToFitDocumentIfNeeded()
 
     // Our current understanding of the document width is still up to date, and we're in scaling mode.
     // Update the viewScale without doing an extra layout to re-determine the document width.
-    if (m_isScalingViewToFitDocument && !documentWidthChanged) {
-        m_lastViewSizeForScaleToFit = m_webPage.size();
-        float viewScale = (float)viewWidth / (float)m_lastDocumentSizeForScaleToFit.width();
-        if (viewScale < minimumViewScale) {
-            viewScale = minimumViewScale;
-            documentWidth = std::ceil(viewWidth / viewScale);
-        }
-        IntSize fixedLayoutSize(documentWidth, std::ceil((m_webPage.size().height() - m_webPage.corePage()->topContentInset()) / viewScale));
-        m_webPage.setFixedLayoutSize(fixedLayoutSize);
-        m_webPage.scaleView(viewScale);
+    if (m_isScalingViewToFitDocument) {
+        if (!documentWidthChanged) {
+            m_lastViewSizeForScaleToFit = m_webPage.size();
+            float viewScale = (float)viewWidth / (float)m_lastDocumentSizeForScaleToFit.width();
+            if (viewScale < minimumViewScale) {
+                viewScale = minimumViewScale;
+                documentWidth = std::ceil(viewWidth / viewScale);
+            }
+            IntSize fixedLayoutSize(documentWidth, std::ceil((m_webPage.size().height() - m_webPage.corePage()->topContentInset()) / viewScale));
+            m_webPage.setFixedLayoutSize(fixedLayoutSize);
+            m_webPage.scaleView(viewScale);
 
-        LOG(Resize, "  using fixed layout at %dx%d. document width %d unchanged, scaled to %.4f to fit view width %d", fixedLayoutSize.width(), fixedLayoutSize.height(), documentWidth, viewScale, viewWidth);
-        return;
+            LOG(Resize, "  using fixed layout at %dx%d. document width %d unchanged, scaled to %.4f to fit view width %d", fixedLayoutSize.width(), fixedLayoutSize.height(), documentWidth, viewScale, viewWidth);
+            return;
+        }
+    
+        IntSize fixedLayoutSize = m_webPage.fixedLayoutSize();
+        if (documentWidth > fixedLayoutSize.width()) {
+            LOG(Resize, "  page laid out wider than fixed layout width. Not attempting to re-scale");
+            return;
+        }
     }
 
-
     LOG(Resize, "  doing unconstrained layout");
 
     // Lay out at the view size.