<!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>[197336] releases/WebKitGTK/webkit-2.12/Source</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/197336">197336</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2016-02-29 03:16:05 -0800 (Mon, 29 Feb 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/197244">r197244</a> - Network cache: old pages returned by disk cache on history navigation after session is restored
https://bugs.webkit.org/show_bug.cgi?id=153230

Reviewed by Chris Dumez.

Source/WebCore:

Add a flag to HistoryItem to mark them as restored from session
and use it from the FrameLoader to not change the policy request
when navigating to a history item that was restored from session,
except for iOS port.

* history/HistoryItem.h:
(WebCore::HistoryItem::setWasRestoredFromSession):
(WebCore::HistoryItem::wasRestoredFromSession):
* loader/FrameLoader.cpp:
(WebCore::FrameLoader::loadDifferentDocumentItem):

Source/WebKit2:

Since <a href="http://trac.webkit.org/projects/webkit/changeset/181734">r181734</a>, the network cache never revalidates resources for
history navigation. This is good for the memory cache, but in the
case of disk cache, we might end up with outdated pages when
restoring the session. When restoring the session happens because
of an API request (we also restore the session when recovering
from a web process crash), we should revalidate back forward list
requests in the disk cache if needed. This will only happen the
first time they are loaded after a session restore. After a web process
crash, resources will be used uncondionally from the disk cache.

* WebProcess/WebPage/WebBackForwardListProxy.cpp:
(WebKit::WebBackForwardListProxy::addItemFromUIProcess): Use Ref&amp;&amp;
instead of PassRefPtr.
* WebProcess/WebPage/WebBackForwardListProxy.h:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WePage::WebPage): Call restoreSessionInternal passing
No as restoredByAPIRequest parameter.
(WebKit::WebPage::restoreSessionInternal): Set restoredFromSession
flag to the created HistoryItem if the item was restored from
session by an API request.
(WebKit::WebPage::restoreSession): Call restoreSessionInternal
passing Yes as restoredByAPIRequest parameter.
* WebProcess/WebPage/WebPage.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit212SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebCorehistoryHistoryItemh">releases/WebKitGTK/webkit-2.12/Source/WebCore/history/HistoryItem.h</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebCoreloaderFrameLoadercpp">releases/WebKitGTK/webkit-2.12/Source/WebCore/loader/FrameLoader.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebKit2ChangeLog">releases/WebKitGTK/webkit-2.12/Source/WebKit2/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebKit2WebProcessWebPageWebBackForwardListProxycpp">releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebKit2WebProcessWebPageWebBackForwardListProxyh">releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.h</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebKit2WebProcessWebPageWebPagecpp">releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebKit2WebProcessWebPageWebPageh">releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit212SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog (197335 => 197336)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog        2016-02-29 11:14:24 UTC (rev 197335)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog        2016-02-29 11:16:05 UTC (rev 197336)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2016-02-26  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        Network cache: old pages returned by disk cache on history navigation after session is restored
+        https://bugs.webkit.org/show_bug.cgi?id=153230
+
+        Reviewed by Chris Dumez.
+
+        Add a flag to HistoryItem to mark them as restored from session
+        and use it from the FrameLoader to not change the policy request
+        when navigating to a history item that was restored from session,
+        except for iOS port.
+
+        * history/HistoryItem.h:
+        (WebCore::HistoryItem::setWasRestoredFromSession):
+        (WebCore::HistoryItem::wasRestoredFromSession):
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::loadDifferentDocumentItem):
+
</ins><span class="cx"> 2016-02-26  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         &lt;g&gt; wrapping &lt;symbol&gt; causes display of hidden &lt;symbol&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebCorehistoryHistoryItemh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/history/HistoryItem.h (197335 => 197336)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebCore/history/HistoryItem.h        2016-02-29 11:14:24 UTC (rev 197335)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/history/HistoryItem.h        2016-02-29 11:16:05 UTC (rev 197336)
</span><span class="lines">@@ -205,6 +205,9 @@
</span><span class="cx"> 
</span><span class="cx">     void notifyChanged();
</span><span class="cx"> 
</span><ins>+    void setWasRestoredFromSession(bool wasRestoredFromSession) { m_wasRestoredFromSession = wasRestoredFromSession; }
+    bool wasRestoredFromSession() const { return m_wasRestoredFromSession; }
+
</ins><span class="cx"> private:
</span><span class="cx">     WEBCORE_EXPORT HistoryItem();
</span><span class="cx">     WEBCORE_EXPORT HistoryItem(const String&amp; urlString, const String&amp; title);
</span><span class="lines">@@ -231,6 +234,7 @@
</span><span class="cx">     
</span><span class="cx">     bool m_lastVisitWasFailure;
</span><span class="cx">     bool m_isTargetItem;
</span><ins>+    bool m_wasRestoredFromSession { false };
</ins><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;Vector&lt;String&gt;&gt; m_redirectURLs;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebCoreloaderFrameLoadercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/loader/FrameLoader.cpp (197335 => 197336)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebCore/loader/FrameLoader.cpp        2016-02-29 11:14:24 UTC (rev 197335)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/loader/FrameLoader.cpp        2016-02-29 11:16:05 UTC (rev 197336)
</span><span class="lines">@@ -3336,9 +3336,17 @@
</span><span class="cx">             break;
</span><span class="cx">         case FrameLoadType::Back:
</span><span class="cx">         case FrameLoadType::Forward:
</span><del>-        case FrameLoadType::IndexedBackForward:
-            request.setCachePolicy(ReturnCacheDataElseLoad);
</del><ins>+        case FrameLoadType::IndexedBackForward: {
+#if PLATFORM(IOS)
+            bool allowStaleData = true;
+#else
+            bool allowStaleData = !item.wasRestoredFromSession();
+#endif
+            if (allowStaleData)
+                request.setCachePolicy(ReturnCacheDataElseLoad);
+            item.setWasRestoredFromSession(false);
</ins><span class="cx">             break;
</span><ins>+        }
</ins><span class="cx">         case FrameLoadType::Standard:
</span><span class="cx">         case FrameLoadType::RedirectWithLockedBackForwardList:
</span><span class="cx">             break;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebKit2/ChangeLog (197335 => 197336)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebKit2/ChangeLog        2016-02-29 11:14:24 UTC (rev 197335)
+++ releases/WebKitGTK/webkit-2.12/Source/WebKit2/ChangeLog        2016-02-29 11:16:05 UTC (rev 197336)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2016-02-26  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        Network cache: old pages returned by disk cache on history navigation after session is restored
+        https://bugs.webkit.org/show_bug.cgi?id=153230
+
+        Reviewed by Chris Dumez.
+
+        Since r181734, the network cache never revalidates resources for
+        history navigation. This is good for the memory cache, but in the
+        case of disk cache, we might end up with outdated pages when
+        restoring the session. When restoring the session happens because
+        of an API request (we also restore the session when recovering
+        from a web process crash), we should revalidate back forward list
+        requests in the disk cache if needed. This will only happen the
+        first time they are loaded after a session restore. After a web process
+        crash, resources will be used uncondionally from the disk cache.
+
+        * WebProcess/WebPage/WebBackForwardListProxy.cpp:
+        (WebKit::WebBackForwardListProxy::addItemFromUIProcess): Use Ref&amp;&amp;
+        instead of PassRefPtr.
+        * WebProcess/WebPage/WebBackForwardListProxy.h:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WePage::WebPage): Call restoreSessionInternal passing
+        No as restoredByAPIRequest parameter.
+        (WebKit::WebPage::restoreSessionInternal): Set restoredFromSession
+        flag to the created HistoryItem if the item was restored from
+        session by an API request.
+        (WebKit::WebPage::restoreSession): Call restoreSessionInternal
+        passing Yes as restoredByAPIRequest parameter.
+        * WebProcess/WebPage/WebPage.h:
+
</ins><span class="cx"> 2016-02-26  Michael Catanzaro  &lt;mcatanzaro@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Fix order of parameters in gtkdoc for webkit_web_view_get_snapshot
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebKit2WebProcessWebPageWebBackForwardListProxycpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp (197335 => 197336)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp        2016-02-29 11:14:24 UTC (rev 197335)
+++ releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp        2016-02-29 11:16:05 UTC (rev 197336)
</span><span class="lines">@@ -94,16 +94,14 @@
</span><span class="cx">     WebProcess::singleton().parentProcessConnection()-&gt;send(Messages::WebProcessProxy::AddBackForwardItem(itemID, pageID, toPageState(*item)), 0);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebBackForwardListProxy::addItemFromUIProcess(uint64_t itemID, PassRefPtr&lt;WebCore::HistoryItem&gt; prpItem, uint64_t pageID)
</del><ins>+void WebBackForwardListProxy::addItemFromUIProcess(uint64_t itemID, Ref&lt;HistoryItem&gt;&amp;&amp; item, uint64_t pageID)
</ins><span class="cx"> {
</span><del>-    RefPtr&lt;HistoryItem&gt; item = prpItem;
-    
</del><span class="cx">     // This item/itemID pair should not already exist in our maps.
</span><del>-    ASSERT(!historyItemToIDMap().contains(item.get()));
</del><ins>+    ASSERT(!historyItemToIDMap().contains(item.ptr()));
</ins><span class="cx">     ASSERT(!idToHistoryItemMap().contains(itemID));
</span><span class="cx"> 
</span><del>-    historyItemToIDMap().set&lt;ItemAndPageID&gt;(item, { .itemID = itemID, .pageID = pageID });
-    idToHistoryItemMap().set(itemID, item);
</del><ins>+    historyItemToIDMap().set&lt;ItemAndPageID&gt;(item.ptr(), { .itemID = itemID, .pageID = pageID });
+    idToHistoryItemMap().set(itemID, item.ptr());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void WK2NotifyHistoryItemChanged(HistoryItem* item)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebKit2WebProcessWebPageWebBackForwardListProxyh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.h (197335 => 197336)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.h        2016-02-29 11:14:24 UTC (rev 197335)
+++ releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.h        2016-02-29 11:16:05 UTC (rev 197336)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx">     static uint64_t idForItem(WebCore::HistoryItem*);
</span><span class="cx">     static void removeItem(uint64_t itemID);
</span><span class="cx"> 
</span><del>-    static void addItemFromUIProcess(uint64_t itemID, PassRefPtr&lt;WebCore::HistoryItem&gt;, uint64_t pageID);
</del><ins>+    static void addItemFromUIProcess(uint64_t itemID, Ref&lt;WebCore::HistoryItem&gt;&amp;&amp;, uint64_t pageID);
</ins><span class="cx">     static void setHighestItemIDFromUIProcess(uint64_t itemID);
</span><span class="cx">     
</span><span class="cx">     void clear();
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (197335 => 197336)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2016-02-29 11:14:24 UTC (rev 197335)
+++ releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2016-02-29 11:16:05 UTC (rev 197336)
</span><span class="lines">@@ -490,7 +490,7 @@
</span><span class="cx">     WebBackForwardListProxy::setHighestItemIDFromUIProcess(parameters.highestUsedBackForwardItemID);
</span><span class="cx">     
</span><span class="cx">     if (!parameters.itemStates.isEmpty())
</span><del>-        restoreSession(parameters.itemStates);
</del><ins>+        restoreSessionInternal(parameters.itemStates, WasRestoredByAPIRequest::No);
</ins><span class="cx"> 
</span><span class="cx">     if (parameters.sessionID.isValid())
</span><span class="cx">         setSessionID(parameters.sessionID);
</span><span class="lines">@@ -2176,10 +2176,18 @@
</span><span class="cx">     executeEditingCommand(commandName, argument);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPage::restoreSessionInternal(const Vector&lt;BackForwardListItemState&gt;&amp; itemStates, WasRestoredByAPIRequest restoredByAPIRequest)
+{
+    for (const auto&amp; itemState : itemStates) {
+        auto historyItem = toHistoryItem(itemState.pageState);
+        historyItem-&gt;setWasRestoredFromSession(restoredByAPIRequest == WasRestoredByAPIRequest::Yes);
+        WebBackForwardListProxy::addItemFromUIProcess(itemState.identifier, WTFMove(historyItem), m_pageID);
+    }
+}
+
</ins><span class="cx"> void WebPage::restoreSession(const Vector&lt;BackForwardListItemState&gt;&amp; itemStates)
</span><span class="cx"> {
</span><del>-    for (const auto&amp; itemState : itemStates)
-        WebBackForwardListProxy::addItemFromUIProcess(itemState.identifier, toHistoryItem(itemState.pageState), m_pageID);
</del><ins>+    restoreSessionInternal(itemStates, WasRestoredByAPIRequest::Yes);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(TOUCH_EVENTS)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebPage.h (197335 => 197336)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebPage.h        2016-02-29 11:14:24 UTC (rev 197335)
+++ releases/WebKitGTK/webkit-2.12/Source/WebKit2/WebProcess/WebPage/WebPage.h        2016-02-29 11:16:05 UTC (rev 197336)
</span><span class="lines">@@ -1015,6 +1015,8 @@
</span><span class="cx"> 
</span><span class="cx">     void loadURLInFrame(const String&amp;, uint64_t frameID);
</span><span class="cx"> 
</span><ins>+    enum class WasRestoredByAPIRequest { No, Yes };
+    void restoreSessionInternal(const Vector&lt;BackForwardListItemState&gt;&amp;, WasRestoredByAPIRequest);
</ins><span class="cx">     void restoreSession(const Vector&lt;BackForwardListItemState&gt;&amp;);
</span><span class="cx">     void didRemoveBackForwardItem(uint64_t);
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>