<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[186761] trunk/Source/WebKit2</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/186761">186761</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-07-13 00:44:18 -0700 (Mon, 13 Jul 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] Contents not correctly laid out when the web view is not realized
https://bugs.webkit.org/show_bug.cgi?id=142532

Reviewed by Darin Adler.

The problem is that we are not reporting any size until the web
view is realized, so any web view loaded in a separate tab in the
browser, will report 0x0 as the window.innerWidth,
window.innerHeight until the view is realized. Websites that use
the window.innerWidth/innerHeight during the page load to decide
how to lay out the contents will be rendered wrongly.
I haven't been able to reproduce this with unit tests, as this
requires the particular case of same window but different web
views using tabs for example.

* UIProcess/API/gtk/PageClientImpl.cpp:
(WebKit::PageClientImpl::viewSize): Always report the drawing area
size to make usre it's in sync with the WebProcess page size.
* UIProcess/API/gtk/WebKitWebViewBase.cpp:
(webkitWebViewBaseSizeAllocate): Remove the optimization of only
report the size when it has changed, since both the redirected
window and the drawing area already do that check. Also remove the
optimization of waiting until the view is mapped to report its
size, since that's often too late for websites using the window
size during load.
(webkitWebViewBaseMap): Never report size on map, it should have
already been reported by size-allocate.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkPageClientImplcpp">trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewBasecpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (186760 => 186761)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-07-13 07:13:31 UTC (rev 186760)
+++ trunk/Source/WebKit2/ChangeLog        2015-07-13 07:44:18 UTC (rev 186761)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2015-07-13  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [GTK] Contents not correctly laid out when the web view is not realized
+        https://bugs.webkit.org/show_bug.cgi?id=142532
+
+        Reviewed by Darin Adler.
+
+        The problem is that we are not reporting any size until the web
+        view is realized, so any web view loaded in a separate tab in the
+        browser, will report 0x0 as the window.innerWidth,
+        window.innerHeight until the view is realized. Websites that use
+        the window.innerWidth/innerHeight during the page load to decide
+        how to lay out the contents will be rendered wrongly.
+        I haven't been able to reproduce this with unit tests, as this
+        requires the particular case of same window but different web
+        views using tabs for example.
+
+        * UIProcess/API/gtk/PageClientImpl.cpp:
+        (WebKit::PageClientImpl::viewSize): Always report the drawing area
+        size to make usre it's in sync with the WebProcess page size.
+        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
+        (webkitWebViewBaseSizeAllocate): Remove the optimization of only
+        report the size when it has changed, since both the redirected
+        window and the drawing area already do that check. Also remove the
+        optimization of waiting until the view is mapped to report its
+        size, since that's often too late for websites using the window
+        size during load.
+        (webkitWebViewBaseMap): Never report size on map, it should have
+        already been reported by size-allocate.
+
</ins><span class="cx"> 2015-07-11  Nikita Vasilyev  &lt;nvasilyev@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Inspector should be able to be docked to the bottom of a narrow window
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkPageClientImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp (186760 => 186761)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp        2015-07-13 07:13:31 UTC (rev 186760)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp        2015-07-13 07:44:18 UTC (rev 186761)
</span><span class="lines">@@ -84,11 +84,8 @@
</span><span class="cx"> 
</span><span class="cx"> WebCore::IntSize PageClientImpl::viewSize()
</span><span class="cx"> {
</span><del>-    if (!gtk_widget_get_realized(m_viewWidget))
-        return IntSize();
-    GtkAllocation allocation;
-    gtk_widget_get_allocation(m_viewWidget, &amp;allocation);
-    return IntSize(allocation.width, allocation.height);
</del><ins>+    auto* drawingArea = static_cast&lt;DrawingAreaProxyImpl*&gt;(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(m_viewWidget))-&gt;drawingArea());
+    return drawingArea ? drawingArea-&gt;size() : IntSize();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool PageClientImpl::isViewWindowActive()
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp (186760 => 186761)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp        2015-07-13 07:13:31 UTC (rev 186760)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp        2015-07-13 07:44:18 UTC (rev 186761)
</span><span class="lines">@@ -155,7 +155,6 @@
</span><span class="cx">     CString tooltipText;
</span><span class="cx">     IntRect tooltipArea;
</span><span class="cx">     GRefPtr&lt;AtkObject&gt; accessible;
</span><del>-    bool needsResizeOnMap;
</del><span class="cx">     GtkWidget* authenticationDialog;
</span><span class="cx">     GtkWidget* inspectorView;
</span><span class="cx">     AttachmentSide inspectorAttachmentSide;
</span><span class="lines">@@ -551,8 +550,11 @@
</span><span class="cx">     priv-&gt;children.set(child, IntRect());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void resizeWebKitWebViewBaseFromAllocation(WebKitWebViewBase* webViewBase, GtkAllocation* allocation, bool sizeChanged)
</del><ins>+static void webkitWebViewBaseSizeAllocate(GtkWidget* widget, GtkAllocation* allocation)
</ins><span class="cx"> {
</span><ins>+    GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)-&gt;size_allocate(widget, allocation);
+
+    WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget);
</ins><span class="cx">     gtk_container_foreach(GTK_CONTAINER(webViewBase), webkitWebViewBaseChildAllocate, webViewBase);
</span><span class="cx"> 
</span><span class="cx">     IntRect viewRect(allocation-&gt;x, allocation-&gt;y, allocation-&gt;width, allocation-&gt;height);
</span><span class="lines">@@ -594,34 +596,18 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     DrawingAreaProxyImpl* drawingArea = static_cast&lt;DrawingAreaProxyImpl*&gt;(priv-&gt;pageProxy-&gt;drawingArea());
</span><ins>+    if (!drawingArea)
+        return;
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx"> #if USE(REDIRECTED_XCOMPOSITE_WINDOW)
</span><del>-    if (sizeChanged &amp;&amp; priv-&gt;redirectedWindow &amp;&amp; drawingArea &amp;&amp; drawingArea-&gt;isInAcceleratedCompositingMode())
</del><ins>+    if (priv-&gt;redirectedWindow &amp;&amp; drawingArea-&gt;isInAcceleratedCompositingMode())
</ins><span class="cx">         priv-&gt;redirectedWindow-&gt;resize(viewRect.size());
</span><del>-#else
-    UNUSED_PARAM(sizeChanged);
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    if (drawingArea)
-        drawingArea-&gt;setSize(viewRect.size(), IntSize(), IntSize());
</del><ins>+    drawingArea-&gt;setSize(viewRect.size(), IntSize(), IntSize());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void webkitWebViewBaseSizeAllocate(GtkWidget* widget, GtkAllocation* allocation)
-{
-    bool sizeChanged = gtk_widget_get_allocated_width(widget) != allocation-&gt;width
-                       || gtk_widget_get_allocated_height(widget) != allocation-&gt;height;
-
-    GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)-&gt;size_allocate(widget, allocation);
-
-    WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget);
-    if (sizeChanged &amp;&amp; !gtk_widget_get_mapped(widget)) {
-        webViewBase-&gt;priv-&gt;needsResizeOnMap = true;
-        return;
-    }
-
-    resizeWebKitWebViewBaseFromAllocation(webViewBase, allocation, sizeChanged);
-}
-
</del><span class="cx"> static void webkitWebViewBaseMap(GtkWidget* widget)
</span><span class="cx"> {
</span><span class="cx">     GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)-&gt;map(widget);
</span><span class="lines">@@ -632,14 +618,6 @@
</span><span class="cx">         priv-&gt;isVisible = true;
</span><span class="cx">         priv-&gt;pageProxy-&gt;viewStateDidChange(ViewState::IsVisible);
</span><span class="cx">     }
</span><del>-
-    if (!priv-&gt;needsResizeOnMap)
-        return;
-
-    GtkAllocation allocation;
-    gtk_widget_get_allocation(widget, &amp;allocation);
-    resizeWebKitWebViewBaseFromAllocation(webViewBase, &amp;allocation, true /* sizeChanged */);
-    priv-&gt;needsResizeOnMap = false;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void webkitWebViewBaseUnmap(GtkWidget* widget)
</span></span></pre>
</div>
</div>

</body>
</html>