<!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>[203371] 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/203371">203371</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2016-07-18 13:41:18 -0700 (Mon, 18 Jul 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Mail contents are temporarily obscured by black rectangles when returning from suspend and in app switcher
https://bugs.webkit.org/show_bug.cgi?id=159894
&lt;rdar://problem/26973202&gt;

Reviewed by Simon Fraser.

* UIProcess/ApplicationStateTracker.h:
* UIProcess/ApplicationStateTracker.mm:
(WebKit::ApplicationStateTracker::ApplicationStateTracker):
(WebKit::ApplicationStateTracker::~ApplicationStateTracker):
(WebKit::ApplicationStateTracker::applicationDidCreateWindowContext):
* UIProcess/ios/WKContentView.mm:
(-[WKContentView didMoveToWindow]):
(-[WKContentView _applicationDidCreateWindowContext]):
(-[WKContentView _applicationWillEnterForeground]): Deleted.
* UIProcess/ios/WKPDFView.mm:
(-[WKPDFView didMoveToWindow]):
(-[WKPDFView _applicationDidCreateWindowContext]):
* UIProcess/ios/WebPageProxyIOS.mm:
(WebKit::WebPageProxy::applicationDidFinishSnapshottingAfterEnteringBackground):
Hide content at window context creation time, instead of when the application
becomes foregrounded. Otherwise, background snapshots (which create/destroy
window contexts, but do not bring the app into the foreground) can have
parented layers that have volatile surfaces in them. In the normal case,
we will subsequently get foregrounded and re-build the layer tree; in the
background snapshot case, we will just have an empty layer tree.

In the future, we should consider making ApplicationStateTracker use
window context creation/destruction to drive web process lifetime, so
that we can actually paint correctly for background snapshots.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessApplicationStateTrackerh">trunk/Source/WebKit2/UIProcess/ApplicationStateTracker.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessApplicationStateTrackermm">trunk/Source/WebKit2/UIProcess/ApplicationStateTracker.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWKContentViewmm">trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWKPDFViewmm">trunk/Source/WebKit2/UIProcess/ios/WKPDFView.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (203370 => 203371)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-07-18 20:31:20 UTC (rev 203370)
+++ trunk/Source/WebKit2/ChangeLog        2016-07-18 20:41:18 UTC (rev 203371)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2016-07-18  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+        Mail contents are temporarily obscured by black rectangles when returning from suspend and in app switcher
+        https://bugs.webkit.org/show_bug.cgi?id=159894
+        &lt;rdar://problem/26973202&gt;
+
+        Reviewed by Simon Fraser.
+
+        * UIProcess/ApplicationStateTracker.h:
+        * UIProcess/ApplicationStateTracker.mm:
+        (WebKit::ApplicationStateTracker::ApplicationStateTracker):
+        (WebKit::ApplicationStateTracker::~ApplicationStateTracker):
+        (WebKit::ApplicationStateTracker::applicationDidCreateWindowContext):
+        * UIProcess/ios/WKContentView.mm:
+        (-[WKContentView didMoveToWindow]):
+        (-[WKContentView _applicationDidCreateWindowContext]):
+        (-[WKContentView _applicationWillEnterForeground]): Deleted.
+        * UIProcess/ios/WKPDFView.mm:
+        (-[WKPDFView didMoveToWindow]):
+        (-[WKPDFView _applicationDidCreateWindowContext]):
+        * UIProcess/ios/WebPageProxyIOS.mm:
+        (WebKit::WebPageProxy::applicationDidFinishSnapshottingAfterEnteringBackground):
+        Hide content at window context creation time, instead of when the application
+        becomes foregrounded. Otherwise, background snapshots (which create/destroy
+        window contexts, but do not bring the app into the foreground) can have
+        parented layers that have volatile surfaces in them. In the normal case,
+        we will subsequently get foregrounded and re-build the layer tree; in the
+        background snapshot case, we will just have an empty layer tree.
+
+        In the future, we should consider making ApplicationStateTracker use
+        window context creation/destruction to drive web process lifetime, so
+        that we can actually paint correctly for background snapshots.
+
</ins><span class="cx"> 2016-07-18  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed. Update OptionsGTK.cmake and NEWS for 2.13.3 release.
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessApplicationStateTrackerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ApplicationStateTracker.h (203370 => 203371)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ApplicationStateTracker.h        2016-07-18 20:31:20 UTC (rev 203370)
+++ trunk/Source/WebKit2/UIProcess/ApplicationStateTracker.h        2016-07-18 20:41:18 UTC (rev 203371)
</span><span class="lines">@@ -39,7 +39,7 @@
</span><span class="cx"> 
</span><span class="cx"> class ApplicationStateTracker {
</span><span class="cx"> public:
</span><del>-    ApplicationStateTracker(UIView *, SEL didEnterBackgroundSelector, SEL didFinishSnapshottingAfterEnteringBackgroundSelector, SEL willEnterForegroundSelector);
</del><ins>+    ApplicationStateTracker(UIView *, SEL didEnterBackgroundSelector, SEL didCreateWindowContextSelector, SEL didFinishSnapshottingAfterEnteringBackgroundSelector, SEL willEnterForegroundSelector);
</ins><span class="cx">     ~ApplicationStateTracker();
</span><span class="cx"> 
</span><span class="cx">     bool isInBackground() const { return m_isInBackground; }
</span><span class="lines">@@ -46,11 +46,13 @@
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     void applicationDidEnterBackground();
</span><ins>+    void applicationDidCreateWindowContext();
</ins><span class="cx">     void applicationDidFinishSnapshottingAfterEnteringBackground();
</span><span class="cx">     void applicationWillEnterForeground();
</span><span class="cx"> 
</span><span class="cx">     WeakObjCPtr&lt;UIView&gt; m_view;
</span><span class="cx">     SEL m_didEnterBackgroundSelector;
</span><ins>+    SEL m_didCreateWindowContextSelector;
</ins><span class="cx">     SEL m_didFinishSnapshottingAfterEnteringBackgroundSelector;
</span><span class="cx">     SEL m_willEnterForegroundSelector;
</span><span class="cx"> 
</span><span class="lines">@@ -61,6 +63,7 @@
</span><span class="cx">     RetainPtr&lt;BKSApplicationStateMonitor&gt; m_applicationStateMonitor;
</span><span class="cx"> 
</span><span class="cx">     id m_didEnterBackgroundObserver;
</span><ins>+    id m_didCreateWindowContextObserver;
</ins><span class="cx">     id m_didFinishSnapshottingAfterEnteringBackgroundObserver;
</span><span class="cx">     id m_willEnterForegroundObserver;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessApplicationStateTrackermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ApplicationStateTracker.mm (203370 => 203371)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ApplicationStateTracker.mm        2016-07-18 20:31:20 UTC (rev 203370)
+++ trunk/Source/WebKit2/UIProcess/ApplicationStateTracker.mm        2016-07-18 20:41:18 UTC (rev 203371)
</span><span class="lines">@@ -73,18 +73,21 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ApplicationStateTracker::ApplicationStateTracker(UIView *view, SEL didEnterBackgroundSelector, SEL didFinishSnapshottingAfterEnteringBackgroundSelector, SEL willEnterForegroundSelector)
</del><ins>+ApplicationStateTracker::ApplicationStateTracker(UIView *view, SEL didEnterBackgroundSelector, SEL didCreateWindowContextSelector, SEL didFinishSnapshottingAfterEnteringBackgroundSelector, SEL willEnterForegroundSelector)
</ins><span class="cx">     : m_view(view)
</span><span class="cx">     , m_didEnterBackgroundSelector(didEnterBackgroundSelector)
</span><ins>+    , m_didCreateWindowContextSelector(didCreateWindowContextSelector)
</ins><span class="cx">     , m_didFinishSnapshottingAfterEnteringBackgroundSelector(didFinishSnapshottingAfterEnteringBackgroundSelector)
</span><span class="cx">     , m_willEnterForegroundSelector(willEnterForegroundSelector)
</span><span class="cx">     , m_isInBackground(true)
</span><span class="cx">     , m_weakPtrFactory(this)
</span><span class="cx">     , m_didEnterBackgroundObserver(nullptr)
</span><ins>+    , m_didCreateWindowContextObserver(nullptr)
</ins><span class="cx">     , m_didFinishSnapshottingAfterEnteringBackgroundObserver(nullptr)
</span><span class="cx">     , m_willEnterForegroundObserver(nullptr)
</span><span class="cx"> {
</span><span class="cx">     ASSERT([m_view.get() respondsToSelector:m_didEnterBackgroundSelector]);
</span><ins>+    ASSERT([m_view.get() respondsToSelector:m_didCreateWindowContextSelector]);
</ins><span class="cx">     ASSERT([m_view.get() respondsToSelector:m_didFinishSnapshottingAfterEnteringBackgroundSelector]);
</span><span class="cx">     ASSERT([m_view.get() respondsToSelector:m_willEnterForegroundSelector]);
</span><span class="cx"> 
</span><span class="lines">@@ -93,6 +96,13 @@
</span><span class="cx"> 
</span><span class="cx">     NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
</span><span class="cx">     auto weakThis = m_weakPtrFactory.createWeakPtr();
</span><ins>+    m_didCreateWindowContextObserver = [notificationCenter addObserverForName:@&quot;_UIWindowDidCreateWindowContextNotification&quot; object:window queue:nil usingBlock:[weakThis](NSNotification *) {
+        auto applicationStateTracker = weakThis.get();
+        if (!applicationStateTracker)
+            return;
+        applicationStateTracker-&gt;applicationDidCreateWindowContext();
+    }];
+
</ins><span class="cx">     m_didFinishSnapshottingAfterEnteringBackgroundObserver = [notificationCenter addObserverForName:@&quot;_UIWindowWillDestroyWindowContextNotification&quot; object:window queue:nil usingBlock:[weakThis](NSNotification *) {
</span><span class="cx">         auto applicationStateTracker = weakThis.get();
</span><span class="cx">         if (!applicationStateTracker)
</span><span class="lines">@@ -183,6 +193,7 @@
</span><span class="cx"> 
</span><span class="cx">     NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
</span><span class="cx">     [notificationCenter removeObserver:m_didEnterBackgroundObserver];
</span><ins>+    [notificationCenter removeObserver:m_didCreateWindowContextObserver];
</ins><span class="cx">     [notificationCenter removeObserver:m_didFinishSnapshottingAfterEnteringBackgroundObserver];
</span><span class="cx">     [notificationCenter removeObserver:m_willEnterForegroundObserver];
</span><span class="cx"> }
</span><span class="lines">@@ -195,6 +206,12 @@
</span><span class="cx">         wtfObjcMsgSend&lt;void&gt;(view.get(), m_didEnterBackgroundSelector);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void ApplicationStateTracker::applicationDidCreateWindowContext()
+{
+    if (auto view = m_view.get())
+        wtfObjcMsgSend&lt;void&gt;(view.get(), m_didCreateWindowContextSelector);
+}
+
</ins><span class="cx"> void ApplicationStateTracker::applicationDidFinishSnapshottingAfterEnteringBackground()
</span><span class="cx"> {
</span><span class="cx">     if (auto view = m_view.get())
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWKContentViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm (203370 => 203371)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm        2016-07-18 20:31:20 UTC (rev 203370)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm        2016-07-18 20:41:18 UTC (rev 203371)
</span><span class="lines">@@ -284,7 +284,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     ASSERT(!_applicationStateTracker);
</span><del>-    _applicationStateTracker = std::make_unique&lt;ApplicationStateTracker&gt;(self, @selector(_applicationDidEnterBackground), @selector(_applicationDidFinishSnapshottingAfterEnteringBackground), @selector(_applicationWillEnterForeground));
</del><ins>+    _applicationStateTracker = std::make_unique&lt;ApplicationStateTracker&gt;(self, @selector(_applicationDidEnterBackground), @selector(_applicationDidCreateWindowContext), @selector(_applicationDidFinishSnapshottingAfterEnteringBackground), @selector(_applicationWillEnterForeground));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (WKBrowsingContextController *)browsingContextController
</span><span class="lines">@@ -601,6 +601,12 @@
</span><span class="cx">     _page-&gt;viewStateDidChange(ViewState::AllFlags &amp; ~ViewState::IsInWindow);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)_applicationDidCreateWindowContext
+{
+    if (auto drawingArea = _page-&gt;drawingArea())
+        drawingArea-&gt;hideContentUntilAnyUpdate();
+}
+
</ins><span class="cx"> - (void)_applicationDidFinishSnapshottingAfterEnteringBackground
</span><span class="cx"> {
</span><span class="cx">     _page-&gt;applicationDidFinishSnapshottingAfterEnteringBackground();
</span><span class="lines">@@ -609,8 +615,6 @@
</span><span class="cx"> - (void)_applicationWillEnterForeground
</span><span class="cx"> {
</span><span class="cx">     _page-&gt;applicationWillEnterForeground();
</span><del>-    if (auto drawingArea = _page-&gt;drawingArea())
-        drawingArea-&gt;hideContentUntilAnyUpdate();
</del><span class="cx">     _page-&gt;viewStateDidChange(ViewState::AllFlags &amp; ~ViewState::IsInWindow, true, WebPageProxy::ViewStateChangeDispatchMode::Immediate);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWKPDFViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WKPDFView.mm (203370 => 203371)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WKPDFView.mm        2016-07-18 20:31:20 UTC (rev 203370)
+++ trunk/Source/WebKit2/UIProcess/ios/WKPDFView.mm        2016-07-18 20:41:18 UTC (rev 203371)
</span><span class="lines">@@ -864,7 +864,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     ASSERT(!_applicationStateTracker);
</span><del>-    _applicationStateTracker = std::make_unique&lt;ApplicationStateTracker&gt;(self, @selector(_applicationDidEnterBackground), @selector(_applicationDidFinishSnapshottingAfterEnteringBackground), @selector(_applicationWillEnterForeground));
</del><ins>+    _applicationStateTracker = std::make_unique&lt;ApplicationStateTracker&gt;(self, @selector(_applicationDidEnterBackground), @selector(_applicationDidCreateWindowContext), @selector(_applicationDidFinishSnapshottingAfterEnteringBackground), @selector(_applicationWillEnterForeground));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (BOOL)isBackground
</span><span class="lines">@@ -881,6 +881,10 @@
</span><span class="cx">     _webView-&gt;_page-&gt;viewStateDidChange(ViewState::AllFlags &amp; ~ViewState::IsInWindow);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)_applicationDidCreateWindowContext
+{
+}
+
</ins><span class="cx"> - (void)_applicationDidFinishSnapshottingAfterEnteringBackground
</span><span class="cx"> {
</span><span class="cx">     _webView-&gt;_page-&gt;applicationDidFinishSnapshottingAfterEnteringBackground();
</span></span></pre>
</div>
</div>

</body>
</html>