<!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>[179347] trunk/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/179347">179347</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2015-01-29 10:38:51 -0800 (Thu, 29 Jan 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Clean up / modernize PageCache class
https://bugs.webkit.org/show_bug.cgi?id=141009

Reviewed by Darin Adler.

Source/WebCore:

Clean up / modernize PageCache class:
- Use more references instead of pointers
- Use a ListHashSet&lt;Ref&lt;HistoryItem&gt;&gt; internally instead of a linked
  list of HistoryItem*. This avoids having the ref/unref HistoryItems
  manually and maintaining the list size separately. It also simplifies
  the code dealing with the container and makes looking up HistoryItems
  faster as a bonus. Similarly to the previous implementation, we are
  adding elements to one end and removing from the opposite end when
  pruning to drop old history items first. Note that even though the
  previous implementation was called LRUList, it did not move items to
  the front when accessed. The new implementation doesn't either.
 - Rename &quot;capacity&quot; to &quot;maxSize&quot; to avoid confusing with containers'
   capacity (which doesn't limit the size of the container).
 - Use unsigned instead of int for all values that are supposed to be
   positive.
 - Do not explicitely define the default constructor and let the
   compiler generate it for us (and use in-class initialization for
   members)
 - Fix indentation in the header.

Source/WebKit/mac:

Clean up / modernize PageCache class.

* History/WebBackForwardList.mm:
(-[WebBackForwardList pageCacheSize]):
* WebView/WebView.mm:
(-[WebView _loadBackForwardListFromOtherView:]):
(-[WebView goToBackForwardItem:]):
(+[WebView _setCacheModel:]):

Source/WebKit/win:

Clean up / modernize PageCache class.

* WebView.cpp:
(WebView::setCacheModel):

Source/WebKit2:

Clean up / modernize PageCache class.

* WebProcess/WebPage/WebBackForwardListProxy.cpp:
(WebKit::WebBackForwardListProxy::removeItem):
(WebKit::WebBackForwardListProxy::close):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::goForward):
(WebKit::WebPage::goBack):
(WebKit::WebPage::goToBackForwardItem):
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::releasePageCache):
* WebProcess/cocoa/WebProcessCocoa.mm:
(WebKit::WebProcess::platformSetCacheModel):
* WebProcess/soup/WebProcessSoup.cpp:
(WebKit::WebProcess::platformSetCacheModel):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCoreexpin">trunk/Source/WebCore/WebCore.exp.in</a></li>
<li><a href="#trunkSourceWebCorehistoryBackForwardControllercpp">trunk/Source/WebCore/history/BackForwardController.cpp</a></li>
<li><a href="#trunkSourceWebCorehistoryBackForwardListcpp">trunk/Source/WebCore/history/BackForwardList.cpp</a></li>
<li><a href="#trunkSourceWebCorehistoryHistoryItemcpp">trunk/Source/WebCore/history/HistoryItem.cpp</a></li>
<li><a href="#trunkSourceWebCorehistoryPageCachecpp">trunk/Source/WebCore/history/PageCache.cpp</a></li>
<li><a href="#trunkSourceWebCorehistoryPageCacheh">trunk/Source/WebCore/history/PageCache.h</a></li>
<li><a href="#trunkSourceWebCoreloaderFrameLoadercpp">trunk/Source/WebCore/loader/FrameLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderFrameLoaderh">trunk/Source/WebCore/loader/FrameLoader.h</a></li>
<li><a href="#trunkSourceWebCoreloaderHistoryControllercpp">trunk/Source/WebCore/loader/HistoryController.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderHistoryControllerh">trunk/Source/WebCore/loader/HistoryController.h</a></li>
<li><a href="#trunkSourceWebCorepageDiagnosticLoggingKeyscpp">trunk/Source/WebCore/page/DiagnosticLoggingKeys.cpp</a></li>
<li><a href="#trunkSourceWebCorepageDiagnosticLoggingKeysh">trunk/Source/WebCore/page/DiagnosticLoggingKeys.h</a></li>
<li><a href="#trunkSourceWebCorepageFramecpp">trunk/Source/WebCore/page/Frame.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePagecpp">trunk/Source/WebCore/page/Page.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePageh">trunk/Source/WebCore/page/Page.h</a></li>
<li><a href="#trunkSourceWebCorepageSettingscpp">trunk/Source/WebCore/page/Settings.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformMemoryPressureHandlercpp">trunk/Source/WebCore/platform/MemoryPressureHandler.cpp</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacHistoryWebBackForwardListmm">trunk/Source/WebKit/mac/History/WebBackForwardList.mm</a></li>
<li><a href="#trunkSourceWebKitmacWebViewWebViewmm">trunk/Source/WebKit/mac/WebView/WebView.mm</a></li>
<li><a href="#trunkSourceWebKitwinChangeLog">trunk/Source/WebKit/win/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitwinWebViewcpp">trunk/Source/WebKit/win/WebView.cpp</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebBackForwardListProxycpp">trunk/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebProcesscpp">trunk/Source/WebKit2/WebProcess/WebProcess.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcesscocoaWebProcessCocoamm">trunk/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcesssoupWebProcessSoupcpp">trunk/Source/WebKit2/WebProcess/soup/WebProcessSoup.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/ChangeLog        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2015-01-29  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Clean up / modernize PageCache class
+        https://bugs.webkit.org/show_bug.cgi?id=141009
+
+        Reviewed by Darin Adler.
+
+        Clean up / modernize PageCache class:
+        - Use more references instead of pointers
+        - Use a ListHashSet&lt;Ref&lt;HistoryItem&gt;&gt; internally instead of a linked
+          list of HistoryItem*. This avoids having the ref/unref HistoryItems
+          manually and maintaining the list size separately. It also simplifies
+          the code dealing with the container and makes looking up HistoryItems
+          faster as a bonus. Similarly to the previous implementation, we are
+          adding elements to one end and removing from the opposite end when
+          pruning to drop old history items first. Note that even though the
+          previous implementation was called LRUList, it did not move items to
+          the front when accessed. The new implementation doesn't either.
+         - Rename &quot;capacity&quot; to &quot;maxSize&quot; to avoid confusing with containers'
+           capacity (which doesn't limit the size of the container).
+         - Use unsigned instead of int for all values that are supposed to be
+           positive.
+         - Do not explicitely define the default constructor and let the
+           compiler generate it for us (and use in-class initialization for
+           members)
+         - Fix indentation in the header.
+
</ins><span class="cx"> 2015-01-29  Julien Isorce  &lt;j.isorce@samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         HTMLImageLoader: fix build failure on assert condition after r179340
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCoreexpin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.exp.in (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.exp.in        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/WebCore.exp.in        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -1239,7 +1239,7 @@
</span><span class="cx"> __ZN7WebCore4Page36setShouldSuppressScrollbarAnimationsEb
</span><span class="cx"> __ZN7WebCore4Page36suspendActiveDOMObjectsAndAnimationsEv
</span><span class="cx"> __ZN7WebCore4Page37setInLowQualityImageInterpolationModeEb
</span><del>-__ZN7WebCore4Page8goToItemEPNS_11HistoryItemENS_13FrameLoadTypeE
</del><ins>+__ZN7WebCore4Page8goToItemERNS_11HistoryItemENS_13FrameLoadTypeE
</ins><span class="cx"> __ZN7WebCore4Page8setMutedEb
</span><span class="cx"> __ZN7WebCore4Page9initGroupEv
</span><span class="cx"> __ZN7WebCore4PageC1ERNS_17PageConfigurationE
</span><span class="lines">@@ -1606,10 +1606,10 @@
</span><span class="cx"> __ZN7WebCore9JSElement9toWrappedEN3JSC7JSValueE
</span><span class="cx"> __ZN7WebCore9LayerPoolC1Ev
</span><span class="cx"> __ZN7WebCore9LayerPoolD1Ev
</span><del>-__ZN7WebCore9PageCache11setCapacityEi
-__ZN7WebCore9PageCache18pruneToCapacityNowEiNS_13PruningReasonE
</del><ins>+__ZN7WebCore9PageCache10setMaxSizeEj
+__ZN7WebCore9PageCache14pruneToSizeNowEjNS_13PruningReasonE
</ins><span class="cx"> __ZN7WebCore9PageCache34markPagesForVisitedLinkStyleRecalcEv
</span><del>-__ZN7WebCore9PageCache6removeEPNS_11HistoryItemE
</del><ins>+__ZN7WebCore9PageCache6removeERNS_11HistoryItemE
</ins><span class="cx"> __ZN7WebCore9PageCache6sharedEv
</span><span class="cx"> __ZN7WebCore9PageGroup9pageGroupERKN3WTF6StringE
</span><span class="cx"> __ZN7WebCore9Scrollbar11mouseExitedEv
</span></span></pre></div>
<a id="trunkSourceWebCorehistoryBackForwardControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/history/BackForwardController.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/history/BackForwardController.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/history/BackForwardController.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -74,7 +74,7 @@
</span><span class="cx">     if (!item)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_page.goToItem(item, FrameLoadType::IndexedBackForward);
</del><ins>+    m_page.goToItem(*item, FrameLoadType::IndexedBackForward);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool BackForwardController::goBack()
</span><span class="lines">@@ -83,7 +83,7 @@
</span><span class="cx">     if (!item)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    m_page.goToItem(item, FrameLoadType::Back);
</del><ins>+    m_page.goToItem(*item, FrameLoadType::Back);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -93,7 +93,7 @@
</span><span class="cx">     if (!item)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    m_page.goToItem(item, FrameLoadType::Forward);
</del><ins>+    m_page.goToItem(*item, FrameLoadType::Forward);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehistoryBackForwardListcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/history/BackForwardList.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/history/BackForwardList.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/history/BackForwardList.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -68,7 +68,7 @@
</span><span class="cx">             RefPtr&lt;HistoryItem&gt; item = m_entries.last();
</span><span class="cx">             m_entries.removeLast();
</span><span class="cx">             m_entryHash.remove(item);
</span><del>-            PageCache::shared().remove(item.get());
</del><ins>+            PageCache::shared().remove(*item);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -78,7 +78,7 @@
</span><span class="cx">         RefPtr&lt;HistoryItem&gt; item = m_entries[0];
</span><span class="cx">         m_entries.remove(0);
</span><span class="cx">         m_entryHash.remove(item);
</span><del>-        PageCache::shared().remove(item.get());
</del><ins>+        PageCache::shared().remove(*item);
</ins><span class="cx">         m_current--;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -175,7 +175,7 @@
</span><span class="cx">         RefPtr&lt;HistoryItem&gt; item = m_entries.last();
</span><span class="cx">         m_entries.removeLast();
</span><span class="cx">         m_entryHash.remove(item);
</span><del>-        PageCache::shared().remove(item.get());
</del><ins>+        PageCache::shared().remove(*item);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (!size)
</span><span class="lines">@@ -242,12 +242,10 @@
</span><span class="cx"> bool BackForwardList::clearAllPageCaches()
</span><span class="cx"> {
</span><span class="cx">     bool didRemoveAtLeastOneItem = false;
</span><del>-    unsigned length = m_entries.size();
-    for (unsigned i = 0; i &lt; length; ++i) {
-        HistoryItem* item = m_entries[i].get();
</del><ins>+    for (auto&amp; item : m_entries) {
</ins><span class="cx">         if (item-&gt;isInPageCache()) {
</span><span class="cx">             didRemoveAtLeastOneItem = true;
</span><del>-            PageCache::shared().remove(item);
</del><ins>+            PageCache::shared().remove(*item);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     return didRemoveAtLeastOneItem;
</span><span class="lines">@@ -256,12 +254,11 @@
</span><span class="cx"> 
</span><span class="cx"> void BackForwardList::close()
</span><span class="cx"> {
</span><del>-    int size = m_entries.size();
-    for (int i = 0; i &lt; size; ++i)
-        PageCache::shared().remove(m_entries[i].get());
</del><ins>+    for (auto&amp; item : m_entries)
+        PageCache::shared().remove(*item);
</ins><span class="cx">     m_entries.clear();
</span><span class="cx">     m_entryHash.clear();
</span><del>-    m_page = 0;
</del><ins>+    m_page = nullptr;
</ins><span class="cx">     m_closed = true;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehistoryHistoryItemcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/history/HistoryItem.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/history/HistoryItem.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/history/HistoryItem.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -286,7 +286,7 @@
</span><span class="cx"> 
</span><span class="cx"> void HistoryItem::setURL(const URL&amp; url)
</span><span class="cx"> {
</span><del>-    PageCache::shared().remove(this);
</del><ins>+    PageCache::shared().remove(*this);
</ins><span class="cx">     setURLString(url.string());
</span><span class="cx">     clearDocumentState();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehistoryPageCachecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/history/PageCache.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/history/PageCache.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/history/PageCache.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2007, 2014 Apple Inc.  All rights reserved.
</del><ins>+ * Copyright (C) 2007, 2014, 2015 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -43,7 +43,6 @@
</span><span class="cx"> #include &quot;FrameLoaderStateMachine.h&quot;
</span><span class="cx"> #include &quot;FrameView.h&quot;
</span><span class="cx"> #include &quot;HistoryController.h&quot;
</span><del>-#include &quot;HistoryItem.h&quot;
</del><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> #include &quot;MainFrame.h&quot;
</span><span class="cx"> #include &quot;MemoryPressureHandler.h&quot;
</span><span class="lines">@@ -110,7 +109,7 @@
</span><span class="cx">     logPageCacheFailureDiagnosticMessage(page-&gt;mainFrame().diagnosticLoggingClient(), reason);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static unsigned logCanCacheFrameDecision(Frame&amp; frame, DiagnosticLoggingClient&amp; diagnosticLoggingClient, int indentLevel)
</del><ins>+static unsigned logCanCacheFrameDecision(Frame&amp; frame, DiagnosticLoggingClient&amp; diagnosticLoggingClient, unsigned indentLevel)
</ins><span class="cx"> {
</span><span class="cx">     PCLOG(&quot;+---&quot;);
</span><span class="cx">     if (!frame.loader().documentLoader()) {
</span><span class="lines">@@ -234,7 +233,7 @@
</span><span class="cx">     if (currentURL.isEmpty())
</span><span class="cx">         return;
</span><span class="cx">     
</span><del>-    int indentLevel = 0;    
</del><ins>+    unsigned indentLevel = 0;
</ins><span class="cx">     PCLOG(&quot;--------\n Determining if page can be cached:&quot;);
</span><span class="cx">     
</span><span class="cx">     unsigned rejectReasons = 0;
</span><span class="lines">@@ -297,26 +296,17 @@
</span><span class="cx">     static NeverDestroyed&lt;PageCache&gt; globalPageCache;
</span><span class="cx">     return globalPageCache;
</span><span class="cx"> }
</span><del>-
-PageCache::PageCache()
-    : m_capacity(0)
-    , m_size(0)
-    , m_head(0)
-    , m_tail(0)
-    , m_shouldClearBackingStores(false)
-{
-}
</del><span class="cx">     
</span><del>-bool PageCache::canCachePageContainingThisFrame(Frame* frame)
</del><ins>+bool PageCache::canCachePageContainingThisFrame(Frame&amp; frame)
</ins><span class="cx"> {
</span><del>-    for (Frame* child = frame-&gt;tree().firstChild(); child; child = child-&gt;tree().nextSibling()) {
-        if (!canCachePageContainingThisFrame(child))
</del><ins>+    for (Frame* child = frame.tree().firstChild(); child; child = child-&gt;tree().nextSibling()) {
+        if (!canCachePageContainingThisFrame(*child))
</ins><span class="cx">             return false;
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    FrameLoader&amp; frameLoader = frame-&gt;loader();
</del><ins>+    FrameLoader&amp; frameLoader = frame.loader();
</ins><span class="cx">     DocumentLoader* documentLoader = frameLoader.documentLoader();
</span><del>-    Document* document = frame-&gt;document();
</del><ins>+    Document* document = frame.document();
</ins><span class="cx">     
</span><span class="cx">     return documentLoader
</span><span class="cx"> #if !PLATFORM(IOS)
</span><span class="lines">@@ -326,8 +316,8 @@
</span><span class="cx"> #endif
</span><span class="cx">         // Do not cache error pages (these can be recognized as pages with substitute data or unreachable URLs).
</span><span class="cx">         &amp;&amp; !(documentLoader-&gt;substituteData().isValid() &amp;&amp; !documentLoader-&gt;substituteData().failingURL().isEmpty())
</span><del>-        &amp;&amp; (!frameLoader.subframeLoader().containsPlugins() || frame-&gt;page()-&gt;settings().pageCacheSupportsPlugins())
-        &amp;&amp; !(frame-&gt;isMainFrame() &amp;&amp; document-&gt;url().protocolIs(&quot;https&quot;) &amp;&amp; documentLoader-&gt;response().cacheControlContainsNoStore())
</del><ins>+        &amp;&amp; (!frameLoader.subframeLoader().containsPlugins() || frame.page()-&gt;settings().pageCacheSupportsPlugins())
+        &amp;&amp; !(frame.isMainFrame() &amp;&amp; document-&gt;url().protocolIs(&quot;https&quot;) &amp;&amp; documentLoader-&gt;response().cacheControlContainsNoStore())
</ins><span class="cx">         &amp;&amp; !DatabaseManager::manager().hasOpenDatabases(document)
</span><span class="cx">         &amp;&amp; frameLoader.history().currentItem()
</span><span class="cx">         &amp;&amp; !frameLoader.quickRedirectComing()
</span><span class="lines">@@ -357,8 +347,8 @@
</span><span class="cx">     // over it again when we leave that page.
</span><span class="cx">     FrameLoadType loadType = page-&gt;mainFrame().loader().loadType();
</span><span class="cx">     
</span><del>-    return m_capacity &gt; 0
-        &amp;&amp; canCachePageContainingThisFrame(&amp;page-&gt;mainFrame())
</del><ins>+    return m_maxSize &gt; 0
+        &amp;&amp; canCachePageContainingThisFrame(page-&gt;mainFrame())
</ins><span class="cx">         &amp;&amp; page-&gt;settings().usesPageCache()
</span><span class="cx"> #if ENABLE(DEVICE_ORIENTATION) &amp;&amp; !PLATFORM(IOS)
</span><span class="cx">         &amp;&amp; !DeviceMotionController::isActiveAt(page)
</span><span class="lines">@@ -373,27 +363,24 @@
</span><span class="cx">             || loadType == FrameLoadType::IndexedBackForward);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PageCache::pruneToCapacityNow(int capacity, PruningReason pruningReason)
</del><ins>+void PageCache::pruneToSizeNow(unsigned size, PruningReason pruningReason)
</ins><span class="cx"> {
</span><del>-    TemporaryChange&lt;int&gt;(m_capacity, std::max(capacity, 0));
</del><ins>+    TemporaryChange&lt;unsigned&gt;(m_maxSize, size);
</ins><span class="cx">     prune(pruningReason);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PageCache::setCapacity(int capacity)
</del><ins>+void PageCache::setMaxSize(unsigned maxSize)
</ins><span class="cx"> {
</span><del>-    ASSERT(capacity &gt;= 0);
-    m_capacity = std::max(capacity, 0);
-
</del><ins>+    m_maxSize = maxSize;
</ins><span class="cx">     prune(PruningReason::None);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-int PageCache::frameCount() const
</del><ins>+unsigned PageCache::frameCount() const
</ins><span class="cx"> {
</span><del>-    int frameCount = 0;
-    for (HistoryItem* current = m_head; current; current = current-&gt;m_next) {
-        ++frameCount;
-        ASSERT(current-&gt;m_cachedPage);
-        frameCount += current-&gt;m_cachedPage-&gt;cachedMainFrame()-&gt;descendantFrameCount();
</del><ins>+    unsigned frameCount = m_items.size();
+    for (auto&amp; item : m_items) {
+        ASSERT(item-&gt;m_cachedPage);
+        frameCount += item-&gt;m_cachedPage-&gt;cachedMainFrame()-&gt;descendantFrameCount();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     return frameCount;
</span><span class="lines">@@ -401,26 +388,26 @@
</span><span class="cx"> 
</span><span class="cx"> void PageCache::markPagesForVisitedLinkStyleRecalc()
</span><span class="cx"> {
</span><del>-    for (HistoryItem* current = m_head; current; current = current-&gt;m_next) {
-        ASSERT(current-&gt;m_cachedPage);
-        current-&gt;m_cachedPage-&gt;markForVisitedLinkStyleRecalc();
</del><ins>+    for (auto&amp; item : m_items) {
+        ASSERT(item-&gt;m_cachedPage);
+        item-&gt;m_cachedPage-&gt;markForVisitedLinkStyleRecalc();
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PageCache::markPagesForFullStyleRecalc(Page* page)
</del><ins>+void PageCache::markPagesForFullStyleRecalc(Page&amp; page)
</ins><span class="cx"> {
</span><del>-    for (HistoryItem* current = m_head; current; current = current-&gt;m_next) {
-        CachedPage&amp; cachedPage = *current-&gt;m_cachedPage;
-        if (&amp;page-&gt;mainFrame() == &amp;cachedPage.cachedMainFrame()-&gt;view()-&gt;frame())
</del><ins>+    for (auto&amp; item : m_items) {
+        CachedPage&amp; cachedPage = *item-&gt;m_cachedPage;
+        if (&amp;page.mainFrame() == &amp;cachedPage.cachedMainFrame()-&gt;view()-&gt;frame())
</ins><span class="cx">             cachedPage.markForFullStyleRecalc();
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PageCache::markPagesForDeviceScaleChanged(Page* page)
</del><ins>+void PageCache::markPagesForDeviceScaleChanged(Page&amp; page)
</ins><span class="cx"> {
</span><del>-    for (HistoryItem* current = m_head; current; current = current-&gt;m_next) {
-        CachedPage&amp; cachedPage = *current-&gt;m_cachedPage;
-        if (&amp;page-&gt;mainFrame() == &amp;cachedPage.cachedMainFrame()-&gt;view()-&gt;frame())
</del><ins>+    for (auto&amp; item : m_items) {
+        CachedPage&amp; cachedPage = *item-&gt;m_cachedPage;
+        if (&amp;page.mainFrame() == &amp;cachedPage.cachedMainFrame()-&gt;view()-&gt;frame())
</ins><span class="cx">             cachedPage.markForDeviceScaleChanged();
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -428,9 +415,9 @@
</span><span class="cx"> #if ENABLE(VIDEO_TRACK)
</span><span class="cx"> void PageCache::markPagesForCaptionPreferencesChanged()
</span><span class="cx"> {
</span><del>-    for (HistoryItem* current = m_head; current; current = current-&gt;m_next) {
-        ASSERT(current-&gt;m_cachedPage);
-        current-&gt;m_cachedPage-&gt;markForCaptionPreferencesChanged();
</del><ins>+    for (auto&amp; item : m_items) {
+        ASSERT(item-&gt;m_cachedPage);
+        item-&gt;m_cachedPage-&gt;markForCaptionPreferencesChanged();
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="lines">@@ -442,8 +429,8 @@
</span><span class="cx">         return DiagnosticLoggingKeys::prunedDueToMemoryPressureKey();
</span><span class="cx">     case PruningReason::ProcessSuspended:
</span><span class="cx">         return DiagnosticLoggingKeys::prunedDueToProcessSuspended();
</span><del>-    case PruningReason::ReachedCapacity:
-        return DiagnosticLoggingKeys::prunedDueToCapacityReached();
</del><ins>+    case PruningReason::ReachedMaxSize:
+        return DiagnosticLoggingKeys::prunedDueToMaxSizeReached();
</ins><span class="cx">     case PruningReason::None:
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -451,45 +438,33 @@
</span><span class="cx">     return emptyString();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PageCache::add(PassRefPtr&lt;HistoryItem&gt; prpItem, Page&amp; page)
</del><ins>+void PageCache::add(HistoryItem&amp; item, Page&amp; page)
</ins><span class="cx"> {
</span><del>-    ASSERT(prpItem);
</del><span class="cx">     ASSERT(canCache(&amp;page));
</span><del>-    
-    HistoryItem* item = prpItem.leakRef(); // Balanced in remove().
</del><span class="cx"> 
</span><span class="cx">     // Remove stale cache entry if necessary.
</span><del>-    if (item-&gt;m_cachedPage)
-        remove(item);
</del><ins>+    remove(item);
</ins><span class="cx"> 
</span><del>-    item-&gt;m_cachedPage = std::make_unique&lt;CachedPage&gt;(page);
-    item-&gt;m_pruningReason = PruningReason::None;
-    addToLRUList(item);
-    ++m_size;
</del><ins>+    item.m_cachedPage = std::make_unique&lt;CachedPage&gt;(page);
+    item.m_pruningReason = PruningReason::None;
+    m_items.add(&amp;item);
</ins><span class="cx">     
</span><del>-    prune(PruningReason::ReachedCapacity);
</del><ins>+    prune(PruningReason::ReachedMaxSize);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-std::unique_ptr&lt;CachedPage&gt; PageCache::take(HistoryItem* item, Page* page)
</del><ins>+std::unique_ptr&lt;CachedPage&gt; PageCache::take(HistoryItem&amp; item, Page* page)
</ins><span class="cx"> {
</span><del>-    if (!item)
</del><ins>+    if (!item.m_cachedPage) {
+        if (item.m_pruningReason != PruningReason::None)
+            logPageCacheFailureDiagnosticMessage(page, pruningReasonToDiagnosticLoggingKey(item.m_pruningReason));
</ins><span class="cx">         return nullptr;
</span><del>-
-    std::unique_ptr&lt;CachedPage&gt; cachedPage = WTF::move(item-&gt;m_cachedPage);
-
-    removeFromLRUList(item);
-    --m_size;
-
-    item-&gt;deref(); // Balanced in add().
-
-    if (!cachedPage) {
-        if (item-&gt;m_pruningReason != PruningReason::None)
-            logPageCacheFailureDiagnosticMessage(page, pruningReasonToDiagnosticLoggingKey(item-&gt;m_pruningReason));
-        return nullptr;
</del><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    std::unique_ptr&lt;CachedPage&gt; cachedPage = WTF::move(item.m_cachedPage);
+    m_items.remove(&amp;item);
+
</ins><span class="cx">     if (cachedPage-&gt;hasExpired()) {
</span><del>-        LOG(PageCache, &quot;Not restoring page for %s from back/forward cache because cache entry has expired&quot;, item-&gt;url().string().ascii().data());
</del><ins>+        LOG(PageCache, &quot;Not restoring page for %s from back/forward cache because cache entry has expired&quot;, item.url().string().ascii().data());
</ins><span class="cx">         logPageCacheFailureDiagnosticMessage(page, DiagnosticLoggingKeys::expiredKey());
</span><span class="cx">         return nullptr;
</span><span class="cx">     }
</span><span class="lines">@@ -497,79 +472,42 @@
</span><span class="cx">     return cachedPage;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-CachedPage* PageCache::get(HistoryItem* item, Page* page)
</del><ins>+CachedPage* PageCache::get(HistoryItem&amp; item, Page* page) const
</ins><span class="cx"> {
</span><del>-    if (!item)
</del><ins>+    CachedPage* cachedPage = item.m_cachedPage.get();
+    if (!cachedPage) {
+        if (item.m_pruningReason != PruningReason::None)
+            logPageCacheFailureDiagnosticMessage(page, pruningReasonToDiagnosticLoggingKey(item.m_pruningReason));
</ins><span class="cx">         return nullptr;
</span><ins>+    }
</ins><span class="cx"> 
</span><del>-    if (CachedPage* cachedPage = item-&gt;m_cachedPage.get()) {
-        if (!cachedPage-&gt;hasExpired())
-            return cachedPage;
-        
-        LOG(PageCache, &quot;Not restoring page for %s from back/forward cache because cache entry has expired&quot;, item-&gt;url().string().ascii().data());
</del><ins>+    if (cachedPage-&gt;hasExpired()) {
+        LOG(PageCache, &quot;Not restoring page for %s from back/forward cache because cache entry has expired&quot;, item.url().string().ascii().data());
</ins><span class="cx">         logPageCacheFailureDiagnosticMessage(page, DiagnosticLoggingKeys::expiredKey());
</span><span class="cx">         PageCache::shared().remove(item);
</span><del>-    } else if (item-&gt;m_pruningReason != PruningReason::None)
-        logPageCacheFailureDiagnosticMessage(page, pruningReasonToDiagnosticLoggingKey(item-&gt;m_pruningReason));
-
-    return nullptr;
</del><ins>+        return nullptr;
+    }
+    return cachedPage;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PageCache::remove(HistoryItem* item)
</del><ins>+void PageCache::remove(HistoryItem&amp; item)
</ins><span class="cx"> {
</span><span class="cx">     // Safely ignore attempts to remove items not in the cache.
</span><del>-    if (!item || !item-&gt;m_cachedPage)
</del><ins>+    if (!item.m_cachedPage)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    item-&gt;m_cachedPage = nullptr;
-    removeFromLRUList(item);
-    --m_size;
-
-    item-&gt;deref(); // Balanced in add().
</del><ins>+    item.m_cachedPage = nullptr;
+    m_items.remove(&amp;item);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PageCache::prune(PruningReason pruningReason)
</span><span class="cx"> {
</span><del>-    while (m_size &gt; m_capacity) {
-        ASSERT(m_tail &amp;&amp; m_tail-&gt;m_cachedPage);
-        m_tail-&gt;m_pruningReason = pruningReason;
-        remove(m_tail);
</del><ins>+    while (pageCount() &gt; maxSize()) {
+        auto&amp; oldestItem = m_items.first();
+        oldestItem-&gt;m_cachedPage = nullptr;
+        oldestItem-&gt;m_pruningReason = pruningReason;
+        m_items.removeFirst();
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PageCache::addToLRUList(HistoryItem* item)
-{
-    item-&gt;m_next = m_head;
-    item-&gt;m_prev = 0;
-
-    if (m_head) {
-        ASSERT(m_tail);
-        m_head-&gt;m_prev = item;
-    } else {
-        ASSERT(!m_tail);
-        m_tail = item;
-    }
-
-    m_head = item;
-}
-
-void PageCache::removeFromLRUList(HistoryItem* item)
-{
-    if (!item-&gt;m_next) {
-        ASSERT(item == m_tail);
-        m_tail = item-&gt;m_prev;
-    } else {
-        ASSERT(item != m_tail);
-        item-&gt;m_next-&gt;m_prev = item-&gt;m_prev;
-    }
-
-    if (!item-&gt;m_prev) {
-        ASSERT(item == m_head);
-        m_head = item-&gt;m_next;
-    } else {
-        ASSERT(item != m_head);
-        item-&gt;m_prev-&gt;m_next = item-&gt;m_next;
-    }
-}
-
</del><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorehistoryPageCacheh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/history/PageCache.h (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/history/PageCache.h        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/history/PageCache.h        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2007 Apple Inc.  All rights reserved.
</del><ins>+ * Copyright (C) 2007, 2015 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -26,78 +26,67 @@
</span><span class="cx"> #ifndef PageCache_h
</span><span class="cx"> #define PageCache_h
</span><span class="cx"> 
</span><ins>+#include &quot;HistoryItem.h&quot;
</ins><span class="cx"> #include &quot;Timer.h&quot;
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><del>-#include &lt;wtf/HashSet.h&gt;
</del><ins>+#include &lt;wtf/ListHashSet.h&gt;
</ins><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-    class CachedPage;
-    class Frame;
-    class HistoryItem;
-    class Page;
</del><ins>+class CachedPage;
+class Frame;
+class Page;
</ins><span class="cx"> 
</span><del>-    enum class PruningReason { None, ProcessSuspended, MemoryPressure, ReachedCapacity };
-    
-    class PageCache {
-        WTF_MAKE_NONCOPYABLE(PageCache); WTF_MAKE_FAST_ALLOCATED;
-    public:
-        // Function to obtain the global page cache.
-        WEBCORE_EXPORT static PageCache&amp; shared();
-        
-        bool canCache(Page*) const;
</del><ins>+enum class PruningReason { None, ProcessSuspended, MemoryPressure, ReachedMaxSize };
</ins><span class="cx"> 
</span><del>-        WEBCORE_EXPORT void setCapacity(int); // number of pages to cache
-        int capacity() { return m_capacity; }
-        
-        void add(PassRefPtr&lt;HistoryItem&gt;, Page&amp;); // Prunes if capacity() is exceeded.
-        WEBCORE_EXPORT void remove(HistoryItem*);
-        CachedPage* get(HistoryItem*, Page*);
-        std::unique_ptr&lt;CachedPage&gt; take(HistoryItem*, Page*);
</del><ins>+class PageCache {
+    WTF_MAKE_NONCOPYABLE(PageCache); WTF_MAKE_FAST_ALLOCATED;
+public:
+    // Function to obtain the global page cache.
+    WEBCORE_EXPORT static PageCache&amp; shared();
</ins><span class="cx"> 
</span><del>-        int pageCount() const { return m_size; }
-        WEBCORE_EXPORT int frameCount() const;
</del><ins>+    bool canCache(Page*) const;
</ins><span class="cx"> 
</span><del>-        WEBCORE_EXPORT void markPagesForVisitedLinkStyleRecalc();
</del><ins>+    // Used when memory is low to prune some cached pages.
+    WEBCORE_EXPORT void pruneToSizeNow(unsigned maxSize, PruningReason);
+    WEBCORE_EXPORT void setMaxSize(unsigned); // number of pages to cache.
+    unsigned maxSize() const { return m_maxSize; }
</ins><span class="cx"> 
</span><del>-        // Will mark all cached pages associated with the given page as needing style recalc.
-        void markPagesForFullStyleRecalc(Page*);
</del><ins>+    void add(HistoryItem&amp;, Page&amp;); // Prunes if maxSize() is exceeded.
+    WEBCORE_EXPORT void remove(HistoryItem&amp;);
+    CachedPage* get(HistoryItem&amp;, Page*) const;
+    std::unique_ptr&lt;CachedPage&gt; take(HistoryItem&amp;, Page*);
</ins><span class="cx"> 
</span><del>-        // Used when memory is low to prune some cached pages.
-        WEBCORE_EXPORT void pruneToCapacityNow(int capacity, PruningReason);
</del><ins>+    unsigned pageCount() const { return m_items.size(); }
+    WEBCORE_EXPORT unsigned frameCount() const;
</ins><span class="cx"> 
</span><ins>+    WEBCORE_EXPORT void markPagesForVisitedLinkStyleRecalc();
+    // Will mark all cached pages associated with the given page as needing style recalc.
+    void markPagesForFullStyleRecalc(Page&amp;);
+    void markPagesForDeviceScaleChanged(Page&amp;);
</ins><span class="cx"> #if ENABLE(VIDEO_TRACK)
</span><del>-        void markPagesForCaptionPreferencesChanged();
</del><ins>+    void markPagesForCaptionPreferencesChanged();
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-        bool shouldClearBackingStores() const { return m_shouldClearBackingStores; }
-        void setShouldClearBackingStores(bool flag) { m_shouldClearBackingStores = flag; }
-        void markPagesForDeviceScaleChanged(Page*);
</del><ins>+    bool shouldClearBackingStores() const { return m_shouldClearBackingStores; }
+    void setShouldClearBackingStores(bool flag) { m_shouldClearBackingStores = flag; }
</ins><span class="cx"> 
</span><del>-    private:
-        PageCache(); // Use shared() instead.
-        ~PageCache(); // Not implemented to make sure nobody accidentally calls delete -- WebCore does not delete singletons.
-        
-        static bool canCachePageContainingThisFrame(Frame*);
</del><ins>+private:
+    PageCache() = default; // Use shared() instead.
+    ~PageCache() = delete; // Make sure nobody accidentally calls delete -- WebCore does not delete singletons.
</ins><span class="cx"> 
</span><del>-        void addToLRUList(HistoryItem*); // Adds to the head of the list.
-        void removeFromLRUList(HistoryItem*);
</del><ins>+    static bool canCachePageContainingThisFrame(Frame&amp;);
</ins><span class="cx"> 
</span><del>-        void prune(PruningReason);
</del><ins>+    void prune(PruningReason);
</ins><span class="cx"> 
</span><del>-        int m_capacity;
-        int m_size;
</del><ins>+    ListHashSet&lt;RefPtr&lt;HistoryItem&gt;&gt; m_items;
+    unsigned m_maxSize {0};
+    bool m_shouldClearBackingStores {false};
</ins><span class="cx"> 
</span><del>-        // LRU List
-        HistoryItem* m_head;
-        HistoryItem* m_tail;
-        
-        bool m_shouldClearBackingStores;
</del><ins>+    friend class WTF::NeverDestroyed&lt;PageCache&gt;;
+};
</ins><span class="cx"> 
</span><del>-        friend class WTF::NeverDestroyed&lt;PageCache&gt;;
-    };
-
</del><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // PageCache_h
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderFrameLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/FrameLoader.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -921,7 +921,7 @@
</span><span class="cx">         HistoryItem* childItem = parentItem-&gt;childItemWithTarget(childFrame-&gt;tree().uniqueName());
</span><span class="cx">         if (childItem) {
</span><span class="cx">             childFrame-&gt;loader().m_requestedHistoryItem = childItem;
</span><del>-            childFrame-&gt;loader().loadDifferentDocumentItem(childItem, loadType(), MayAttemptCacheOnlyLoadForFormSubmissionItem);
</del><ins>+            childFrame-&gt;loader().loadDifferentDocumentItem(*childItem, loadType(), MayAttemptCacheOnlyLoadForFormSubmissionItem);
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -1740,8 +1740,8 @@
</span><span class="cx">     Ref&lt;Frame&gt; protect(m_frame);
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;CachedPage&gt; cachedPage;
</span><del>-    if (m_loadingFromCachedPage)
-        cachedPage = PageCache::shared().take(history().provisionalItem(), m_frame.page());
</del><ins>+    if (m_loadingFromCachedPage &amp;&amp; history().provisionalItem())
+        cachedPage = PageCache::shared().take(*history().provisionalItem(), m_frame.page());
</ins><span class="cx"> 
</span><span class="cx">     LOG(PageCache, &quot;WebCoreLoading %s: About to commit provisional load from previous URL '%s' to new URL '%s'&quot;, m_frame.tree().uniqueName().string().utf8().data(),
</span><span class="cx">         m_frame.document() ? m_frame.document()-&gt;url().stringCenterEllipsizedToLength().utf8().data() : &quot;&quot;,
</span><span class="lines">@@ -1758,11 +1758,11 @@
</span><span class="cx">             LOG(MemoryPressure, &quot;Pruning page cache because under memory pressure at: %s&quot;, __PRETTY_FUNCTION__);
</span><span class="cx">             LOG(PageCache, &quot;Pruning page cache to 0 due to memory pressure&quot;);
</span><span class="cx">             // Don't cache any page if we are under memory pressure.
</span><del>-            PageCache::shared().pruneToCapacityNow(0, PruningReason::MemoryPressure);
</del><ins>+            PageCache::shared().pruneToSizeNow(0, PruningReason::MemoryPressure);
</ins><span class="cx">         } else if (systemMemoryLevel() &lt;= memoryLevelThresholdToPrunePageCache) {
</span><span class="cx">             LOG(MemoryPressure, &quot;Pruning page cache because system memory level is %d at: %s&quot;, systemMemoryLevel(), __PRETTY_FUNCTION__);
</span><span class="cx">             LOG(PageCache, &quot;Pruning page cache to %d due to low memory (level %d less or equal to %d threshold)&quot;, PageCache::shared().capacity() / 2, systemMemoryLevel(), memoryLevelThresholdToPrunePageCache);
</span><del>-            PageCache::shared().pruneToCapacityNow(PageCache::shared().capacity() / 2, PruningReason::MemoryPressure);
</del><ins>+            PageCache::shared().pruneToSizeNow(PageCache::shared().maxSize() / 2, PruningReason::MemoryPressure);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="lines">@@ -1771,8 +1771,8 @@
</span><span class="cx"> 
</span><span class="cx">     // Check to see if we need to cache the page we are navigating away from into the back/forward cache.
</span><span class="cx">     // We are doing this here because we know for sure that a new page is about to be loaded.
</span><del>-    HistoryItem* item = history().currentItem();
-    if (!m_frame.tree().parent() &amp;&amp; PageCache::shared().canCache(m_frame.page()) &amp;&amp; !item-&gt;isInPageCache())
</del><ins>+    HistoryItem&amp; item = *history().currentItem();
+    if (!m_frame.tree().parent() &amp;&amp; PageCache::shared().canCache(m_frame.page()) &amp;&amp; !item.isInPageCache())
</ins><span class="cx">         PageCache::shared().add(item, *m_frame.page());
</span><span class="cx"> 
</span><span class="cx">     if (m_loadType != FrameLoadType::Replace)
</span><span class="lines">@@ -3127,14 +3127,14 @@
</span><span class="cx">         activeDocument = m_frame.document();
</span><span class="cx"> 
</span><span class="cx">     if (!activeDocument-&gt;canNavigate(frame))
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx"> 
</span><span class="cx">     return frame;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FrameLoader::loadSameDocumentItem(HistoryItem* item)
</del><ins>+void FrameLoader::loadSameDocumentItem(HistoryItem&amp; item)
</ins><span class="cx"> {
</span><del>-    ASSERT(item-&gt;documentSequenceNumber() == history().currentItem()-&gt;documentSequenceNumber());
</del><ins>+    ASSERT(item.documentSequenceNumber() == history().currentItem()-&gt;documentSequenceNumber());
</ins><span class="cx"> 
</span><span class="cx">     // Save user view state to the current history item here since we don't do a normal load.
</span><span class="cx">     // FIXME: Does form state need to be saved here too?
</span><span class="lines">@@ -3142,10 +3142,10 @@
</span><span class="cx">     if (FrameView* view = m_frame.view())
</span><span class="cx">         view-&gt;setWasScrolledByUser(false);
</span><span class="cx"> 
</span><del>-    history().setCurrentItem(item);
</del><ins>+    history().setCurrentItem(&amp;item);
</ins><span class="cx">         
</span><span class="cx">     // loadInSameDocument() actually changes the URL and notifies load delegates of a &quot;fake&quot; load
</span><del>-    loadInSameDocument(item-&gt;url(), item-&gt;stateObject(), false);
</del><ins>+    loadInSameDocument(item.url(), item.stateObject(), false);
</ins><span class="cx"> 
</span><span class="cx">     // Restore user view state from the current history item here since we don't do a normal load.
</span><span class="cx">     history().restoreScrollPositionAndViewState();
</span><span class="lines">@@ -3154,10 +3154,10 @@
</span><span class="cx"> // FIXME: This function should really be split into a couple pieces, some of
</span><span class="cx"> // which should be methods of HistoryController and some of which should be
</span><span class="cx"> // methods of FrameLoader.
</span><del>-void FrameLoader::loadDifferentDocumentItem(HistoryItem* item, FrameLoadType loadType, FormSubmissionCacheLoadPolicy cacheLoadPolicy)
</del><ins>+void FrameLoader::loadDifferentDocumentItem(HistoryItem&amp; item, FrameLoadType loadType, FormSubmissionCacheLoadPolicy cacheLoadPolicy)
</ins><span class="cx"> {
</span><span class="cx">     // Remember this item so we can traverse any child items as child frames load
</span><del>-    history().setProvisionalItem(item);
</del><ins>+    history().setProvisionalItem(&amp;item);
</ins><span class="cx"> 
</span><span class="cx">     if (CachedPage* cachedPage = PageCache::shared().get(item, m_frame.page())) {
</span><span class="cx">         auto documentLoader = cachedPage-&gt;documentLoader();
</span><span class="lines">@@ -3167,17 +3167,17 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    URL itemURL = item-&gt;url();
-    URL itemOriginalURL = item-&gt;originalURL();
</del><ins>+    URL itemURL = item.url();
+    URL itemOriginalURL = item.originalURL();
</ins><span class="cx">     URL currentURL;
</span><span class="cx">     if (documentLoader())
</span><span class="cx">         currentURL = documentLoader()-&gt;url();
</span><del>-    RefPtr&lt;FormData&gt; formData = item-&gt;formData();
</del><ins>+    RefPtr&lt;FormData&gt; formData = item.formData();
</ins><span class="cx"> 
</span><span class="cx">     ResourceRequest request(itemURL);
</span><span class="cx"> 
</span><del>-    if (!item-&gt;referrer().isNull())
-        request.setHTTPReferrer(item-&gt;referrer());
</del><ins>+    if (!item.referrer().isNull())
+        request.setHTTPReferrer(item.referrer());
</ins><span class="cx">     
</span><span class="cx">     // If this was a repost that failed the page cache, we might try to repost the form.
</span><span class="cx">     NavigationAction action;
</span><span class="lines">@@ -3186,8 +3186,8 @@
</span><span class="cx"> 
</span><span class="cx">         request.setHTTPMethod(&quot;POST&quot;);
</span><span class="cx">         request.setHTTPBody(formData);
</span><del>-        request.setHTTPContentType(item-&gt;formContentType());
-        RefPtr&lt;SecurityOrigin&gt; securityOrigin = SecurityOrigin::createFromString(item-&gt;referrer());
</del><ins>+        request.setHTTPContentType(item.formContentType());
+        RefPtr&lt;SecurityOrigin&gt; securityOrigin = SecurityOrigin::createFromString(item.referrer());
</ins><span class="cx">         addHTTPOriginIfNeeded(request, securityOrigin-&gt;toString());
</span><span class="cx"> 
</span><span class="cx">         // Make sure to add extra fields to the request after the Origin header is added for the FormData case.
</span><span class="lines">@@ -3242,11 +3242,11 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Loads content into this frame, as specified by history item
</span><del>-void FrameLoader::loadItem(HistoryItem* item, FrameLoadType loadType)
</del><ins>+void FrameLoader::loadItem(HistoryItem&amp; item, FrameLoadType loadType)
</ins><span class="cx"> {
</span><del>-    m_requestedHistoryItem = item;
</del><ins>+    m_requestedHistoryItem = &amp;item;
</ins><span class="cx">     HistoryItem* currentItem = history().currentItem();
</span><del>-    bool sameDocumentNavigation = currentItem &amp;&amp; item-&gt;shouldDoSameDocumentNavigationTo(currentItem);
</del><ins>+    bool sameDocumentNavigation = currentItem &amp;&amp; item.shouldDoSameDocumentNavigationTo(currentItem);
</ins><span class="cx"> 
</span><span class="cx">     if (sameDocumentNavigation)
</span><span class="cx">         loadSameDocumentItem(item);
</span><span class="lines">@@ -3260,11 +3260,12 @@
</span><span class="cx">     ASSERT(!m_loadingFromCachedPage);
</span><span class="cx">     // We only use cache-only loads to avoid resubmitting forms.
</span><span class="cx">     ASSERT(isBackForwardLoadType(m_loadType));
</span><ins>+    ASSERT(history().provisionalItem());
</ins><span class="cx">     ASSERT(history().provisionalItem()-&gt;formData());
</span><span class="cx">     ASSERT(history().provisionalItem() == m_requestedHistoryItem.get());
</span><span class="cx"> 
</span><span class="cx">     FrameLoadType loadType = m_loadType;
</span><del>-    HistoryItem* item = history().provisionalItem();
</del><ins>+    HistoryItem&amp; item = *history().provisionalItem();
</ins><span class="cx"> 
</span><span class="cx">     stopAllLoaders(ShouldNotClearProvisionalItem);
</span><span class="cx">     loadDifferentDocumentItem(item, loadType, MayNotAttemptCacheOnlyLoadForFormSubmissionItem);
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderFrameLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/FrameLoader.h (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/FrameLoader.h        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/loader/FrameLoader.h        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -125,7 +125,7 @@
</span><span class="cx">     WEBCORE_EXPORT void reloadWithOverrideEncoding(const String&amp; overrideEncoding);
</span><span class="cx"> 
</span><span class="cx">     void open(CachedFrameBase&amp;);
</span><del>-    void loadItem(HistoryItem*, FrameLoadType);
</del><ins>+    void loadItem(HistoryItem&amp;, FrameLoadType);
</ins><span class="cx">     HistoryItem* requestedHistoryItem() const { return m_requestedHistoryItem.get(); }
</span><span class="cx"> 
</span><span class="cx">     void retryAfterFailedCacheOnlyMainResourceLoad();
</span><span class="lines">@@ -299,8 +299,8 @@
</span><span class="cx"> 
</span><span class="cx">     void checkTimerFired();
</span><span class="cx">     
</span><del>-    void loadSameDocumentItem(HistoryItem*);
-    void loadDifferentDocumentItem(HistoryItem*, FrameLoadType, FormSubmissionCacheLoadPolicy);
</del><ins>+    void loadSameDocumentItem(HistoryItem&amp;);
+    void loadDifferentDocumentItem(HistoryItem&amp;, FrameLoadType, FormSubmissionCacheLoadPolicy);
</ins><span class="cx">     
</span><span class="cx">     void loadProvisionalItemFromCachedPage();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderHistoryControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/HistoryController.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/HistoryController.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/loader/HistoryController.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -234,12 +234,14 @@
</span><span class="cx"> 
</span><span class="cx"> void HistoryController::invalidateCurrentItemCachedPage()
</span><span class="cx"> {
</span><ins>+    if (!currentItem())
+        return;
+
</ins><span class="cx">     // When we are pre-commit, the currentItem is where any page cache data resides.
</span><del>-    if (!PageCache::shared().get(currentItem(), m_frame.page()))
</del><ins>+    std::unique_ptr&lt;CachedPage&gt; cachedPage = PageCache::shared().take(*currentItem(), m_frame.page());
+    if (!cachedPage)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    std::unique_ptr&lt;CachedPage&gt; cachedPage = PageCache::shared().take(currentItem(), m_frame.page());
-
</del><span class="cx">     // FIXME: This is a grotesque hack to fix &lt;rdar://problem/4059059&gt; Crash in RenderFlow::detach
</span><span class="cx">     // Somehow the PageState object is not properly updated, and is holding onto a stale document.
</span><span class="cx">     // Both Xcode and FileMaker see this crash, Safari does not.
</span><span class="lines">@@ -265,7 +267,7 @@
</span><span class="cx"> 
</span><span class="cx"> // Main funnel for navigating to a previous location (back/forward, non-search snap-back)
</span><span class="cx"> // This includes recursion to handle loading into framesets properly
</span><del>-void HistoryController::goToItem(HistoryItem* targetItem, FrameLoadType type)
</del><ins>+void HistoryController::goToItem(HistoryItem&amp; targetItem, FrameLoadType type)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_frame.tree().parent());
</span><span class="cx">     
</span><span class="lines">@@ -276,10 +278,10 @@
</span><span class="cx">     Page* page = m_frame.page();
</span><span class="cx">     if (!page)
</span><span class="cx">         return;
</span><del>-    if (!m_frame.loader().client().shouldGoToHistoryItem(targetItem))
</del><ins>+    if (!m_frame.loader().client().shouldGoToHistoryItem(&amp;targetItem))
</ins><span class="cx">         return;
</span><span class="cx">     if (m_defersLoading) {
</span><del>-        m_deferredItem = targetItem;
</del><ins>+        m_deferredItem = &amp;targetItem;
</ins><span class="cx">         m_deferredFrameLoadType = type;
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="lines">@@ -288,7 +290,7 @@
</span><span class="cx">     // - plus, it only makes sense for the top level of the operation through the frame tree,
</span><span class="cx">     // as opposed to happening for some/one of the page commits that might happen soon
</span><span class="cx">     RefPtr&lt;HistoryItem&gt; currentItem = page-&gt;backForward().currentItem();
</span><del>-    page-&gt;backForward().setCurrentItem(targetItem);
</del><ins>+    page-&gt;backForward().setCurrentItem(&amp;targetItem);
</ins><span class="cx">     m_frame.loader().client().updateGlobalHistoryItemForPage();
</span><span class="cx"> 
</span><span class="cx">     // First set the provisional item of any frames that are not actually navigating.
</span><span class="lines">@@ -305,8 +307,8 @@
</span><span class="cx"> {
</span><span class="cx">     m_defersLoading = defer;
</span><span class="cx">     if (!defer &amp;&amp; m_deferredItem) {
</span><del>-        goToItem(m_deferredItem.get(), m_deferredFrameLoadType);
-        m_deferredItem = 0;
</del><ins>+        goToItem(*m_deferredItem, m_deferredFrameLoadType);
+        m_deferredItem = nullptr;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -334,7 +336,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     if (m_currentItem) {
</span><del>-        PageCache::shared().remove(m_currentItem.get());
</del><ins>+        PageCache::shared().remove(*m_currentItem);
</ins><span class="cx">     
</span><span class="cx">         if (m_frame.loader().loadType() == FrameLoadType::Reload || m_frame.loader().loadType() == FrameLoadType::ReloadFromOrigin)
</span><span class="cx">             saveScrollPositionAndViewStateToItem(m_currentItem.get());
</span><span class="lines">@@ -499,7 +501,7 @@
</span><span class="cx">     // For each frame that already had the content the item requested (based on
</span><span class="cx">     // (a matching URL and frame tree snapshot), just restore the scroll position.
</span><span class="cx">     // Save form state (works from currentItem, since m_frameLoadComplete is true)
</span><del>-    if (m_currentItem &amp;&amp; itemsAreClones(m_currentItem.get(), m_provisionalItem.get())) {
</del><ins>+    if (m_currentItem &amp;&amp; itemsAreClones(*m_currentItem, m_provisionalItem.get())) {
</ins><span class="cx">         ASSERT(m_frameLoadComplete);
</span><span class="cx">         saveDocumentState();
</span><span class="cx">         saveScrollPositionAndViewStateToItem(m_currentItem.get());
</span><span class="lines">@@ -707,17 +709,15 @@
</span><span class="cx"> // tracking whether each frame already has the content the item requests.  If there is
</span><span class="cx"> // a match, we set the provisional item and recurse.  Otherwise we will reload that
</span><span class="cx"> // frame and all its kids in recursiveGoToItem.
</span><del>-void HistoryController::recursiveSetProvisionalItem(HistoryItem* item, HistoryItem* fromItem)
</del><ins>+void HistoryController::recursiveSetProvisionalItem(HistoryItem&amp; item, HistoryItem* fromItem)
</ins><span class="cx"> {
</span><del>-    ASSERT(item);
-
</del><span class="cx">     if (!itemsAreClones(item, fromItem))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     // Set provisional item, which will be committed in recursiveUpdateForCommit.
</span><del>-    m_provisionalItem = item;
</del><ins>+    m_provisionalItem = &amp;item;
</ins><span class="cx"> 
</span><del>-    for (const auto&amp; childItem : item-&gt;children()) {
</del><ins>+    for (const auto&amp; childItem : item.children()) {
</ins><span class="cx">         const String&amp; childFrameName = childItem-&gt;target();
</span><span class="cx"> 
</span><span class="cx">         HistoryItem* fromChildItem = fromItem-&gt;childItemWithTarget(childFrameName);
</span><span class="lines">@@ -725,34 +725,32 @@
</span><span class="cx">         Frame* childFrame = m_frame.tree().child(childFrameName);
</span><span class="cx">         ASSERT(childFrame);
</span><span class="cx"> 
</span><del>-        childFrame-&gt;loader().history().recursiveSetProvisionalItem(childItem.get(), fromChildItem);
</del><ins>+        childFrame-&gt;loader().history().recursiveSetProvisionalItem(*childItem, fromChildItem);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // We now traverse the frame tree and item tree a second time, loading frames that
</span><span class="cx"> // do have the content the item requests.
</span><del>-void HistoryController::recursiveGoToItem(HistoryItem* item, HistoryItem* fromItem, FrameLoadType type)
</del><ins>+void HistoryController::recursiveGoToItem(HistoryItem&amp; item, HistoryItem* fromItem, FrameLoadType type)
</ins><span class="cx"> {
</span><del>-    ASSERT(item);
-
</del><span class="cx">     if (!itemsAreClones(item, fromItem)) {
</span><span class="cx">         m_frame.loader().loadItem(item, type);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Just iterate over the rest, looking for frames to navigate.
</span><del>-    for (const auto&amp; childItem : item-&gt;children()) {
</del><ins>+    for (const auto&amp; childItem : item.children()) {
</ins><span class="cx">         const String&amp; childFrameName = childItem-&gt;target();
</span><span class="cx"> 
</span><span class="cx">         HistoryItem* fromChildItem = fromItem-&gt;childItemWithTarget(childFrameName);
</span><span class="cx">         ASSERT(fromChildItem);
</span><span class="cx">         Frame* childFrame = m_frame.tree().child(childFrameName);
</span><span class="cx">         ASSERT(childFrame);
</span><del>-        childFrame-&gt;loader().history().recursiveGoToItem(childItem.get(), fromChildItem, type);
</del><ins>+        childFrame-&gt;loader().history().recursiveGoToItem(*childItem, fromChildItem, type);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool HistoryController::itemsAreClones(HistoryItem* item1, HistoryItem* item2) const
</del><ins>+bool HistoryController::itemsAreClones(HistoryItem&amp; item1, HistoryItem* item2) const
</ins><span class="cx"> {
</span><span class="cx">     // If the item we're going to is a clone of the item we're at, then we do
</span><span class="cx">     // not need to load it again.  The current frame tree and the frame tree
</span><span class="lines">@@ -761,12 +759,11 @@
</span><span class="cx">     // a reload.  Thus, if item1 and item2 are the same, we need to create a
</span><span class="cx">     // new document and should not consider them clones.
</span><span class="cx">     // (See http://webkit.org/b/35532 for details.)
</span><del>-    return item1
-        &amp;&amp; item2
-        &amp;&amp; item1 != item2
-        &amp;&amp; item1-&gt;itemSequenceNumber() == item2-&gt;itemSequenceNumber()
-        &amp;&amp; currentFramesMatchItem(item1)
-        &amp;&amp; item2-&gt;hasSameFrames(item1);
</del><ins>+    return item2
+        &amp;&amp; &amp;item1 != item2
+        &amp;&amp; item1.itemSequenceNumber() == item2-&gt;itemSequenceNumber()
+        &amp;&amp; currentFramesMatchItem(&amp;item1)
+        &amp;&amp; item2-&gt;hasSameFrames(&amp;item1);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // Helper method that determines whether the current frame tree matches given history item's.
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderHistoryControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/HistoryController.h (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/HistoryController.h        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/loader/HistoryController.h        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -93,19 +93,19 @@
</span><span class="cx"> private:
</span><span class="cx">     friend class Page;
</span><span class="cx">     bool shouldStopLoadingForHistoryItem(HistoryItem*) const;
</span><del>-    void goToItem(HistoryItem*, FrameLoadType);
</del><ins>+    void goToItem(HistoryItem&amp;, FrameLoadType);
</ins><span class="cx"> 
</span><span class="cx">     void initializeItem(HistoryItem*);
</span><span class="cx">     PassRefPtr&lt;HistoryItem&gt; createItem();
</span><span class="cx">     PassRefPtr&lt;HistoryItem&gt; createItemTree(Frame&amp; targetFrame, bool clipAtTarget);
</span><span class="cx"> 
</span><del>-    void recursiveSetProvisionalItem(HistoryItem*, HistoryItem*);
-    void recursiveGoToItem(HistoryItem*, HistoryItem*, FrameLoadType);
</del><ins>+    void recursiveSetProvisionalItem(HistoryItem&amp;, HistoryItem*);
+    void recursiveGoToItem(HistoryItem&amp;, HistoryItem*, FrameLoadType);
</ins><span class="cx">     bool isReplaceLoadTypeWithProvisionalItem(FrameLoadType);
</span><span class="cx">     bool isReloadTypeWithProvisionalItem(FrameLoadType);
</span><span class="cx">     void recursiveUpdateForCommit();
</span><span class="cx">     void recursiveUpdateForSameDocumentNavigation();
</span><del>-    bool itemsAreClones(HistoryItem*, HistoryItem*) const;
</del><ins>+    bool itemsAreClones(HistoryItem&amp;, HistoryItem*) const;
</ins><span class="cx">     bool currentFramesMatchItem(HistoryItem*) const;
</span><span class="cx">     void updateBackForwardListClippedAtTarget(bool doClip);
</span><span class="cx">     void updateCurrentItem();
</span></span></pre></div>
<a id="trunkSourceWebCorepageDiagnosticLoggingKeyscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DiagnosticLoggingKeys.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DiagnosticLoggingKeys.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/page/DiagnosticLoggingKeys.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -388,7 +388,7 @@
</span><span class="cx">     return ASCIILiteral(&quot;pruned.memoryPressure&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-String DiagnosticLoggingKeys::prunedDueToCapacityReached()
</del><ins>+String DiagnosticLoggingKeys::prunedDueToMaxSizeReached()
</ins><span class="cx"> {
</span><span class="cx">     return ASCIILiteral(&quot;pruned.capacityReached&quot;);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepageDiagnosticLoggingKeysh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/DiagnosticLoggingKeys.h (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/DiagnosticLoggingKeys.h        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/page/DiagnosticLoggingKeys.h        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -76,7 +76,7 @@
</span><span class="cx">     static String playedKey();
</span><span class="cx">     static String pluginLoadedKey();
</span><span class="cx">     static String pluginLoadingFailedKey();
</span><del>-    static String prunedDueToCapacityReached();
</del><ins>+    static String prunedDueToMaxSizeReached();
</ins><span class="cx">     static String prunedDueToMemoryPressureKey();
</span><span class="cx">     static String prunedDueToProcessSuspended();
</span><span class="cx">     static String quirkRedirectComingKey();
</span></span></pre></div>
<a id="trunkSourceWebCorepageFramecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Frame.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Frame.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/page/Frame.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -989,7 +989,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (isMainFrame())
</span><del>-        PageCache::shared().markPagesForFullStyleRecalc(page);
</del><ins>+        PageCache::shared().markPagesForFullStyleRecalc(*page);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> float Frame::frameScaleFactor() const
</span></span></pre></div>
<a id="trunkSourceWebCorepagePagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/page/Page.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -430,13 +430,13 @@
</span><span class="cx">     m_openedByDOM = true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Page::goToItem(HistoryItem* item, FrameLoadType type)
</del><ins>+void Page::goToItem(HistoryItem&amp; item, FrameLoadType type)
</ins><span class="cx"> {
</span><span class="cx">     // stopAllLoaders may end up running onload handlers, which could cause further history traversals that may lead to the passed in HistoryItem
</span><span class="cx">     // being deref()-ed. Make sure we can still use it with HistoryController::goToItem later.
</span><del>-    RefPtr&lt;HistoryItem&gt; protector(item);
</del><ins>+    Ref&lt;HistoryItem&gt; protector(item);
</ins><span class="cx"> 
</span><del>-    if (m_mainFrame-&gt;loader().history().shouldStopLoadingForHistoryItem(item))
</del><ins>+    if (m_mainFrame-&gt;loader().history().shouldStopLoadingForHistoryItem(&amp;item))
</ins><span class="cx">         m_mainFrame-&gt;loader().stopAllLoaders();
</span><span class="cx"> 
</span><span class="cx">     m_mainFrame-&gt;loader().history().goToItem(item, type);
</span><span class="lines">@@ -839,9 +839,9 @@
</span><span class="cx">     setNeedsRecalcStyleInAllFrames();
</span><span class="cx"> 
</span><span class="cx">     mainFrame().deviceOrPageScaleFactorChanged();
</span><del>-    PageCache::shared().markPagesForDeviceScaleChanged(this);
</del><ins>+    PageCache::shared().markPagesForDeviceScaleChanged(*this);
</ins><span class="cx"> 
</span><del>-    PageCache::shared().markPagesForFullStyleRecalc(this);
</del><ins>+    PageCache::shared().markPagesForFullStyleRecalc(*this);
</ins><span class="cx">     GraphicsContext::updateDocumentMarkerResources();
</span><span class="cx"> 
</span><span class="cx">     mainFrame().pageOverlayController().didChangeDeviceScaleFactor();
</span><span class="lines">@@ -921,7 +921,7 @@
</span><span class="cx">     m_pagination = pagination;
</span><span class="cx"> 
</span><span class="cx">     setNeedsRecalcStyleInAllFrames();
</span><del>-    PageCache::shared().markPagesForFullStyleRecalc(this);
</del><ins>+    PageCache::shared().markPagesForFullStyleRecalc(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> unsigned Page::pageCount() const
</span><span class="lines">@@ -1661,7 +1661,7 @@
</span><span class="cx">     m_visitedLinkStore-&gt;addPage(*this);
</span><span class="cx"> 
</span><span class="cx">     invalidateStylesForAllLinks();
</span><del>-    PageCache::shared().markPagesForFullStyleRecalc(this);
</del><ins>+    PageCache::shared().markPagesForFullStyleRecalc(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> SessionID Page::sessionID() const
</span></span></pre></div>
<a id="trunkSourceWebCorepagePageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.h (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.h        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/page/Page.h        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -150,7 +150,7 @@
</span><span class="cx">     bool openedByDOM() const;
</span><span class="cx">     void setOpenedByDOM();
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT void goToItem(HistoryItem*, FrameLoadType);
</del><ins>+    WEBCORE_EXPORT void goToItem(HistoryItem&amp;, FrameLoadType);
</ins><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void setGroupName(const String&amp;);
</span><span class="cx">     WEBCORE_EXPORT const String&amp; groupName() const;
</span></span></pre></div>
<a id="trunkSourceWebCorepageSettingscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Settings.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Settings.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/page/Settings.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -519,12 +519,8 @@
</span><span class="cx">     if (!m_page)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (!m_usesPageCache) {
-        int first = -m_page-&gt;backForward().backCount();
-        int last = m_page-&gt;backForward().forwardCount();
-        for (int i = first; i &lt;= last; i++)
-            PageCache::shared().remove(m_page-&gt;backForward().itemAtIndex(i));
-    }
</del><ins>+    if (!m_usesPageCache)
+        PageCache::shared().pruneToSizeNow(0, PruningReason::None);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Settings::setScreenFontSubstitutionEnabled(bool enabled)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformMemoryPressureHandlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/MemoryPressureHandler.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/MemoryPressureHandler.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebCore/platform/MemoryPressureHandler.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -102,7 +102,7 @@
</span><span class="cx">         ReliefLogger log(&quot;Empty the PageCache&quot;);
</span><span class="cx">         // Right now, the only reason we call release critical memory while not under memory pressure is if the process is about to be suspended.
</span><span class="cx">         PruningReason pruningReason = memoryPressureHandler().isUnderMemoryPressure() ? PruningReason::MemoryPressure : PruningReason::ProcessSuspended;
</span><del>-        PageCache::shared().pruneToCapacityNow(0, pruningReason);
</del><ins>+        PageCache::shared().pruneToSizeNow(0, pruningReason);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebKit/mac/ChangeLog        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2015-01-29  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Clean up / modernize PageCache class
+        https://bugs.webkit.org/show_bug.cgi?id=141009
+
+        Reviewed by Darin Adler.
+
+        Clean up / modernize PageCache class.
+
+        * History/WebBackForwardList.mm:
+        (-[WebBackForwardList pageCacheSize]):
+        * WebView/WebView.mm:
+        (-[WebView _loadBackForwardListFromOtherView:]):
+        (-[WebView goToBackForwardItem:]):
+        (+[WebView _setCacheModel:]):
+
</ins><span class="cx"> 2015-01-28  Beth Dakin  &lt;bdakin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove Mountain Lion code from WebKit and WebKit2
</span></span></pre></div>
<a id="trunkSourceWebKitmacHistoryWebBackForwardListmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/History/WebBackForwardList.mm (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/History/WebBackForwardList.mm        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebKit/mac/History/WebBackForwardList.mm        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -355,7 +355,7 @@
</span><span class="cx"> 
</span><span class="cx"> - (NSUInteger)pageCacheSize
</span><span class="cx"> {
</span><del>-    return [kit(core(self)-&gt;page()) usesPageCache] ? PageCache::shared().capacity() : 0;
</del><ins>+    return [kit(core(self)-&gt;page()) usesPageCache] ? PageCache::shared().maxSize() : 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (int)backListCount
</span></span></pre></div>
<a id="trunkSourceWebKitmacWebViewWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/WebView/WebView.mm (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/WebView/WebView.mm        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebKit/mac/WebView/WebView.mm        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -1997,7 +1997,7 @@
</span><span class="cx">     if (!otherBackForwardClient-&gt;currentItem())
</span><span class="cx">         return; // empty back forward list, bail
</span><span class="cx">     
</span><del>-    HistoryItem* newItemToGoTo = 0;
</del><ins>+    HistoryItem* newItemToGoTo = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     int lastItemIndex = otherBackForwardClient-&gt;forwardListCount();
</span><span class="cx">     for (int i = -otherBackForwardClient-&gt;backListCount(); i &lt;= lastItemIndex; ++i) {
</span><span class="lines">@@ -2014,7 +2014,7 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     ASSERT(newItemToGoTo);
</span><del>-    _private-&gt;page-&gt;goToItem(newItemToGoTo, FrameLoadType::IndexedBackForward);
</del><ins>+    _private-&gt;page-&gt;goToItem(*newItemToGoTo, FrameLoadType::IndexedBackForward);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)_setFormDelegate: (id&lt;WebFormDelegate&gt;)delegate
</span><span class="lines">@@ -5647,7 +5647,8 @@
</span><span class="cx">     if (!_private-&gt;page)
</span><span class="cx">         return NO;
</span><span class="cx"> 
</span><del>-    _private-&gt;page-&gt;goToItem(core(item), FrameLoadType::IndexedBackForward);
</del><ins>+    ASSERT(item);
+    _private-&gt;page-&gt;goToItem(*core(item), FrameLoadType::IndexedBackForward);
</ins><span class="cx">     return YES;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -7742,7 +7743,7 @@
</span><span class="cx">     unsigned cacheMaxDeadCapacity = 0;
</span><span class="cx">     auto deadDecodedDataDeletionInterval = std::chrono::seconds { 0 };
</span><span class="cx"> 
</span><del>-    unsigned pageCacheCapacity = 0;
</del><ins>+    unsigned pageCacheSize = 0;
</ins><span class="cx"> 
</span><span class="cx">     NSUInteger nsurlCacheMemoryCapacity = 0;
</span><span class="cx">     NSUInteger nsurlCacheDiskCapacity = 0;
</span><span class="lines">@@ -7753,7 +7754,7 @@
</span><span class="cx">     switch (cacheModel) {
</span><span class="cx">     case WebCacheModelDocumentViewer: {
</span><span class="cx">         // Page cache capacity (in pages)
</span><del>-        pageCacheCapacity = 0;
</del><ins>+        pageCacheSize = 0;
</ins><span class="cx"> 
</span><span class="cx">         // Object cache capacities (in bytes)
</span><span class="cx">         if (memSize &gt;= 4096)
</span><span class="lines">@@ -7790,13 +7791,13 @@
</span><span class="cx">     case WebCacheModelDocumentBrowser: {
</span><span class="cx">         // Page cache capacity (in pages)
</span><span class="cx">         if (memSize &gt;= 1024)
</span><del>-            pageCacheCapacity = 3;
</del><ins>+            pageCacheSize = 3;
</ins><span class="cx">         else if (memSize &gt;= 512)
</span><del>-            pageCacheCapacity = 2;
</del><ins>+            pageCacheSize = 2;
</ins><span class="cx">         else if (memSize &gt;= 256)
</span><del>-            pageCacheCapacity = 1;
</del><ins>+            pageCacheSize = 1;
</ins><span class="cx">         else
</span><del>-            pageCacheCapacity = 0;
</del><ins>+            pageCacheSize = 0;
</ins><span class="cx"> 
</span><span class="cx">         // Object cache capacities (in bytes)
</span><span class="cx">         if (memSize &gt;= 4096)
</span><span class="lines">@@ -7844,22 +7845,22 @@
</span><span class="cx">         // Page cache capacity (in pages)
</span><span class="cx">         // (Research indicates that value / page drops substantially after 3 pages.)
</span><span class="cx">         if (memSize &gt;= 2048)
</span><del>-            pageCacheCapacity = 5;
</del><ins>+            pageCacheSize = 5;
</ins><span class="cx">         else if (memSize &gt;= 1024)
</span><del>-            pageCacheCapacity = 4;
</del><ins>+            pageCacheSize = 4;
</ins><span class="cx">         else if (memSize &gt;= 512)
</span><del>-            pageCacheCapacity = 3;
</del><ins>+            pageCacheSize = 3;
</ins><span class="cx">         else if (memSize &gt;= 256)
</span><del>-            pageCacheCapacity = 2;
</del><ins>+            pageCacheSize = 2;
</ins><span class="cx">         else
</span><del>-            pageCacheCapacity = 1;
</del><ins>+            pageCacheSize = 1;
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">         // Cache page less aggressively in iOS to reduce the chance of being jettisoned.
</span><span class="cx">         // FIXME (&lt;rdar://problem/11779846&gt;): Avoiding jettisoning should not have to require reducing the page cache capacity.
</span><span class="cx">         // Reducing the capacity by 1 reduces overall back-forward performance.
</span><del>-        if (pageCacheCapacity &gt; 0)
-            pageCacheCapacity -= 1;
</del><ins>+        if (pageCacheSize &gt; 0)
+            pageCacheSize -= 1;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">         // Object cache capacities (in bytes)
</span><span class="lines">@@ -7935,7 +7936,7 @@
</span><span class="cx"> 
</span><span class="cx">     memoryCache().setCapacities(cacheMinDeadCapacity, cacheMaxDeadCapacity, cacheTotalCapacity);
</span><span class="cx">     memoryCache().setDeadDecodedDataDeletionInterval(deadDecodedDataDeletionInterval);
</span><del>-    PageCache::shared().setCapacity(pageCacheCapacity);
</del><ins>+    PageCache::shared().setMaxSize(pageCacheSize);
</ins><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     PageCache::shared().setShouldClearBackingStores(true);
</span><span class="cx">     nsurlCacheMemoryCapacity = std::max(nsurlCacheMemoryCapacity, [nsurlCache memoryCapacity]);
</span></span></pre></div>
<a id="trunkSourceWebKitwinChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/ChangeLog (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/ChangeLog        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebKit/win/ChangeLog        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2015-01-29  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Clean up / modernize PageCache class
+        https://bugs.webkit.org/show_bug.cgi?id=141009
+
+        Reviewed by Darin Adler.
+
+        Clean up / modernize PageCache class.
+
+        * WebView.cpp:
+        (WebView::setCacheModel):
+
</ins><span class="cx"> 2015-01-28  peavo@outlook.com  &lt;peavo@outlook.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WinCairo] Message loop is flooded with timer messages when animating in accelerated compositing mode.
</span></span></pre></div>
<a id="trunkSourceWebKitwinWebViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/WebView.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/WebView.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebKit/win/WebView.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -530,13 +530,13 @@
</span><span class="cx">     unsigned cacheMaxDeadCapacity = 0;
</span><span class="cx">     auto deadDecodedDataDeletionInterval = std::chrono::seconds { 0 };
</span><span class="cx"> 
</span><del>-    unsigned pageCacheCapacity = 0;
</del><ins>+    unsigned pageCacheSize = 0;
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     switch (cacheModel) {
</span><span class="cx">     case WebCacheModelDocumentViewer: {
</span><span class="cx">         // Page cache capacity (in pages)
</span><del>-        pageCacheCapacity = 0;
</del><ins>+        pageCacheSize = 0;
</ins><span class="cx"> 
</span><span class="cx">         // Object cache capacities (in bytes)
</span><span class="cx">         if (memSize &gt;= 2048)
</span><span class="lines">@@ -563,13 +563,13 @@
</span><span class="cx">     case WebCacheModelDocumentBrowser: {
</span><span class="cx">         // Page cache capacity (in pages)
</span><span class="cx">         if (memSize &gt;= 1024)
</span><del>-            pageCacheCapacity = 3;
</del><ins>+            pageCacheSize = 3;
</ins><span class="cx">         else if (memSize &gt;= 512)
</span><del>-            pageCacheCapacity = 2;
</del><ins>+            pageCacheSize = 2;
</ins><span class="cx">         else if (memSize &gt;= 256)
</span><del>-            pageCacheCapacity = 1;
</del><ins>+            pageCacheSize = 1;
</ins><span class="cx">         else
</span><del>-            pageCacheCapacity = 0;
</del><ins>+            pageCacheSize = 0;
</ins><span class="cx"> 
</span><span class="cx">         // Object cache capacities (in bytes)
</span><span class="cx">         if (memSize &gt;= 2048)
</span><span class="lines">@@ -610,15 +610,15 @@
</span><span class="cx">         // Page cache capacity (in pages)
</span><span class="cx">         // (Research indicates that value / page drops substantially after 3 pages.)
</span><span class="cx">         if (memSize &gt;= 2048)
</span><del>-            pageCacheCapacity = 5;
</del><ins>+            pageCacheSize = 5;
</ins><span class="cx">         else if (memSize &gt;= 1024)
</span><del>-            pageCacheCapacity = 4;
</del><ins>+            pageCacheSize = 4;
</ins><span class="cx">         else if (memSize &gt;= 512)
</span><del>-            pageCacheCapacity = 3;
</del><ins>+            pageCacheSize = 3;
</ins><span class="cx">         else if (memSize &gt;= 256)
</span><del>-            pageCacheCapacity = 2;
</del><ins>+            pageCacheSize = 2;
</ins><span class="cx">         else
</span><del>-            pageCacheCapacity = 1;
</del><ins>+            pageCacheSize = 1;
</ins><span class="cx"> 
</span><span class="cx">         // Object cache capacities (in bytes)
</span><span class="cx">         // (Testing indicates that value / MB depends heavily on content and
</span><span class="lines">@@ -675,7 +675,7 @@
</span><span class="cx"> 
</span><span class="cx">     memoryCache().setCapacities(cacheMinDeadCapacity, cacheMaxDeadCapacity, cacheTotalCapacity);
</span><span class="cx">     memoryCache().setDeadDecodedDataDeletionInterval(deadDecodedDataDeletionInterval);
</span><del>-    PageCache::shared().setCapacity(pageCacheCapacity);
</del><ins>+    PageCache::shared().setMaxSize(pageCacheSize);
</ins><span class="cx"> 
</span><span class="cx"> #if USE(CFNETWORK)
</span><span class="cx">     // Don't shrink a big disk cache, since that would cause churn.
</span><span class="lines">@@ -3154,7 +3154,7 @@
</span><span class="cx">     if (FAILED(hr))
</span><span class="cx">         return hr;
</span><span class="cx"> 
</span><del>-    m_page-&gt;goToItem(webHistoryItem-&gt;historyItem(), FrameLoadType::IndexedBackForward);
</del><ins>+    m_page-&gt;goToItem(*webHistoryItem-&gt;historyItem(), FrameLoadType::IndexedBackForward);
</ins><span class="cx">     *succeeded = TRUE;
</span><span class="cx"> 
</span><span class="cx">     return S_OK;
</span><span class="lines">@@ -5501,7 +5501,7 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     ASSERT(newItemToGoTo);
</span><del>-    m_page-&gt;goToItem(newItemToGoTo, FrameLoadType::IndexedBackForward);
</del><ins>+    m_page-&gt;goToItem(*newItemToGoTo, FrameLoadType::IndexedBackForward);
</ins><span class="cx">     return S_OK;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebKit2/ChangeLog        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2015-01-29  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Clean up / modernize PageCache class
+        https://bugs.webkit.org/show_bug.cgi?id=141009
+
+        Reviewed by Darin Adler.
+
+        Clean up / modernize PageCache class.
+
+        * WebProcess/WebPage/WebBackForwardListProxy.cpp:
+        (WebKit::WebBackForwardListProxy::removeItem):
+        (WebKit::WebBackForwardListProxy::close):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::goForward):
+        (WebKit::WebPage::goBack):
+        (WebKit::WebPage::goToBackForwardItem):
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::releasePageCache):
+        * WebProcess/cocoa/WebProcessCocoa.mm:
+        (WebKit::WebProcess::platformSetCacheModel):
+        * WebProcess/soup/WebProcessSoup.cpp:
+        (WebKit::WebProcess::platformSetCacheModel):
+
</ins><span class="cx"> 2015-01-29  Csaba Osztrogonác  &lt;ossy@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         [EFL][GTK] Fix the build after r179326
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebBackForwardListProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -132,7 +132,7 @@
</span><span class="cx">     if (!item)
</span><span class="cx">         return;
</span><span class="cx">         
</span><del>-    PageCache::shared().remove(item.get());
</del><ins>+    PageCache::shared().remove(*item);
</ins><span class="cx">     WebCore::Page::clearPreviousItemFromAllPages(item.get());
</span><span class="cx">     historyItemToIDMap().remove(item);
</span><span class="cx"> }
</span><span class="lines">@@ -216,12 +216,12 @@
</span><span class="cx"> 
</span><span class="cx"> void WebBackForwardListProxy::close()
</span><span class="cx"> {
</span><del>-    HashSet&lt;uint64_t&gt;::iterator end = m_associatedItemIDs.end();
-    for (HashSet&lt;uint64_t&gt;::iterator i = m_associatedItemIDs.begin(); i != end; ++i)
-        WebCore::PageCache::shared().remove(itemForID(*i));
</del><ins>+    for (auto&amp; itemID : m_associatedItemIDs) {
+        if (HistoryItem* item = itemForID(itemID))
+            WebCore::PageCache::shared().remove(*item);
+    }
</ins><span class="cx"> 
</span><span class="cx">     m_associatedItemIDs.clear();
</span><del>-
</del><span class="cx">     m_page = nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -1210,7 +1210,7 @@
</span><span class="cx">     if (!item-&gt;isInPageCache())
</span><span class="cx">         m_pendingNavigationID = navigationID;
</span><span class="cx"> 
</span><del>-    m_page-&gt;goToItem(item, FrameLoadType::Forward);
</del><ins>+    m_page-&gt;goToItem(*item, FrameLoadType::Forward);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPage::goBack(uint64_t navigationID, uint64_t backForwardItemID)
</span><span class="lines">@@ -1226,7 +1226,7 @@
</span><span class="cx">     if (!item-&gt;isInPageCache())
</span><span class="cx">         m_pendingNavigationID = navigationID;
</span><span class="cx"> 
</span><del>-    m_page-&gt;goToItem(item, FrameLoadType::Back);
</del><ins>+    m_page-&gt;goToItem(*item, FrameLoadType::Back);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPage::goToBackForwardItem(uint64_t navigationID, uint64_t backForwardItemID)
</span><span class="lines">@@ -1242,7 +1242,7 @@
</span><span class="cx">     if (!item-&gt;isInPageCache())
</span><span class="cx">         m_pendingNavigationID = navigationID;
</span><span class="cx"> 
</span><del>-    m_page-&gt;goToItem(item, FrameLoadType::IndexedBackForward);
</del><ins>+    m_page-&gt;goToItem(*item, FrameLoadType::IndexedBackForward);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPage::tryRestoreScrollPosition()
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebProcesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -1116,7 +1116,7 @@
</span><span class="cx"> 
</span><span class="cx"> void WebProcess::releasePageCache()
</span><span class="cx"> {
</span><del>-    PageCache::shared().pruneToCapacityNow(0, PruningReason::MemoryPressure);
</del><ins>+    PageCache::shared().pruneToSizeNow(0, PruningReason::MemoryPressure);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if !PLATFORM(COCOA)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcesscocoaWebProcessCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebKit2/WebProcess/cocoa/WebProcessCocoa.mm        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -104,18 +104,18 @@
</span><span class="cx">     unsigned cacheMinDeadCapacity = 0;
</span><span class="cx">     unsigned cacheMaxDeadCapacity = 0;
</span><span class="cx">     auto deadDecodedDataDeletionInterval = std::chrono::seconds { 0 };
</span><del>-    unsigned pageCacheCapacity = 0;
</del><ins>+    unsigned pageCacheSize = 0;
</ins><span class="cx">     unsigned long urlCacheMemoryCapacity = 0;
</span><span class="cx">     unsigned long urlCacheDiskCapacity = 0;
</span><span class="cx"> 
</span><span class="cx">     calculateCacheSizes(cacheModel, memSize, diskFreeSize,
</span><span class="cx">         cacheTotalCapacity, cacheMinDeadCapacity, cacheMaxDeadCapacity, deadDecodedDataDeletionInterval,
</span><del>-        pageCacheCapacity, urlCacheMemoryCapacity, urlCacheDiskCapacity);
</del><ins>+        pageCacheSize, urlCacheMemoryCapacity, urlCacheDiskCapacity);
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     memoryCache().setCapacities(cacheMinDeadCapacity, cacheMaxDeadCapacity, cacheTotalCapacity);
</span><span class="cx">     memoryCache().setDeadDecodedDataDeletionInterval(deadDecodedDataDeletionInterval);
</span><del>-    PageCache::shared().setCapacity(pageCacheCapacity);
</del><ins>+    PageCache::shared().setMaxSize(pageCacheSize);
</ins><span class="cx"> 
</span><span class="cx">     NSURLCache *nsurlCache = [NSURLCache sharedURLCache];
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcesssoupWebProcessSoupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/soup/WebProcessSoup.cpp (179346 => 179347)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/soup/WebProcessSoup.cpp        2015-01-29 18:23:45 UTC (rev 179346)
+++ trunk/Source/WebKit2/WebProcess/soup/WebProcessSoup.cpp        2015-01-29 18:38:51 UTC (rev 179347)
</span><span class="lines">@@ -83,7 +83,7 @@
</span><span class="cx">     unsigned cacheMinDeadCapacity = 0;
</span><span class="cx">     unsigned cacheMaxDeadCapacity = 0;
</span><span class="cx">     auto deadDecodedDataDeletionInterval = std::chrono::seconds { 0 };
</span><del>-    unsigned pageCacheCapacity = 0;
</del><ins>+    unsigned pageCacheSize = 0;
</ins><span class="cx"> 
</span><span class="cx">     unsigned long urlCacheMemoryCapacity = 0;
</span><span class="cx">     unsigned long urlCacheDiskCapacity = 0;
</span><span class="lines">@@ -99,12 +99,12 @@
</span><span class="cx">     uint64_t memSize = getMemorySize();
</span><span class="cx">     calculateCacheSizes(cacheModel, memSize, diskFreeSize,
</span><span class="cx">                         cacheTotalCapacity, cacheMinDeadCapacity, cacheMaxDeadCapacity, deadDecodedDataDeletionInterval,
</span><del>-                        pageCacheCapacity, urlCacheMemoryCapacity, urlCacheDiskCapacity);
</del><ins>+                        pageCacheSize, urlCacheMemoryCapacity, urlCacheDiskCapacity);
</ins><span class="cx"> 
</span><span class="cx">     WebCore::memoryCache().setDisabled(cacheModel == CacheModelDocumentViewer);
</span><span class="cx">     WebCore::memoryCache().setCapacities(cacheMinDeadCapacity, cacheMaxDeadCapacity, cacheTotalCapacity);
</span><span class="cx">     WebCore::memoryCache().setDeadDecodedDataDeletionInterval(deadDecodedDataDeletionInterval);
</span><del>-    WebCore::PageCache::shared().setCapacity(pageCacheCapacity);
</del><ins>+    WebCore::PageCache::shared().setMaxSize(pageCacheSize);
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(GTK)
</span><span class="cx">     WebCore::PageCache::shared().setShouldClearBackingStores(true);
</span></span></pre>
</div>
</div>

</body>
</html>