<!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>[178870] 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/178870">178870</a></dd>
<dt>Author</dt> <dd>jhoneycutt@apple.com</dd>
<dt>Date</dt> <dd>2015-01-21 15:47:43 -0800 (Wed, 21 Jan 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS] WebKitTestRunner: Tests fail due to incorrect web view size

&lt;https://bugs.webkit.org/show_bug.cgi?id=139736&gt;
&lt;rdar://problem/19282196&gt;

This starts happening after we fail to reset the test controller to
consistent values in TestInvocation::invoke(). When we terminate the
web process and relaunch it, the new WebPage object created in the web
process is using the default ViewportConfiguration with dimensions of
1024x768.

The PageClient on iOS currently notifies the WKWebView and the
WKContentView when the web process is relaunched. This patch extends
that to also notify the WKView.

Reviewed by Benjamin Poulain.

* UIProcess/API/Cocoa/WKViewPrivate.h:
Declare -_didRelaunchProcess.

* UIProcess/API/ios/WKViewIOS.mm:
(-[WKView _commonInitializationWithContextRef:pageGroupRef:relatedToPage:]):
Call the new method that accepts a WKView.
(-[WKView _didRelaunchProcess]):
Call -_frameOrBoundsChanged to update the web process's size to the
size of the WKView.

* UIProcess/ios/PageClientImplIOS.h:
Add a constructor that takes a WKView, and add a member var to hold it.

* UIProcess/ios/PageClientImplIOS.mm:
(WebKit::PageClientImpl::PageClientImpl):
Implement the constructor that takes a WKView.
(WebKit::PageClientImpl::didRelaunchProcess):
Tell the WKView that the web process relaunched.

* UIProcess/ios/WKContentView.h:
Declare an initializer that takes a WKView.

* UIProcess/ios/WKContentView.mm:
(-[WKContentView _commonInitializationWithProcessPool:configuration:]):
Split out from -[WKContentView initWithFrame:processPool:configuration:webView:].
(-[WKContentView initWithFrame:processPool:configuration:webView:]):
Perform some initialization, including creating the PageClient, and
call the common initializer.
(-[WKContentView initWithFrame:processPool:configuration:wkView:]):
Ditto.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKViewPrivateh">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKViewPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIiosWKViewIOSmm">trunk/Source/WebKit2/UIProcess/API/ios/WKViewIOS.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosPageClientImplIOSh">trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosPageClientImplIOSmm">trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWKContentViewh">trunk/Source/WebKit2/UIProcess/ios/WKContentView.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWKContentViewmm">trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (178869 => 178870)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-01-21 23:44:35 UTC (rev 178869)
+++ trunk/Source/WebKit2/ChangeLog        2015-01-21 23:47:43 UTC (rev 178870)
</span><span class="lines">@@ -1,3 +1,53 @@
</span><ins>+2015-01-20  Jon Honeycutt  &lt;jhoneycutt@apple.com&gt;
+
+        [iOS] WebKitTestRunner: Tests fail due to incorrect web view size
+
+        &lt;https://bugs.webkit.org/show_bug.cgi?id=139736&gt;
+        &lt;rdar://problem/19282196&gt;
+
+        This starts happening after we fail to reset the test controller to
+        consistent values in TestInvocation::invoke(). When we terminate the
+        web process and relaunch it, the new WebPage object created in the web
+        process is using the default ViewportConfiguration with dimensions of
+        1024x768.
+
+        The PageClient on iOS currently notifies the WKWebView and the
+        WKContentView when the web process is relaunched. This patch extends
+        that to also notify the WKView.
+
+        Reviewed by Benjamin Poulain.
+
+        * UIProcess/API/Cocoa/WKViewPrivate.h:
+        Declare -_didRelaunchProcess.
+
+        * UIProcess/API/ios/WKViewIOS.mm:
+        (-[WKView _commonInitializationWithContextRef:pageGroupRef:relatedToPage:]):
+        Call the new method that accepts a WKView.
+        (-[WKView _didRelaunchProcess]):
+        Call -_frameOrBoundsChanged to update the web process's size to the
+        size of the WKView.
+
+        * UIProcess/ios/PageClientImplIOS.h:
+        Add a constructor that takes a WKView, and add a member var to hold it.
+
+        * UIProcess/ios/PageClientImplIOS.mm:
+        (WebKit::PageClientImpl::PageClientImpl):
+        Implement the constructor that takes a WKView.
+        (WebKit::PageClientImpl::didRelaunchProcess):
+        Tell the WKView that the web process relaunched.
+
+        * UIProcess/ios/WKContentView.h:
+        Declare an initializer that takes a WKView.
+
+        * UIProcess/ios/WKContentView.mm:
+        (-[WKContentView _commonInitializationWithProcessPool:configuration:]):
+        Split out from -[WKContentView initWithFrame:processPool:configuration:webView:].
+        (-[WKContentView initWithFrame:processPool:configuration:webView:]):
+        Perform some initialization, including creating the PageClient, and
+        call the common initializer.
+        (-[WKContentView initWithFrame:processPool:configuration:wkView:]):
+        Ditto.
+
</ins><span class="cx"> 2015-01-21  Sam Weinig  &lt;sam@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Add WKPageGroupRef SPI for user content filters
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKViewPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKViewPrivate.h (178869 => 178870)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKViewPrivate.h        2015-01-21 23:44:35 UTC (rev 178869)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKViewPrivate.h        2015-01-21 23:47:43 UTC (rev 178870)
</span><span class="lines">@@ -57,6 +57,7 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)_beginInteractiveObscuredInsetsChange;
</span><span class="cx"> - (void)_endInteractiveObscuredInsetsChange;
</span><ins>+- (void)_didRelaunchProcess;
</ins><span class="cx"> 
</span><span class="cx"> #else
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIiosWKViewIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/ios/WKViewIOS.mm (178869 => 178870)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/ios/WKViewIOS.mm        2015-01-21 23:44:35 UTC (rev 178869)
+++ trunk/Source/WebKit2/UIProcess/API/ios/WKViewIOS.mm        2015-01-21 23:47:43 UTC (rev 178870)
</span><span class="lines">@@ -223,7 +223,7 @@
</span><span class="cx">     webPageConfiguration.pageGroup = toImpl(pageGroupRef);
</span><span class="cx">     webPageConfiguration.relatedPage = toImpl(relatedPage);
</span><span class="cx"> 
</span><del>-    _contentView = adoptNS([[WKContentView alloc] initWithFrame:bounds processPool:*toImpl(contextRef) configuration:WTF::move(webPageConfiguration) webView:nil]);
</del><ins>+    _contentView = adoptNS([[WKContentView alloc] initWithFrame:bounds processPool:*toImpl(contextRef) configuration:WTF::move(webPageConfiguration) wkView:self]);
</ins><span class="cx"> 
</span><span class="cx">     [[_contentView layer] setAnchorPoint:CGPointZero];
</span><span class="cx">     [_contentView setFrame:bounds];
</span><span class="lines">@@ -337,6 +337,12 @@
</span><span class="cx">     _minimumLayoutSizeOverride = minimumLayoutSizeOverride;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)_didRelaunchProcess
+{
+    // Update the WebView to our size rather than the default size it will have after being relaunched.
+    [self _frameOrBoundsChanged];
+}
+
</ins><span class="cx"> - (UIEdgeInsets)_obscuredInsets
</span><span class="cx"> {
</span><span class="cx">     return _obscuredInsets;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosPageClientImplIOSh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.h (178869 => 178870)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.h        2015-01-21 23:44:35 UTC (rev 178869)
+++ trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.h        2015-01-21 23:47:43 UTC (rev 178870)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #import &lt;wtf/RetainPtr.h&gt;
</span><span class="cx"> 
</span><span class="cx"> OBJC_CLASS WKContentView;
</span><ins>+OBJC_CLASS WKView;
</ins><span class="cx"> OBJC_CLASS WKWebView;
</span><span class="cx"> OBJC_CLASS WKEditorUndoTargetObjC;
</span><span class="cx"> 
</span><span class="lines">@@ -45,6 +46,7 @@
</span><span class="cx">     {
</span><span class="cx"> public:
</span><span class="cx">     PageClientImpl(WKContentView *, WKWebView *);
</span><ins>+    PageClientImpl(WKContentView *, WKView *);
</ins><span class="cx">     virtual ~PageClientImpl();
</span><span class="cx">     
</span><span class="cx"> private:
</span><span class="lines">@@ -179,6 +181,7 @@
</span><span class="cx"> 
</span><span class="cx">     WKContentView *m_contentView;
</span><span class="cx">     WKWebView *m_webView;
</span><ins>+    WKView *m_wkView;
</ins><span class="cx">     RetainPtr&lt;WKEditorUndoTargetObjC&gt; m_undoTarget;
</span><span class="cx"> };
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosPageClientImplIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm (178869 => 178870)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm        2015-01-21 23:44:35 UTC (rev 178869)
+++ trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm        2015-01-21 23:47:43 UTC (rev 178870)
</span><span class="lines">@@ -40,6 +40,7 @@
</span><span class="cx"> #import &quot;WKContentViewInteraction.h&quot;
</span><span class="cx"> #import &quot;WKGeolocationProviderIOS.h&quot;
</span><span class="cx"> #import &quot;WKProcessPoolInternal.h&quot;
</span><ins>+#import &quot;WKViewPrivate.h&quot;
</ins><span class="cx"> #import &quot;WKWebViewConfigurationInternal.h&quot;
</span><span class="cx"> #import &quot;WKWebViewContentProviderRegistry.h&quot;
</span><span class="cx"> #import &quot;WKWebViewInternal.h&quot;
</span><span class="lines">@@ -110,10 +111,19 @@
</span><span class="cx"> PageClientImpl::PageClientImpl(WKContentView *contentView, WKWebView *webView)
</span><span class="cx">     : m_contentView(contentView)
</span><span class="cx">     , m_webView(webView)
</span><ins>+    , m_wkView(nil)
</ins><span class="cx">     , m_undoTarget(adoptNS([[WKEditorUndoTargetObjC alloc] init]))
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+PageClientImpl::PageClientImpl(WKContentView *contentView, WKView *wkView)
+    : m_contentView(contentView)
+    , m_webView(nil)
+    , m_wkView(wkView)
+    , m_undoTarget(adoptNS([[WKEditorUndoTargetObjC alloc] init]))
+{
+}
+
</ins><span class="cx"> PageClientImpl::~PageClientImpl()
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -213,6 +223,7 @@
</span><span class="cx"> {
</span><span class="cx">     [m_contentView _didRelaunchProcess];
</span><span class="cx">     [m_webView _didRelaunchProcess];
</span><ins>+    [m_wkView _didRelaunchProcess];
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PageClientImpl::pageClosed()
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWKContentViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentView.h (178869 => 178870)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WKContentView.h        2015-01-21 23:44:35 UTC (rev 178869)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentView.h        2015-01-21 23:47:43 UTC (rev 178870)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #import &lt;wtf/RetainPtr.h&gt;
</span><span class="cx"> 
</span><span class="cx"> @class WKContentView;
</span><ins>+@class WKView;
</ins><span class="cx"> @class WKWebView;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -62,6 +63,7 @@
</span><span class="cx"> @property (nonatomic, readonly) BOOL isBackground;
</span><span class="cx"> 
</span><span class="cx"> - (instancetype)initWithFrame:(CGRect)frame processPool:(WebKit::WebProcessPool&amp;)processPool configuration:(WebKit::WebPageConfiguration)webPageConfiguration webView:(WKWebView *)webView;
</span><ins>+- (instancetype)initWithFrame:(CGRect)frame processPool:(WebKit::WebProcessPool&amp;)processPool configuration:(WebKit::WebPageConfiguration)webPageConfiguration wkView:(WKView *)webView;
</ins><span class="cx"> 
</span><span class="cx"> - (void)didUpdateVisibleRect:(CGRect)visibleRect unobscuredRect:(CGRect)unobscuredRect
</span><span class="cx">     unobscuredRectInScrollViewCoordinates:(CGRect)unobscuredRectInScrollViewCoordinates
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWKContentViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm (178869 => 178870)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm        2015-01-21 23:44:35 UTC (rev 178869)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm        2015-01-21 23:47:43 UTC (rev 178870)
</span><span class="lines">@@ -178,23 +178,16 @@
</span><span class="cx">     RetainPtr&lt;NSUndoManager&gt; _undoManager;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (instancetype)initWithFrame:(CGRect)frame processPool:(WebKit::WebProcessPool&amp;)processPool configuration:(WebKit::WebPageConfiguration)webPageConfiguration webView:(WKWebView *)webView
</del><ins>+- (instancetype)_commonInitializationWithProcessPool:(WebKit::WebProcessPool&amp;)processPool configuration:(WebKit::WebPageConfiguration)webPageConfiguration
</ins><span class="cx"> {
</span><del>-    if (!(self = [super initWithFrame:frame]))
-        return nil;
</del><ins>+    ASSERT(_pageClient);
</ins><span class="cx"> 
</span><del>-    InitializeWebKit2();
-
-    _pageClient = std::make_unique&lt;PageClientImpl&gt;(self, webView);
-
</del><span class="cx">     _page = processPool.createWebPage(*_pageClient, WTF::move(webPageConfiguration));
</span><span class="cx">     _page-&gt;initializeWebPage();
</span><span class="cx">     _page-&gt;setIntrinsicDeviceScaleFactor(WKGetScaleFactorForScreen([UIScreen mainScreen]));
</span><span class="cx">     _page-&gt;setUseFixedLayout(true);
</span><span class="cx">     _page-&gt;setDelegatesScrolling(true);
</span><span class="cx"> 
</span><del>-    _webView = webView;
-    
</del><span class="cx">     _isBackground = [UIApplication sharedApplication].applicationState == UIApplicationStateBackground;
</span><span class="cx"> 
</span><span class="cx">     WebProcessPool::statistics().wkViewCount++;
</span><span class="lines">@@ -226,6 +219,31 @@
</span><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (instancetype)initWithFrame:(CGRect)frame processPool:(WebKit::WebProcessPool&amp;)processPool configuration:(WebKit::WebPageConfiguration)webPageConfiguration webView:(WKWebView *)webView
+{
+    if (!(self = [super initWithFrame:frame]))
+        return nil;
+
+    InitializeWebKit2();
+
+    _pageClient = std::make_unique&lt;PageClientImpl&gt;(self, webView);
+    _webView = webView;
+
+    return [self _commonInitializationWithProcessPool:processPool configuration:webPageConfiguration];
+}
+
+- (instancetype)initWithFrame:(CGRect)frame processPool:(WebKit::WebProcessPool&amp;)processPool configuration:(WebKit::WebPageConfiguration)webPageConfiguration wkView:(WKView *)wkView
+{
+    if (!(self = [super initWithFrame:frame]))
+        return nil;
+
+    InitializeWebKit2();
+
+    _pageClient = std::make_unique&lt;PageClientImpl&gt;(self, wkView);
+
+    return [self _commonInitializationWithProcessPool:processPool configuration:webPageConfiguration];
+}
+
</ins><span class="cx"> - (void)dealloc
</span><span class="cx"> {
</span><span class="cx">     [self cleanupInteraction];
</span></span></pre>
</div>
</div>

</body>
</html>