<!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>[207603] branches/safari-602-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/207603">207603</a></dd>
<dt>Author</dt> <dd>matthew_hanson@apple.com</dd>
<dt>Date</dt> <dd>2016-10-20 02:59:53 -0700 (Thu, 20 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/206833">r206833</a>. rdar://problem/28634858</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchessafari602branchSourceWebKit2ChangeLog">branches/safari-602-branch/Source/WebKit2/ChangeLog</a></li>
<li><a href="#branchessafari602branchSourceWebKit2UIProcessCocoaWebViewImplmm">branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebViewImpl.mm</a></li>
<li><a href="#branchessafari602branchSourceWebKit2UIProcessWebBackForwardListcpp">branches/safari-602-branch/Source/WebKit2/UIProcess/WebBackForwardList.cpp</a></li>
<li><a href="#branchessafari602branchSourceWebKit2UIProcessWebPageProxycpp">branches/safari-602-branch/Source/WebKit2/UIProcess/WebPageProxy.cpp</a></li>
<li><a href="#branchessafari602branchSourceWebKit2UIProcessWebPageProxyh">branches/safari-602-branch/Source/WebKit2/UIProcess/WebPageProxy.h</a></li>
<li><a href="#branchessafari602branchSourceWebKit2UIProcessiosViewGestureControllerIOSmm">branches/safari-602-branch/Source/WebKit2/UIProcess/ios/ViewGestureControllerIOS.mm</a></li>
<li><a href="#branchessafari602branchSourceWebKit2UIProcessmacViewGestureControllerMacmm">branches/safari-602-branch/Source/WebKit2/UIProcess/mac/ViewGestureControllerMac.mm</a></li>
<li><a href="#branchessafari602branchToolsChangeLog">branches/safari-602-branch/Tools/ChangeLog</a></li>
<li><a href="#branchessafari602branchToolsTestWebKitAPITestsWebKit2CocoaSnapshotStoremm">branches/safari-602-branch/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/SnapshotStore.mm</a></li>
<li><a href="#branchessafari602branchToolsTestWebKitAPImacTestWKWebViewMach">branches/safari-602-branch/Tools/TestWebKitAPI/mac/TestWKWebViewMac.h</a></li>
<li><a href="#branchessafari602branchToolsTestWebKitAPImacTestWKWebViewMacmm">branches/safari-602-branch/Tools/TestWebKitAPI/mac/TestWKWebViewMac.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchessafari602branchSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/ChangeLog (207602 => 207603)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/ChangeLog        2016-10-20 09:59:48 UTC (rev 207602)
+++ branches/safari-602-branch/Source/WebKit2/ChangeLog        2016-10-20 09:59:53 UTC (rev 207603)
</span><span class="lines">@@ -1,5 +1,51 @@
</span><span class="cx"> 2016-10-20  Matthew Hanson  &lt;matthew_hanson@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Merge r206833. rdar://problem/28634858
+
+    2016-10-05  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+            Avoid automatically re-taking snapshots for back-forward items that were never loaded into the view
+            https://bugs.webkit.org/show_bug.cgi?id=162955
+            &lt;rdar://problem/27659173&gt;
+
+            Reviewed by Simon Fraser.
+
+            Make it possible for clients to control the snapshot for back-forward
+            items that are restored from session state without navigating to them,
+            by ensuring that we won't stomp on the snapshot that they explicitly take,
+            until a load occurs.
+
+            * UIProcess/WebBackForwardList.cpp:
+            (WebKit::WebBackForwardList::addItem):
+            (WebKit::WebBackForwardList::goToItem):
+            * UIProcess/ios/ViewGestureControllerIOS.mm:
+            (WebKit::ViewGestureController::beginSwipeGesture):
+            * UIProcess/mac/ViewGestureControllerMac.mm:
+            (WebKit::ViewGestureController::trackSwipeGesture):
+            Disambiguate explicit API-driven snapshot recording from automatic,
+            navigation-driven snapshot recording.
+
+            * UIProcess/Cocoa/WebViewImpl.mm:
+            (WebKit::WebViewImpl::saveBackForwardSnapshotForCurrentItem):
+            Get rid of the version of recordNavigationSnapshot() that doesn't take a
+            back-forward list item, and grab the current item at the one remaining caller.
+
+            * UIProcess/WebPageProxy.cpp:
+            (WebKit::WebPageProxy::recordAutomaticNavigationSnapshot):
+            (WebKit::WebPageProxy::recordNavigationSnapshot):
+            (WebKit::WebPageProxy::restoreFromSessionState):
+            (WebKit::WebPageProxy::didCommitLoadForFrame):
+            * UIProcess/WebPageProxy.h:
+            Rename m_suppressNavigationSnapshotting to m_suppressAutomaticNavigationSnapshotting,
+            and make it be only about automatic (navigation-driven) snapshots; it won't have
+            any impact on explicit snapshots forced by clients.
+
+            Set m_suppressAutomaticNavigationSnapshotting unconditionally when restoring
+            from session state, so that we won't start automatically snapshotting until
+            something has loaded in the view.
+
+2016-10-20  Matthew Hanson  &lt;matthew_hanson@apple.com&gt;
+
</ins><span class="cx">         Merge r206829. rdar://problem/28634858
</span><span class="cx"> 
</span><span class="cx">     2016-10-05  Tim Horton  &lt;timothy_horton@apple.com&gt;
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2UIProcessCocoaWebViewImplmm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebViewImpl.mm (207602 => 207603)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebViewImpl.mm        2016-10-20 09:59:48 UTC (rev 207602)
+++ branches/safari-602-branch/Source/WebKit2/UIProcess/Cocoa/WebViewImpl.mm        2016-10-20 09:59:53 UTC (rev 207603)
</span><span class="lines">@@ -3177,7 +3177,8 @@
</span><span class="cx"> 
</span><span class="cx"> void WebViewImpl::saveBackForwardSnapshotForCurrentItem()
</span><span class="cx"> {
</span><del>-    m_page-&gt;recordNavigationSnapshot();
</del><ins>+    if (WebBackForwardListItem* item = m_page-&gt;backForwardList().currentItem())
+        m_page-&gt;recordNavigationSnapshot(*item);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebViewImpl::saveBackForwardSnapshotForItem(WebBackForwardListItem&amp; item)
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2UIProcessWebBackForwardListcpp"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/UIProcess/WebBackForwardList.cpp (207602 => 207603)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/UIProcess/WebBackForwardList.cpp        2016-10-20 09:59:48 UTC (rev 207602)
+++ branches/safari-602-branch/Source/WebKit2/UIProcess/WebBackForwardList.cpp        2016-10-20 09:59:53 UTC (rev 207603)
</span><span class="lines">@@ -93,7 +93,7 @@
</span><span class="cx">     Vector&lt;RefPtr&lt;WebBackForwardListItem&gt;&gt; removedItems;
</span><span class="cx">     
</span><span class="cx">     if (m_hasCurrentIndex) {
</span><del>-        m_page-&gt;recordNavigationSnapshot();
</del><ins>+        m_page-&gt;recordAutomaticNavigationSnapshot();
</ins><span class="cx"> 
</span><span class="cx">         // Toss everything in the forward list.
</span><span class="cx">         unsigned targetSize = m_currentIndex + 1;
</span><span class="lines">@@ -187,7 +187,7 @@
</span><span class="cx">     WebBackForwardListItem* currentItem = m_entries[m_currentIndex].get();
</span><span class="cx">     bool shouldKeepCurrentItem = true;
</span><span class="cx">     if (currentItem != item) {
</span><del>-        m_page-&gt;recordNavigationSnapshot();
</del><ins>+        m_page-&gt;recordAutomaticNavigationSnapshot();
</ins><span class="cx">         shouldKeepCurrentItem = m_page-&gt;shouldKeepCurrentBackForwardListItemInList(m_entries[m_currentIndex].get());
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/UIProcess/WebPageProxy.cpp (207602 => 207603)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/UIProcess/WebPageProxy.cpp        2016-10-20 09:59:48 UTC (rev 207602)
+++ branches/safari-602-branch/Source/WebKit2/UIProcess/WebPageProxy.cpp        2016-10-20 09:59:53 UTC (rev 207603)
</span><span class="lines">@@ -1183,8 +1183,11 @@
</span><span class="cx">     return WTFMove(navigation);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebPageProxy::recordNavigationSnapshot()
</del><ins>+void WebPageProxy::recordAutomaticNavigationSnapshot()
</ins><span class="cx"> {
</span><ins>+    if (m_suppressAutomaticNavigationSnapshotting)
+        return;
+
</ins><span class="cx">     if (WebBackForwardListItem* item = m_backForwardList-&gt;currentItem())
</span><span class="cx">         recordNavigationSnapshot(*item);
</span><span class="cx"> }
</span><span class="lines">@@ -1191,7 +1194,7 @@
</span><span class="cx"> 
</span><span class="cx"> void WebPageProxy::recordNavigationSnapshot(WebBackForwardListItem&amp; item)
</span><span class="cx"> {
</span><del>-    if (!m_shouldRecordNavigationSnapshots || m_suppressNavigationSnapshotting)
</del><ins>+    if (!m_shouldRecordNavigationSnapshots)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="lines">@@ -2388,11 +2391,9 @@
</span><span class="cx"> 
</span><span class="cx">         process().send(Messages::WebPage::RestoreSession(m_backForwardList-&gt;itemStates()), m_pageID);
</span><span class="cx"> 
</span><del>-        if (navigate) {
-            // The back / forward list was restored from a sessionState so we don't want to snapshot the current
-            // page when navigating away. Suppress navigation snapshotting until the next load has committed
-            m_suppressNavigationSnapshotting = true;
-        }
</del><ins>+        // The back / forward list was restored from a sessionState so we don't want to snapshot the current
+        // page when navigating away. Suppress navigation snapshotting until the next load has committed
+        m_suppressAutomaticNavigationSnapshotting = true;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // FIXME: Navigating should be separate from state restoration.
</span><span class="lines">@@ -3246,7 +3247,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (frame-&gt;isMainFrame()) {
</span><span class="cx">         m_pageLoadState.didCommitLoad(transaction, webCertificateInfo, markPageInsecure);
</span><del>-        m_suppressNavigationSnapshotting = false;
</del><ins>+        m_suppressAutomaticNavigationSnapshotting = false;
</ins><span class="cx">     } else if (markPageInsecure)
</span><span class="cx">         m_pageLoadState.didDisplayOrRunInsecureContent(transaction);
</span><span class="cx"> 
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/UIProcess/WebPageProxy.h (207602 => 207603)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/UIProcess/WebPageProxy.h        2016-10-20 09:59:48 UTC (rev 207602)
+++ branches/safari-602-branch/Source/WebKit2/UIProcess/WebPageProxy.h        2016-10-20 09:59:53 UTC (rev 207603)
</span><span class="lines">@@ -1002,7 +1002,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool shouldRecordNavigationSnapshots() const { return m_shouldRecordNavigationSnapshots; }
</span><span class="cx">     void setShouldRecordNavigationSnapshots(bool shouldRecordSnapshots) { m_shouldRecordNavigationSnapshots = shouldRecordSnapshots; }
</span><del>-    void recordNavigationSnapshot();
</del><ins>+    void recordAutomaticNavigationSnapshot();
</ins><span class="cx">     void recordNavigationSnapshot(WebBackForwardListItem&amp;);
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="lines">@@ -1828,7 +1828,7 @@
</span><span class="cx">     bool m_waitingForDidUpdateViewState;
</span><span class="cx"> 
</span><span class="cx">     bool m_shouldScaleViewToFitDocument { false };
</span><del>-    bool m_suppressNavigationSnapshotting { false };
</del><ins>+    bool m_suppressAutomaticNavigationSnapshotting { false };
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">     HashMap&lt;String, String&gt; m_temporaryPDFFiles;
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2UIProcessiosViewGestureControllerIOSmm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/UIProcess/ios/ViewGestureControllerIOS.mm (207602 => 207603)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/UIProcess/ios/ViewGestureControllerIOS.mm        2016-10-20 09:59:48 UTC (rev 207602)
+++ branches/safari-602-branch/Source/WebKit2/UIProcess/ios/ViewGestureControllerIOS.mm        2016-10-20 09:59:53 UTC (rev 207603)
</span><span class="lines">@@ -158,7 +158,7 @@
</span><span class="cx">     if (m_activeGestureType != ViewGestureType::None)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_webPageProxy.recordNavigationSnapshot();
</del><ins>+    m_webPageProxy.recordAutomaticNavigationSnapshot();
</ins><span class="cx"> 
</span><span class="cx">     m_webPageProxyForBackForwardListForCurrentSwipe = m_alternateBackForwardListSourceView.get() ? m_alternateBackForwardListSourceView.get()-&gt;_page : &amp;m_webPageProxy;
</span><span class="cx">     m_webPageProxyForBackForwardListForCurrentSwipe-&gt;navigationGestureDidBegin();
</span></span></pre></div>
<a id="branchessafari602branchSourceWebKit2UIProcessmacViewGestureControllerMacmm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Source/WebKit2/UIProcess/mac/ViewGestureControllerMac.mm (207602 => 207603)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Source/WebKit2/UIProcess/mac/ViewGestureControllerMac.mm        2016-10-20 09:59:48 UTC (rev 207602)
+++ branches/safari-602-branch/Source/WebKit2/UIProcess/mac/ViewGestureControllerMac.mm        2016-10-20 09:59:53 UTC (rev 207603)
</span><span class="lines">@@ -399,7 +399,7 @@
</span><span class="cx"> 
</span><span class="cx">     m_pendingSwipeTracker.reset(&quot;starting to track swipe&quot;);
</span><span class="cx"> 
</span><del>-    m_webPageProxy.recordNavigationSnapshot();
</del><ins>+    m_webPageProxy.recordAutomaticNavigationSnapshot();
</ins><span class="cx"> 
</span><span class="cx">     BOOL swipingLeft = isPhysicallySwipingLeft(direction);
</span><span class="cx">     CGFloat maxProgress = swipingLeft ? 1 : 0;
</span></span></pre></div>
<a id="branchessafari602branchToolsChangeLog"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Tools/ChangeLog (207602 => 207603)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Tools/ChangeLog        2016-10-20 09:59:48 UTC (rev 207602)
+++ branches/safari-602-branch/Tools/ChangeLog        2016-10-20 09:59:53 UTC (rev 207603)
</span><span class="lines">@@ -1,5 +1,40 @@
</span><span class="cx"> 2016-10-20  Matthew Hanson  &lt;matthew_hanson@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Merge r206833. rdar://problem/28634858
+
+    2016-10-05  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+            Avoid automatically re-taking snapshots for back-forward items that were never loaded into the view
+            https://bugs.webkit.org/show_bug.cgi?id=162955
+            &lt;rdar://problem/27659173&gt;
+
+            Reviewed by Simon Fraser.
+
+            * TestWebKitAPI/Tests/WebKit2Cocoa/SnapshotStore.mm:
+            (-[SnapshotTestWKWebView init]):
+            (forceRepaintCallback):
+            (-[SnapshotTestWKWebView synchronouslyForceRepaint]):
+            (-[SnapshotTestWKWebView synchronouslyLoadTestPageAndForceRepaint:]):
+            (TEST):
+            (makeRedSquareView):
+            Add a test that restoring session state into a web view without navigating,
+            then explicitly snapshotting and navigating away, leaves the original snapshot alone.
+
+            Adjust the existing test, as well, to ensure that it will reliably fail
+            if the feature is broken. Use an explicitly added and removed red square
+            instead of scrolling, because we can't scroll in the restore-without-navigating case.
+
+            Stop trying to override the window scale, because it's not working (we're getting partial snapshots)
+            and isn't necessary; instead just multiply the expected value by the page scale.
+
+            (-[SnapshotTestWKWebView loadPageNamed:]): Deleted.
+            * TestWebKitAPI/mac/TestWKWebViewMac.h:
+            * TestWebKitAPI/mac/TestWKWebViewMac.mm:
+            (-[TestWKWebView synchronouslyLoadTestPageNamed:]):
+            Reorganize to reduce duplication.
+
+2016-10-20  Matthew Hanson  &lt;matthew_hanson@apple.com&gt;
+
</ins><span class="cx">         Merge r206829. rdar://problem/28634858
</span><span class="cx"> 
</span><span class="cx">     2016-10-05  Tim Horton  &lt;timothy_horton@apple.com&gt;
</span></span></pre></div>
<a id="branchessafari602branchToolsTestWebKitAPITestsWebKit2CocoaSnapshotStoremm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/SnapshotStore.mm (207602 => 207603)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/SnapshotStore.mm        2016-10-20 09:59:48 UTC (rev 207602)
+++ branches/safari-602-branch/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/SnapshotStore.mm        2016-10-20 09:59:53 UTC (rev 207603)
</span><span class="lines">@@ -28,22 +28,21 @@
</span><span class="cx"> 
</span><span class="cx"> #if WK_API_ENABLED &amp;&amp; PLATFORM(MAC)
</span><span class="cx"> 
</span><del>-#import &quot;JavaScriptTest.h&quot;
</del><span class="cx"> #import &quot;PlatformUtilities.h&quot;
</span><span class="cx"> #import &quot;Test.h&quot;
</span><span class="cx"> #import &quot;TestNavigationDelegate.h&quot;
</span><span class="cx"> #import &quot;TestWKWebViewMac.h&quot;
</span><span class="cx"> #import &lt;WebKit/WKBackForwardListItemPrivate.h&gt;
</span><ins>+#import &lt;WebKit/WKPage.h&gt;
+#import &lt;WebKit/WKPagePrivate.h&gt;
</ins><span class="cx"> #import &lt;WebKit/WKWebView.h&gt;
</span><span class="cx"> #import &lt;WebKit/WKWebViewPrivate.h&gt;
</span><span class="cx"> #import &lt;wtf/RetainPtr.h&gt;
</span><span class="cx"> 
</span><ins>+static bool didForceRepaint;
+
</ins><span class="cx"> using namespace TestWebKitAPI;
</span><span class="cx"> 
</span><del>-@interface NSWindow ()
-- (void)_setWindowResolution:(CGFloat)resolution displayIfChanged:(BOOL)displayIfChanged;
-@end
-
</del><span class="cx"> @interface WKWebView ()
</span><span class="cx"> - (WKPageRef)_pageForTesting;
</span><span class="cx"> @end
</span><span class="lines">@@ -58,23 +57,35 @@
</span><span class="cx"> {
</span><span class="cx">     self = [super initWithFrame:NSMakeRect(0, 0, 800, 600)];
</span><span class="cx">     if (self) {
</span><del>-        [self _setOverrideDeviceScaleFactor:1];
</del><span class="cx">         [self _disableBackForwardSnapshotVolatilityForTesting];
</span><span class="cx">         [self setAllowsBackForwardNavigationGestures:YES];
</span><span class="cx">         [self _setWindowOcclusionDetectionEnabled:NO];
</span><span class="cx"> 
</span><del>-        [self.window _setWindowResolution:1 displayIfChanged:YES];
</del><span class="cx">         [self.window orderBack:nil];
</span><span class="cx">     }
</span><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)loadPageNamed:(NSString *)pageName
</del><ins>+static void forceRepaintCallback(WKErrorRef error, void*)
</ins><span class="cx"> {
</span><del>-    [self loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:pageName withExtension:@&quot;html&quot; subdirectory:@&quot;TestWebKitAPI.resources&quot;]]];
-    [self _test_waitForDidFinishNavigation];
</del><ins>+    EXPECT_NULL(error);
+    didForceRepaint = true;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)synchronouslyForceRepaint
+{
+    didForceRepaint = false;
+    WKPageForceRepaint([self _pageForTesting], 0, forceRepaintCallback);
+    TestWebKitAPI::Util::run(&amp;didForceRepaint);
+}
+
+- (void)synchronouslyLoadTestPageAndForceRepaint:(NSString *)testPageName
+{
+    [self synchronouslyLoadTestPageNamed:testPageName];
+    [self synchronouslyForceRepaint];
+    [[self window] display];
+}
+
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> static bool imagesAreEqual(CGImageRef first, CGImageRef second)
</span><span class="lines">@@ -89,7 +100,7 @@
</span><span class="cx"> {
</span><span class="cx">     RetainPtr&lt;SnapshotTestWKWebView&gt; webView = adoptNS([[SnapshotTestWKWebView alloc] init]);
</span><span class="cx"> 
</span><del>-    [webView loadPageNamed:@&quot;simple&quot;];
</del><ins>+    [webView synchronouslyLoadTestPageAndForceRepaint:@&quot;simple&quot;];
</ins><span class="cx"> 
</span><span class="cx">     RetainPtr&lt;WKBackForwardListItem&gt; firstItem = [[webView backForwardList] currentItem];
</span><span class="cx"> 
</span><span class="lines">@@ -96,12 +107,12 @@
</span><span class="cx">     RetainPtr&lt;CGImageRef&gt; imageBeforeNavigation = adoptCF([firstItem _copySnapshotForTesting]);
</span><span class="cx">     EXPECT_NULL(imageBeforeNavigation.get());
</span><span class="cx"> 
</span><del>-    [webView loadPageNamed:@&quot;lots-of-text&quot;];
</del><ins>+    [webView synchronouslyLoadTestPageAndForceRepaint:@&quot;lots-of-text&quot;];
</ins><span class="cx"> 
</span><span class="cx">     // After navigating, the first item should have a valid back-forward snapshot.
</span><span class="cx">     RetainPtr&lt;CGImageRef&gt; imageAfterNavigation = adoptCF([firstItem _copySnapshotForTesting]);
</span><span class="cx">     EXPECT_NOT_NULL(imageAfterNavigation.get());
</span><del>-    EXPECT_EQ(CGImageGetWidth(imageAfterNavigation.get()), (unsigned long)800);
</del><ins>+    EXPECT_EQ(CGImageGetWidth(imageAfterNavigation.get()), (unsigned long)(800 * [webView window].backingScaleFactor));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TEST(SnapshotStore, SnapshotClearedWhenItemIsRemoved)
</span><span class="lines">@@ -108,12 +119,12 @@
</span><span class="cx"> {
</span><span class="cx">     RetainPtr&lt;SnapshotTestWKWebView&gt; webView = adoptNS([[SnapshotTestWKWebView alloc] init]);
</span><span class="cx"> 
</span><del>-    [webView loadPageNamed:@&quot;simple&quot;];
-    [webView loadPageNamed:@&quot;lots-of-text&quot;];
</del><ins>+    [webView synchronouslyLoadTestPageAndForceRepaint:@&quot;simple&quot;];
+    [webView synchronouslyLoadTestPageAndForceRepaint:@&quot;lots-of-text&quot;];
</ins><span class="cx"> 
</span><span class="cx">     RetainPtr&lt;WKBackForwardListItem&gt; item = [[webView backForwardList] currentItem];
</span><span class="cx"> 
</span><del>-    [webView loadPageNamed:@&quot;simple&quot;];
</del><ins>+    [webView synchronouslyLoadTestPageAndForceRepaint:@&quot;simple&quot;];
</ins><span class="cx"> 
</span><span class="cx">     EXPECT_NOT_NULL(adoptCF([item _copySnapshotForTesting]).get());
</span><span class="cx"> 
</span><span class="lines">@@ -125,7 +136,7 @@
</span><span class="cx">     // The original second item is still in the forward list, and should still have a snapshot.
</span><span class="cx">     EXPECT_NOT_NULL(adoptCF([item _copySnapshotForTesting]).get());
</span><span class="cx"> 
</span><del>-    [webView loadPageNamed:@&quot;lots-of-text&quot;];
</del><ins>+    [webView synchronouslyLoadTestPageAndForceRepaint:@&quot;lots-of-text&quot;];
</ins><span class="cx"> 
</span><span class="cx">     // The original second item shouldn't have an image anymore, because it was invalidated
</span><span class="cx">     // by navigating back past it and then doing another load.
</span><span class="lines">@@ -132,20 +143,31 @@
</span><span class="cx">     EXPECT_NULL(adoptCF([item _copySnapshotForTesting]).get());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static RetainPtr&lt;NSView&gt; makeRedSquareView()
+{
+    RetainPtr&lt;NSBox&gt; redSquare = adoptNS([[NSBox alloc] initWithFrame:NSMakeRect(0, 0, 200, 200)]);
+    [redSquare setBoxType:NSBoxCustom];
+    [redSquare setFillColor:[NSColor redColor]];
+    return redSquare;
+}
+
</ins><span class="cx"> TEST(SnapshotStore, ExplicitSnapshotsChangeUponNavigation)
</span><span class="cx"> {
</span><span class="cx">     RetainPtr&lt;SnapshotTestWKWebView&gt; webView = adoptNS([[SnapshotTestWKWebView alloc] init]);
</span><span class="cx"> 
</span><del>-    [webView loadPageNamed:@&quot;lots-of-text&quot;];
</del><ins>+    RetainPtr&lt;NSView&gt; redSquare = makeRedSquareView();
+    [[webView superview] addSubview:redSquare.get()];
</ins><span class="cx"> 
</span><ins>+    [webView synchronouslyLoadTestPageAndForceRepaint:@&quot;lots-of-text&quot;];
+
</ins><span class="cx">     RetainPtr&lt;WKBackForwardListItem&gt; firstItem = [[webView backForwardList] currentItem];
</span><span class="cx">     [webView _saveBackForwardSnapshotForItem:firstItem.get()];
</span><ins>+    [redSquare removeFromSuperview];
</ins><span class="cx"> 
</span><span class="cx">     RetainPtr&lt;CGImageRef&gt; initialSnapshot = adoptCF([firstItem _copySnapshotForTesting]);
</span><span class="cx">     EXPECT_NOT_NULL(initialSnapshot);
</span><span class="cx"> 
</span><del>-    EXPECT_JS_EQ([webView _pageForTesting], &quot;window.scrollTo(0,100)&quot;, &quot;undefined&quot;);
-    [webView loadPageNamed:@&quot;simple&quot;];
</del><ins>+    [webView synchronouslyLoadTestPageAndForceRepaint:@&quot;simple&quot;];
</ins><span class="cx"> 
</span><span class="cx">     // After navigating, the first item's snapshot should change.
</span><span class="cx">     RetainPtr&lt;CGImageRef&gt; snapshotAfterNavigation = adoptCF([firstItem _copySnapshotForTesting]);
</span><span class="lines">@@ -153,4 +175,34 @@
</span><span class="cx">     EXPECT_FALSE(imagesAreEqual(initialSnapshot.get(), snapshotAfterNavigation.get()));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TEST(SnapshotStore, SnapshotsForNeverLoadedPagesDoNotChangeUponNavigation)
+{
+    RetainPtr&lt;SnapshotTestWKWebView&gt; webView = adoptNS([[SnapshotTestWKWebView alloc] init]);
+
+    RetainPtr&lt;NSView&gt; redSquare = makeRedSquareView();
+    [[webView superview] addSubview:redSquare.get()];
+
+    [webView synchronouslyLoadTestPageAndForceRepaint:@&quot;simple&quot;];
+
+    WKRetainPtr&lt;WKSessionStateRef&gt; sessionState = adoptWK(static_cast&lt;WKSessionStateRef&gt;(WKPageCopySessionState([webView _pageForTesting], nullptr, nullptr)));
+    WKPageRestoreFromSessionStateWithoutNavigation([webView _pageForTesting], sessionState.get());
+
+    RetainPtr&lt;WKBackForwardListItem&gt; firstItem = [[webView backForwardList] currentItem];
+    [webView _saveBackForwardSnapshotForItem:firstItem.get()];
+    [redSquare removeFromSuperview];
+
+    [webView synchronouslyLoadTestPageAndForceRepaint:@&quot;lots-of-text&quot;];
+
+    RetainPtr&lt;CGImageRef&gt; initialSnapshot = adoptCF([firstItem _copySnapshotForTesting]);
+    EXPECT_NOT_NULL(initialSnapshot);
+
+    [webView synchronouslyLoadTestPageAndForceRepaint:@&quot;simple&quot;];
+
+    // After navigating, the first item's snapshot should not change, because it was
+    // never loaded into the view.
+    RetainPtr&lt;CGImageRef&gt; snapshotAfterNavigation = adoptCF([firstItem _copySnapshotForTesting]);
+    EXPECT_NOT_NULL(snapshotAfterNavigation.get());
+    EXPECT_TRUE(imagesAreEqual(initialSnapshot.get(), snapshotAfterNavigation.get()));
+}
+
</ins><span class="cx"> #endif // WK_API_ENABLED &amp;&amp; PLATFORM(MAC)
</span></span></pre></div>
<a id="branchessafari602branchToolsTestWebKitAPImacTestWKWebViewMach"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Tools/TestWebKitAPI/mac/TestWKWebViewMac.h (207602 => 207603)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Tools/TestWebKitAPI/mac/TestWKWebViewMac.h        2016-10-20 09:59:48 UTC (rev 207602)
+++ branches/safari-602-branch/Tools/TestWebKitAPI/mac/TestWKWebViewMac.h        2016-10-20 09:59:53 UTC (rev 207603)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx"> - (void)mouseDownAtPoint:(NSPoint)point simulatePressure:(BOOL)simulatePressure;
</span><span class="cx"> - (void)performAfterReceivingMessage:(NSString *)message action:(dispatch_block_t)action;
</span><span class="cx"> - (void)loadTestPageNamed:(NSString *)pageName;
</span><ins>+- (void)synchronouslyLoadTestPageNamed:(NSString *)pageName;
</ins><span class="cx"> - (void)typeCharacter:(char)character;
</span><span class="cx"> - (NSString *)stringByEvaluatingJavaScript:(NSString *)script;
</span><span class="cx"> - (void)waitForMessage:(NSString *)message;
</span></span></pre></div>
<a id="branchessafari602branchToolsTestWebKitAPImacTestWKWebViewMacmm"></a>
<div class="modfile"><h4>Modified: branches/safari-602-branch/Tools/TestWebKitAPI/mac/TestWKWebViewMac.mm (207602 => 207603)</h4>
<pre class="diff"><span>
<span class="info">--- branches/safari-602-branch/Tools/TestWebKitAPI/mac/TestWKWebViewMac.mm        2016-10-20 09:59:48 UTC (rev 207602)
+++ branches/safari-602-branch/Tools/TestWebKitAPI/mac/TestWKWebViewMac.mm        2016-10-20 09:59:53 UTC (rev 207603)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if WK_API_ENABLED &amp;&amp; PLATFORM(MAC)
</span><span class="cx"> 
</span><ins>+#import &quot;TestNavigationDelegate.h&quot;
</ins><span class="cx"> #import &quot;Utilities.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #import &lt;AppKit/AppKit.h&gt;
</span><span class="lines">@@ -180,6 +181,12 @@
</span><span class="cx">     [self loadRequest:request];
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)synchronouslyLoadTestPageNamed:(NSString *)pageName
+{
+    [self loadTestPageNamed:pageName];
+    [self _test_waitForDidFinishNavigation];
+}
+
</ins><span class="cx"> - (void)typeCharacter:(char)character {
</span><span class="cx">     NSString *characterAsString = [NSString stringWithFormat:@&quot;%c&quot; , character];
</span><span class="cx"> #if __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101200
</span></span></pre>
</div>
</div>

</body>
</html>