<!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>[169326] 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/169326">169326</a></dd>
<dt>Author</dt> <dd>benjamin@webkit.org</dd>
<dt>Date</dt> <dd>2014-05-25 17:04:43 -0700 (Sun, 25 May 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS][WK2] Fix some state reset on crash on the WKWebView
https://bugs.webkit.org/show_bug.cgi?id=133039

Reviewed by Sam Weinig.

This is in no way complete, but this should reduce the undefined states on crash.

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _processDidExit]):
If the view is animating, nuke the resize animation. That should be invisible to the user
because the background color is reset to white below.

Reset the contentView frame and scrollview state.

Reset the runtime states. We do not strictly need to reset _needsResetViewStateAfterCommitLoadForMainFrame,
_delayUpdateVisibleContentRects and _hadDelayedUpdateVisibleContentRects but it seems better to have
a clean slate.

(-[WKWebView _beginAnimatedResizeWithUpdates:]):
(-[WKWebView _endAnimatedResize]):
We could have crashes during rotation. To simplify the reset code, the animated resize code
no longer change any state when WKWebView is using a custom content view.

* UIProcess/API/Cocoa/WKWebViewInternal.h:
* UIProcess/ios/PageClientImplIOS.mm:
(WebKit::PageClientImpl::processDidExit):
Send a _processDidExit on the WKWebView too.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKWebViewInternalh">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosPageClientImplIOSmm">trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (169325 => 169326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-05-25 22:30:25 UTC (rev 169325)
+++ trunk/Source/WebKit2/ChangeLog        2014-05-26 00:04:43 UTC (rev 169326)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2014-05-25  Benjamin Poulain  &lt;benjamin@webkit.org&gt;
+
+        [iOS][WK2] Fix some state reset on crash on the WKWebView
+        https://bugs.webkit.org/show_bug.cgi?id=133039
+
+        Reviewed by Sam Weinig.
+
+        This is in no way complete, but this should reduce the undefined states on crash.
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _processDidExit]):
+        If the view is animating, nuke the resize animation. That should be invisible to the user
+        because the background color is reset to white below.
+
+        Reset the contentView frame and scrollview state.
+
+        Reset the runtime states. We do not strictly need to reset _needsResetViewStateAfterCommitLoadForMainFrame,
+        _delayUpdateVisibleContentRects and _hadDelayedUpdateVisibleContentRects but it seems better to have
+        a clean slate.
+
+        (-[WKWebView _beginAnimatedResizeWithUpdates:]):
+        (-[WKWebView _endAnimatedResize]):
+        We could have crashes during rotation. To simplify the reset code, the animated resize code
+        no longer change any state when WKWebView is using a custom content view.
+
+        * UIProcess/API/Cocoa/WKWebViewInternal.h:
+        * UIProcess/ios/PageClientImplIOS.mm:
+        (WebKit::PageClientImpl::processDidExit):
+        Send a _processDidExit on the WKWebView too.
+
</ins><span class="cx"> 2014-05-25  Anders Carlsson  &lt;andersca@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Use the right paths for website data
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (169325 => 169326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2014-05-25 22:30:25 UTC (rev 169325)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2014-05-26 00:04:43 UTC (rev 169326)
</span><span class="lines">@@ -554,6 +554,29 @@
</span><span class="cx">     return _usesMinimalUI;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)_processDidExit
+{
+    if (!_customContentView &amp;&amp; _isAnimatingResize) {
+        NSUInteger indexOfResizeAnimationView = [[_scrollView subviews] indexOfObject:_resizeAnimationView.get()];
+        [_scrollView insertSubview:_contentView.get() atIndex:indexOfResizeAnimationView];
+        [_resizeAnimationView removeFromSuperview];
+        _resizeAnimationView = nil;
+
+        _isAnimatingResize = NO;
+        _resizeAnimationTransformAdjustments = CATransform3DIdentity;
+    }
+    [_contentView setFrame:self.bounds];
+    [_scrollView setBackgroundColor:[UIColor whiteColor]];
+    [_scrollView setContentOffset:CGPointMake(-_obscuredInsets.left, -_obscuredInsets.top)];
+    [_scrollView setZoomScale:1];
+
+    _viewportMetaTagWidth = -1;
+    _needsResetViewStateAfterCommitLoadForMainFrame = NO;
+    _scrollViewBackgroundColor = WebCore::Color();
+    _delayUpdateVisibleContentRects = NO;
+    _hadDelayedUpdateVisibleContentRects = NO;
+}
+
</ins><span class="cx"> - (void)_didCommitLoadForMainFrame
</span><span class="cx"> {
</span><span class="cx">     _needsResetViewStateAfterCommitLoadForMainFrame = YES;
</span><span class="lines">@@ -1662,6 +1685,12 @@
</span><span class="cx"> - (void)_beginAnimatedResizeWithUpdates:(void (^)(void))updateBlock
</span><span class="cx"> {
</span><span class="cx">     _isAnimatingResize = YES;
</span><ins>+
+    if (_customContentView) {
+        updateBlock();
+        return;
+    }
+
</ins><span class="cx">     _resizeAnimationTransformAdjustments = CATransform3DIdentity;
</span><span class="cx"> 
</span><span class="cx">     NSUInteger indexOfContentView = [[_scrollView subviews] indexOfObject:_contentView.get()];
</span><span class="lines">@@ -1672,9 +1701,6 @@
</span><span class="cx"> 
</span><span class="cx">     updateBlock();
</span><span class="cx"> 
</span><del>-    if (_customContentView)
-        return;
-
</del><span class="cx">     CGRect newBounds = self.bounds;
</span><span class="cx">     CGSize newMinimumLayoutSize = newBounds.size;
</span><span class="cx"> 
</span><span class="lines">@@ -1740,7 +1766,7 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)_endAnimatedResize
</span><span class="cx"> {
</span><del>-    if (!_customContentView) {
</del><ins>+    if (!_customContentView &amp;&amp; _isAnimatingResize) {
</ins><span class="cx">         NSUInteger indexOfResizeAnimationView = [[_scrollView subviews] indexOfObject:_resizeAnimationView.get()];
</span><span class="cx">         [_scrollView insertSubview:_contentView.get() atIndex:indexOfResizeAnimationView];
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewInternalh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h (169325 => 169326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h        2014-05-25 22:30:25 UTC (rev 169325)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h        2014-05-26 00:04:43 UTC (rev 169326)
</span><span class="lines">@@ -65,6 +65,8 @@
</span><span class="cx"> 
</span><span class="cx"> @property (nonatomic, setter=_setUsesMinimalUI:) BOOL _usesMinimalUI;
</span><span class="cx"> 
</span><ins>+- (void)_processDidExit;
+
</ins><span class="cx"> - (void)_didCommitLoadForMainFrame;
</span><span class="cx"> - (void)_didCommitLayerTree:(const WebKit::RemoteLayerTreeTransaction&amp;)layerTreeTransaction;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosPageClientImplIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm (169325 => 169326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm        2014-05-25 22:30:25 UTC (rev 169325)
+++ trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm        2014-05-26 00:04:43 UTC (rev 169326)
</span><span class="lines">@@ -145,6 +145,7 @@
</span><span class="cx"> void PageClientImpl::processDidExit()
</span><span class="cx"> {
</span><span class="cx">     [m_contentView _processDidExit];
</span><ins>+    [m_webView _processDidExit];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PageClientImpl::didRelaunchProcess()
</span></span></pre>
</div>
</div>

</body>
</html>