<!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>[248622] branches/safari-608-branch</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/248622">248622</a></dd>
<dt>Author</dt> <dd>alancoon@apple.com</dd>
<dt>Date</dt> <dd>2019-08-13 13:01:22 -0700 (Tue, 13 Aug 2019)</dd>
</dl>

<h3>Log Message</h3>
<pre>Cherry-pick <a href="http://trac.webkit.org/projects/webkit/changeset/248541">r248541</a>. rdar://problem/54237768

    [iPadOS] Web pages sometimes load at half width in Safari
    https://bugs.webkit.org/show_bug.cgi?id=200624
    <rdar://problem/52694257>

    Reviewed by Simon Fraser.

    Source/WebKit:

    Whenever WKWebView's size changes, it normally notifies the web content process by calling into WebPageProxy::
    setViewportConfigurationViewLayoutSize, which remembers this view layout size using a member variable,
    m_viewportConfigurationViewLayoutSize. Later, m_viewportConfigurationViewLayoutSize is consulted as a part of
    constructing the creation parameters used to set up a new page.

    However, during animated resize, WKWebView avoids these calls to setViewportConfigurationViewLayoutSize via the
    dynamic viewport update mode check in -[WKWebView _frameOrBoundsChanged]. Instead, the new view layout size is
    pushed to the web process by calling WebPageProxy::dynamicViewportSizeUpdate.

    Since dynamicViewportSizeUpdate doesn't update m_viewportConfigurationViewLayoutSize, the next
    WebPageCreationParameters that are created with this WebPageProxy (e.g. after a process swap, or after
    reloading, if the process was terminated) will use the size of the WKWebView prior to the most recent animated
    resize.

    To fix the bug, we simply make sure that m_viewportConfigurationViewLayoutSize is updated in the dynamic
    viewport size update (i.e. animated resize) case as well.

    Test: WebKit.CreateWebPageAfterAnimatedResize

    * UIProcess/ios/WebPageProxyIOS.mm:
    (WebKit::WebPageProxy::dynamicViewportSizeUpdate):

    Tools:

    Add an API test to verify that after performing an animated resize and killing the web process, the subsequent
    web page is created using the post-animated-resize web view dimensions, rather than the original layout
    dimensions.

    * TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm:

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248541 268f45cc-cd09-0410-ab3c-d52691b4dbfc</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchessafari608branchSourceWebKitChangeLog">branches/safari-608-branch/Source/WebKit/ChangeLog</a></li>
<li><a href="#branchessafari608branchSourceWebKitUIProcessiosWebPageProxyIOSmm">branches/safari-608-branch/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm</a></li>
<li><a href="#branchessafari608branchToolsChangeLog">branches/safari-608-branch/Tools/ChangeLog</a></li>
<li><a href="#branchessafari608branchToolsTestWebKitAPITestsWebKitCocoaAnimatedResizemm">branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchessafari608branchSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-608-branch/Source/WebKit/ChangeLog (248621 => 248622)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-608-branch/Source/WebKit/ChangeLog       2019-08-13 20:01:19 UTC (rev 248621)
+++ branches/safari-608-branch/Source/WebKit/ChangeLog  2019-08-13 20:01:22 UTC (rev 248622)
</span><span class="lines">@@ -1,5 +1,80 @@
</span><span class="cx"> 2019-08-13  Alan Coon  <alancoon@apple.com>
</span><span class="cx"> 
</span><ins>+        Cherry-pick r248541. rdar://problem/54237768
+
+    [iPadOS] Web pages sometimes load at half width in Safari
+    https://bugs.webkit.org/show_bug.cgi?id=200624
+    <rdar://problem/52694257>
+    
+    Reviewed by Simon Fraser.
+    
+    Source/WebKit:
+    
+    Whenever WKWebView's size changes, it normally notifies the web content process by calling into WebPageProxy::
+    setViewportConfigurationViewLayoutSize, which remembers this view layout size using a member variable,
+    m_viewportConfigurationViewLayoutSize. Later, m_viewportConfigurationViewLayoutSize is consulted as a part of
+    constructing the creation parameters used to set up a new page.
+    
+    However, during animated resize, WKWebView avoids these calls to setViewportConfigurationViewLayoutSize via the
+    dynamic viewport update mode check in -[WKWebView _frameOrBoundsChanged]. Instead, the new view layout size is
+    pushed to the web process by calling WebPageProxy::dynamicViewportSizeUpdate.
+    
+    Since dynamicViewportSizeUpdate doesn't update m_viewportConfigurationViewLayoutSize, the next
+    WebPageCreationParameters that are created with this WebPageProxy (e.g. after a process swap, or after
+    reloading, if the process was terminated) will use the size of the WKWebView prior to the most recent animated
+    resize.
+    
+    To fix the bug, we simply make sure that m_viewportConfigurationViewLayoutSize is updated in the dynamic
+    viewport size update (i.e. animated resize) case as well.
+    
+    Test: WebKit.CreateWebPageAfterAnimatedResize
+    
+    * UIProcess/ios/WebPageProxyIOS.mm:
+    (WebKit::WebPageProxy::dynamicViewportSizeUpdate):
+    
+    Tools:
+    
+    Add an API test to verify that after performing an animated resize and killing the web process, the subsequent
+    web page is created using the post-animated-resize web view dimensions, rather than the original layout
+    dimensions.
+    
+    * TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm:
+    
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248541 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2019-08-12  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+            [iPadOS] Web pages sometimes load at half width in Safari
+            https://bugs.webkit.org/show_bug.cgi?id=200624
+            <rdar://problem/52694257>
+
+            Reviewed by Simon Fraser.
+
+            Whenever WKWebView's size changes, it normally notifies the web content process by calling into WebPageProxy::
+            setViewportConfigurationViewLayoutSize, which remembers this view layout size using a member variable,
+            m_viewportConfigurationViewLayoutSize. Later, m_viewportConfigurationViewLayoutSize is consulted as a part of
+            constructing the creation parameters used to set up a new page.
+
+            However, during animated resize, WKWebView avoids these calls to setViewportConfigurationViewLayoutSize via the
+            dynamic viewport update mode check in -[WKWebView _frameOrBoundsChanged]. Instead, the new view layout size is
+            pushed to the web process by calling WebPageProxy::dynamicViewportSizeUpdate.
+
+            Since dynamicViewportSizeUpdate doesn't update m_viewportConfigurationViewLayoutSize, the next
+            WebPageCreationParameters that are created with this WebPageProxy (e.g. after a process swap, or after
+            reloading, if the process was terminated) will use the size of the WKWebView prior to the most recent animated
+            resize.
+
+            To fix the bug, we simply make sure that m_viewportConfigurationViewLayoutSize is updated in the dynamic
+            viewport size update (i.e. animated resize) case as well.
+
+            Test: WebKit.CreateWebPageAfterAnimatedResize
+
+            * UIProcess/ios/WebPageProxyIOS.mm:
+            (WebKit::WebPageProxy::dynamicViewportSizeUpdate):
+
+2019-08-13  Alan Coon  <alancoon@apple.com>
+
</ins><span class="cx">         Cherry-pick r248487. rdar://problem/54237679
</span><span class="cx"> 
</span><span class="cx">     [iOS 13] Google Docs/Slides/Sheets: paste often doesn't work and sometimes produces an error
</span></span></pre></div>
<a id="branchessafari608branchSourceWebKitUIProcessiosWebPageProxyIOSmm"></a>
<div class="modfile"><h4>Modified: branches/safari-608-branch/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm (248621 => 248622)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-608-branch/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm        2019-08-13 20:01:19 UTC (rev 248621)
+++ branches/safari-608-branch/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm   2019-08-13 20:01:22 UTC (rev 248622)
</span><span class="lines">@@ -300,6 +300,7 @@
</span><span class="cx"> 
</span><span class="cx">     hideValidationMessage();
</span><span class="cx"> 
</span><ins>+    m_viewportConfigurationViewLayoutSize = viewLayoutSize;
</ins><span class="cx">     m_process->send(Messages::WebPage::DynamicViewportSizeUpdate(viewLayoutSize,
</span><span class="cx">         maximumUnobscuredSize, targetExposedContentRect, targetUnobscuredRect,
</span><span class="cx">         targetUnobscuredRectInScrollViewCoordinates, unobscuredSafeAreaInsets,
</span></span></pre></div>
<a id="branchessafari608branchToolsChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-608-branch/Tools/ChangeLog (248621 => 248622)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-608-branch/Tools/ChangeLog       2019-08-13 20:01:19 UTC (rev 248621)
+++ branches/safari-608-branch/Tools/ChangeLog  2019-08-13 20:01:22 UTC (rev 248622)
</span><span class="lines">@@ -1,5 +1,64 @@
</span><span class="cx"> 2019-08-13  Alan Coon  <alancoon@apple.com>
</span><span class="cx"> 
</span><ins>+        Cherry-pick r248541. rdar://problem/54237768
+
+    [iPadOS] Web pages sometimes load at half width in Safari
+    https://bugs.webkit.org/show_bug.cgi?id=200624
+    <rdar://problem/52694257>
+    
+    Reviewed by Simon Fraser.
+    
+    Source/WebKit:
+    
+    Whenever WKWebView's size changes, it normally notifies the web content process by calling into WebPageProxy::
+    setViewportConfigurationViewLayoutSize, which remembers this view layout size using a member variable,
+    m_viewportConfigurationViewLayoutSize. Later, m_viewportConfigurationViewLayoutSize is consulted as a part of
+    constructing the creation parameters used to set up a new page.
+    
+    However, during animated resize, WKWebView avoids these calls to setViewportConfigurationViewLayoutSize via the
+    dynamic viewport update mode check in -[WKWebView _frameOrBoundsChanged]. Instead, the new view layout size is
+    pushed to the web process by calling WebPageProxy::dynamicViewportSizeUpdate.
+    
+    Since dynamicViewportSizeUpdate doesn't update m_viewportConfigurationViewLayoutSize, the next
+    WebPageCreationParameters that are created with this WebPageProxy (e.g. after a process swap, or after
+    reloading, if the process was terminated) will use the size of the WKWebView prior to the most recent animated
+    resize.
+    
+    To fix the bug, we simply make sure that m_viewportConfigurationViewLayoutSize is updated in the dynamic
+    viewport size update (i.e. animated resize) case as well.
+    
+    Test: WebKit.CreateWebPageAfterAnimatedResize
+    
+    * UIProcess/ios/WebPageProxyIOS.mm:
+    (WebKit::WebPageProxy::dynamicViewportSizeUpdate):
+    
+    Tools:
+    
+    Add an API test to verify that after performing an animated resize and killing the web process, the subsequent
+    web page is created using the post-animated-resize web view dimensions, rather than the original layout
+    dimensions.
+    
+    * TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm:
+    
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248541 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2019-08-12  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+            [iPadOS] Web pages sometimes load at half width in Safari
+            https://bugs.webkit.org/show_bug.cgi?id=200624
+            <rdar://problem/52694257>
+
+            Reviewed by Simon Fraser.
+
+            Add an API test to verify that after performing an animated resize and killing the web process, the subsequent
+            web page is created using the post-animated-resize web view dimensions, rather than the original layout
+            dimensions.
+
+            * TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm:
+
+2019-08-13  Alan Coon  <alancoon@apple.com>
+
</ins><span class="cx">         Cherry-pick r248487. rdar://problem/54237679
</span><span class="cx"> 
</span><span class="cx">     [iOS 13] Google Docs/Slides/Sheets: paste often doesn't work and sometimes produces an error
</span></span></pre></div>
<a id="branchessafari608branchToolsTestWebKitAPITestsWebKitCocoaAnimatedResizemm"></a>
<div class="modfile"><h4>Modified: branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm (248621 => 248622)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm       2019-08-13 20:01:19 UTC (rev 248621)
+++ branches/safari-608-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/AnimatedResize.mm  2019-08-13 20:01:22 UTC (rev 248622)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> #import "PlatformUtilities.h"
</span><span class="cx"> #import "Test.h"
</span><span class="cx"> #import "TestNavigationDelegate.h"
</span><ins>+#import "TestWKWebView.h"
</ins><span class="cx"> #import <WebKit/WKPreferences.h>
</span><span class="cx"> #import <WebKit/WKProcessPoolPrivate.h>
</span><span class="cx"> #import <WebKit/WKWebView.h>
</span><span class="lines">@@ -428,4 +429,32 @@
</span><span class="cx">     TestWebKitAPI::Util::run(&didGetCommitAfterEndAnimatedResize);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TEST(WebKit, CreateWebPageAfterAnimatedResize)
+{
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)]);
+    [webView synchronouslyLoadTestPageNamed:@"large-red-square-image"];
+
+    [webView _beginAnimatedResizeWithUpdates:^{
+        [webView setFrame:CGRectMake(0, 0, 768, 1024)];
+    }];
+
+    __block bool doneWaitingForPresentationUpdate = false;
+    [webView _doAfterNextPresentationUpdate:^{
+        doneWaitingForPresentationUpdate = true;
+    }];
+
+    [webView _doAfterNextPresentationUpdateWithoutWaitingForAnimatedResizeForTesting:^{
+        [webView _endAnimatedResize];
+    }];
+
+    TestWebKitAPI::Util::run(&doneWaitingForPresentationUpdate);
+
+    [webView _killWebContentProcessAndResetState];
+    [webView synchronouslyLoadTestPageNamed:@"large-red-square-image"];
+
+    NSArray<NSNumber *> *dimensions = [webView objectByEvaluatingJavaScript:@"[innerWidth, innerHeight]"];
+    EXPECT_EQ(768, dimensions.firstObject.intValue);
+    EXPECT_EQ(1024, dimensions.lastObject.intValue);
+}
+
</ins><span class="cx"> #endif
</span></span></pre>
</div>
</div>

</body>
</html>