<!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>[185127] 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/185127">185127</a></dd>
<dt>Author</dt> <dd>barraclough@apple.com</dd>
<dt>Date</dt> <dd>2015-06-02 15:02:35 -0700 (Tue, 02 Jun 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>PDFs always think they're visible on iOS.
https://bugs.webkit.org/show_bug.cgi?id=145493
&lt;rdar://problem/19668879&gt;

Reviewed by Andreas Kling &amp; Sam Weinig.

The problem here is that WKContentView is currently responsible for notifying the WebPageProxy
that the visibility may have changed, but when a PDF isn't showing the WKContentView isn't in
the view hierarchy and doesn't receive the didMoveToWindow notifications – and the WKPDFView
(which is in the view hierarchy) does not listen for these events.

Visibility of the page should really just track the visibility of the WKWebView (and when
actually assessing the visibility it largely does - the page client checks the web view's
visibility, bar a FIXME, and the foreground/background check, which needs to change).
So notifications should really just come from the WKWebView.

The WKWebView already listens for the didMoveToWindow notification, it just was only updating
the IsInWindow flag. Instead just update all flags, and the call to viewStateDidChange from
WKContentView can just be removed.

There is one problem with this in that it would reverse the order of the calls to
viewStateDidChange &amp; _updateForScreen:, which would mean the the view would become visible before
updating the screen pixel density. To fix this, moving the call to _updateForScreen:
to willMoveToWindow:, to ensure it occurs before the page becomes visible.

This will also change behavior on Mac for WKWebView clients, in coalescing all view state changes
within the didMoveToWindow call. This is the direction we intended to go in anyway (the plan is
to remove the mayHaveChanged argument from viewStateDidChange - we're currently adding unnecessary
IPC traffic).

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView didMoveToWindow]):
    - should update all view state flags.
* UIProcess/API/ios/WKViewIOS.mm:
(-[WKView didMoveToWindow]):
    - added to match WKWebView.mm, for WebKitTestRunner.
* UIProcess/ios/WKContentView.mm:
(-[WKContentView willMoveToWindow:]):
    - should _updateForScreen:
(-[WKContentView didMoveToWindow]): Deleted.
    - functionality moved to -[WKWebView didMoveToWindow], -[WKContentView didMoveToWindow].</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="#trunkSourceWebKit2UIProcessAPIiosWKViewIOSmm">trunk/Source/WebKit2/UIProcess/API/ios/WKViewIOS.mm</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 (185126 => 185127)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-06-02 21:54:13 UTC (rev 185126)
+++ trunk/Source/WebKit2/ChangeLog        2015-06-02 22:02:35 UTC (rev 185127)
</span><span class="lines">@@ -1,3 +1,47 @@
</span><ins>+2015-06-02  Gavin Barraclough  &lt;barraclough@apple.com&gt;
+
+        PDFs always think they're visible on iOS.
+        https://bugs.webkit.org/show_bug.cgi?id=145493
+        &lt;rdar://problem/19668879&gt;
+
+        Reviewed by Andreas Kling &amp; Sam Weinig.
+
+        The problem here is that WKContentView is currently responsible for notifying the WebPageProxy
+        that the visibility may have changed, but when a PDF isn't showing the WKContentView isn't in
+        the view hierarchy and doesn't receive the didMoveToWindow notifications – and the WKPDFView
+        (which is in the view hierarchy) does not listen for these events.
+
+        Visibility of the page should really just track the visibility of the WKWebView (and when
+        actually assessing the visibility it largely does - the page client checks the web view's
+        visibility, bar a FIXME, and the foreground/background check, which needs to change).
+        So notifications should really just come from the WKWebView.
+
+        The WKWebView already listens for the didMoveToWindow notification, it just was only updating
+        the IsInWindow flag. Instead just update all flags, and the call to viewStateDidChange from
+        WKContentView can just be removed.
+
+        There is one problem with this in that it would reverse the order of the calls to
+        viewStateDidChange &amp; _updateForScreen:, which would mean the the view would become visible before
+        updating the screen pixel density. To fix this, moving the call to _updateForScreen:
+        to willMoveToWindow:, to ensure it occurs before the page becomes visible.
+
+        This will also change behavior on Mac for WKWebView clients, in coalescing all view state changes
+        within the didMoveToWindow call. This is the direction we intended to go in anyway (the plan is
+        to remove the mayHaveChanged argument from viewStateDidChange - we're currently adding unnecessary
+        IPC traffic).
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView didMoveToWindow]):
+            - should update all view state flags.
+        * UIProcess/API/ios/WKViewIOS.mm:
+        (-[WKView didMoveToWindow]):
+            - added to match WKWebView.mm, for WebKitTestRunner.
+        * UIProcess/ios/WKContentView.mm:
+        (-[WKContentView willMoveToWindow:]):
+            - should _updateForScreen:
+        (-[WKContentView didMoveToWindow]): Deleted.
+            - functionality moved to -[WKWebView didMoveToWindow], -[WKContentView didMoveToWindow].
+
</ins><span class="cx"> 2015-06-02  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS][WK2] Always mark layers as volatile for background pages
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (185126 => 185127)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2015-06-02 21:54:13 UTC (rev 185126)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2015-06-02 22:02:35 UTC (rev 185127)
</span><span class="lines">@@ -1320,7 +1320,7 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)didMoveToWindow
</span><span class="cx"> {
</span><del>-    _page-&gt;viewStateDidChange(WebCore::ViewState::IsInWindow);
</del><ins>+    _page-&gt;viewStateDidChange(WebCore::ViewState::AllFlags);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)setOpaque:(BOOL)opaque
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIiosWKViewIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/ios/WKViewIOS.mm (185126 => 185127)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/ios/WKViewIOS.mm        2015-06-02 21:54:13 UTC (rev 185126)
+++ trunk/Source/WebKit2/UIProcess/API/ios/WKViewIOS.mm        2015-06-02 22:02:35 UTC (rev 185127)
</span><span class="lines">@@ -113,6 +113,11 @@
</span><span class="cx">         [self _frameOrBoundsChanged];
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)didMoveToWindow
+{
+    [_contentView page]-&gt;viewStateDidChange(WebCore::ViewState::AllFlags);
+}
+
</ins><span class="cx"> - (UIScrollView *)scrollView
</span><span class="cx"> {
</span><span class="cx">     return _scrollView.get();
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWKContentViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm (185126 => 185127)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm        2015-06-02 21:54:13 UTC (rev 185126)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm        2015-06-02 22:02:35 UTC (rev 185127)
</span><span class="lines">@@ -281,16 +281,11 @@
</span><span class="cx">         if (_webView._allowsLinkPreview)
</span><span class="cx">             [self _registerPreviewInWindow:newWindow];
</span><span class="cx"> #endif
</span><ins>+
+        [self _updateForScreen:newWindow.screen];
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)didMoveToWindow
-{
-    if (self.window)
-        [self _updateForScreen:self.window.screen];
-    _page-&gt;viewStateDidChange(ViewState::AllFlags);
-}
-
</del><span class="cx"> - (WKBrowsingContextController *)browsingContextController
</span><span class="cx"> {
</span><span class="cx">     if (!_browsingContextController)
</span></span></pre>
</div>
</div>

</body>
</html>