<!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>[185950] trunk</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/185950">185950</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-06-25 00:51:32 -0700 (Thu, 25 Jun 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] Add initial WebKitWebsiteDataManager API for process configuration options
https://bugs.webkit.org/show_bug.cgi?id=146149

Reviewed by Sergio Villar Senin.

Source/WebKit2:

Add WebKitWebsiteDataManager to replace the different ways we have
to configure data store
directories. WebKitWebContext:indexed-db-directory property has
been removed, since it was added only in trunk, and
WebKitWebContext:local-storage-directory has been deprecated. The
method webkit_web_context_set_disk_cache_directory() has been
deprecated too in favor of WebKitWebsiteDataManager.

* PlatformGTK.cmake: Add new files to compilation.
* UIProcess/API/gtk/WebKitPrivate.h: Move networkCacheSubdirectory
definition here.
* UIProcess/API/gtk/WebKitWebContext.cpp:
(webkitWebContextGetProperty): Replace indexed-db-directory getter
with website-data-manager one.
(webkitWebContextSetProperty): Replace indexed-db-directory setter
with website-data-manager one.
(webkitWebContextConstructed): Use the user provided
WebKitWebsiteDataManager to configure the context or create a
default WebKitWebsiteDataManager if not provided.
(webkit_web_context_class_init): Replace indexed-db-directory
property with website-data-manager.
(webkit_web_context_new_with_website_data_manager):
(webkit_web_context_get_website_data_manager):
(webkitWebContextCreatePageForWebView): Get the WebsiteDataStore
from the WebKitWebsiteDataManager.
* UIProcess/API/gtk/WebKitWebContext.h:
* UIProcess/API/gtk/WebKitWebsiteDataManager.cpp: Added.
(webkitWebsiteDataManagerGetProperty):
(webkitWebsiteDataManagerSetProperty):
(webkit_website_data_manager_class_init):
(webkitWebsiteDataManagerCreate):
(webkitWebsiteDataManagerGetDataStore):
(webkit_website_data_manager_new):
(webkit_website_data_manager_get_local_storage_directory):
(webkit_website_data_manager_get_disk_cache_directory):
(webkit_website_data_manager_get_offline_application_cache_directory):
(webkit_website_data_manager_get_indexeddb_directory):
(webkit_website_data_manager_get_websql_directory):
* UIProcess/API/gtk/WebKitWebsiteDataManager.h: Added.
* UIProcess/API/gtk/WebKitWebsiteDataManagerPrivate.h: Added.
* UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt: Add new symbols.
* UIProcess/API/gtk/docs/webkit2gtk-4.0.types: Add webkit_website_data_manager_get_type.
* UIProcess/API/gtk/webkit2.h: Include WebKitWebsiteDataManager.h.

Tools:

Update unit tests to use WebKitWebsiteDataManager.

* TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebContext.cpp:
(testWebContextConfiguration):
(serverCallback):
* TestWebKitAPI/gtk/WebKit2Gtk/TestMain.h:
(Test::Test): Use WebKitWebsiteDataManager and set all possible
values to ensure unit tests don't write outside the temporary directory.
(Test::~Test): Explicitly reset the web context to ensure its
objects are released before the leaks check.
* TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.cpp:
(WebViewTest::wait): Fix the GSource used, since we are receiving
a double in seconds, but using g_timeout_add_seconds() that
expects an unsigned in seconds. Use GMainLoopSource to correctly
handle the value and simplify the code.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2PlatformGTKcmake">trunk/Source/WebKit2/PlatformGTK.cmake</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitPrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebContextcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebContexth">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtk40sectionstxt">trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtk40types">trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0.types</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkwebkit2h">trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2GtkTestWebKitWebContextcpp">trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebContext.cpp</a></li>
<li><a href="#trunkToolsTestWebKitAPIgtkWebKit2GtkTestMainh">trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/TestMain.h</a></li>
<li><a href="#trunkToolsTestWebKitAPIgtkWebKit2GtkWebViewTestcpp">trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebsiteDataManagercpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManager.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebsiteDataManagerh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManager.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebsiteDataManagerPrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManagerPrivate.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (185949 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-06-25 07:15:56 UTC (rev 185949)
+++ trunk/Source/WebKit2/ChangeLog        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -1,5 +1,56 @@
</span><span class="cx"> 2015-06-25  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><ins>+        [GTK] Add initial WebKitWebsiteDataManager API for process configuration options
+        https://bugs.webkit.org/show_bug.cgi?id=146149
+
+        Reviewed by Sergio Villar Senin.
+
+        Add WebKitWebsiteDataManager to replace the different ways we have
+        to configure data store
+        directories. WebKitWebContext:indexed-db-directory property has
+        been removed, since it was added only in trunk, and
+        WebKitWebContext:local-storage-directory has been deprecated. The
+        method webkit_web_context_set_disk_cache_directory() has been
+        deprecated too in favor of WebKitWebsiteDataManager.
+
+        * PlatformGTK.cmake: Add new files to compilation.
+        * UIProcess/API/gtk/WebKitPrivate.h: Move networkCacheSubdirectory
+        definition here.
+        * UIProcess/API/gtk/WebKitWebContext.cpp:
+        (webkitWebContextGetProperty): Replace indexed-db-directory getter
+        with website-data-manager one.
+        (webkitWebContextSetProperty): Replace indexed-db-directory setter
+        with website-data-manager one.
+        (webkitWebContextConstructed): Use the user provided
+        WebKitWebsiteDataManager to configure the context or create a
+        default WebKitWebsiteDataManager if not provided.
+        (webkit_web_context_class_init): Replace indexed-db-directory
+        property with website-data-manager.
+        (webkit_web_context_new_with_website_data_manager):
+        (webkit_web_context_get_website_data_manager):
+        (webkitWebContextCreatePageForWebView): Get the WebsiteDataStore
+        from the WebKitWebsiteDataManager.
+        * UIProcess/API/gtk/WebKitWebContext.h:
+        * UIProcess/API/gtk/WebKitWebsiteDataManager.cpp: Added.
+        (webkitWebsiteDataManagerGetProperty):
+        (webkitWebsiteDataManagerSetProperty):
+        (webkit_website_data_manager_class_init):
+        (webkitWebsiteDataManagerCreate):
+        (webkitWebsiteDataManagerGetDataStore):
+        (webkit_website_data_manager_new):
+        (webkit_website_data_manager_get_local_storage_directory):
+        (webkit_website_data_manager_get_disk_cache_directory):
+        (webkit_website_data_manager_get_offline_application_cache_directory):
+        (webkit_website_data_manager_get_indexeddb_directory):
+        (webkit_website_data_manager_get_websql_directory):
+        * UIProcess/API/gtk/WebKitWebsiteDataManager.h: Added.
+        * UIProcess/API/gtk/WebKitWebsiteDataManagerPrivate.h: Added.
+        * UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt: Add new symbols.
+        * UIProcess/API/gtk/docs/webkit2gtk-4.0.types: Add webkit_website_data_manager_get_type.
+        * UIProcess/API/gtk/webkit2.h: Include WebKitWebsiteDataManager.h.
+
+2015-06-25  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
</ins><span class="cx">         [GTK] Do not use legacy data store options in WebKit2 GTK+ API
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=146145
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformGTKcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/PlatformGTK.cmake (185949 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/PlatformGTK.cmake        2015-06-25 07:15:56 UTC (rev 185949)
+++ trunk/Source/WebKit2/PlatformGTK.cmake        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -251,6 +251,9 @@
</span><span class="cx">     UIProcess/API/gtk/WebKitWebViewBaseAccessible.h
</span><span class="cx">     UIProcess/API/gtk/WebKitWebViewBasePrivate.h
</span><span class="cx">     UIProcess/API/gtk/WebKitWebViewPrivate.h
</span><ins>+    UIProcess/API/gtk/WebKitWebsiteDataManager.cpp
+    UIProcess/API/gtk/WebKitWebsiteDataManager.h
+    UIProcess/API/gtk/WebKitWebsiteDataManagerPrivate.h
</ins><span class="cx">     UIProcess/API/gtk/WebKitWindowProperties.cpp
</span><span class="cx">     UIProcess/API/gtk/WebKitWindowProperties.h
</span><span class="cx">     UIProcess/API/gtk/WebKitWindowPropertiesPrivate.h
</span><span class="lines">@@ -399,6 +402,7 @@
</span><span class="cx">     ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitWebResource.h
</span><span class="cx">     ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitWebView.h
</span><span class="cx">     ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitWebViewBase.h
</span><ins>+    ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitWebsiteDataManager.h
</ins><span class="cx">     ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitWindowProperties.h
</span><span class="cx">     ${WEBKIT2_DIR}/UIProcess/API/gtk/webkit2.h
</span><span class="cx"> )
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitPrivate.h (185949 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitPrivate.h        2015-06-25 07:15:56 UTC (rev 185949)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitPrivate.h        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -127,4 +127,10 @@
</span><span class="cx">     SnapshotRegionFullDocument
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+#if ENABLE(NETWORK_CACHE)
+static const char networkCacheSubdirectory[] = &quot;WebKitCache&quot;;
+#else
+static const char networkCacheSubdirectory[] = &quot;webkit&quot;;
+#endif
+
</ins><span class="cx"> #endif // WebKitPrivate_h
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp (185949 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp        2015-06-25 07:15:56 UTC (rev 185949)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -47,6 +47,7 @@
</span><span class="cx"> #include &quot;WebKitWebContextPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitWebViewBasePrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitWebViewPrivate.h&quot;
</span><ins>+#include &quot;WebKitWebsiteDataManagerPrivate.h&quot;
</ins><span class="cx"> #include &quot;WebNotificationManagerProxy.h&quot;
</span><span class="cx"> #include &lt;WebCore/FileSystem.h&gt;
</span><span class="cx"> #include &lt;WebCore/IconDatabase.h&gt;
</span><span class="lines">@@ -102,7 +103,7 @@
</span><span class="cx">     PROP_0,
</span><span class="cx"> 
</span><span class="cx">     PROP_LOCAL_STORAGE_DIRECTORY,
</span><del>-    PROP_INDEXED_DB_DIRECTORY
</del><ins>+    PROP_WEBSITE_DATA_MANAGER
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> enum {
</span><span class="lines">@@ -173,7 +174,7 @@
</span><span class="cx"> #if ENABLE(NOTIFICATIONS)
</span><span class="cx">     RefPtr&lt;WebKitNotificationProvider&gt; notificationProvider;
</span><span class="cx"> #endif
</span><del>-    RefPtr&lt;WebsiteDataStore&gt; websiteDataStore;
</del><ins>+    GRefPtr&lt;WebKitWebsiteDataManager&gt; websiteDataManager;
</ins><span class="cx"> 
</span><span class="cx">     CString faviconDatabaseDirectory;
</span><span class="cx">     WebKitTLSErrorsPolicy tlsErrorsPolicy;
</span><span class="lines">@@ -238,8 +239,8 @@
</span><span class="cx">     case PROP_LOCAL_STORAGE_DIRECTORY:
</span><span class="cx">         g_value_set_string(value, context-&gt;priv-&gt;localStorageDirectory.data());
</span><span class="cx">         break;
</span><del>-    case PROP_INDEXED_DB_DIRECTORY:
-        g_value_set_string(value, context-&gt;priv-&gt;indexedDBDirectory.data());
</del><ins>+    case PROP_WEBSITE_DATA_MANAGER:
+        g_value_set_object(value, webkit_web_context_get_website_data_manager(context));
</ins><span class="cx">         break;
</span><span class="cx">     default:
</span><span class="cx">         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propID, paramSpec);
</span><span class="lines">@@ -254,9 +255,11 @@
</span><span class="cx">     case PROP_LOCAL_STORAGE_DIRECTORY:
</span><span class="cx">         context-&gt;priv-&gt;localStorageDirectory = g_value_get_string(value);
</span><span class="cx">         break;
</span><del>-    case PROP_INDEXED_DB_DIRECTORY:
-        context-&gt;priv-&gt;indexedDBDirectory = g_value_get_string(value);
</del><ins>+    case PROP_WEBSITE_DATA_MANAGER: {
+        gpointer manager = g_value_get_object(value);
+        context-&gt;priv-&gt;websiteDataManager = manager ? WEBKIT_WEBSITE_DATA_MANAGER(manager) : nullptr;
</ins><span class="cx">         break;
</span><ins>+    }
</ins><span class="cx">     default:
</span><span class="cx">         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propID, paramSpec);
</span><span class="cx">     }
</span><span class="lines">@@ -286,14 +289,20 @@
</span><span class="cx"> 
</span><span class="cx">     WebKitWebContext* webContext = WEBKIT_WEB_CONTEXT(object);
</span><span class="cx">     WebKitWebContextPrivate* priv = webContext-&gt;priv;
</span><del>-    if (!priv-&gt;localStorageDirectory.isNull())
</del><ins>+    if (priv-&gt;websiteDataManager) {
+        configuration.setLocalStorageDirectory(WebCore::filenameToString(webkit_website_data_manager_get_local_storage_directory(priv-&gt;websiteDataManager.get())));
+        configuration.setDiskCacheDirectory(WebCore::pathByAppendingComponent(WebCore::filenameToString(webkit_website_data_manager_get_disk_cache_directory(priv-&gt;websiteDataManager.get())), networkCacheSubdirectory));
+        configuration.setApplicationCacheDirectory(WebCore::filenameToString(webkit_website_data_manager_get_offline_application_cache_directory(priv-&gt;websiteDataManager.get())));
+        configuration.setIndexedDBDatabaseDirectory(WebCore::filenameToString(webkit_website_data_manager_get_indexeddb_directory(priv-&gt;websiteDataManager.get())));
+        configuration.setWebSQLDatabaseDirectory(WebCore::filenameToString(webkit_website_data_manager_get_websql_directory(priv-&gt;websiteDataManager.get())));
+    } else if (!priv-&gt;localStorageDirectory.isNull())
</ins><span class="cx">         configuration.setLocalStorageDirectory(WebCore::filenameToString(priv-&gt;localStorageDirectory.data()));
</span><del>-    if (!priv-&gt;indexedDBDirectory.isNull())
-        configuration.setIndexedDBDatabaseDirectory(WebCore::filenameToString(priv-&gt;indexedDBDirectory.data()));
</del><span class="cx"> 
</span><span class="cx">     priv-&gt;context = WebProcessPool::create(configuration);
</span><span class="cx"> 
</span><del>-    priv-&gt;websiteDataStore = WebsiteDataStore::create(websiteDataStoreConfigurationForWebProcessPoolConfiguration(configuration));
</del><ins>+    if (!priv-&gt;websiteDataManager)
+        priv-&gt;websiteDataManager = webkitWebsiteDataManagerCreate(websiteDataStoreConfigurationForWebProcessPoolConfiguration(configuration));
+
</ins><span class="cx">     priv-&gt;requestManager = priv-&gt;context-&gt;supplement&lt;WebSoupCustomProtocolRequestManager&gt;();
</span><span class="cx"> 
</span><span class="cx">     priv-&gt;tlsErrorsPolicy = WEBKIT_TLS_ERRORS_POLICY_FAIL;
</span><span class="lines">@@ -344,6 +353,8 @@
</span><span class="cx">      * The directory where local storage data will be saved.
</span><span class="cx">      *
</span><span class="cx">      * Since: 2.8
</span><ins>+     *
+     * Deprecated: 2.10. Use #WebKitWebsiteDataManager:local-storage-directory instead.
</ins><span class="cx">      */
</span><span class="cx">     g_object_class_install_property(
</span><span class="cx">         gObjectClass,
</span><span class="lines">@@ -356,20 +367,20 @@
</span><span class="cx">             static_cast&lt;GParamFlags&gt;(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
</span><span class="cx"> 
</span><span class="cx">     /**
</span><del>-     * WebKitWebContext:indexed-db-directory:
</del><ins>+     * WebKitWebContext:website-data-manager:
</ins><span class="cx">      *
</span><del>-     * The directory where IndexedDB databases will be saved.
</del><ins>+     * The #WebKitWebsiteDataManager associated with this context.
</ins><span class="cx">      *
</span><span class="cx">      * Since: 2.10
</span><span class="cx">      */
</span><span class="cx">     g_object_class_install_property(
</span><span class="cx">         gObjectClass,
</span><del>-        PROP_INDEXED_DB_DIRECTORY,
-        g_param_spec_string(
-            &quot;indexed-db-directory&quot;,
-            _(&quot;IndexedDB Directory&quot;),
-            _(&quot;The directory where IndexedDB databases will be saved&quot;),
-            nullptr,
</del><ins>+        PROP_WEBSITE_DATA_MANAGER,
+        g_param_spec_object(
+            &quot;website-data-manager&quot;,
+            _(&quot;Website Data Manager&quot;),
+            _(&quot;The WebKitWebsiteDataManager associated with this context&quot;),
+            WEBKIT_TYPE_WEBSITE_DATA_MANAGER,
</ins><span class="cx">             static_cast&lt;GParamFlags&gt;(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
</span><span class="cx"> 
</span><span class="cx">     /**
</span><span class="lines">@@ -444,6 +455,40 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /**
</span><ins>+ * webkit_web_context_new_with_website_data_manager:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Create a new #WebKitWebContext with a #WebKitWebsiteDataManager.
+ *
+ * Returns: (transfer full): a newly created #WebKitWebContext
+ *
+ * Since: 2.10
+ */
+WebKitWebContext* webkit_web_context_new_with_website_data_manager(WebKitWebsiteDataManager* manager)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+    return WEBKIT_WEB_CONTEXT(g_object_new(WEBKIT_TYPE_WEB_CONTEXT, &quot;website-data-manager&quot;, manager, nullptr));
+}
+
+/**
+ * webkit_web_context_get_website_data_manager:
+ * @context: the #WebKitWebContext
+ *
+ * Get the #WebKitWebsiteDataManager of @context.
+ *
+ * Returns: (transfer none): a #WebKitWebsiteDataManager
+ *
+ * Since: 2.10
+ */
+WebKitWebsiteDataManager* webkit_web_context_get_website_data_manager(WebKitWebContext* context)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEB_CONTEXT(context), nullptr);
+
+    return context-&gt;priv-&gt;websiteDataManager.get();
+}
+
+/**
</ins><span class="cx">  * webkit_web_context_set_cache_model:
</span><span class="cx">  * @context: the #WebKitWebContext
</span><span class="cx">  * @cache_model: a #WebKitCacheModel
</span><span class="lines">@@ -1039,17 +1084,18 @@
</span><span class="cx">  * Set the directory where disk cache files will be stored
</span><span class="cx">  * This method must be called before loading anything in this context, otherwise
</span><span class="cx">  * it will not have any effect.
</span><ins>+ *
+ * Note that this method overrides the directory set in the #WebKitWebsiteDataManager,
+ * but it doesn't change the value returned by webkit_website_data_manager_get_disk_cache_directory()
+ * since the #WebKitWebsiteDataManager is immutable.
+ *
+ * Deprecated: 2.10. Use webkit_web_context_new_with_website_data_manager() instead.
</ins><span class="cx">  */
</span><span class="cx"> void webkit_web_context_set_disk_cache_directory(WebKitWebContext* context, const char* directory)
</span><span class="cx"> {
</span><span class="cx">     g_return_if_fail(WEBKIT_IS_WEB_CONTEXT(context));
</span><span class="cx">     g_return_if_fail(directory);
</span><span class="cx"> 
</span><del>-#if ENABLE(NETWORK_CACHE)
-    static const char networkCacheSubdirectory[] = &quot;WebKitCache&quot;;
-#else
-    static const char networkCacheSubdirectory[] = &quot;webkit&quot;;
-#endif
</del><span class="cx">     context-&gt;priv-&gt;context-&gt;configuration().setDiskCacheDirectory(WebCore::pathByAppendingComponent(WebCore::filenameToString(directory), networkCacheSubdirectory));
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1232,8 +1278,8 @@
</span><span class="cx">     webPageConfiguration.preferences = webkitSettingsGetPreferences(webkit_web_view_get_settings(webView));
</span><span class="cx">     webPageConfiguration.relatedPage = relatedView ? webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(relatedView)) : nullptr;
</span><span class="cx">     webPageConfiguration.userContentController = userContentManager ? webkitUserContentManagerGetUserContentControllerProxy(userContentManager) : nullptr;
</span><del>-    webPageConfiguration.websiteDataStore = context-&gt;priv-&gt;websiteDataStore.get();
-    webPageConfiguration.sessionID = context-&gt;priv-&gt;websiteDataStore-&gt;sessionID();
</del><ins>+    webPageConfiguration.websiteDataStore = &amp;webkitWebsiteDataManagerGetDataStore(context-&gt;priv-&gt;websiteDataManager.get());
+    webPageConfiguration.sessionID = webPageConfiguration.websiteDataStore-&gt;sessionID();
</ins><span class="cx">     webkitWebViewBaseCreateWebPage(webViewBase, context-&gt;priv-&gt;context.get(), WTF::move(webPageConfiguration));
</span><span class="cx"> 
</span><span class="cx">     WebPageProxy* page = webkitWebViewBaseGetPage(webViewBase);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.h (185949 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.h        2015-06-25 07:15:56 UTC (rev 185949)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.h        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &lt;webkit2/WebKitFaviconDatabase.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitSecurityManager.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitURISchemeRequest.h&gt;
</span><ins>+#include &lt;webkit2/WebKitWebsiteDataManager.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> G_BEGIN_DECLS
</span><span class="cx"> 
</span><span class="lines">@@ -148,6 +149,12 @@
</span><span class="cx"> WEBKIT_API WebKitWebContext *
</span><span class="cx"> webkit_web_context_new                              (void);
</span><span class="cx"> 
</span><ins>+WEBKIT_API WebKitWebContext *
+webkit_web_context_new_with_website_data_manager    (WebKitWebsiteDataManager      *manager);
+
+WEBKIT_API WebKitWebsiteDataManager *
+webkit_web_context_get_website_data_manager         (WebKitWebContext              *context);
+
</ins><span class="cx"> WEBKIT_API void
</span><span class="cx"> webkit_web_context_set_cache_model                  (WebKitWebContext              *context,
</span><span class="cx">                                                      WebKitCacheModel               cache_model);
</span><span class="lines">@@ -234,7 +241,7 @@
</span><span class="cx"> webkit_web_context_prefetch_dns                     (WebKitWebContext              *context,
</span><span class="cx">                                                      const gchar                   *hostname);
</span><span class="cx"> 
</span><del>-WEBKIT_API void
</del><ins>+WEBKIT_DEPRECATED_FOR(webkit_web_context_new_with_website_data_manager) void
</ins><span class="cx"> webkit_web_context_set_disk_cache_directory         (WebKitWebContext              *context,
</span><span class="cx">                                                      const gchar                   *directory);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebsiteDataManagercpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManager.cpp (0 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManager.cpp                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManager.cpp        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -0,0 +1,485 @@
</span><ins>+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2,1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;WebKitWebsiteDataManager.h&quot;
+
+#include &quot;APIWebsiteDataStore.h&quot;
+#include &quot;WebKitWebsiteDataManagerPrivate.h&quot;
+#include &lt;WebCore/FileSystem.h&gt;
+#include &lt;glib/gi18n-lib.h&gt;
+#include &lt;wtf/glib/GUniquePtr.h&gt;
+
+using namespace WebKit;
+
+/**
+ * SECTION: WebKitWebsiteDataManager
+ * @Short_description: Website data manager
+ * @Title: WebKitWebsiteDataManager
+ * @See_also: #WebKitWebContext
+ *
+ * WebKitWebsiteDataManager allows you to manage the data that websites
+ * can store in the client file system like databases or caches.
+ * You can use WebKitWebsiteDataManager to configure the local directories
+ * where the Website data will be stored, by creating a new manager with
+ * webkit_website_data_manager_new() passing the values you want to set.
+ * You can set all the possible configuration values or only some of them,
+ * a default value will be used automatically for the configuration options
+ * not provided. #WebKitWebsiteDataManager:base-data-directory and
+ * #WebKitWebsiteDataManager:base-cache-directory are two special properties
+ * that can be used to set a common base directory for all Website data and
+ * caches. It's possible to provide both, a base directory and a specific value,
+ * but in that case, the specific value takes precedence over the base directory.
+ * The newly created WebKitWebsiteDataManager must be passed as a construct property
+ * to a #WebKitWebContext, you can use webkit_web_context_new_with_website_data_manager()
+ * to create a new #WebKitWebContext with a WebKitWebsiteDataManager.
+ * In case you don't want to set any specific configuration, you don't need to create
+ * a WebKitWebsiteDataManager, the #WebKitWebContext will create a WebKitWebsiteDataManager
+ * with the default configuration. To get the WebKitWebsiteDataManager of a #WebKitWebContext
+ * you can use webkit_web_context_get_website_data_manager().
+ *
+ * Since: 2.10
+ */
+
+enum {
+    PROP_0,
+
+    PROP_BASE_DATA_DIRECTORY,
+    PROP_BASE_CACHE_DIRECTORY,
+    PROP_LOCAL_STORAGE_DIRECTORY,
+    PROP_DISK_CACHE_DIRECTORY,
+    PROP_APPLICATION_CACHE_DIRECTORY,
+    PROP_INDEXEDDB_DIRECTORY,
+    PROP_WEBSQL_DIRECTORY
+};
+
+struct _WebKitWebsiteDataManagerPrivate {
+    RefPtr&lt;WebsiteDataStore&gt; websiteDataStore;
+    GUniquePtr&lt;char&gt; baseDataDirectory;
+    GUniquePtr&lt;char&gt; baseCacheDirectory;
+    GUniquePtr&lt;char&gt; localStorageDirectory;
+    GUniquePtr&lt;char&gt; diskCacheDirectory;
+    GUniquePtr&lt;char&gt; applicationCacheDirectory;
+    GUniquePtr&lt;char&gt; indexedDBDirectory;
+    GUniquePtr&lt;char&gt; webSQLDirectory;
+};
+
+WEBKIT_DEFINE_TYPE(WebKitWebsiteDataManager, webkit_website_data_manager, G_TYPE_OBJECT)
+
+static void webkitWebsiteDataManagerGetProperty(GObject* object, guint propID, GValue* value, GParamSpec* paramSpec)
+{
+    WebKitWebsiteDataManager* manager = WEBKIT_WEBSITE_DATA_MANAGER(object);
+
+    switch (propID) {
+    case PROP_BASE_DATA_DIRECTORY:
+        g_value_set_string(value, webkit_website_data_manager_get_base_data_directory(manager));
+        break;
+    case PROP_BASE_CACHE_DIRECTORY:
+        g_value_set_string(value, webkit_website_data_manager_get_base_cache_directory(manager));
+        break;
+    case PROP_LOCAL_STORAGE_DIRECTORY:
+        g_value_set_string(value, webkit_website_data_manager_get_local_storage_directory(manager));
+        break;
+    case PROP_DISK_CACHE_DIRECTORY:
+        g_value_set_string(value, webkit_website_data_manager_get_disk_cache_directory(manager));
+        break;
+    case PROP_APPLICATION_CACHE_DIRECTORY:
+        g_value_set_string(value, webkit_website_data_manager_get_offline_application_cache_directory(manager));
+        break;
+    case PROP_INDEXEDDB_DIRECTORY:
+        g_value_set_string(value, webkit_website_data_manager_get_indexeddb_directory(manager));
+        break;
+    case PROP_WEBSQL_DIRECTORY:
+        g_value_set_string(value, webkit_website_data_manager_get_websql_directory(manager));
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propID, paramSpec);
+    }
+}
+
+static void webkitWebsiteDataManagerSetProperty(GObject* object, guint propID, const GValue* value, GParamSpec* paramSpec)
+{
+    WebKitWebsiteDataManager* manager = WEBKIT_WEBSITE_DATA_MANAGER(object);
+
+    switch (propID) {
+    case PROP_BASE_DATA_DIRECTORY:
+        manager-&gt;priv-&gt;baseDataDirectory.reset(g_value_dup_string(value));
+        break;
+    case PROP_BASE_CACHE_DIRECTORY:
+        manager-&gt;priv-&gt;baseCacheDirectory.reset(g_value_dup_string(value));
+        break;
+    case PROP_LOCAL_STORAGE_DIRECTORY:
+        manager-&gt;priv-&gt;localStorageDirectory.reset(g_value_dup_string(value));
+        break;
+    case PROP_DISK_CACHE_DIRECTORY:
+        manager-&gt;priv-&gt;diskCacheDirectory.reset(g_value_dup_string(value));
+        break;
+    case PROP_APPLICATION_CACHE_DIRECTORY:
+        manager-&gt;priv-&gt;applicationCacheDirectory.reset(g_value_dup_string(value));
+        break;
+    case PROP_INDEXEDDB_DIRECTORY:
+        manager-&gt;priv-&gt;indexedDBDirectory.reset(g_value_dup_string(value));
+        break;
+    case PROP_WEBSQL_DIRECTORY:
+        manager-&gt;priv-&gt;webSQLDirectory.reset(g_value_dup_string(value));
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propID, paramSpec);
+    }
+}
+
+static void webkitWebsiteDataManagerConstructed(GObject* object)
+{
+    G_OBJECT_CLASS(webkit_website_data_manager_parent_class)-&gt;constructed(object);
+
+    WebKitWebsiteDataManagerPrivate* priv = WEBKIT_WEBSITE_DATA_MANAGER(object)-&gt;priv;
+    if (priv-&gt;baseDataDirectory) {
+        if (!priv-&gt;localStorageDirectory)
+            priv-&gt;localStorageDirectory.reset(g_build_filename(priv-&gt;baseDataDirectory.get(), &quot;localstorage&quot;, nullptr));
+        if (!priv-&gt;indexedDBDirectory)
+            priv-&gt;indexedDBDirectory.reset(g_build_filename(priv-&gt;baseDataDirectory.get(), &quot;databases&quot;, &quot;indexeddb&quot;, nullptr));
+        if (!priv-&gt;webSQLDirectory)
+            priv-&gt;webSQLDirectory.reset(g_build_filename(priv-&gt;baseDataDirectory.get(), &quot;databases&quot;, nullptr));
+    }
+
+    if (priv-&gt;baseCacheDirectory) {
+        if (!priv-&gt;diskCacheDirectory)
+            priv-&gt;diskCacheDirectory.reset(g_strdup(priv-&gt;baseCacheDirectory.get()));
+        if (!priv-&gt;applicationCacheDirectory)
+            priv-&gt;applicationCacheDirectory.reset(g_build_filename(priv-&gt;baseCacheDirectory.get(), &quot;applications&quot;, nullptr));
+    }
+}
+
+static void webkit_website_data_manager_class_init(WebKitWebsiteDataManagerClass* findClass)
+{
+    GObjectClass* gObjectClass = G_OBJECT_CLASS(findClass);
+
+    gObjectClass-&gt;get_property = webkitWebsiteDataManagerGetProperty;
+    gObjectClass-&gt;set_property = webkitWebsiteDataManagerSetProperty;
+    gObjectClass-&gt;constructed = webkitWebsiteDataManagerConstructed;
+
+    /**
+     * WebKitWebsiteDataManager:base-data-directory:
+     *
+     * The base directory for Website data. This is used as a base directory
+     * for any Website data when no specific data directory has been provided.
+     *
+     * Since: 2.10
+     */
+    g_object_class_install_property(
+        gObjectClass,
+        PROP_BASE_DATA_DIRECTORY,
+        g_param_spec_string(
+            &quot;base-data-directory&quot;,
+            _(&quot;Base Data Directory&quot;),
+            _(&quot;The base directory for Website data&quot;),
+            nullptr,
+            static_cast&lt;GParamFlags&gt;(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+
+    /**
+     * WebKitWebsiteDataManager:base-cache-directory:
+     *
+     * The base directory for Website cache. This is used as a base directory
+     * for any Website cache when no specific cache directory has been provided.
+     *
+     * Since: 2.10
+     */
+    g_object_class_install_property(
+        gObjectClass,
+        PROP_BASE_CACHE_DIRECTORY,
+        g_param_spec_string(
+            &quot;base-cache-directory&quot;,
+            _(&quot;Base Cache Directory&quot;),
+            _(&quot;The base directory for Website cache&quot;),
+            nullptr,
+            static_cast&lt;GParamFlags&gt;(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+
+    /**
+     * WebKitWebsiteDataManager:local-storage-directory:
+     *
+     * The directory where local storage data will be stored.
+     *
+     * Since: 2.10
+     */
+    g_object_class_install_property(
+        gObjectClass,
+        PROP_LOCAL_STORAGE_DIRECTORY,
+        g_param_spec_string(
+            &quot;local-storage-directory&quot;,
+            _(&quot;Local Storage Directory&quot;),
+            _(&quot;The directory where local storage data will be stored&quot;),
+            nullptr,
+            static_cast&lt;GParamFlags&gt;(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+
+    /**
+     * WebKitWebsiteDataManager:disk-cache-directory:
+     *
+     * The directory where HTTP disk cache will be stored.
+     *
+     * Since: 2.10
+     */
+    g_object_class_install_property(
+        gObjectClass,
+        PROP_DISK_CACHE_DIRECTORY,
+        g_param_spec_string(
+            &quot;disk-cache-directory&quot;,
+            _(&quot;Disk Cache Directory&quot;),
+            _(&quot;The directory where HTTP disk cache will be stored&quot;),
+            nullptr,
+            static_cast&lt;GParamFlags&gt;(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+
+    /**
+     * WebKitWebsiteDataManager:offline-application-cache-directory:
+     *
+     * The directory where offline web application cache will be stored.
+     *
+     * Since: 2.10
+     */
+    g_object_class_install_property(
+        gObjectClass,
+        PROP_APPLICATION_CACHE_DIRECTORY,
+        g_param_spec_string(
+            &quot;offline-application-cache-directory&quot;,
+            _(&quot;Offline Web Application Cache Directory&quot;),
+            _(&quot;The directory where offline web application cache will be stored&quot;),
+            nullptr,
+            static_cast&lt;GParamFlags&gt;(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+
+    /**
+     * WebKitWebsiteDataManager:indexeddb-directory:
+     *
+     * The directory where IndexedDB databases will be stored.
+     *
+     * Since: 2.10
+     */
+    g_object_class_install_property(
+        gObjectClass,
+        PROP_INDEXEDDB_DIRECTORY,
+        g_param_spec_string(
+            &quot;indexeddb-directory&quot;,
+            _(&quot;IndexedDB Directory&quot;),
+            _(&quot;The directory where IndexedDB databases will be stored&quot;),
+            nullptr,
+            static_cast&lt;GParamFlags&gt;(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+
+    /**
+     * WebKitWebsiteDataManager:websql-directory:
+     *
+     * The directory where WebSQL databases will be stored.
+     *
+     * Since: 2.10
+     */
+    g_object_class_install_property(
+        gObjectClass,
+        PROP_WEBSQL_DIRECTORY,
+        g_param_spec_string(
+            &quot;websql-directory&quot;,
+            _(&quot;WebSQL Directory&quot;),
+            _(&quot;The directory where WebSQL databases will be stored&quot;),
+            nullptr,
+            static_cast&lt;GParamFlags&gt;(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+}
+
+WebKitWebsiteDataManager* webkitWebsiteDataManagerCreate(WebsiteDataStore::Configuration&amp;&amp; configuration)
+{
+    WebKitWebsiteDataManager* manager = WEBKIT_WEBSITE_DATA_MANAGER(g_object_new(WEBKIT_TYPE_WEBSITE_DATA_MANAGER, nullptr));
+    manager-&gt;priv-&gt;websiteDataStore = WebsiteDataStore::create(WTF::move(configuration));
+
+    return manager;
+}
+
+WebsiteDataStore&amp; webkitWebsiteDataManagerGetDataStore(WebKitWebsiteDataManager* manager)
+{
+    WebKitWebsiteDataManagerPrivate* priv = manager-&gt;priv;
+    if (!priv-&gt;websiteDataStore) {
+        WebsiteDataStore::Configuration configuration;
+        configuration.localStorageDirectory = !priv-&gt;localStorageDirectory ?
+            API::WebsiteDataStore::defaultLocalStorageDirectory() : WebCore::filenameToString(priv-&gt;localStorageDirectory.get());
+        configuration.networkCacheDirectory = !priv-&gt;diskCacheDirectory ?
+            API::WebsiteDataStore::defaultNetworkCacheDirectory() : WebCore::pathByAppendingComponent(WebCore::filenameToString(priv-&gt;diskCacheDirectory.get()), networkCacheSubdirectory);
+        configuration.applicationCacheDirectory = !priv-&gt;applicationCacheDirectory ?
+            API::WebsiteDataStore::defaultApplicationCacheDirectory() : WebCore::filenameToString(priv-&gt;applicationCacheDirectory.get());
+        configuration.webSQLDatabaseDirectory = !priv-&gt;webSQLDirectory ?
+            API::WebsiteDataStore::defaultWebSQLDatabaseDirectory() : WebCore::filenameToString(priv-&gt;webSQLDirectory.get());
+        configuration.mediaKeysStorageDirectory = API::WebsiteDataStore::defaultMediaKeysStorageDirectory();
+        priv-&gt;websiteDataStore = WebsiteDataStore::create(WTF::move(configuration));
+    }
+
+    return *priv-&gt;websiteDataStore;
+}
+
+/**
+ * webkit_website_data_manager_new:
+ * @first_option_name: name of the first option to set
+ * @...: value of first option, followed by more options, %NULL-terminated
+ *
+ * Creates a new #WebKitWebsiteDataManager with the given options. It must
+ * be passed as construction parameter of a #WebKitWebContext.
+ *
+ * Returns: (transfer full): the newly created #WebKitWebsiteDataManager
+ *
+ * Since: 2.10
+ */
+WebKitWebsiteDataManager* webkit_website_data_manager_new(const gchar* firstOptionName, ...)
+{
+    va_list args;
+    va_start(args, firstOptionName);
+    WebKitWebsiteDataManager* manager = WEBKIT_WEBSITE_DATA_MANAGER(g_object_new_valist(WEBKIT_TYPE_WEBSITE_DATA_MANAGER, firstOptionName, args));
+    va_end(args);
+
+    return manager;
+}
+
+/**
+ * webkit_website_data_manager_get_base_data_directory:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitWebsiteDataManager:base-data-directory property.
+ *
+ * Returns: the base directory for Website data, or %NULL if
+ *    #WebKitWebsiteDataManager:base-data-directory was not provided.
+ *
+ * Since: 2.10
+ */
+const gchar* webkit_website_data_manager_get_base_data_directory(WebKitWebsiteDataManager* manager)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+    return manager-&gt;priv-&gt;baseDataDirectory.get();
+}
+
+/**
+ * webkit_website_data_manager_get_base_cache_directory:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitWebsiteDataManager:base-cache-directory property.
+ *
+ * Returns: the base directory for Website cache, or %NULL if
+ *    #WebKitWebsiteDataManager:base-cache-directory was not provided.
+ *
+ * Since: 2.10
+ */
+const gchar* webkit_website_data_manager_get_base_cache_directory(WebKitWebsiteDataManager* manager)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+    return manager-&gt;priv-&gt;baseCacheDirectory.get();
+}
+
+/**
+ * webkit_website_data_manager_get_local_storage_directory:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitWebsiteDataManager:local-storage-directory property.
+ *
+ * Returns: the directory where local storage data is stored.
+ *
+ * Since: 2.10
+ */
+const gchar* webkit_website_data_manager_get_local_storage_directory(WebKitWebsiteDataManager* manager)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+    WebKitWebsiteDataManagerPrivate* priv = manager-&gt;priv;
+    if (!priv-&gt;localStorageDirectory)
+        priv-&gt;localStorageDirectory.reset(g_strdup(API::WebsiteDataStore::defaultLocalStorageDirectory().utf8().data()));
+    return priv-&gt;localStorageDirectory.get();
+}
+
+/**
+ * webkit_website_data_manager_get_disk_cache_directory:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitWebsiteDataManager:disk-cache-directory property.
+ *
+ * Returns: the directory where HTTP disk cache is stored.
+ *
+ * Since: 2.10
+ */
+const gchar* webkit_website_data_manager_get_disk_cache_directory(WebKitWebsiteDataManager* manager)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+    WebKitWebsiteDataManagerPrivate* priv = manager-&gt;priv;
+    if (!priv-&gt;diskCacheDirectory) {
+        // The default directory already has the subdirectory.
+        priv-&gt;diskCacheDirectory.reset(g_strdup(WebCore::directoryName(API::WebsiteDataStore::defaultNetworkCacheDirectory()).utf8().data()));
+    }
+    return priv-&gt;diskCacheDirectory.get();
+}
+
+/**
+ * webkit_website_data_manager_get_offline_application_cache_directory:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitWebsiteDataManager:offline-application-cache-directory property.
+ *
+ * Returns: the directory where offline web application cache is stored.
+ *
+ * Since: 2.10
+ */
+const gchar* webkit_website_data_manager_get_offline_application_cache_directory(WebKitWebsiteDataManager* manager)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+    WebKitWebsiteDataManagerPrivate* priv = manager-&gt;priv;
+    if (!priv-&gt;applicationCacheDirectory)
+        priv-&gt;applicationCacheDirectory.reset(g_strdup(API::WebsiteDataStore::defaultApplicationCacheDirectory().utf8().data()));
+    return priv-&gt;applicationCacheDirectory.get();
+}
+
+/**
+ * webkit_website_data_manager_get_indexeddb_directory:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitWebsiteDataManager:indexeddb-directory property.
+ *
+ * Returns: the directory where IndexedDB databases are stored.
+ *
+ * Since: 2.10
+ */
+const gchar* webkit_website_data_manager_get_indexeddb_directory(WebKitWebsiteDataManager* manager)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+    WebKitWebsiteDataManagerPrivate* priv = manager-&gt;priv;
+    if (!priv-&gt;indexedDBDirectory)
+        priv-&gt;indexedDBDirectory.reset(g_strdup(API::WebsiteDataStore::defaultIndexedDBDatabaseDirectory().utf8().data()));
+    return priv-&gt;indexedDBDirectory.get();
+}
+
+/**
+ * webkit_website_data_manager_get_websql_directory:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitWebsiteDataManager:websql-directory property.
+ *
+ * Returns: the directory where WebSQL databases are stored.
+ *
+ * Since: 2.10
+ */
+const gchar* webkit_website_data_manager_get_websql_directory(WebKitWebsiteDataManager* manager)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+    WebKitWebsiteDataManagerPrivate* priv = manager-&gt;priv;
+    if (!priv-&gt;webSQLDirectory)
+        priv-&gt;webSQLDirectory.reset(g_strdup(API::WebsiteDataStore::defaultWebSQLDatabaseDirectory().utf8().data()));
+    return priv-&gt;webSQLDirectory.get();
+}
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebsiteDataManagerh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManager.h (0 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManager.h                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManager.h        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -0,0 +1,87 @@
</span><ins>+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2,1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#if !defined(__WEBKIT2_H_INSIDE__) &amp;&amp; !defined(WEBKIT2_COMPILATION)
+#error &quot;Only &lt;webkit2/webkit2.h&gt; can be included directly.&quot;
+#endif
+
+#ifndef WebKitWebsiteDataManager_h
+#define WebKitWebsiteDataManager_h
+
+#include &lt;glib-object.h&gt;
+#include &lt;webkit2/WebKitDefines.h&gt;
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_WEBSITE_DATA_MANAGER            (webkit_website_data_manager_get_type())
+#define WEBKIT_WEBSITE_DATA_MANAGER(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_WEBSITE_DATA_MANAGER, WebKitWebsiteDataManager))
+#define WEBKIT_IS_WEBSITE_DATA_MANAGER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_WEBSITE_DATA_MANAGER))
+#define WEBKIT_WEBSITE_DATA_MANAGER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),  WEBKIT_TYPE_WEBSITE_DATA_MANAGER, WebKitWebsiteDataManagerClass))
+#define WEBKIT_IS_WEBSITE_DATA_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),  WEBKIT_TYPE_WEBSITE_DATA_MANAGER))
+#define WEBKIT_WEBSITE_DATA_MANAGER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj),  WEBKIT_TYPE_WEBSITE_DATA_MANAGER, WebKitWebsiteDataManagerClass))
+
+typedef struct _WebKitWebsiteDataManager        WebKitWebsiteDataManager;
+typedef struct _WebKitWebsiteDataManagerClass   WebKitWebsiteDataManagerClass;
+typedef struct _WebKitWebsiteDataManagerPrivate WebKitWebsiteDataManagerPrivate;
+
+struct _WebKitWebsiteDataManager {
+    GObject parent;
+
+    WebKitWebsiteDataManagerPrivate *priv;
+};
+
+struct _WebKitWebsiteDataManagerClass {
+    GObjectClass parent_class;
+
+    void (*_webkit_reserved0) (void);
+    void (*_webkit_reserved1) (void);
+    void (*_webkit_reserved2) (void);
+    void (*_webkit_reserved3) (void);
+};
+
+WEBKIT_API GType
+webkit_website_data_manager_get_type                                (void);
+
+WEBKIT_API WebKitWebsiteDataManager *
+webkit_website_data_manager_new                                     (const gchar              *first_option_name,
+                                                                     ...);
+WEBKIT_API const gchar *
+webkit_website_data_manager_get_base_data_directory                 (WebKitWebsiteDataManager *manager);
+
+WEBKIT_API const gchar *
+webkit_website_data_manager_get_base_cache_directory                 (WebKitWebsiteDataManager *manager);
+
+WEBKIT_API const gchar *
+webkit_website_data_manager_get_local_storage_directory             (WebKitWebsiteDataManager *manager);
+
+WEBKIT_API const gchar *
+webkit_website_data_manager_get_disk_cache_directory                (WebKitWebsiteDataManager *manager);
+
+WEBKIT_API const gchar *
+webkit_website_data_manager_get_offline_application_cache_directory (WebKitWebsiteDataManager *manager);
+
+WEBKIT_API const gchar *
+webkit_website_data_manager_get_indexeddb_directory                 (WebKitWebsiteDataManager *manager);
+
+WEBKIT_API const gchar *
+webkit_website_data_manager_get_websql_directory                    (WebKitWebsiteDataManager *manager);
+
+G_END_DECLS
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebsiteDataManagerPrivateh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManagerPrivate.h (0 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManagerPrivate.h                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManagerPrivate.h        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -0,0 +1,29 @@
</span><ins>+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef WebKitWebsiteDataManagerPrivate_h
+#define WebKitWebsiteDataManagerPrivate_h
+
+#include &quot;WebKitPrivate.h&quot;
+#include &quot;WebsiteDataStore.h&quot;
+
+WebKitWebsiteDataManager* webkitWebsiteDataManagerCreate(WebKit::WebsiteDataStore::Configuration&amp;&amp;);
+WebKit::WebsiteDataStore&amp; webkitWebsiteDataManagerGetDataStore(WebKitWebsiteDataManager*);
+
+#endif // WebKitWebsiteDataManagerPrivate_h
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtk40sectionstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt (185949 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt        2015-06-25 07:15:56 UTC (rev 185949)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -29,6 +29,8 @@
</span><span class="cx"> WebKitTLSErrorsPolicy
</span><span class="cx"> webkit_web_context_get_default
</span><span class="cx"> webkit_web_context_new
</span><ins>+webkit_web_context_new_with_website_data_manager
+webkit_web_context_get_website_data_manager
</ins><span class="cx"> webkit_web_context_get_cache_model
</span><span class="cx"> webkit_web_context_set_cache_model
</span><span class="cx"> webkit_web_context_clear_cache
</span><span class="lines">@@ -1147,6 +1149,32 @@
</span><span class="cx"> &lt;/SECTION&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;SECTION&gt;
</span><ins>+&lt;FILE&gt;WebKitWebsiteDataManager&lt;/FILE&gt;
+WebKitWebsiteDataManager
+webkit_website_data_manager_new
+webkit_website_data_manager_get_base_data_directory
+webkit_website_data_manager_get_base_cache_directory
+webkit_website_data_manager_get_local_storage_directory
+webkit_website_data_manager_get_disk_cache_directory
+webkit_website_data_manager_get_offline_application_cache_directory
+webkit_website_data_manager_get_indexeddb_directory
+webkit_website_data_manager_get_websql_directory
+
+&lt;SUBSECTION Standard&gt;
+WebKitWebsiteDataManagerClass
+WEBKIT_TYPE_WEBSITE_DATA_MANAGER
+WEBKIT_WEBSITE_DATA_MANAGER
+WEBKIT_IS_WEBSITE_DATA_MANAGER
+WEBKIT_WEBSITE_DATA_MANAGER_CLASS
+WEBKIT_IS_WEBSITE_DATA_MANAGER_CLASS
+WEBKIT_WEBSITE_DATA_MANAGER_GET_CLASS
+
+&lt;SUBSECTION Private&gt;
+WebKitWebsiteDataManagerPrivate
+webkit_website_data_manager_get_type
+&lt;/SECTION&gt;
+
+&lt;SECTION&gt;
</ins><span class="cx"> &lt;FILE&gt;WebKitWebExtension&lt;/FILE&gt;
</span><span class="cx"> WebKitWebExtension
</span><span class="cx"> WebKitWebExtensionInitializeFunction
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtk40types"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0.types (185949 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0.types        2015-06-25 07:15:56 UTC (rev 185949)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0.types        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -29,3 +29,4 @@
</span><span class="cx"> webkit_certificate_info_get_type
</span><span class="cx"> webkit_user_content_manager_get_type
</span><span class="cx"> webkit_web_hit_test_result_get_type
</span><ins>+webkit_website_data_manager_get_type
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkwebkit2h"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h (185949 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h        2015-06-25 07:15:56 UTC (rev 185949)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -72,6 +72,7 @@
</span><span class="cx"> #include &lt;webkit2/WebKitWebResource.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitWebView.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitWebViewBase.h&gt;
</span><ins>+#include &lt;webkit2/WebKitWebsiteDataManager.h&gt;
</ins><span class="cx"> #include &lt;webkit2/WebKitWindowProperties.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #undef __WEBKIT2_H_INSIDE__
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (185949 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2015-06-25 07:15:56 UTC (rev 185949)
+++ trunk/Tools/ChangeLog        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2015-06-25  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [GTK] Add initial WebKitWebsiteDataManager API for process configuration options
+        https://bugs.webkit.org/show_bug.cgi?id=146149
+
+        Reviewed by Sergio Villar Senin.
+
+        Update unit tests to use WebKitWebsiteDataManager.
+
+        * TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebContext.cpp:
+        (testWebContextConfiguration):
+        (serverCallback):
+        * TestWebKitAPI/gtk/WebKit2Gtk/TestMain.h:
+        (Test::Test): Use WebKitWebsiteDataManager and set all possible
+        values to ensure unit tests don't write outside the temporary directory.
+        (Test::~Test): Explicitly reset the web context to ensure its
+        objects are released before the leaks check.
+        * TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.cpp:
+        (WebViewTest::wait): Fix the GSource used, since we are receiving
+        a double in seconds, but using g_timeout_add_seconds() that
+        expects an unsigned in seconds. Use GMainLoopSource to correctly
+        handle the value and simplify the code.
+
</ins><span class="cx"> 2015-06-24  Jason Marcell  &lt;jmarcell@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Work towards: Add status of Safari projects on iOS Dashboard on build-safari
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2GtkTestWebKitWebContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebContext.cpp (185949 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebContext.cpp        2015-06-25 07:15:56 UTC (rev 185949)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebContext.cpp        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -39,14 +39,86 @@
</span><span class="cx"> 
</span><span class="cx"> static void testWebContextConfiguration(WebViewTest* test, gconstpointer)
</span><span class="cx"> {
</span><ins>+    WebKitWebsiteDataManager* manager = webkit_web_context_get_website_data_manager(test-&gt;m_webContext.get());
+    g_assert(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager));
+    test-&gt;assertObjectIsDeletedWhenTestFinishes(G_OBJECT(manager));
+
+    // Base directories are not used by TestMain.
+    g_assert(!webkit_website_data_manager_get_base_data_directory(manager));
+    g_assert(!webkit_website_data_manager_get_base_cache_directory(manager));
+
</ins><span class="cx">     GUniquePtr&lt;char&gt; localStorageDirectory(g_build_filename(Test::dataDirectory(), &quot;local-storage&quot;, nullptr));
</span><ins>+    g_assert_cmpstr(localStorageDirectory.get(), ==, webkit_website_data_manager_get_local_storage_directory(manager));
</ins><span class="cx">     g_assert(g_file_test(localStorageDirectory.get(), G_FILE_TEST_IS_DIR));
</span><span class="cx"> 
</span><span class="cx">     test-&gt;loadURI(kServer-&gt;getURIForPath(&quot;/empty&quot;).data());
</span><span class="cx">     test-&gt;waitUntilLoadFinished();
</span><span class="cx">     test-&gt;runJavaScriptAndWaitUntilFinished(&quot;window.indexedDB.open('TestDatabase');&quot;, nullptr);
</span><span class="cx">     GUniquePtr&lt;char&gt; indexedDBDirectory(g_build_filename(Test::dataDirectory(), &quot;indexeddb&quot;, nullptr));
</span><ins>+    g_assert_cmpstr(indexedDBDirectory.get(), ==, webkit_website_data_manager_get_indexeddb_directory(manager));
</ins><span class="cx">     g_assert(g_file_test(indexedDBDirectory.get(), G_FILE_TEST_IS_DIR));
</span><ins>+
+    test-&gt;loadURI(kServer-&gt;getURIForPath(&quot;/appcache&quot;).data());
+    test-&gt;waitUntilLoadFinished();
+    GUniquePtr&lt;char&gt; applicationCacheDirectory(g_build_filename(Test::dataDirectory(), &quot;appcache&quot;, nullptr));
+    g_assert_cmpstr(applicationCacheDirectory.get(), ==, webkit_website_data_manager_get_offline_application_cache_directory(manager));
+    GUniquePtr&lt;char&gt; applicationCacheDatabase(g_build_filename(applicationCacheDirectory.get(), &quot;ApplicationCache.db&quot;, nullptr));
+    unsigned triesCount = 4;
+    while (!g_file_test(applicationCacheDatabase.get(), G_FILE_TEST_IS_REGULAR) &amp;&amp; --triesCount)
+        test-&gt;wait(0.25);
+    g_assert(triesCount);
+
+
+    GUniquePtr&lt;char&gt; webSQLDirectory(g_build_filename(Test::dataDirectory(), &quot;websql&quot;, nullptr));
+    g_assert_cmpstr(webSQLDirectory.get(), ==, webkit_website_data_manager_get_websql_directory(manager));
+#if 0 // FIXME: We need API to set the database quota for an origin to be able to test this.
+    test-&gt;runJavaScriptAndWaitUntilFinished(&quot;db = openDatabase(\&quot;TestDatabase\&quot;, \&quot;1.0\&quot;, \&quot;TestDatabase\&quot;, 1);&quot;, &amp;error);
+    g_assert(g_file_test(webSQLDirectory.get(), G_FILE_TEST_IS_DIR));
+#endif
+
+    GUniquePtr&lt;char&gt; diskCacheDirectory(g_build_filename(Test::dataDirectory(), &quot;disk-cache&quot;, nullptr));
+    g_assert_cmpstr(diskCacheDirectory.get(), ==, webkit_website_data_manager_get_disk_cache_directory(manager));
+    g_assert(g_file_test(diskCacheDirectory.get(), G_FILE_TEST_IS_DIR));
+
+    // The default context should have a different manager with different configuration.
+    WebKitWebsiteDataManager* defaultManager = webkit_web_context_get_website_data_manager(webkit_web_context_get_default());
+    g_assert(WEBKIT_IS_WEBSITE_DATA_MANAGER(defaultManager));
+    g_assert(manager != defaultManager);
+    g_assert_cmpstr(webkit_website_data_manager_get_local_storage_directory(manager), !=, webkit_website_data_manager_get_local_storage_directory(defaultManager));
+    g_assert_cmpstr(webkit_website_data_manager_get_indexeddb_directory(manager), !=, webkit_website_data_manager_get_indexeddb_directory(defaultManager));
+    g_assert_cmpstr(webkit_website_data_manager_get_disk_cache_directory(manager), !=, webkit_website_data_manager_get_disk_cache_directory(defaultManager));
+    g_assert_cmpstr(webkit_website_data_manager_get_offline_application_cache_directory(manager), !=, webkit_website_data_manager_get_offline_application_cache_directory(defaultManager));
+    g_assert_cmpstr(webkit_website_data_manager_get_websql_directory(manager), !=, webkit_website_data_manager_get_websql_directory(defaultManager));
+
+    // Using Test::dataDirectory() we get the default configuration but for a differrent prefix.
+    GRefPtr&lt;WebKitWebsiteDataManager&gt; baseDataManager = adoptGRef(webkit_website_data_manager_new(&quot;base-data-directory&quot;, Test::dataDirectory(), &quot;base-cache-directory&quot;, Test::dataDirectory(), nullptr));
+    g_assert(WEBKIT_IS_WEBSITE_DATA_MANAGER(baseDataManager.get()));
+
+    localStorageDirectory.reset(g_build_filename(Test::dataDirectory(), &quot;localstorage&quot;, nullptr));
+    g_assert_cmpstr(webkit_website_data_manager_get_local_storage_directory(baseDataManager.get()), ==, localStorageDirectory.get());
+
+    indexedDBDirectory.reset(g_build_filename(Test::dataDirectory(), &quot;databases&quot;, &quot;indexeddb&quot;, nullptr));
+    g_assert_cmpstr(webkit_website_data_manager_get_indexeddb_directory(baseDataManager.get()), ==, indexedDBDirectory.get());
+
+    applicationCacheDirectory.reset(g_build_filename(Test::dataDirectory(), &quot;applications&quot;, nullptr));
+    g_assert_cmpstr(webkit_website_data_manager_get_offline_application_cache_directory(baseDataManager.get()), ==, applicationCacheDirectory.get());
+
+    webSQLDirectory.reset(g_build_filename(Test::dataDirectory(), &quot;databases&quot;, nullptr));
+    g_assert_cmpstr(webkit_website_data_manager_get_websql_directory(baseDataManager.get()), ==, webSQLDirectory.get());
+
+    g_assert_cmpstr(webkit_website_data_manager_get_disk_cache_directory(baseDataManager.get()), ==, Test::dataDirectory());
+
+    // Any specific configuration provided takes precedence over base dirs.
+    indexedDBDirectory.reset(g_build_filename(Test::dataDirectory(), &quot;mycustomindexeddb&quot;, nullptr));
+    applicationCacheDirectory.reset(g_build_filename(Test::dataDirectory(), &quot;mycustomappcache&quot;, nullptr));
+    baseDataManager = adoptGRef(webkit_website_data_manager_new(&quot;base-data-directory&quot;, Test::dataDirectory(), &quot;base-cache-directory&quot;, Test::dataDirectory(),
+        &quot;indexeddb-directory&quot;, indexedDBDirectory.get(), &quot;offline-application-cache-directory&quot;, applicationCacheDirectory.get(), nullptr));
+    g_assert_cmpstr(webkit_website_data_manager_get_indexeddb_directory(baseDataManager.get()), ==, indexedDBDirectory.get());
+    g_assert_cmpstr(webkit_website_data_manager_get_offline_application_cache_directory(baseDataManager.get()), ==, applicationCacheDirectory.get());
+    // The resutl should be the same as previous manager.
+    g_assert_cmpstr(webkit_website_data_manager_get_local_storage_directory(baseDataManager.get()), ==, localStorageDirectory.get());
+    g_assert_cmpstr(webkit_website_data_manager_get_websql_directory(baseDataManager.get()), ==, webSQLDirectory.get());
+    g_assert_cmpstr(webkit_website_data_manager_get_disk_cache_directory(baseDataManager.get()), ==, Test::dataDirectory());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> class PluginsTest: public Test {
</span><span class="lines">@@ -351,6 +423,20 @@
</span><span class="cx">         soup_message_body_append(message-&gt;response_body, SOUP_MEMORY_STATIC, emptyHTML, strlen(emptyHTML));
</span><span class="cx">         soup_message_body_complete(message-&gt;response_body);
</span><span class="cx">         soup_message_set_status(message, SOUP_STATUS_OK);
</span><ins>+    } else if (g_str_equal(path, &quot;/appcache&quot;)) {
+        const char* appcacheHTML = &quot;&lt;html manifest=appcache.manifest&gt;&lt;body&gt;&lt;/body&gt;&lt;/html&gt;&quot;;
+        soup_message_body_append(message-&gt;response_body, SOUP_MEMORY_STATIC, appcacheHTML, strlen(appcacheHTML));
+        soup_message_body_complete(message-&gt;response_body);
+        soup_message_set_status(message, SOUP_STATUS_OK);
+    } else if (g_str_equal(path, &quot;/appcache.manifest&quot;)) {
+        const char* appcacheManifest = &quot;CACHE MANIFEST\nCACHE:\nappcache/foo.txt\n&quot;;
+        soup_message_body_append(message-&gt;response_body, SOUP_MEMORY_STATIC, appcacheManifest, strlen(appcacheManifest));
+        soup_message_body_complete(message-&gt;response_body);
+        soup_message_set_status(message, SOUP_STATUS_OK);
+    } else if (g_str_equal(path, &quot;/appcache/foo.txt&quot;)) {
+        soup_message_body_append(message-&gt;response_body, SOUP_MEMORY_STATIC, &quot;foo&quot;, 3);
+        soup_message_body_complete(message-&gt;response_body);
+        soup_message_set_status(message, SOUP_STATUS_OK);
</ins><span class="cx">     } else
</span><span class="cx">         soup_message_set_status(message, SOUP_STATUS_NOT_FOUND);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPIgtkWebKit2GtkTestMainh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/TestMain.h (185949 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/TestMain.h        2015-06-25 07:15:56 UTC (rev 185949)
+++ trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/TestMain.h        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -69,19 +69,22 @@
</span><span class="cx">     {
</span><span class="cx">         GUniquePtr&lt;char&gt; localStorageDirectory(g_build_filename(dataDirectory(), &quot;local-storage&quot;, nullptr));
</span><span class="cx">         GUniquePtr&lt;char&gt; indexedDBDirectory(g_build_filename(dataDirectory(), &quot;indexeddb&quot;, nullptr));
</span><del>-        m_webContext = adoptGRef(WEBKIT_WEB_CONTEXT(g_object_new(WEBKIT_TYPE_WEB_CONTEXT,
-            &quot;local-storage-directory&quot;, localStorageDirectory.get(),
-            &quot;indexed-db-directory&quot;, indexedDBDirectory.get(),
-            nullptr)));
</del><ins>+        GUniquePtr&lt;char&gt; diskCacheDirectory(g_build_filename(dataDirectory(), &quot;disk-cache&quot;, nullptr));
+        GUniquePtr&lt;char&gt; applicationCacheDirectory(g_build_filename(dataDirectory(), &quot;appcache&quot;, nullptr));
+        GUniquePtr&lt;char&gt; webSQLDirectory(g_build_filename(dataDirectory(), &quot;websql&quot;, nullptr));
+        GRefPtr&lt;WebKitWebsiteDataManager&gt; websiteDataManager = adoptGRef(webkit_website_data_manager_new(
+            &quot;local-storage-directory&quot;, localStorageDirectory.get(), &quot;indexeddb-directory&quot;, indexedDBDirectory.get(),
+            &quot;disk-cache-directory&quot;, diskCacheDirectory.get(), &quot;offline-application-cache-directory&quot;, applicationCacheDirectory.get(),
+            &quot;websql-directory&quot;, webSQLDirectory.get(), nullptr));
</ins><span class="cx"> 
</span><ins>+        m_webContext = adoptGRef(webkit_web_context_new_with_website_data_manager(websiteDataManager.get()));
</ins><span class="cx">         g_signal_connect(m_webContext.get(), &quot;initialize-web-extensions&quot;, G_CALLBACK(initializeWebExtensionsCallback), this);
</span><del>-        GUniquePtr&lt;char&gt; diskCacheDirectory(g_build_filename(dataDirectory(), &quot;disk-cache&quot;, nullptr));
-        webkit_web_context_set_disk_cache_directory(m_webContext.get(), diskCacheDirectory.get());
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ~Test()
</span><span class="cx">     {
</span><span class="cx">         g_signal_handlers_disconnect_matched(m_webContext.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this);
</span><ins>+        m_webContext = nullptr;
</ins><span class="cx">         if (m_watchedObjects.isEmpty())
</span><span class="cx">             return;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPIgtkWebKit2GtkWebViewTestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.cpp (185949 => 185950)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.cpp        2015-06-25 07:15:56 UTC (rev 185949)
+++ trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.cpp        2015-06-25 07:51:32 UTC (rev 185950)
</span><span class="lines">@@ -23,6 +23,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;JavaScriptCore/JSRetainPtr.h&gt;
</span><span class="cx"> #include &lt;WebCore/GUniquePtrGtk.h&gt;
</span><ins>+#include &lt;wtf/glib/GMainLoopSource.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> WebViewTest::WebViewTest(WebKitUserContentManager* userContentManager)
</span><span class="cx">     : m_webView(WEBKIT_WEB_VIEW(g_object_ref_sink(g_object_new(WEBKIT_TYPE_WEB_VIEW, &quot;web-context&quot;, m_webContext.get(), &quot;user-content-manager&quot;, userContentManager, nullptr))))
</span><span class="lines">@@ -179,15 +180,10 @@
</span><span class="cx">     quitMainLoop();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static gboolean quitMainLoopIdleCallback(WebViewTest* test)
-{
-    test-&gt;quitMainLoop();
-    return FALSE;
-}
-
</del><span class="cx"> void WebViewTest::wait(double seconds)
</span><span class="cx"> {
</span><del>-    g_timeout_add_seconds(seconds, reinterpret_cast&lt;GSourceFunc&gt;(quitMainLoopIdleCallback), this);
</del><ins>+    GMainLoopSource::scheduleAfterDelayAndDeleteOnDestroy(&quot;WebViewTest wait&quot;, [this] { quitMainLoop(); },
+        std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(std::chrono::duration&lt;double&gt;(seconds)));
</ins><span class="cx">     g_main_loop_run(m_mainLoop);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>