<!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>[184930] 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/184930">184930</a></dd>
<dt>Author</dt> <dd>akling@apple.com</dd>
<dt>Date</dt> <dd>2015-05-27 17:30:59 -0700 (Wed, 27 May 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WK2] Local storage areas should get torn down when they have no remaining references.
&lt;https://webkit.org/b/143339&gt;
&lt;rdar://problem/20156436&gt;

Reviewed by Darin Adler.

Source/WebCore:

Add StorageArea::securityOrigin() implementations.

* loader/EmptyClients.cpp:
* storage/StorageArea.h:

Source/WebKit:

Add StorageArea::securityOrigin() implementation.

* Storage/StorageAreaImpl.h:

Source/WebKit2:

Let StorageNamespaceImpl own its StorageAreaMaps weakly instead of through RefPtr.
Ownership is flipped so that StorageAreaMap refs the StorageNamespaceImpl instead.
This allows the StorageAreaMaps to get destroyed once all of its clients are gone.

Practically speaking, this means that the garbage collector now decides when local
storage databases can be closed, instead of us keeping them open for the lifetime
of the web process.

For session storage, it works a bit differently. In the web process, they get torn
down when their last client disappears, but they stay alive in the UI process.
If/when the web process asks the UI process to open session storage for an origin,
the UI process checks if one already exists, and if so, just updates the ID of the
old storage with the new one provided by the web process.

* UIProcess/Storage/StorageManager.cpp:
(WebKit::StorageManager::StorageArea::isSessionStorage):
(WebKit::StorageManager::createTransientLocalStorageMap):
(WebKit::StorageManager::createSessionStorageMap):
(WebKit::StorageManager::destroyStorageMap):
* WebProcess/Storage/StorageAreaImpl.cpp:
(WebKit::StorageAreaImpl::securityOrigin):
* WebProcess/Storage/StorageAreaImpl.h:
* WebProcess/Storage/StorageAreaMap.cpp:
(WebKit::StorageAreaMap::StorageAreaMap):
(WebKit::StorageAreaMap::~StorageAreaMap):
* WebProcess/Storage/StorageAreaMap.h:
(WebKit::StorageAreaMap::securityOrigin):
* WebProcess/Storage/StorageNamespaceImpl.cpp:
(WebKit::StorageNamespaceImpl::didDestroyStorageAreaMap):
(WebKit::StorageNamespaceImpl::storageArea):
* WebProcess/Storage/StorageNamespaceImpl.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreloaderEmptyClientscpp">trunk/Source/WebCore/loader/EmptyClients.cpp</a></li>
<li><a href="#trunkSourceWebCorestorageStorageAreah">trunk/Source/WebCore/storage/StorageArea.h</a></li>
<li><a href="#trunkSourceWebKitChangeLog">trunk/Source/WebKit/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitStorageStorageAreaImplh">trunk/Source/WebKit/Storage/StorageAreaImpl.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessStorageStorageManagercpp">trunk/Source/WebKit2/UIProcess/Storage/StorageManager.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessStorageStorageAreaImplcpp">trunk/Source/WebKit2/WebProcess/Storage/StorageAreaImpl.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessStorageStorageAreaImplh">trunk/Source/WebKit2/WebProcess/Storage/StorageAreaImpl.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessStorageStorageAreaMapcpp">trunk/Source/WebKit2/WebProcess/Storage/StorageAreaMap.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessStorageStorageAreaMaph">trunk/Source/WebKit2/WebProcess/Storage/StorageAreaMap.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessStorageStorageNamespaceImplcpp">trunk/Source/WebKit2/WebProcess/Storage/StorageNamespaceImpl.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessStorageStorageNamespaceImplh">trunk/Source/WebKit2/WebProcess/Storage/StorageNamespaceImpl.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (184929 => 184930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-05-28 00:25:52 UTC (rev 184929)
+++ trunk/Source/WebCore/ChangeLog        2015-05-28 00:30:59 UTC (rev 184930)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2015-05-27  Andreas Kling  &lt;akling@apple.com&gt;
+
+        [WK2] Local storage areas should get torn down when they have no remaining references.
+        &lt;https://webkit.org/b/143339&gt;
+        &lt;rdar://problem/20156436&gt;
+
+        Reviewed by Darin Adler.
+
+        Add StorageArea::securityOrigin() implementations.
+
+        * loader/EmptyClients.cpp:
+        * storage/StorageArea.h:
+
</ins><span class="cx"> 2015-05-27  Dean Jackson  &lt;dino@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         img.currentSrc problem in strict mode with old picturefill
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderEmptyClientscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/EmptyClients.cpp (184929 => 184930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/EmptyClients.cpp        2015-05-28 00:25:52 UTC (rev 184929)
+++ trunk/Source/WebCore/loader/EmptyClients.cpp        2015-05-28 00:30:59 UTC (rev 184930)
</span><span class="lines">@@ -63,6 +63,7 @@
</span><span class="cx">         virtual bool canAccessStorage(Frame*) override { return false; }
</span><span class="cx">         virtual StorageType storageType() const override { return LocalStorage; }
</span><span class="cx">         virtual size_t memoryBytesUsedByCache() override { return 0; }
</span><ins>+        SecurityOrigin&amp; securityOrigin() override { return SecurityOrigin::createUnique(); }
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     struct EmptyStorageNamespace final : public StorageNamespace {
</span></span></pre></div>
<a id="trunkSourceWebCorestorageStorageAreah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/storage/StorageArea.h (184929 => 184930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/storage/StorageArea.h        2015-05-28 00:25:52 UTC (rev 184929)
+++ trunk/Source/WebCore/storage/StorageArea.h        2015-05-28 00:30:59 UTC (rev 184930)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class Frame;
</span><ins>+class SecurityOrigin;
</ins><span class="cx"> class StorageSyncManager;
</span><span class="cx"> typedef int ExceptionCode;
</span><span class="cx"> enum StorageType { LocalStorage, SessionStorage };
</span><span class="lines">@@ -58,6 +59,8 @@
</span><span class="cx">     virtual void incrementAccessCount() { }
</span><span class="cx">     virtual void decrementAccessCount() { }
</span><span class="cx">     virtual void closeDatabaseIfIdle() { }
</span><ins>+
+    virtual SecurityOrigin&amp; securityOrigin() = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/ChangeLog (184929 => 184930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/ChangeLog        2015-05-28 00:25:52 UTC (rev 184929)
+++ trunk/Source/WebKit/ChangeLog        2015-05-28 00:30:59 UTC (rev 184930)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2015-05-27  Andreas Kling  &lt;akling@apple.com&gt;
+
+        [WK2] Local storage areas should get torn down when they have no remaining references.
+        &lt;https://webkit.org/b/143339&gt;
+        &lt;rdar://problem/20156436&gt;
+
+        Reviewed by Darin Adler.
+
+        Add StorageArea::securityOrigin() implementation.
+
+        * Storage/StorageAreaImpl.h:
+
</ins><span class="cx"> 2015-05-22  Tim Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove action menu support
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageAreaImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageAreaImpl.h (184929 => 184930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageAreaImpl.h        2015-05-28 00:25:52 UTC (rev 184929)
+++ trunk/Source/WebKit/Storage/StorageAreaImpl.h        2015-05-28 00:30:59 UTC (rev 184930)
</span><span class="lines">@@ -60,6 +60,8 @@
</span><span class="cx">     virtual void decrementAccessCount() override;
</span><span class="cx">     virtual void closeDatabaseIfIdle() override;
</span><span class="cx"> 
</span><ins>+    SecurityOrigin&amp; securityOrigin() override { return *m_securityOrigin; }
+
</ins><span class="cx">     PassRefPtr&lt;StorageAreaImpl&gt; copy();
</span><span class="cx">     void close();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (184929 => 184930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-05-28 00:25:52 UTC (rev 184929)
+++ trunk/Source/WebKit2/ChangeLog        2015-05-28 00:30:59 UTC (rev 184930)
</span><span class="lines">@@ -1,3 +1,43 @@
</span><ins>+2015-05-27  Andreas Kling  &lt;akling@apple.com&gt;
+
+        [WK2] Local storage areas should get torn down when they have no remaining references.
+        &lt;https://webkit.org/b/143339&gt;
+        &lt;rdar://problem/20156436&gt;
+
+        Reviewed by Darin Adler.
+
+        Let StorageNamespaceImpl own its StorageAreaMaps weakly instead of through RefPtr.
+        Ownership is flipped so that StorageAreaMap refs the StorageNamespaceImpl instead.
+        This allows the StorageAreaMaps to get destroyed once all of its clients are gone.
+
+        Practically speaking, this means that the garbage collector now decides when local
+        storage databases can be closed, instead of us keeping them open for the lifetime
+        of the web process.
+
+        For session storage, it works a bit differently. In the web process, they get torn
+        down when their last client disappears, but they stay alive in the UI process.
+        If/when the web process asks the UI process to open session storage for an origin,
+        the UI process checks if one already exists, and if so, just updates the ID of the
+        old storage with the new one provided by the web process.
+
+        * UIProcess/Storage/StorageManager.cpp:
+        (WebKit::StorageManager::StorageArea::isSessionStorage):
+        (WebKit::StorageManager::createTransientLocalStorageMap):
+        (WebKit::StorageManager::createSessionStorageMap):
+        (WebKit::StorageManager::destroyStorageMap):
+        * WebProcess/Storage/StorageAreaImpl.cpp:
+        (WebKit::StorageAreaImpl::securityOrigin):
+        * WebProcess/Storage/StorageAreaImpl.h:
+        * WebProcess/Storage/StorageAreaMap.cpp:
+        (WebKit::StorageAreaMap::StorageAreaMap):
+        (WebKit::StorageAreaMap::~StorageAreaMap):
+        * WebProcess/Storage/StorageAreaMap.h:
+        (WebKit::StorageAreaMap::securityOrigin):
+        * WebProcess/Storage/StorageNamespaceImpl.cpp:
+        (WebKit::StorageNamespaceImpl::didDestroyStorageAreaMap):
+        (WebKit::StorageNamespaceImpl::storageArea):
+        * WebProcess/Storage/StorageNamespaceImpl.h:
+
</ins><span class="cx"> 2015-05-27  Antti Koivisto  &lt;antti@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Disable network cache for old clients
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessStorageStorageManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Storage/StorageManager.cpp (184929 => 184930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Storage/StorageManager.cpp        2015-05-28 00:25:52 UTC (rev 184929)
+++ trunk/Source/WebKit2/UIProcess/Storage/StorageManager.cpp        2015-05-28 00:30:59 UTC (rev 184930)
</span><span class="lines">@@ -63,6 +63,8 @@
</span><span class="cx">     const HashMap&lt;String, String&gt;&amp; items();
</span><span class="cx">     void clear();
</span><span class="cx"> 
</span><ins>+    bool isSessionStorage() const { return !m_localStorageNamespace; }
+
</ins><span class="cx"> private:
</span><span class="cx">     explicit StorageArea(LocalStorageNamespace*, RefPtr&lt;SecurityOrigin&gt;&amp;&amp;, unsigned quotaInBytes);
</span><span class="cx"> 
</span><span class="lines">@@ -738,6 +740,23 @@
</span><span class="cx">     // FIXME: This should be a message check.
</span><span class="cx">     ASSERT(m_storageAreasByConnection.isValidKey({ &amp;connection, storageMapID }));
</span><span class="cx"> 
</span><ins>+    Ref&lt;SecurityOrigin&gt; origin = securityOriginData.securityOrigin();
+
+    // See if we already have session storage for this connection/origin combo.
+    // If so, update the map with the new ID, otherwise keep on trucking.
+    for (auto it = m_storageAreasByConnection.begin(), end = m_storageAreasByConnection.end(); it != end; ++it) {
+        if (it-&gt;key.first != &amp;connection)
+            continue;
+        Ref&lt;StorageArea&gt; area = *it-&gt;value;
+        if (!area-&gt;isSessionStorage())
+            continue;
+        if (!origin-&gt;isSameSchemeHostPort(area-&gt;securityOrigin()))
+            continue;
+        m_storageAreasByConnection.remove(it);
+        m_storageAreasByConnection.add({ &amp;connection, storageMapID }, WTF::move(area));
+        return;
+    }
+
</ins><span class="cx">     auto&amp; slot = m_storageAreasByConnection.add({ &amp;connection, storageMapID }, nullptr).iterator-&gt;value;
</span><span class="cx"> 
</span><span class="cx">     // FIXME: This should be a message check.
</span><span class="lines">@@ -774,7 +793,7 @@
</span><span class="cx">     // FIXME: This should be a message check.
</span><span class="cx">     ASSERT(&amp;connection == sessionStorageNamespace-&gt;allowedConnection());
</span><span class="cx"> 
</span><del>-    auto storageArea = sessionStorageNamespace-&gt;getOrCreateStorageArea(securityOriginData.securityOrigin());
</del><ins>+    auto storageArea = sessionStorageNamespace-&gt;getOrCreateStorageArea(securityOriginData.securityOrigin().ptr());
</ins><span class="cx">     storageArea-&gt;addListener(connection, storageMapID);
</span><span class="cx"> 
</span><span class="cx">     slot = WTF::move(storageArea);
</span><span class="lines">@@ -793,6 +812,10 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // Don't remove session storage maps. The web process may reconnect and expect the data to still be around.
+    if (it-&gt;value-&gt;isSessionStorage())
+        return;
+
</ins><span class="cx">     it-&gt;value-&gt;removeListener(connection, storageMapID);
</span><span class="cx">     m_storageAreasByConnection.remove(connectionAndStorageMapIDPair);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessStorageStorageAreaImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Storage/StorageAreaImpl.cpp (184929 => 184930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Storage/StorageAreaImpl.cpp        2015-05-28 00:25:52 UTC (rev 184929)
+++ trunk/Source/WebKit2/WebProcess/Storage/StorageAreaImpl.cpp        2015-05-28 00:30:59 UTC (rev 184930)
</span><span class="lines">@@ -127,4 +127,9 @@
</span><span class="cx">     ASSERT_NOT_REACHED();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+WebCore::SecurityOrigin&amp; StorageAreaImpl::securityOrigin()
+{
+    return m_storageAreaMap-&gt;securityOrigin();
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessStorageStorageAreaImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Storage/StorageAreaImpl.h (184929 => 184930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Storage/StorageAreaImpl.h        2015-05-28 00:25:52 UTC (rev 184929)
+++ trunk/Source/WebKit2/WebProcess/Storage/StorageAreaImpl.h        2015-05-28 00:30:59 UTC (rev 184930)
</span><span class="lines">@@ -31,6 +31,10 @@
</span><span class="cx"> #include &lt;wtf/HashCountedSet.h&gt;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> 
</span><ins>+namespace WebCore {
+class SecurityOrigin;
+}
+
</ins><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><span class="cx"> class StorageAreaMap;
</span><span class="lines">@@ -59,6 +63,7 @@
</span><span class="cx">     virtual void incrementAccessCount() override;
</span><span class="cx">     virtual void decrementAccessCount() override;
</span><span class="cx">     virtual void closeDatabaseIfIdle() override;
</span><ins>+    WebCore::SecurityOrigin&amp; securityOrigin() override;
</ins><span class="cx"> 
</span><span class="cx">     uint64_t m_storageAreaID;
</span><span class="cx">     RefPtr&lt;StorageAreaMap&gt; m_storageAreaMap;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessStorageStorageAreaMapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Storage/StorageAreaMap.cpp (184929 => 184930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Storage/StorageAreaMap.cpp        2015-05-28 00:25:52 UTC (rev 184929)
+++ trunk/Source/WebKit2/WebProcess/Storage/StorageAreaMap.cpp        2015-05-28 00:30:59 UTC (rev 184930)
</span><span class="lines">@@ -59,7 +59,8 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> StorageAreaMap::StorageAreaMap(StorageNamespaceImpl* storageNamespace, Ref&lt;WebCore::SecurityOrigin&gt;&amp;&amp; securityOrigin)
</span><del>-    : m_storageMapID(generateStorageMapID())
</del><ins>+    : m_storageNamespace(*storageNamespace)
+    , m_storageMapID(generateStorageMapID())
</ins><span class="cx">     , m_storageType(storageNamespace-&gt;storageType())
</span><span class="cx">     , m_storageNamespaceID(storageNamespace-&gt;storageNamespaceID())
</span><span class="cx">     , m_quotaInBytes(storageNamespace-&gt;quotaInBytes())
</span><span class="lines">@@ -89,6 +90,8 @@
</span><span class="cx"> {
</span><span class="cx">     WebProcess::singleton().parentProcessConnection()-&gt;send(Messages::StorageManager::DestroyStorageMap(m_storageMapID), 0);
</span><span class="cx">     WebProcess::singleton().removeMessageReceiver(Messages::StorageAreaMap::messageReceiverName(), m_storageMapID);
</span><ins>+
+    m_storageNamespace-&gt;didDestroyStorageAreaMap(*this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> unsigned StorageAreaMap::length()
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessStorageStorageAreaMaph"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Storage/StorageAreaMap.h (184929 => 184930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Storage/StorageAreaMap.h        2015-05-28 00:25:52 UTC (rev 184929)
+++ trunk/Source/WebKit2/WebProcess/Storage/StorageAreaMap.h        2015-05-28 00:30:59 UTC (rev 184930)
</span><span class="lines">@@ -59,6 +59,8 @@
</span><span class="cx">     void clear(WebCore::Frame* sourceFrame, StorageAreaImpl* sourceArea);
</span><span class="cx">     bool contains(const String&amp; key);
</span><span class="cx"> 
</span><ins>+    WebCore::SecurityOrigin&amp; securityOrigin() { return m_securityOrigin.get(); }
+
</ins><span class="cx"> private:
</span><span class="cx">     StorageAreaMap(StorageNamespaceImpl*, Ref&lt;WebCore::SecurityOrigin&gt;&amp;&amp;);
</span><span class="cx"> 
</span><span class="lines">@@ -82,6 +84,8 @@
</span><span class="cx">     void dispatchSessionStorageEvent(uint64_t sourceStorageAreaID, const String&amp; key, const String&amp; oldValue, const String&amp; newValue, const String&amp; urlString);
</span><span class="cx">     void dispatchLocalStorageEvent(uint64_t sourceStorageAreaID, const String&amp; key, const String&amp; oldValue, const String&amp; newValue, const String&amp; urlString);
</span><span class="cx"> 
</span><ins>+    Ref&lt;StorageNamespaceImpl&gt; m_storageNamespace;
+
</ins><span class="cx">     uint64_t m_storageMapID;
</span><span class="cx"> 
</span><span class="cx">     WebCore::StorageType m_storageType;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessStorageStorageNamespaceImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Storage/StorageNamespaceImpl.cpp (184929 => 184930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Storage/StorageNamespaceImpl.cpp        2015-05-28 00:25:52 UTC (rev 184929)
+++ trunk/Source/WebKit2/WebProcess/Storage/StorageNamespaceImpl.cpp        2015-05-28 00:30:59 UTC (rev 184930)
</span><span class="lines">@@ -67,13 +67,23 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void StorageNamespaceImpl::didDestroyStorageAreaMap(StorageAreaMap&amp; map)
+{
+    m_storageAreaMaps.remove(&amp;map.securityOrigin());
+}
+
</ins><span class="cx"> PassRefPtr&lt;StorageArea&gt; StorageNamespaceImpl::storageArea(PassRefPtr&lt;SecurityOrigin&gt; securityOrigin)
</span><span class="cx"> {
</span><ins>+    RefPtr&lt;StorageAreaMap&gt; map;
+
</ins><span class="cx">     auto&amp; slot = m_storageAreaMaps.add(securityOrigin.get(), nullptr).iterator-&gt;value;
</span><del>-    if (!slot)
-        slot = StorageAreaMap::create(this, *securityOrigin);
</del><ins>+    if (!slot) {
+        map = StorageAreaMap::create(this, *securityOrigin);
+        slot = map.get();
+    } else
+        map = slot;
</ins><span class="cx"> 
</span><del>-    return StorageAreaImpl::create(slot);
</del><ins>+    return StorageAreaImpl::create(WTF::move(map));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;StorageNamespace&gt; StorageNamespaceImpl::copy(Page* newPage)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessStorageStorageNamespaceImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Storage/StorageNamespaceImpl.h (184929 => 184930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Storage/StorageNamespaceImpl.h        2015-05-28 00:25:52 UTC (rev 184929)
+++ trunk/Source/WebKit2/WebProcess/Storage/StorageNamespaceImpl.h        2015-05-28 00:30:59 UTC (rev 184930)
</span><span class="lines">@@ -49,6 +49,8 @@
</span><span class="cx">     WebCore::SecurityOrigin* topLevelOrigin() const { return m_topLevelOrigin.get(); }
</span><span class="cx">     unsigned quotaInBytes() const { return m_quotaInBytes; }
</span><span class="cx"> 
</span><ins>+    void didDestroyStorageAreaMap(StorageAreaMap&amp;);
+
</ins><span class="cx"> private:
</span><span class="cx">     explicit StorageNamespaceImpl(WebCore::StorageType, uint64_t storageNamespaceID, WebCore::SecurityOrigin* topLevelOrigin, unsigned quotaInBytes);
</span><span class="cx"> 
</span><span class="lines">@@ -63,7 +65,7 @@
</span><span class="cx"> 
</span><span class="cx">     const unsigned m_quotaInBytes;
</span><span class="cx"> 
</span><del>-    HashMap&lt;RefPtr&lt;WebCore::SecurityOrigin&gt;, RefPtr&lt;StorageAreaMap&gt;&gt; m_storageAreaMaps;
</del><ins>+    HashMap&lt;RefPtr&lt;WebCore::SecurityOrigin&gt;, StorageAreaMap*&gt; m_storageAreaMaps;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre>
</div>
</div>

</body>
</html>