<!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>[175188] trunk/Source/WebKit2</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/175188">175188</a></dd>
<dt>Author</dt> <dd>jer.noble@apple.com</dd>
<dt>Date</dt> <dd>2014-10-24 16:01:54 -0700 (Fri, 24 Oct 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Abstractify WebOriginDataManager to support arbitrary ChildProcess supplements.
https://bugs.webkit.org/show_bug.cgi?id=137993

Reviewed by Brady Eidson.

To allow different ChildProcess subclasses to handle listing and deletion of origin
data, make WebOriginDataManager more generic by having a supplement implement the
details, leaving WebOriginDataManager to deal with cross-process messaging.

De-virtualize AsyncTask, allowing a task to be created by passing in a
function&lt;void()&gt;, rather than an object, method, and arguments.

* Shared/AsyncTask.h:
(WebKit::AsyncTask::AsyncTask):
(WebKit::AsyncTask::performTask):
(WebKit::AsyncTask::~AsyncTask): Deleted.

Add a new virtual base class, to be implemented by various ChildProcesses, which
WebOriginDataManager will use to implement listing and deletion requests.

* WebProcess/OriginData/WebOriginDataManager.h:
* WebProcess/OriginData/WebOriginDataManagerSupplement.h: Added.
(WebKit::WebOriginDataManagerSupplement::WebOriginDataManagerSupplement):
(WebKit::WebOriginDataManagerSupplement::~WebOriginDataManagerSupplement):
(WebKit::WebOriginDataManagerSupplement::getOrigins):
(WebKit::WebOriginDataManagerSupplement::deleteEntriesForOrigin):
(WebKit::WebOriginDataManagerSupplement::deleteEntriesModifiedBetweenDates):
(WebKit::WebOriginDataManagerSupplement::deleteAllEntries):
* WebKit2.xcodeproj/project.pbxproj:

WebOriginDataManager doesn't need to be a ChildSupplement. Remove the DatabaseProcess-
specific implementations for its message handlers and replace with clean, generic calls
to its supplement. Because these supplements may want to respond to the request
asynchronously, pass a completion function in to be called by the supplement once its
work is complete.

* WebProcess/OriginData/WebOriginDataManager.cpp:
(WebKit::WebOriginDataManager::WebOriginDataManager):
(WebKit::WebOriginDataManager::getOrigins):
(WebKit::WebOriginDataManager::deleteEntriesForOrigin):
(WebKit::WebOriginDataManager::deleteEntriesModifiedBetweenDates):
(WebKit::WebOriginDataManager::deleteAllEntries):
(WebKit::WebOriginDataManager::supplementName): Deleted.

DatabaseProcess already uses WebOriginDataManager, so it will be the first process
to fall under the heel of the new regime. DatabaseProcess will subclass
WebOriginDataManagerSupplement, and pass itself in twice to the WebOriginDataManager
constructor. Create a lambda-based AsyncTask for each request, and call the completion
function when each request is complete.

* DatabaseProcess/DatabaseProcess.cpp:
(WebKit::DatabaseProcess::DatabaseProcess):
(WebKit::DatabaseProcess::getIndexedDatabaseOrigins):
(WebKit::DatabaseProcess::deleteIndexedDatabaseEntriesForOrigin):
(WebKit::DatabaseProcess::deleteIndexedDatabaseEntriesModifiedBetweenDates):
(WebKit::DatabaseProcess::deleteAllIndexedDatabaseEntries):
(WebKit::DatabaseProcess::getOrigins):
(WebKit::DatabaseProcess::deleteEntriesForOrigin):
(WebKit::DatabaseProcess::deleteEntriesModifiedBetweenDates):
(WebKit::DatabaseProcess::deleteAllEntries):
(WebKit::DatabaseProcess::doGetIndexedDatabaseOrigins): Deleted.
(WebKit::DatabaseProcess::doDeleteIndexedDatabaseEntriesForOrigin): Deleted.
(WebKit::DatabaseProcess::doDeleteIndexedDatabaseEntriesModifiedBetweenDates): Deleted.
(WebKit::DatabaseProcess::doDeleteAllIndexedDatabaseEntries): Deleted.
* DatabaseProcess/DatabaseProcess.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessDatabaseProcesscpp">trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessDatabaseProcessh">trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h</a></li>
<li><a href="#trunkSourceWebKit2SharedAsyncTaskh">trunk/Source/WebKit2/Shared/AsyncTask.h</a></li>
<li><a href="#trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj">trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebKit2WebProcessOriginDataWebOriginDataManagercpp">trunk/Source/WebKit2/WebProcess/OriginData/WebOriginDataManager.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessOriginDataWebOriginDataManagerh">trunk/Source/WebKit2/WebProcess/OriginData/WebOriginDataManager.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2WebProcessOriginDataWebOriginDataManagerSupplementh">trunk/Source/WebKit2/WebProcess/OriginData/WebOriginDataManagerSupplement.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (175187 => 175188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-10-24 22:27:27 UTC (rev 175187)
+++ trunk/Source/WebKit2/ChangeLog        2014-10-24 23:01:54 UTC (rev 175188)
</span><span class="lines">@@ -1,3 +1,71 @@
</span><ins>+2014-10-24  Jer Noble  &lt;jer.noble@apple.com&gt;
+
+        Abstractify WebOriginDataManager to support arbitrary ChildProcess supplements.
+        https://bugs.webkit.org/show_bug.cgi?id=137993
+
+        Reviewed by Brady Eidson.
+
+        To allow different ChildProcess subclasses to handle listing and deletion of origin
+        data, make WebOriginDataManager more generic by having a supplement implement the
+        details, leaving WebOriginDataManager to deal with cross-process messaging.
+
+        De-virtualize AsyncTask, allowing a task to be created by passing in a
+        function&lt;void()&gt;, rather than an object, method, and arguments.
+
+        * Shared/AsyncTask.h:
+        (WebKit::AsyncTask::AsyncTask):
+        (WebKit::AsyncTask::performTask):
+        (WebKit::AsyncTask::~AsyncTask): Deleted.
+
+        Add a new virtual base class, to be implemented by various ChildProcesses, which
+        WebOriginDataManager will use to implement listing and deletion requests.
+
+        * WebProcess/OriginData/WebOriginDataManager.h:
+        * WebProcess/OriginData/WebOriginDataManagerSupplement.h: Added.
+        (WebKit::WebOriginDataManagerSupplement::WebOriginDataManagerSupplement):
+        (WebKit::WebOriginDataManagerSupplement::~WebOriginDataManagerSupplement):
+        (WebKit::WebOriginDataManagerSupplement::getOrigins):
+        (WebKit::WebOriginDataManagerSupplement::deleteEntriesForOrigin):
+        (WebKit::WebOriginDataManagerSupplement::deleteEntriesModifiedBetweenDates):
+        (WebKit::WebOriginDataManagerSupplement::deleteAllEntries):
+        * WebKit2.xcodeproj/project.pbxproj:
+
+        WebOriginDataManager doesn't need to be a ChildSupplement. Remove the DatabaseProcess-
+        specific implementations for its message handlers and replace with clean, generic calls
+        to its supplement. Because these supplements may want to respond to the request
+        asynchronously, pass a completion function in to be called by the supplement once its
+        work is complete.
+
+        * WebProcess/OriginData/WebOriginDataManager.cpp:
+        (WebKit::WebOriginDataManager::WebOriginDataManager):
+        (WebKit::WebOriginDataManager::getOrigins):
+        (WebKit::WebOriginDataManager::deleteEntriesForOrigin):
+        (WebKit::WebOriginDataManager::deleteEntriesModifiedBetweenDates):
+        (WebKit::WebOriginDataManager::deleteAllEntries):
+        (WebKit::WebOriginDataManager::supplementName): Deleted.
+
+        DatabaseProcess already uses WebOriginDataManager, so it will be the first process
+        to fall under the heel of the new regime. DatabaseProcess will subclass
+        WebOriginDataManagerSupplement, and pass itself in twice to the WebOriginDataManager
+        constructor. Create a lambda-based AsyncTask for each request, and call the completion
+        function when each request is complete.
+
+        * DatabaseProcess/DatabaseProcess.cpp:
+        (WebKit::DatabaseProcess::DatabaseProcess):
+        (WebKit::DatabaseProcess::getIndexedDatabaseOrigins):
+        (WebKit::DatabaseProcess::deleteIndexedDatabaseEntriesForOrigin):
+        (WebKit::DatabaseProcess::deleteIndexedDatabaseEntriesModifiedBetweenDates):
+        (WebKit::DatabaseProcess::deleteAllIndexedDatabaseEntries):
+        (WebKit::DatabaseProcess::getOrigins):
+        (WebKit::DatabaseProcess::deleteEntriesForOrigin):
+        (WebKit::DatabaseProcess::deleteEntriesModifiedBetweenDates):
+        (WebKit::DatabaseProcess::deleteAllEntries):
+        (WebKit::DatabaseProcess::doGetIndexedDatabaseOrigins): Deleted.
+        (WebKit::DatabaseProcess::doDeleteIndexedDatabaseEntriesForOrigin): Deleted.
+        (WebKit::DatabaseProcess::doDeleteIndexedDatabaseEntriesModifiedBetweenDates): Deleted.
+        (WebKit::DatabaseProcess::doDeleteAllIndexedDatabaseEntries): Deleted.
+        * DatabaseProcess/DatabaseProcess.h:
+
</ins><span class="cx"> 2014-10-24  Beth Dakin  &lt;bdakin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Very large images crash in action menu code
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessDatabaseProcesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp (175187 => 175188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp        2014-10-24 22:27:27 UTC (rev 175187)
+++ trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp        2014-10-24 23:01:54 UTC (rev 175188)
</span><span class="lines">@@ -54,7 +54,7 @@
</span><span class="cx"> 
</span><span class="cx"> DatabaseProcess::DatabaseProcess()
</span><span class="cx">     : m_queue(adoptRef(*WorkQueue::create(&quot;com.apple.WebKit.DatabaseProcess&quot;).leakRef()))
</span><del>-    , m_webOriginDataManager(std::make_unique&lt;WebOriginDataManager&gt;(this))
</del><ins>+    , m_webOriginDataManager(std::make_unique&lt;WebOriginDataManager&gt;(*this, *this))
</ins><span class="cx"> {
</span><span class="cx">     // Make sure the UTF8Encoding encoding and the text encoding maps have been built on the main thread before a background thread needs it.
</span><span class="cx">     // FIXME: https://bugs.webkit.org/show_bug.cgi?id=135365 - Need a more explicit way of doing this besides accessing the UTF8Encoding.
</span><span class="lines">@@ -191,18 +191,12 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseProcess::getIndexedDatabaseOrigins(uint64_t callbackID)
</del><ins>+Vector&lt;SecurityOriginData&gt; DatabaseProcess::getIndexedDatabaseOrigins()
</ins><span class="cx"> {
</span><del>-    postDatabaseTask(createAsyncTask(*this, &amp;DatabaseProcess::doGetIndexedDatabaseOrigins, callbackID));
-}
-
-void DatabaseProcess::doGetIndexedDatabaseOrigins(uint64_t callbackID)
-{
</del><span class="cx">     Vector&lt;SecurityOriginData&gt; results;
</span><span class="cx"> 
</span><span class="cx">     if (m_indexedDatabaseDirectory.isEmpty()) {
</span><del>-        send(Messages::WebOriginDataManagerProxy::DidGetOrigins(results, callbackID), 0);
-        return;
</del><ins>+        return results;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;String&gt; originPaths = listDirectory(m_indexedDatabaseDirectory, &quot;*&quot;);
</span><span class="lines">@@ -220,7 +214,7 @@
</span><span class="cx">         results.append(SecurityOriginData::fromSecurityOrigin(securityOrigin.get()));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    send(Messages::WebOriginDataManagerProxy::DidGetOrigins(results, callbackID), 0);
</del><ins>+    return results;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void removeAllDatabasesForOriginPath(const String&amp; originPath, double startDate, double endDate)
</span><span class="lines">@@ -252,63 +246,87 @@
</span><span class="cx">     deleteEmptyDirectory(originPath);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseProcess::deleteIndexedDatabaseEntriesForOrigin(const SecurityOriginData&amp; origin, uint64_t callbackID)
</del><ins>+void DatabaseProcess::deleteIndexedDatabaseEntriesForOrigin(const SecurityOriginData&amp; originData)
</ins><span class="cx"> {
</span><del>-    postDatabaseTask(createAsyncTask(*this, &amp;DatabaseProcess::doDeleteIndexedDatabaseEntriesForOrigin, origin, callbackID));
-}
-
-void DatabaseProcess::doDeleteIndexedDatabaseEntriesForOrigin(const SecurityOriginData&amp; originData, uint64_t callbackID)
-{
-    if (m_indexedDatabaseDirectory.isEmpty()) {
-        send(Messages::WebOriginDataManagerProxy::DidDeleteEntries(callbackID), 0);
</del><ins>+    if (m_indexedDatabaseDirectory.isEmpty())
</ins><span class="cx">         return;
</span><del>-    }
</del><span class="cx"> 
</span><span class="cx">     RefPtr&lt;SecurityOrigin&gt; origin = originData.securityOrigin();
</span><span class="cx">     String databaseIdentifier = origin-&gt;databaseIdentifier();
</span><span class="cx">     String originPath = pathByAppendingComponent(m_indexedDatabaseDirectory, databaseIdentifier);
</span><span class="cx"> 
</span><span class="cx">     removeAllDatabasesForOriginPath(originPath, std::numeric_limits&lt;double&gt;::lowest(), std::numeric_limits&lt;double&gt;::max());
</span><del>-
-    send(Messages::WebOriginDataManagerProxy::DidDeleteEntries(callbackID), 0);
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseProcess::deleteIndexedDatabaseEntriesModifiedBetweenDates(double startDate, double endDate, uint64_t callbackID)
</del><ins>+void DatabaseProcess::deleteIndexedDatabaseEntriesModifiedBetweenDates(double startDate, double endDate)
</ins><span class="cx"> {
</span><del>-    postDatabaseTask(createAsyncTask(*this, &amp;DatabaseProcess::doDeleteIndexedDatabaseEntriesModifiedBetweenDates, startDate, endDate, callbackID));
</del><ins>+    if (m_indexedDatabaseDirectory.isEmpty())
+        return;
+
+    Vector&lt;String&gt; originPaths = listDirectory(m_indexedDatabaseDirectory, &quot;*&quot;);
+    for (auto&amp; originPath : originPaths)
+        removeAllDatabasesForOriginPath(originPath, startDate, endDate);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseProcess::doDeleteIndexedDatabaseEntriesModifiedBetweenDates(double startDate, double endDate, uint64_t callbackID)
</del><ins>+void DatabaseProcess::deleteAllIndexedDatabaseEntries()
</ins><span class="cx"> {
</span><del>-    if (m_indexedDatabaseDirectory.isEmpty()) {
-        send(Messages::WebOriginDataManagerProxy::DidDeleteEntries(callbackID), 0);
</del><ins>+    if (m_indexedDatabaseDirectory.isEmpty())
</ins><span class="cx">         return;
</span><del>-    }
</del><span class="cx"> 
</span><span class="cx">     Vector&lt;String&gt; originPaths = listDirectory(m_indexedDatabaseDirectory, &quot;*&quot;);
</span><span class="cx">     for (auto&amp; originPath : originPaths)
</span><del>-        removeAllDatabasesForOriginPath(originPath, startDate, endDate);
</del><ins>+        removeAllDatabasesForOriginPath(originPath, std::numeric_limits&lt;double&gt;::lowest(), std::numeric_limits&lt;double&gt;::max());
+}
</ins><span class="cx"> 
</span><del>-    send(Messages::WebOriginDataManagerProxy::DidDeleteEntries(callbackID), 0);
</del><ins>+void DatabaseProcess::getOrigins(WKOriginDataTypes types, std::function&lt;void(const Vector&lt;SecurityOriginData&gt;&amp;)&gt; completion)
+{
+    if (!(types &amp; kWKWebSQLDatabaseOriginData)) {
+        completion(Vector&lt;SecurityOriginData&gt;());
+        return;
+    }
+
+    postDatabaseTask(std::make_unique&lt;AsyncTask&gt;([completion, this] {
+        completion(getIndexedDatabaseOrigins());
+    }));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseProcess::deleteAllIndexedDatabaseEntries(uint64_t callbackID)
</del><ins>+void DatabaseProcess::deleteEntriesForOrigin(WKOriginDataTypes types, const SecurityOriginData&amp; origin, std::function&lt;void()&gt; completion)
</ins><span class="cx"> {
</span><del>-    postDatabaseTask(createAsyncTask(*this, &amp;DatabaseProcess::doDeleteAllIndexedDatabaseEntries, callbackID));
</del><ins>+    if (!(types &amp; kWKWebSQLDatabaseOriginData)) {
+        completion();
+        return;
+    }
+
+    postDatabaseTask(std::make_unique&lt;AsyncTask&gt;([this, origin, completion] {
+        deleteIndexedDatabaseEntriesForOrigin(origin);
+        completion();
+    }));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DatabaseProcess::doDeleteAllIndexedDatabaseEntries(uint64_t callbackID)
</del><ins>+void DatabaseProcess::deleteEntriesModifiedBetweenDates(WKOriginDataTypes types, double startDate, double endDate, std::function&lt;void()&gt; completion)
</ins><span class="cx"> {
</span><del>-    if (m_indexedDatabaseDirectory.isEmpty()) {
-        send(Messages::WebOriginDataManagerProxy::DidDeleteAllEntries(callbackID), 0);
</del><ins>+    if (!(types &amp; kWKWebSQLDatabaseOriginData)) {
+        completion();
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    Vector&lt;String&gt; originPaths = listDirectory(m_indexedDatabaseDirectory, &quot;*&quot;);
-    for (auto&amp; originPath : originPaths)
-        removeAllDatabasesForOriginPath(originPath, std::numeric_limits&lt;double&gt;::lowest(), std::numeric_limits&lt;double&gt;::max());
</del><ins>+    postDatabaseTask(std::make_unique&lt;AsyncTask&gt;([this, startDate, endDate, completion] {
+        deleteIndexedDatabaseEntriesModifiedBetweenDates(startDate, endDate);
+        completion();
+    }));
+}
</ins><span class="cx"> 
</span><del>-    send(Messages::WebOriginDataManagerProxy::DidDeleteAllEntries(callbackID), 0);
</del><ins>+void DatabaseProcess::deleteAllEntries(WKOriginDataTypes types, std::function&lt;void()&gt; completion)
+{
+    if (!(types &amp; kWKWebSQLDatabaseOriginData)) {
+        completion();
+        return;
+    }
+
+    postDatabaseTask(std::make_unique&lt;AsyncTask&gt;([this, completion] {
+        deleteAllIndexedDatabaseEntries();
+        completion();
+    }));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if !PLATFORM(COCOA)
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessDatabaseProcessh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h (175187 => 175188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h        2014-10-24 22:27:27 UTC (rev 175187)
+++ trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h        2014-10-24 23:01:54 UTC (rev 175188)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ChildProcess.h&quot;
</span><span class="cx"> #include &quot;UniqueIDBDatabaseIdentifier.h&quot;
</span><ins>+#include &quot;WebOriginDataManagerSupplement.h&quot;
</ins><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> 
</span><span class="cx"> class WorkQueue;
</span><span class="lines">@@ -43,7 +44,7 @@
</span><span class="cx"> 
</span><span class="cx"> struct DatabaseProcessCreationParameters;
</span><span class="cx"> 
</span><del>-class DatabaseProcess : public ChildProcess  {
</del><ins>+class DatabaseProcess : public ChildProcess, public WebOriginDataManagerSupplement  {
</ins><span class="cx">     WTF_MAKE_NONCOPYABLE(DatabaseProcess);
</span><span class="cx">     friend class NeverDestroyed&lt;DatabaseProcess&gt;;
</span><span class="cx"> public:
</span><span class="lines">@@ -60,11 +61,13 @@
</span><span class="cx"> 
</span><span class="cx">     WorkQueue&amp; queue() { return m_queue.get(); }
</span><span class="cx"> 
</span><del>-    void getIndexedDatabaseOrigins(uint64_t callbackID);
-    void deleteIndexedDatabaseEntriesForOrigin(const SecurityOriginData&amp;, uint64_t callbackID);
-    void deleteIndexedDatabaseEntriesModifiedBetweenDates(double startDate, double endDate, uint64_t callbackID);
-    void deleteAllIndexedDatabaseEntries(uint64_t callbackID);
</del><ins>+    Vector&lt;SecurityOriginData&gt; getIndexedDatabaseOrigins();
+    void deleteIndexedDatabaseEntriesForOrigin(const SecurityOriginData&amp;);
+    void deleteIndexedDatabaseEntriesModifiedBetweenDates(double startDate, double endDate);
+    void deleteAllIndexedDatabaseEntries();
</ins><span class="cx"> 
</span><ins>+    void postDatabaseTask(std::unique_ptr&lt;AsyncTask&gt;);
+
</ins><span class="cx"> private:
</span><span class="cx">     DatabaseProcess();
</span><span class="cx"> 
</span><span class="lines">@@ -85,16 +88,16 @@
</span><span class="cx">     void initializeDatabaseProcess(const DatabaseProcessCreationParameters&amp;);
</span><span class="cx">     void createDatabaseToWebProcessConnection();
</span><span class="cx"> 
</span><del>-    void postDatabaseTask(std::unique_ptr&lt;AsyncTask&gt;);
-
</del><span class="cx">     // For execution on work queue thread only
</span><span class="cx">     void performNextDatabaseTask();
</span><span class="cx">     void ensurePathExists(const String&amp;);
</span><del>-    void doGetIndexedDatabaseOrigins(uint64_t callbackID);
-    void doDeleteIndexedDatabaseEntriesForOrigin(const SecurityOriginData&amp;, uint64_t callbackID);
-    void doDeleteIndexedDatabaseEntriesModifiedBetweenDates(double startDate, double endDate, uint64_t callbackID);
-    void doDeleteAllIndexedDatabaseEntries(uint64_t callbackID);
</del><span class="cx"> 
</span><ins>+    // WebOriginDataManagerSupplement
+    virtual void getOrigins(WKOriginDataTypes, std::function&lt;void(const Vector&lt;SecurityOriginData&gt;&amp;)&gt; completion) override;
+    virtual void deleteEntriesForOrigin(WKOriginDataTypes, const SecurityOriginData&amp;, std::function&lt;void()&gt; completion) override;
+    virtual void deleteEntriesModifiedBetweenDates(WKOriginDataTypes, double startDate, double endDate, std::function&lt;void()&gt; completion) override;
+    virtual void deleteAllEntries(WKOriginDataTypes, std::function&lt;void()&gt; completion) override;
+
</ins><span class="cx">     Vector&lt;RefPtr&lt;DatabaseToWebProcessConnection&gt;&gt; m_databaseToWebProcessConnections;
</span><span class="cx"> 
</span><span class="cx">     Ref&lt;WorkQueue&gt; m_queue;
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedAsyncTaskh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/AsyncTask.h (175187 => 175188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/AsyncTask.h        2014-10-24 22:27:27 UTC (rev 175187)
+++ trunk/Source/WebKit2/Shared/AsyncTask.h        2014-10-24 23:01:54 UTC (rev 175188)
</span><span class="lines">@@ -34,12 +34,21 @@
</span><span class="cx"> class AsyncTask {
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(AsyncTask);
</span><span class="cx"> public:
</span><del>-    virtual ~AsyncTask() { }
</del><ins>+    AsyncTask(const std::function&lt;void()&gt; taskFunction)
+        : m_taskFunction(taskFunction)
+    {
+        ASSERT(taskFunction);
+    }
</ins><span class="cx"> 
</span><del>-    virtual void performTask() = 0;
</del><ins>+    void performTask()
+    {
+        m_taskFunction();
+    }
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    explicit AsyncTask() { }
</del><ins>+    AsyncTask() { }
+
+    std::function&lt;void()&gt; m_taskFunction;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename T, typename... Arguments&gt;
</span><span class="lines">@@ -51,18 +60,6 @@
</span><span class="cx">             (callee-&gt;*method)(arguments...);
</span><span class="cx">         };
</span><span class="cx">     }
</span><del>-
-    virtual ~AsyncTaskImpl()
-    {
-    }
-
-private:
-    virtual void performTask() override
-    {
-        m_taskFunction();
-    }
-
-    std::function&lt;void()&gt; m_taskFunction;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T&gt;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (175187 => 175188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2014-10-24 22:27:27 UTC (rev 175187)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2014-10-24 23:01:54 UTC (rev 175188)
</span><span class="lines">@@ -1594,6 +1594,7 @@
</span><span class="cx">                 CDC3831017212440008A2FC3 /* CookieStorageShim.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDC3830D1721242D008A2FC3 /* CookieStorageShim.mm */; };
</span><span class="cx">                 CDCA85C8132ABA4E00E961DF /* WKFullScreenWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDCA85C6132ABA4E00E961DF /* WKFullScreenWindowController.mm */; };
</span><span class="cx">                 CDCA85C9132ABA4E00E961DF /* WKFullScreenWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = CDCA85C7132ABA4E00E961DF /* WKFullScreenWindowController.h */; };
</span><ins>+                CDE6E2D319F731C400BA9688 /* WebOriginDataManagerSupplement.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE6E2D219F731C400BA9688 /* WebOriginDataManagerSupplement.h */; };
</ins><span class="cx">                 CEDA12E2152CD1AE00D9E08D /* WebAlternativeTextClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CEDA12DF152CCAE800D9E08D /* WebAlternativeTextClient.cpp */; };
</span><span class="cx">                 CEDA12E3152CD1B300D9E08D /* WebAlternativeTextClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CEDA12DE152CCAE800D9E08D /* WebAlternativeTextClient.h */; };
</span><span class="cx">                 D3B9484611FF4B6500032B39 /* WebPopupMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3B9484211FF4B6500032B39 /* WebPopupMenu.cpp */; };
</span><span class="lines">@@ -3693,6 +3694,7 @@
</span><span class="cx">                 CDCA85C6132ABA4E00E961DF /* WKFullScreenWindowController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKFullScreenWindowController.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 CDCA85C7132ABA4E00E961DF /* WKFullScreenWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKFullScreenWindowController.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 CDCA85D4132AC2B300E961DF /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = &quot;&lt;absolute&gt;&quot;; };
</span><ins>+                CDE6E2D219F731C400BA9688 /* WebOriginDataManagerSupplement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebOriginDataManagerSupplement.h; path = OriginData/WebOriginDataManagerSupplement.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 CEDA12DE152CCAE800D9E08D /* WebAlternativeTextClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebAlternativeTextClient.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 CEDA12DF152CCAE800D9E08D /* WebAlternativeTextClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebAlternativeTextClient.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 D3B9484211FF4B6500032B39 /* WebPopupMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebPopupMenu.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -5534,6 +5536,7 @@
</span><span class="cx">                 755422C518064FFC0046F6A8 /* OriginData */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><ins>+                                CDE6E2D219F731C400BA9688 /* WebOriginDataManagerSupplement.h */,
</ins><span class="cx">                                 755422C618064FFC0046F6A8 /* WebOriginDataManager.cpp */,
</span><span class="cx">                                 755422C718064FFC0046F6A8 /* WebOriginDataManager.h */,
</span><span class="cx">                                 755422C818064FFC0046F6A8 /* WebOriginDataManager.messages.in */,
</span><span class="lines">@@ -7024,6 +7027,7 @@
</span><span class="cx">                         buildActionMask = 2147483647;
</span><span class="cx">                         files = (
</span><span class="cx">                                 1ADAE12E1919A5B400F48E21 /* WKPreferences.h in Headers */,
</span><ins>+                                CDE6E2D319F731C400BA9688 /* WebOriginDataManagerSupplement.h in Headers */,
</ins><span class="cx">                                 1AF459321946559500F9D4A2 /* WKError.h in Headers */,
</span><span class="cx">                                 E19BDA8A193686A400B97F57 /* SandboxUtilities.h in Headers */,
</span><span class="cx">                                 1A7284471959ED100007BCE5 /* SessionStateConversion.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessOriginDataWebOriginDataManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/OriginData/WebOriginDataManager.cpp (175187 => 175188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/OriginData/WebOriginDataManager.cpp        2014-10-24 22:27:27 UTC (rev 175187)
+++ trunk/Source/WebKit2/WebProcess/OriginData/WebOriginDataManager.cpp        2014-10-24 23:01:54 UTC (rev 175188)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> #include &quot;WebCoreArgumentCoders.h&quot;
</span><span class="cx"> #include &quot;WebOriginDataManagerMessages.h&quot;
</span><span class="cx"> #include &quot;WebOriginDataManagerProxyMessages.h&quot;
</span><ins>+#include &quot;WebOriginDataManagerSupplement.h&quot;
</ins><span class="cx"> #include &lt;WebCore/SecurityOrigin.h&gt;
</span><span class="cx"> #include &lt;WebCore/SecurityOriginHash.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -43,85 +44,39 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><del>-const char* WebOriginDataManager::supplementName()
-{
-    return &quot;WebOriginDataManager&quot;;
-}
-
-WebOriginDataManager::WebOriginDataManager(ChildProcess* childProcess)
</del><ins>+WebOriginDataManager::WebOriginDataManager(ChildProcess&amp; childProcess, WebOriginDataManagerSupplement&amp; supplement)
</ins><span class="cx">     : m_childProcess(childProcess)
</span><ins>+    , m_supplement(supplement)
</ins><span class="cx"> {
</span><del>-    m_childProcess-&gt;addMessageReceiver(Messages::WebOriginDataManager::messageReceiverName(), *this);
</del><ins>+    m_childProcess.addMessageReceiver(Messages::WebOriginDataManager::messageReceiverName(), *this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebOriginDataManager::getOrigins(WKOriginDataTypes types, uint64_t callbackID)
</span><span class="cx"> {
</span><del>-#if ENABLE(DATABASE_PROCESS)
-    // FIXME: For now, the DatabaseProcess only handles IndexedDatabase origin data.
-    // If it ever starts handling other data types (e.g. WebSQL) then it will have to aggregrate requests
-    // for multiple types into the one callback.
-    if (types &amp; kWKIndexedDatabaseData) {
-        DatabaseProcess::shared().getIndexedDatabaseOrigins(callbackID);
-        return;
-    }
-#else
-    UNUSED_PARAM(types);
-#endif
-
-    Vector&lt;SecurityOriginData&gt; results;
-    m_childProcess-&gt;send(Messages::WebOriginDataManagerProxy::DidGetOrigins(results, callbackID), 0);
</del><ins>+    m_supplement.getOrigins(types, [this, callbackID](const Vector&lt;SecurityOriginData&gt;&amp; results) {
+        m_childProcess.send(Messages::WebOriginDataManagerProxy::DidGetOrigins(results, callbackID), 0);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebOriginDataManager::deleteEntriesForOrigin(WKOriginDataTypes types, const SecurityOriginData&amp; originData, uint64_t callbackID)
</span><span class="cx"> {
</span><del>-#if ENABLE(DATABASE_PROCESS)
-    // FIXME: For now, the DatabaseProcess only handles IndexedDatabase origin data.
-    // If it ever starts handling other data types (e.g. WebSQL) then it will have to aggregrate requests
-    // for multiple types into the one callback.
-    if (types &amp; kWKIndexedDatabaseData) {
-        DatabaseProcess::shared().deleteIndexedDatabaseEntriesForOrigin(originData, callbackID);
-        return;
-    }
-#else
-    UNUSED_PARAM(types);
-    UNUSED_PARAM(originData);
-#endif
-
-    m_childProcess-&gt;send(Messages::WebOriginDataManagerProxy::DidDeleteEntries(callbackID), 0);
</del><ins>+    m_supplement.deleteEntriesForOrigin(types, originData, [this, callbackID] {
+        m_childProcess.send(Messages::WebOriginDataManagerProxy::DidDeleteEntries(callbackID), 0);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebOriginDataManager::deleteEntriesModifiedBetweenDates(WKOriginDataTypes types, double startTime, double endTime, uint64_t callbackID)
</span><span class="cx"> {
</span><del>-#if ENABLE(DATABASE_PROCESS)
-    // FIXME: For now, the DatabaseProcess only handles IndexedDatabase origin data.
-    // If it ever starts handling other data types (e.g. WebSQL) then it will have to aggregrate requests
-    // for multiple types into the one callback.
-    if (types &amp; kWKIndexedDatabaseData) {
-        DatabaseProcess::shared().deleteIndexedDatabaseEntriesModifiedBetweenDates(startTime, endTime, callbackID);
-        return;
-    }
-#else
-    UNUSED_PARAM(types);
-    UNUSED_PARAM(startTime);
-    UNUSED_PARAM(endTime);
-#endif
-    m_childProcess-&gt;send(Messages::WebOriginDataManagerProxy::DidDeleteEntries(callbackID), 0);
</del><ins>+    m_supplement.deleteEntriesModifiedBetweenDates(types, startTime, endTime, [this, callbackID] {
+        m_childProcess.send(Messages::WebOriginDataManagerProxy::DidDeleteEntries(callbackID), 0);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebOriginDataManager::deleteAllEntries(WKOriginDataTypes types, uint64_t callbackID)
</span><span class="cx"> {
</span><del>-#if ENABLE(DATABASE_PROCESS)
-    // FIXME: For now, the DatabaseProcess only handles IndexedDatabase origin data.
-    // If it ever starts handling other data types (e.g. WebSQL) then it will have to aggregrate requests
-    // for multiple types into the one callback.
-    if (types &amp; kWKIndexedDatabaseData) {
-        DatabaseProcess::shared().deleteAllIndexedDatabaseEntries(callbackID);
-        return;
-    }
-#else
-    UNUSED_PARAM(types);
-#endif
-    m_childProcess-&gt;send(Messages::WebOriginDataManagerProxy::DidDeleteAllEntries(callbackID), 0);
</del><ins>+    m_supplement.deleteAllEntries(types, [this, callbackID] {
+        m_childProcess.send(Messages::WebOriginDataManagerProxy::DidDeleteAllEntries(callbackID), 0);
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessOriginDataWebOriginDataManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/OriginData/WebOriginDataManager.h (175187 => 175188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/OriginData/WebOriginDataManager.h        2014-10-24 22:27:27 UTC (rev 175187)
+++ trunk/Source/WebKit2/WebProcess/OriginData/WebOriginDataManager.h        2014-10-24 23:01:54 UTC (rev 175188)
</span><span class="lines">@@ -26,24 +26,23 @@
</span><span class="cx"> #ifndef WebOriginDataManager_h
</span><span class="cx"> #define WebOriginDataManager_h
</span><span class="cx"> 
</span><del>-#include &quot;ChildProcessSupplement.h&quot;
</del><span class="cx"> #include &quot;MessageReceiver.h&quot;
</span><span class="cx"> #include &quot;WKOriginDataManager.h&quot;
</span><ins>+#include &lt;wtf/HashMap.h&gt;
</ins><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><span class="cx"> class ChildProcess;
</span><ins>+class WebOriginDataManagerSupplement;
</ins><span class="cx"> struct SecurityOriginData;
</span><span class="cx"> 
</span><del>-class WebOriginDataManager : public ChildProcessSupplement, public IPC::MessageReceiver {
</del><ins>+class WebOriginDataManager : public IPC::MessageReceiver {
</ins><span class="cx">     WTF_MAKE_NONCOPYABLE(WebOriginDataManager);
</span><span class="cx"> public:
</span><del>-    WebOriginDataManager(ChildProcess*);
</del><ins>+    WebOriginDataManager(ChildProcess&amp;, WebOriginDataManagerSupplement&amp;);
</ins><span class="cx"> 
</span><del>-    static const char* supplementName();
-
</del><span class="cx"> private:
</span><span class="cx">     void getOrigins(WKOriginDataTypes, uint64_t callbackID);
</span><span class="cx">     void deleteEntriesForOrigin(WKOriginDataTypes, const SecurityOriginData&amp;, uint64_t callbackID);
</span><span class="lines">@@ -53,7 +52,8 @@
</span><span class="cx">     // IPC::MessageReceiver
</span><span class="cx">     virtual void didReceiveMessage(IPC::Connection*, IPC::MessageDecoder&amp;) override;
</span><span class="cx"> 
</span><del>-    ChildProcess* m_childProcess;
</del><ins>+    ChildProcess&amp; m_childProcess;
+    WebOriginDataManagerSupplement&amp; m_supplement;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessOriginDataWebOriginDataManagerSupplementh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/WebProcess/OriginData/WebOriginDataManagerSupplement.h (0 => 175188)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/OriginData/WebOriginDataManagerSupplement.h                                (rev 0)
+++ trunk/Source/WebKit2/WebProcess/OriginData/WebOriginDataManagerSupplement.h        2014-10-24 23:01:54 UTC (rev 175188)
</span><span class="lines">@@ -0,0 +1,48 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef WebOriginDataManagerSupplement_h
+#define WebOriginDataManagerSupplement_h
+
+#include &quot;SecurityOriginData.h&quot;
+#include &quot;WKOriginDataManager.h&quot;
+#include &lt;functional&gt;
+
+namespace WebKit {
+
+class WebOriginDataManagerSupplement {
+public:
+    WebOriginDataManagerSupplement() { }
+    virtual ~WebOriginDataManagerSupplement() { }
+
+    virtual void getOrigins(WKOriginDataTypes, std::function&lt;void(const Vector&lt;SecurityOriginData&gt;&amp;)&gt; completion) = 0;
+    virtual void deleteEntriesForOrigin(WKOriginDataTypes, const SecurityOriginData&amp;, std::function&lt;void()&gt; completion) = 0;
+    virtual void deleteEntriesModifiedBetweenDates(WKOriginDataTypes, double startDate, double endDate, std::function&lt;void()&gt; completion) = 0;
+    virtual void deleteAllEntries(WKOriginDataTypes, std::function&lt;void()&gt; completion) = 0;
+};
+
+}
+
+#endif
</ins></span></pre>
</div>
</div>

</body>
</html>