[SCM] WebKit Debian packaging branch, debian/experimental, updated. debian/1.3.8-1-1049-g2e11a8e

weinig at apple.com weinig at apple.com
Fri Jan 21 14:43:26 UTC 2011


The following commit has been merged in the debian/experimental branch:
commit 6f13e88a54c887e3cdae5af2001519a8c9b8fb54
Author: weinig at apple.com <weinig at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Dec 27 19:17:31 2010 +0000

    WebKit2: Add additional API for managing databases
    https://bugs.webkit.org/show_bug.cgi?id=51629
    
    Reviewed by Anders Carlsson.
    
    - Adds WKDatabaseManagerGetDatabasesByOrigin, which asynchronously returns
      an array of dictionaries containing details about each origin using
      databases and details about each database. Keys were added for accessing
      the data in the dictionaries.
    - Adds WKDatabaseManagerDeleteDatabasesWithNameForOrigin to delete a database
      with a specific identifier.
    - Adds WKDatabaseManagerSetQuotaForOrigin to set the quota for an origin.
    
    * Shared/OriginAndDatabases.cpp: Added.
    (WebKit::OriginAndDatabases::encode):
    (WebKit::OriginAndDatabases::decode):
    * Shared/OriginAndDatabases.h: Added.
    * Shared/WebCoreArgumentCoders.h:
    * UIProcess/API/C/WKDatabaseManager.cpp:
    (WKDatabaseManagerGetOriginKey):
    (WKDatabaseManagerGetOriginQuotaKey):
    (WKDatabaseManagerGetOriginUsageKey):
    (WKDatabaseManagerGetDatabaseDetailsKey):
    (WKDatabaseManagerGetDatabaseDetailsNameKey):
    (WKDatabaseManagerGetDatabaseDetailsDisplayNameKey):
    (WKDatabaseManagerGetDatabaseDetailsExpectedUsageKey):
    (WKDatabaseManagerGetDatabaseDetailsCurrentUsageKey):
    (WKDatabaseManagerGetDatabasesByOrigin):
    (callGetDatabasesByOriginBlockAndDispose):
    (WKDatabaseManagerGetDatabasesByOrigin_b):
    (WKDatabaseManagerGetDatabaseOrigins):
    (callGetDatabaseOriginsBlockBlockAndDispose):
    (WKDatabaseManagerGetDatabaseOrigins_b):
    (WKDatabaseManagerDeleteDatabasesWithNameForOrigin):
    (WKDatabaseManagerDeleteDatabasesForOrigin):
    (WKDatabaseManagerDeleteAllDatabases):
    (WKDatabaseManagerSetQuotaForOrigin):
    * UIProcess/API/C/WKDatabaseManager.h:
    * UIProcess/WebDatabaseManagerProxy.cpp:
    (WebKit::WebDatabaseManagerProxy::originKey):
    (WebKit::WebDatabaseManagerProxy::originQuotaKey):
    (WebKit::WebDatabaseManagerProxy::originUsageKey):
    (WebKit::WebDatabaseManagerProxy::databaseDetailsKey):
    (WebKit::WebDatabaseManagerProxy::databaseDetailsNameKey):
    (WebKit::WebDatabaseManagerProxy::databaseDetailsDisplayNameKey):
    (WebKit::WebDatabaseManagerProxy::databaseDetailsExpectedUsageKey):
    (WebKit::WebDatabaseManagerProxy::databaseDetailsCurrentUsageKey):
    (WebKit::WebDatabaseManagerProxy::invalidate):
    (WebKit::WebDatabaseManagerProxy::getDatabasesByOrigin):
    (WebKit::WebDatabaseManagerProxy::didGetDatabasesByOrigin):
    (WebKit::WebDatabaseManagerProxy::getDatabaseOrigins):
    (WebKit::WebDatabaseManagerProxy::didGetDatabaseOrigins):
    (WebKit::WebDatabaseManagerProxy::deleteDatabaseWithNameForOrigin):
    (WebKit::WebDatabaseManagerProxy::deleteDatabasesForOrigin):
    (WebKit::WebDatabaseManagerProxy::setQuotaForOrigin):
    * UIProcess/WebDatabaseManagerProxy.h:
    * UIProcess/WebDatabaseManagerProxy.messages.in:
    * WebKit2.pro:
    * WebKit2.xcodeproj/project.pbxproj:
    * WebProcess/WebCoreSupport/WebDatabaseManager.cpp:
    (WebKit::WebDatabaseManager::getDatabasesByOrigin):
    (WebKit::WebDatabaseManager::deleteDatabaseWithNameForOrigin):
    (WebKit::WebDatabaseManager::setQuotaForOrigin):
    * WebProcess/WebCoreSupport/WebDatabaseManager.h:
    * WebProcess/WebCoreSupport/WebDatabaseManager.messages.in:
    * win/WebKit2.vcproj:
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@74690 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index 7e46e86..9d2757c 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,72 @@
+2010-12-27  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Anders Carlsson.
+
+        WebKit2: Add additional API for managing databases
+        https://bugs.webkit.org/show_bug.cgi?id=51629
+
+        - Adds WKDatabaseManagerGetDatabasesByOrigin, which asynchronously returns
+          an array of dictionaries containing details about each origin using 
+          databases and details about each database. Keys were added for accessing
+          the data in the dictionaries.
+        - Adds WKDatabaseManagerDeleteDatabasesWithNameForOrigin to delete a database
+          with a specific identifier.
+        - Adds WKDatabaseManagerSetQuotaForOrigin to set the quota for an origin.
+
+        * Shared/OriginAndDatabases.cpp: Added.
+        (WebKit::OriginAndDatabases::encode):
+        (WebKit::OriginAndDatabases::decode):
+        * Shared/OriginAndDatabases.h: Added.
+        * Shared/WebCoreArgumentCoders.h:
+        * UIProcess/API/C/WKDatabaseManager.cpp:
+        (WKDatabaseManagerGetOriginKey):
+        (WKDatabaseManagerGetOriginQuotaKey):
+        (WKDatabaseManagerGetOriginUsageKey):
+        (WKDatabaseManagerGetDatabaseDetailsKey):
+        (WKDatabaseManagerGetDatabaseDetailsNameKey):
+        (WKDatabaseManagerGetDatabaseDetailsDisplayNameKey):
+        (WKDatabaseManagerGetDatabaseDetailsExpectedUsageKey):
+        (WKDatabaseManagerGetDatabaseDetailsCurrentUsageKey):
+        (WKDatabaseManagerGetDatabasesByOrigin):
+        (callGetDatabasesByOriginBlockAndDispose):
+        (WKDatabaseManagerGetDatabasesByOrigin_b):
+        (WKDatabaseManagerGetDatabaseOrigins):
+        (callGetDatabaseOriginsBlockBlockAndDispose):
+        (WKDatabaseManagerGetDatabaseOrigins_b):
+        (WKDatabaseManagerDeleteDatabasesWithNameForOrigin):
+        (WKDatabaseManagerDeleteDatabasesForOrigin):
+        (WKDatabaseManagerDeleteAllDatabases):
+        (WKDatabaseManagerSetQuotaForOrigin):
+        * UIProcess/API/C/WKDatabaseManager.h:
+        * UIProcess/WebDatabaseManagerProxy.cpp:
+        (WebKit::WebDatabaseManagerProxy::originKey):
+        (WebKit::WebDatabaseManagerProxy::originQuotaKey):
+        (WebKit::WebDatabaseManagerProxy::originUsageKey):
+        (WebKit::WebDatabaseManagerProxy::databaseDetailsKey):
+        (WebKit::WebDatabaseManagerProxy::databaseDetailsNameKey):
+        (WebKit::WebDatabaseManagerProxy::databaseDetailsDisplayNameKey):
+        (WebKit::WebDatabaseManagerProxy::databaseDetailsExpectedUsageKey):
+        (WebKit::WebDatabaseManagerProxy::databaseDetailsCurrentUsageKey):
+        (WebKit::WebDatabaseManagerProxy::invalidate):
+        (WebKit::WebDatabaseManagerProxy::getDatabasesByOrigin):
+        (WebKit::WebDatabaseManagerProxy::didGetDatabasesByOrigin):
+        (WebKit::WebDatabaseManagerProxy::getDatabaseOrigins):
+        (WebKit::WebDatabaseManagerProxy::didGetDatabaseOrigins):
+        (WebKit::WebDatabaseManagerProxy::deleteDatabaseWithNameForOrigin):
+        (WebKit::WebDatabaseManagerProxy::deleteDatabasesForOrigin):
+        (WebKit::WebDatabaseManagerProxy::setQuotaForOrigin):
+        * UIProcess/WebDatabaseManagerProxy.h:
+        * UIProcess/WebDatabaseManagerProxy.messages.in:
+        * WebKit2.pro:
+        * WebKit2.xcodeproj/project.pbxproj:
+        * WebProcess/WebCoreSupport/WebDatabaseManager.cpp:
+        (WebKit::WebDatabaseManager::getDatabasesByOrigin):
+        (WebKit::WebDatabaseManager::deleteDatabaseWithNameForOrigin):
+        (WebKit::WebDatabaseManager::setQuotaForOrigin):
+        * WebProcess/WebCoreSupport/WebDatabaseManager.h:
+        * WebProcess/WebCoreSupport/WebDatabaseManager.messages.in:
+        * win/WebKit2.vcproj:
+
 2010-12-26  Anders Carlsson  <andersca at apple.com>
 
         Reviewed by Dan Bernstein.
diff --git a/WebKit2/Shared/OriginAndDatabases.cpp b/WebKit2/Shared/OriginAndDatabases.cpp
new file mode 100644
index 0000000..4db7bf0
--- /dev/null
+++ b/WebKit2/Shared/OriginAndDatabases.cpp
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2010 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#include "OriginAndDatabases.h"
+
+#include "WebCoreArgumentCoders.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void OriginAndDatabases::encode(CoreIPC::ArgumentEncoder* encoder) const
+{
+    encoder->encode(CoreIPC::In(originIdentifier, originQuota, originUsage, databases));
+}
+
+bool OriginAndDatabases::decode(CoreIPC::ArgumentDecoder* decoder, OriginAndDatabases& originAndDatabases)
+{
+    return decoder->decode(CoreIPC::Out(originAndDatabases.originIdentifier, originAndDatabases.originQuota, originAndDatabases.originUsage, originAndDatabases.databases));
+}
+
+} // namespace WebKit
diff --git a/WebKit2/Shared/OriginAndDatabases.h b/WebKit2/Shared/OriginAndDatabases.h
new file mode 100644
index 0000000..c136e8f
--- /dev/null
+++ b/WebKit2/Shared/OriginAndDatabases.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2010 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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 OriginAndDatabases_h
+#define OriginAndDatabases_h
+
+#include <WebCore/DatabaseDetails.h>
+#include <wtf/Vector.h>
+#include <wtf/text/WTFString.h>
+
+namespace CoreIPC {
+    class ArgumentDecoder;
+    class ArgumentEncoder;
+}
+
+namespace WebKit {
+
+struct OriginAndDatabases {
+    void encode(CoreIPC::ArgumentEncoder*) const;
+    static bool decode(CoreIPC::ArgumentDecoder*, OriginAndDatabases&);
+
+    String originIdentifier;
+    unsigned long long originQuota;
+    unsigned long long originUsage;
+    Vector<WebCore::DatabaseDetails> databases;
+};
+
+} // namespace WebKit
+
+#endif // OriginAndDatabases_h
diff --git a/WebKit2/Shared/WebCoreArgumentCoders.h b/WebKit2/Shared/WebCoreArgumentCoders.h
index b46e258..b7ead18 100644
--- a/WebKit2/Shared/WebCoreArgumentCoders.h
+++ b/WebKit2/Shared/WebCoreArgumentCoders.h
@@ -33,6 +33,7 @@
 #include <WebCore/AuthenticationChallenge.h>
 #include <WebCore/Credential.h>
 #include <WebCore/Cursor.h>
+#include <WebCore/DatabaseDetails.h>
 #include <WebCore/Editor.h>
 #include <WebCore/FloatRect.h>
 #include <WebCore/IntRect.h>
@@ -315,6 +316,38 @@ template<> struct ArgumentCoder<WebCore::WindowFeatures> {
     }
 };
 
+template<> struct ArgumentCoder<WebCore::Color> {
+    static void encode(ArgumentEncoder* encoder, const WebCore::Color& color)
+    {
+        if (!color.isValid()) {
+            encoder->encodeBool(false);
+            return;
+        }
+
+        encoder->encodeBool(true);
+        encoder->encode(color.rgb());
+    }
+
+    static bool decode(ArgumentDecoder* decoder, WebCore::Color& color)
+    {
+        bool isValid;
+        if (!decoder->decode(isValid))
+            return false;
+
+        if (!isValid) {
+            color = WebCore::Color();
+            return true;
+        }
+
+        WebCore::RGBA32 rgba;
+        if (!decoder->decode(rgba))
+            return false;
+
+        color = WebCore::Color(rgba);
+        return true;
+    }
+};
+
 #if PLATFORM(MAC)
 template<> struct ArgumentCoder<WebCore::KeypressCommand> {
     static void encode(ArgumentEncoder* encoder, const WebCore::KeypressCommand& keypressCommand)
@@ -337,14 +370,30 @@ template<> struct ArgumentCoder<WebCore::CompositionUnderline> {
     
     static bool decode(ArgumentDecoder* decoder, WebCore::CompositionUnderline& underline)
     {
-        uint32_t rgb;
-        if (!decoder->decode(CoreIPC::Out(underline.startOffset, underline.endOffset, underline.thick, rgb)))
+        return decoder->decode(CoreIPC::Out(underline.startOffset, underline.endOffset, underline.thick, underline.color));
+    }
+};
+
+template<> struct ArgumentCoder<WebCore::DatabaseDetails> {
+    static void encode(ArgumentEncoder* encoder, const WebCore::DatabaseDetails& details)
+    {
+        encoder->encode(CoreIPC::In(details.name(), details.displayName(), details.expectedUsage(), details.currentUsage()));
+    }
+    
+    static bool decode(ArgumentDecoder* decoder, WebCore::DatabaseDetails& details)
+    {
+        String name;
+        String displayName;
+        unsigned long long expectedUsage;
+        unsigned long long currentUsage;
+        if (!decoder->decode(CoreIPC::Out(name, displayName, expectedUsage, currentUsage)))
             return false;
-        underline.color = rgb;
+        
+        details = WebCore::DatabaseDetails(name, displayName, expectedUsage, currentUsage);
         return true;
     }
 };
-    
+
 } // namespace CoreIPC
 
 #endif // WebCoreArgumentCoders_h
diff --git a/WebKit2/UIProcess/API/C/WKDatabaseManager.cpp b/WebKit2/UIProcess/API/C/WKDatabaseManager.cpp
index bc789a1..52aa5be 100644
--- a/WebKit2/UIProcess/API/C/WKDatabaseManager.cpp
+++ b/WebKit2/UIProcess/API/C/WKDatabaseManager.cpp
@@ -39,32 +39,108 @@ WKTypeID WKDatabaseManagerGetTypeID()
     return toAPI(WebDatabaseManagerProxy::APIType);
 }
 
-void WKDatabaseManagerGetDatabaseOrigins(WKDatabaseManagerRef databaseManager, void* context, WKDatabaseManagerGetDatabaseOriginsFunction callback)
+WKStringRef WKDatabaseManagerGetOriginKey()
 {
-    toImpl(databaseManager)->getDatabaseOrigins(DatabaseOriginsCallback::create(context, callback));
+    static WebString* key = WebString::create(WebDatabaseManagerProxy::originKey()).releaseRef();
+    return toAPI(key);
+}
+
+WKStringRef WKDatabaseManagerGetOriginQuotaKey()
+{
+    static WebString* key = WebString::create(WebDatabaseManagerProxy::originQuotaKey()).releaseRef();
+    return toAPI(key);
+}
+
+WKStringRef WKDatabaseManagerGetOriginUsageKey()
+{
+    static WebString* key = WebString::create(WebDatabaseManagerProxy::originUsageKey()).releaseRef();
+    return toAPI(key);
+}
+
+WKStringRef WKDatabaseManagerGetDatabaseDetailsKey()
+{
+    static WebString* key = WebString::create(WebDatabaseManagerProxy::databaseDetailsKey()).releaseRef();
+    return toAPI(key);
+}
+
+WKStringRef WKDatabaseManagerGetDatabaseDetailsNameKey()
+{
+    static WebString* key = WebString::create(WebDatabaseManagerProxy::databaseDetailsNameKey()).releaseRef();
+    return toAPI(key);
+}
+
+WKStringRef WKDatabaseManagerGetDatabaseDetailsDisplayNameKey()
+{
+    static WebString* key = WebString::create(WebDatabaseManagerProxy::databaseDetailsDisplayNameKey()).releaseRef();
+    return toAPI(key);
+}
+
+WKStringRef WKDatabaseManagerGetDatabaseDetailsExpectedUsageKey()
+{
+    static WebString* key = WebString::create(WebDatabaseManagerProxy::databaseDetailsExpectedUsageKey()).releaseRef();
+    return toAPI(key);
+}
+
+WKStringRef WKDatabaseManagerGetDatabaseDetailsCurrentUsageKey()
+{
+    static WebString* key = WebString::create(WebDatabaseManagerProxy::databaseDetailsCurrentUsageKey()).releaseRef();
+    return toAPI(key);
+}
+
+void WKDatabaseManagerGetDatabasesByOrigin(WKDatabaseManagerRef databaseManagerRef, void* context, WKDatabaseManagerGetDatabasesByOriginFunction callback)
+{
+    toImpl(databaseManagerRef)->getDatabasesByOrigin(ArrayCallback::create(context, callback));
+}
+
+#ifdef __BLOCKS__
+static void callGetDatabasesByOriginBlockAndDispose(WKArrayRef resultValue, WKErrorRef errorRef, void* context)
+{
+    WKDatabaseManagerGetDatabasesByOriginBlock block = (WKDatabaseManagerGetDatabasesByOriginBlock)context;
+    block(resultValue, errorRef);
+    Block_release(block);
+}
+
+void WKDatabaseManagerGetDatabasesByOrigin_b(WKDatabaseManagerRef databaseManagerRef, WKDatabaseManagerGetDatabasesByOriginBlock block)
+{
+    WKDatabaseManagerGetDatabasesByOrigin(databaseManagerRef, Block_copy(block), callGetDatabasesByOriginBlockAndDispose);
+}
+#endif
+
+void WKDatabaseManagerGetDatabaseOrigins(WKDatabaseManagerRef databaseManagerRef, void* context, WKDatabaseManagerGetDatabaseOriginsFunction callback)
+{
+    toImpl(databaseManagerRef)->getDatabaseOrigins(ArrayCallback::create(context, callback));
 }
 
 #ifdef __BLOCKS__
-static void callGetDatabaseOriginsBlockBlockAndDispose(WKArrayRef resultValue, WKErrorRef error, void* context)
+static void callGetDatabaseOriginsBlockBlockAndDispose(WKArrayRef resultValue, WKErrorRef errorRef, void* context)
 {
     WKDatabaseManagerGetDatabaseOriginsBlock block = (WKDatabaseManagerGetDatabaseOriginsBlock)context;
-    block(resultValue, error);
+    block(resultValue, errorRef);
     Block_release(block);
 }
 
-void WKDatabaseManagerGetDatabaseOrigins_b(WKDatabaseManagerRef databaseManager, WKDatabaseManagerGetDatabaseOriginsBlock block)
+void WKDatabaseManagerGetDatabaseOrigins_b(WKDatabaseManagerRef databaseManagerRef, WKDatabaseManagerGetDatabaseOriginsBlock block)
 {
-    WKDatabaseManagerGetDatabaseOrigins(databaseManager, Block_copy(block), callGetDatabaseOriginsBlockBlockAndDispose);
+    WKDatabaseManagerGetDatabaseOrigins(databaseManagerRef, Block_copy(block), callGetDatabaseOriginsBlockBlockAndDispose);
 }
 #endif
 
-void WKDatabaseManagerDeleteDatabasesForOrigin(WKDatabaseManagerRef databaseManager, WKSecurityOriginRef origin)
+void WKDatabaseManagerDeleteDatabasesWithNameForOrigin(WKDatabaseManagerRef databaseManagerRef, WKStringRef databaseNameRef, WKSecurityOriginRef originRef)
 {
-    toImpl(databaseManager)->deleteDatabasesForOrigin(toImpl(origin));
+    toImpl(databaseManagerRef)->deleteDatabaseWithNameForOrigin(toWTFString(databaseNameRef), toImpl(originRef));
 }
 
-void WKDatabaseManagerDeleteAllDatabases(WKDatabaseManagerRef databaseManager)
+void WKDatabaseManagerDeleteDatabasesForOrigin(WKDatabaseManagerRef databaseManagerRef, WKSecurityOriginRef originRef)
 {
-    toImpl(databaseManager)->deleteAllDatabases();
+    toImpl(databaseManagerRef)->deleteDatabasesForOrigin(toImpl(originRef));
 }
 
+void WKDatabaseManagerDeleteAllDatabases(WKDatabaseManagerRef databaseManagerRef)
+{
+    toImpl(databaseManagerRef)->deleteAllDatabases();
+}
+
+void WKDatabaseManagerSetQuotaForOrigin(WKDatabaseManagerRef databaseManagerRef, WKSecurityOriginRef originRef, uint64_t quota)
+{
+    toImpl(databaseManagerRef)->setQuotaForOrigin(toImpl(originRef), quota);
+}
diff --git a/WebKit2/UIProcess/API/C/WKDatabaseManager.h b/WebKit2/UIProcess/API/C/WKDatabaseManager.h
index 4b73c2a..a4c97a6 100644
--- a/WebKit2/UIProcess/API/C/WKDatabaseManager.h
+++ b/WebKit2/UIProcess/API/C/WKDatabaseManager.h
@@ -34,15 +34,55 @@ extern "C" {
 
 WK_EXPORT WKTypeID WKDatabaseManagerGetTypeID();
 
+/* Value type: WKSecurityOriginRef */
+WK_EXPORT WKStringRef WKDatabaseManagerGetOriginKey();
+
+/* Value type: WKUInt64Ref */
+WK_EXPORT WKStringRef WKDatabaseManagerGetOriginQuotaKey();
+
+/* Value type: WKUInt64Ref */
+WK_EXPORT WKStringRef WKDatabaseManagerGetOriginUsageKey();
+
+/* Value type: WKArrayRef (array of WKDictionaryRef's with keys that include:
+       - WKDatabaseManagerGetDatabaseNameKey()
+       - WKDatabaseManagerGetDatabaseDisplayNameKey()
+       - WKDatabaseManagerGetDatabaseExpectedUsageKey()
+       - WKDatabaseManagerGetDatabaseCurrentUsageKey()
+ */
+WK_EXPORT WKStringRef WKDatabaseManagerGetDatabaseDetailsKey();
+
+/* Value type: WKStringRef */
+WK_EXPORT WKStringRef WKDatabaseManagerGetDatabaseDetailsNameKey();
+
+/* Value type: WKStringRef */
+WK_EXPORT WKStringRef WKDatabaseManagerGetDatabaseDetailsDisplayNameKey();
+
+/* Value type: WKUInt64Ref */
+WK_EXPORT WKStringRef WKDatabaseManagerGetDatabaseDetailsExpectedUsageKey();
+
+/* Value type: WKUInt64Ref */
+WK_EXPORT WKStringRef WKDatabaseManagerGetDatabaseDetailsCurrentUsageKey();
+
+typedef void (*WKDatabaseManagerGetDatabasesByOriginFunction)(WKArrayRef, WKErrorRef, void*);
+WK_EXPORT void WKDatabaseManagerGetDatabasesByOrigin(WKDatabaseManagerRef contextRef, void* context, WKDatabaseManagerGetDatabasesByOriginFunction function);
+#ifdef __BLOCKS__
+typedef void (^WKDatabaseManagerGetDatabasesByOriginBlock)(WKArrayRef, WKErrorRef);
+WK_EXPORT void WKDatabaseManagerGetDatabasesByOrigin_b(WKDatabaseManagerRef databaseManager, WKDatabaseManagerGetDatabasesByOriginBlock block);
+#endif
+
 typedef void (*WKDatabaseManagerGetDatabaseOriginsFunction)(WKArrayRef, WKErrorRef, void*);
 WK_EXPORT void WKDatabaseManagerGetDatabaseOrigins(WKDatabaseManagerRef contextRef, void* context, WKDatabaseManagerGetDatabaseOriginsFunction function);
 #ifdef __BLOCKS__
 typedef void (^WKDatabaseManagerGetDatabaseOriginsBlock)(WKArrayRef, WKErrorRef);
 WK_EXPORT void WKDatabaseManagerGetDatabaseOrigins_b(WKDatabaseManagerRef databaseManager, WKDatabaseManagerGetDatabaseOriginsBlock block);
 #endif
+
+WK_EXPORT void WKDatabaseManagerDeleteDatabasesWithNameForOrigin(WKDatabaseManagerRef databaseManager, WKStringRef databaseName, WKSecurityOriginRef origin);
 WK_EXPORT void WKDatabaseManagerDeleteDatabasesForOrigin(WKDatabaseManagerRef databaseManager, WKSecurityOriginRef origin);
 WK_EXPORT void WKDatabaseManagerDeleteAllDatabases(WKDatabaseManagerRef databaseManager);
 
+WK_EXPORT void WKDatabaseManagerSetQuotaForOrigin(WKDatabaseManagerRef databaseManager, WKSecurityOriginRef origin, uint64_t quota);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/WebKit2/UIProcess/WebDatabaseManagerProxy.cpp b/WebKit2/UIProcess/WebDatabaseManagerProxy.cpp
index 11755df..eccb16b 100644
--- a/WebKit2/UIProcess/WebDatabaseManagerProxy.cpp
+++ b/WebKit2/UIProcess/WebDatabaseManagerProxy.cpp
@@ -26,6 +26,7 @@
 #include "WebDatabaseManagerProxy.h"
 
 #include "ImmutableArray.h"
+#include "ImmutableDictionary.h"
 #include "WebDatabaseManagerMessages.h"
 #include "WebContext.h"
 #include "WebSecurityOrigin.h"
@@ -34,6 +35,54 @@ using namespace WebCore;
 
 namespace WebKit {
 
+String WebDatabaseManagerProxy::originKey()
+{
+    DEFINE_STATIC_LOCAL(String, key, ("WebDatabaseManagerOriginKey"));
+    return key;
+}
+
+String WebDatabaseManagerProxy::originQuotaKey()
+{
+    DEFINE_STATIC_LOCAL(String, key, ("WebDatabaseManagerOriginQuotaKey"));
+    return key;
+}
+
+String WebDatabaseManagerProxy::originUsageKey()
+{
+    DEFINE_STATIC_LOCAL(String, key, ("WebDatabaseManagerOriginUsageKey"));
+    return key;
+}
+
+String WebDatabaseManagerProxy::databaseDetailsKey()
+{
+    DEFINE_STATIC_LOCAL(String, key, ("WebDatabaseManagerDatabaseDetailsKey"));
+    return key;
+}
+
+String WebDatabaseManagerProxy::databaseDetailsNameKey()
+{
+    DEFINE_STATIC_LOCAL(String, key, ("WebDatabaseManagerDatabaseDetailsNameKey"));
+    return key;
+}
+
+String WebDatabaseManagerProxy::databaseDetailsDisplayNameKey()
+{
+    DEFINE_STATIC_LOCAL(String, key, ("WebDatabaseManagerDatabaseDetailsDisplayNameKey"));
+    return key;
+}
+
+String WebDatabaseManagerProxy::databaseDetailsExpectedUsageKey()
+{
+    DEFINE_STATIC_LOCAL(String, key, ("WebDatabaseManagerDatabaseDetailsExpectedUsageKey"));
+    return key;
+}
+
+String WebDatabaseManagerProxy::databaseDetailsCurrentUsageKey()
+{
+    DEFINE_STATIC_LOCAL(String, key, ("WebDatabaseManagerDatabaseDetailsCurrentUsageKey"));
+    return key;
+}
+
 PassRefPtr<WebDatabaseManagerProxy> WebDatabaseManagerProxy::create(WebContext* webContext)
 {
     return adoptRef(new WebDatabaseManagerProxy(webContext));
@@ -50,22 +99,74 @@ WebDatabaseManagerProxy::~WebDatabaseManagerProxy()
 
 void WebDatabaseManagerProxy::invalidate()
 {
-    invalidateCallbackMap(m_databaseOriginsCallbacks);
+    invalidateCallbackMap(m_arrayCallbacks);
 
     m_webContext = 0;
 }
 
-void WebDatabaseManagerProxy::getDatabaseOrigins(PassRefPtr<DatabaseOriginsCallback> prpCallback)
+void WebDatabaseManagerProxy::getDatabasesByOrigin(PassRefPtr<ArrayCallback> prpCallback)
 {
-    RefPtr<DatabaseOriginsCallback> callback = prpCallback;
+    RefPtr<ArrayCallback> callback = prpCallback;
     uint64_t callbackID = callback->callbackID();
-    m_databaseOriginsCallbacks.set(callbackID, callback.release());
+    m_arrayCallbacks.set(callbackID, callback.release());
+    m_webContext->process()->send(Messages::WebDatabaseManager::GetDatabasesByOrigin(callbackID), 0);
+}
+
+
+void WebDatabaseManagerProxy::didGetDatabasesByOrigin(const Vector<OriginAndDatabases>& originAndDatabasesVector, uint64_t callbackID)
+{
+    RefPtr<ArrayCallback> callback = m_arrayCallbacks.take(callbackID);
+    if (!callback) {
+        // FIXME: Log error or assert.
+        return;
+    }
+
+    size_t originAndDatabasesCount = originAndDatabasesVector.size();
+    Vector<RefPtr<APIObject> > result(originAndDatabasesCount);
+
+    for (size_t i = 0; i < originAndDatabasesCount; ++i) {
+        const OriginAndDatabases& originAndDatabases = originAndDatabasesVector[i];
+    
+        RefPtr<APIObject> origin = WebSecurityOrigin::create(originAndDatabases.originIdentifier);
+    
+        size_t databasesCount = originAndDatabases.databases.size();
+        Vector<RefPtr<APIObject> > databases(databasesCount);
+    
+        for (size_t j = 0; j < databasesCount; ++j) {
+            const DatabaseDetails& details = originAndDatabases.databases[i];
+            HashMap<String, RefPtr<APIObject> > detailsMap;
+
+            detailsMap.set(databaseDetailsNameKey(), WebString::create(details.name()));
+            detailsMap.set(databaseDetailsDisplayNameKey(), WebString::create(details.displayName()));
+            detailsMap.set(databaseDetailsExpectedUsageKey(), WebUInt64::create(details.expectedUsage()));
+            detailsMap.set(databaseDetailsCurrentUsageKey(), WebUInt64::create(details.currentUsage()));
+            databases.append(ImmutableDictionary::adopt(detailsMap));
+        }
+
+        HashMap<String, RefPtr<APIObject> > originAndDatabasesMap;
+        originAndDatabasesMap.set(originKey(), origin);
+        originAndDatabasesMap.set(originQuotaKey(), WebUInt64::create(originAndDatabases.originQuota));
+        originAndDatabasesMap.set(originUsageKey(), WebUInt64::create(originAndDatabases.originUsage));
+        originAndDatabasesMap.set(databaseDetailsKey(), ImmutableArray::adopt(databases));
+
+        result.append(ImmutableDictionary::adopt(originAndDatabasesMap));
+    }
+
+    RefPtr<ImmutableArray> resultArray = ImmutableArray::adopt(result);
+    callback->performCallbackWithReturnValue(resultArray.get());
+}
+
+void WebDatabaseManagerProxy::getDatabaseOrigins(PassRefPtr<ArrayCallback> prpCallback)
+{
+    RefPtr<ArrayCallback> callback = prpCallback;
+    uint64_t callbackID = callback->callbackID();
+    m_arrayCallbacks.set(callbackID, callback.release());
     m_webContext->process()->send(Messages::WebDatabaseManager::GetDatabaseOrigins(callbackID), 0);
 }
 
 void WebDatabaseManagerProxy::didGetDatabaseOrigins(const Vector<String>& originIdentifiers, uint64_t callbackID)
 {
-    RefPtr<DatabaseOriginsCallback> callback = m_databaseOriginsCallbacks.take(callbackID);
+    RefPtr<ArrayCallback> callback = m_arrayCallbacks.take(callbackID);
     if (!callback) {
         // FIXME: Log error or assert.
         return;
@@ -80,11 +181,13 @@ void WebDatabaseManagerProxy::didGetDatabaseOrigins(const Vector<String>& origin
     callback->performCallbackWithReturnValue(ImmutableArray::adopt(securityOrigins).get());
 }
 
-void WebDatabaseManagerProxy::deleteDatabasesForOrigin(WebSecurityOrigin* origin)
+void WebDatabaseManagerProxy::deleteDatabaseWithNameForOrigin(const String& databaseIdentifier, WebSecurityOrigin* origin)
 {
-    if (!origin)
-        return;
+    m_webContext->process()->send(Messages::WebDatabaseManager::DeleteDatabaseWithNameForOrigin(databaseIdentifier, origin->databaseIdentifier()), 0);
+}
 
+void WebDatabaseManagerProxy::deleteDatabasesForOrigin(WebSecurityOrigin* origin)
+{
     m_webContext->process()->send(Messages::WebDatabaseManager::DeleteDatabasesForOrigin(origin->databaseIdentifier()), 0);
 }
 
@@ -93,5 +196,10 @@ void WebDatabaseManagerProxy::deleteAllDatabases()
     m_webContext->process()->send(Messages::WebDatabaseManager::DeleteAllDatabases(), 0);
 }
 
+void WebDatabaseManagerProxy::setQuotaForOrigin(WebSecurityOrigin* origin, uint64_t quota)
+{
+    m_webContext->process()->send(Messages::WebDatabaseManager::SetQuotaForOrigin(origin->databaseIdentifier(), quota), 0);
+}
+
 } // namespace WebKit
 
diff --git a/WebKit2/UIProcess/WebDatabaseManagerProxy.h b/WebKit2/UIProcess/WebDatabaseManagerProxy.h
index 9b912b9..2734ad1 100644
--- a/WebKit2/UIProcess/WebDatabaseManagerProxy.h
+++ b/WebKit2/UIProcess/WebDatabaseManagerProxy.h
@@ -29,6 +29,7 @@
 #include "APIObject.h"
 #include "Arguments.h"
 #include "GenericCallback.h"
+#include "OriginAndDatabases.h"
 #include "WKBase.h"
 #include <wtf/HashMap.h>
 #include <wtf/PassRefPtr.h>
@@ -44,7 +45,7 @@ namespace WebKit {
 class WebContext;
 class WebSecurityOrigin;
 
-typedef GenericCallback<WKArrayRef> DatabaseOriginsCallback;
+typedef GenericCallback<WKArrayRef> ArrayCallback;
 
 class WebDatabaseManagerProxy : public APIObject {
 public:
@@ -55,9 +56,21 @@ public:
 
     void invalidate();
 
-    void getDatabaseOrigins(PassRefPtr<DatabaseOriginsCallback>);
+    void getDatabasesByOrigin(PassRefPtr<ArrayCallback>);
+    void getDatabaseOrigins(PassRefPtr<ArrayCallback>);
+    void deleteDatabaseWithNameForOrigin(const String& databaseIdentifier, WebSecurityOrigin*);
     void deleteDatabasesForOrigin(WebSecurityOrigin*);
     void deleteAllDatabases();
+    void setQuotaForOrigin(WebSecurityOrigin*, uint64_t quota);
+    
+    static String originKey();
+    static String originQuotaKey();
+    static String originUsageKey();
+    static String databaseDetailsKey();
+    static String databaseDetailsNameKey();
+    static String databaseDetailsDisplayNameKey();
+    static String databaseDetailsExpectedUsageKey();
+    static String databaseDetailsCurrentUsageKey();
 
     void didReceiveWebDatabaseManagerProxyMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
 
@@ -67,10 +80,11 @@ private:
     virtual Type type() const { return APIType; }
 
     // Message handlers.
+    void didGetDatabasesByOrigin(const Vector<OriginAndDatabases>& originAndDatabases, uint64_t callbackID);
     void didGetDatabaseOrigins(const Vector<String>& originIdentifiers, uint64_t callbackID);
 
     WebContext* m_webContext;
-    HashMap<uint64_t, RefPtr<DatabaseOriginsCallback> > m_databaseOriginsCallbacks;
+    HashMap<uint64_t, RefPtr<ArrayCallback> > m_arrayCallbacks;
 };
 
 } // namespace WebKit
diff --git a/WebKit2/UIProcess/WebDatabaseManagerProxy.messages.in b/WebKit2/UIProcess/WebDatabaseManagerProxy.messages.in
index d0f459a..b1fa68a 100644
--- a/WebKit2/UIProcess/WebDatabaseManagerProxy.messages.in
+++ b/WebKit2/UIProcess/WebDatabaseManagerProxy.messages.in
@@ -21,5 +21,6 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 messages -> WebDatabaseManagerProxy {
+    DidGetDatabasesByOrigin(Vector<WebKit::OriginAndDatabases> originAndDatabases, uint64_t callbackID);
     DidGetDatabaseOrigins(Vector<WTF::String> originIdentifiers, uint64_t callbackID)
 }
diff --git a/WebKit2/WebKit2.pro b/WebKit2/WebKit2.pro
index e0b8fba..5882a0a 100644
--- a/WebKit2/WebKit2.pro
+++ b/WebKit2/WebKit2.pro
@@ -245,6 +245,7 @@ HEADERS += \
     Shared/MutableDictionary.h \
     Shared/NativeWebKeyboardEvent.h \
     Shared/NotImplemented.h \
+    Shared/OriginAndDatabases.h \
     Shared/PlatformPopupMenuData.h \
     Shared/SameDocumentNavigationType.h \
     Shared/StringPairVector.h \
@@ -454,6 +455,7 @@ SOURCES += \
     Shared/ImmutableDictionary.cpp \
     Shared/MutableArray.cpp \
     Shared/MutableDictionary.cpp \
+    Shared/OriginAndDatabases.cpp \
     Shared/PlatformPopupMenuData.cpp \
     Shared/VisitedLinkTable.cpp \
     Shared/WebContextMenuItem.cpp \
diff --git a/WebKit2/WebKit2.xcodeproj/project.pbxproj b/WebKit2/WebKit2.xcodeproj/project.pbxproj
index dd5dc4f..c0c1872 100644
--- a/WebKit2/WebKit2.xcodeproj/project.pbxproj
+++ b/WebKit2/WebKit2.xcodeproj/project.pbxproj
@@ -520,6 +520,8 @@
 		BCC8B374125FB69000DE46A4 /* WKGeometry.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC8B373125FB69000DE46A4 /* WKGeometry.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		BCC938E11180DE440085E5FE /* WKContextPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC938E01180DE440085E5FE /* WKContextPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		BCCB75C61203A1CE00222D1B /* WebContextMessageKinds.h in Headers */ = {isa = PBXBuildFile; fileRef = BCCB75C51203A1CE00222D1B /* WebContextMessageKinds.h */; };
+		BCCF672D12C7EDF7008F9C35 /* OriginAndDatabases.h in Headers */ = {isa = PBXBuildFile; fileRef = BCCF672C12C7EDF7008F9C35 /* OriginAndDatabases.h */; };
+		BCCF673312C7F15C008F9C35 /* OriginAndDatabases.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCCF673212C7F15C008F9C35 /* OriginAndDatabases.cpp */; };
 		BCD0042D110C1E27003B8A67 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCD0042C110C1E27003B8A67 /* CoreServices.framework */; };
 		BCD0139B110FA420003B8A67 /* WKFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = BCD01397110FA420003B8A67 /* WKFrame.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		BCD0139C110FA420003B8A67 /* WKFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCD01398110FA420003B8A67 /* WKFrame.cpp */; };
@@ -1189,6 +1191,8 @@
 		BCC8B373125FB69000DE46A4 /* WKGeometry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKGeometry.h; sourceTree = "<group>"; };
 		BCC938E01180DE440085E5FE /* WKContextPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKContextPrivate.h; sourceTree = "<group>"; };
 		BCCB75C51203A1CE00222D1B /* WebContextMessageKinds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebContextMessageKinds.h; sourceTree = "<group>"; };
+		BCCF672C12C7EDF7008F9C35 /* OriginAndDatabases.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OriginAndDatabases.h; sourceTree = "<group>"; };
+		BCCF673212C7F15C008F9C35 /* OriginAndDatabases.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OriginAndDatabases.cpp; sourceTree = "<group>"; };
 		BCD0042C110C1E27003B8A67 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = "<absolute>"; };
 		BCD01397110FA420003B8A67 /* WKFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKFrame.h; sourceTree = "<group>"; };
 		BCD01398110FA420003B8A67 /* WKFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKFrame.cpp; sourceTree = "<group>"; };
@@ -1616,6 +1620,8 @@
 				512935D61288D19400A4B695 /* WebContextMenuItem.h */,
 				510FBB981288C95E00AFFDF4 /* WebContextMenuItemData.cpp */,
 				510FBB991288C95E00AFFDF4 /* WebContextMenuItemData.h */,
+				BCCF673212C7F15C008F9C35 /* OriginAndDatabases.cpp */,
+				BCCF672C12C7EDF7008F9C35 /* OriginAndDatabases.h */,
 				51578B821209ECEF00A37C4A /* WebData.h */,
 				BC575612126E0138006F0F12 /* WebError.cpp */,
 				516A4A5B120A2CCD00C05B7F /* WebError.h */,
@@ -2774,6 +2780,7 @@
 				BC858A2012C0357B00EDEB2E /* WebResourceLoadClient.h in Headers */,
 				1AA417CB12C00CCA002BE67B /* TextChecker.h in Headers */,
 				1AA41AB512C02EC4002BE67B /* SelectionState.h in Headers */,
+				BCCF672D12C7EDF7008F9C35 /* OriginAndDatabases.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -3198,6 +3205,7 @@
 				1A4A9C9A12B821CD008FE984 /* NetscapePluginModuleMac.mm in Sources */,
 				BC858A2112C0357B00EDEB2E /* WebResourceLoadClient.cpp in Sources */,
 				1AA417EF12C00D87002BE67B /* TextCheckerMac.mm in Sources */,
+				BCCF673312C7F15C008F9C35 /* OriginAndDatabases.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.cpp b/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.cpp
index 984b9b3..fab0ae1 100644
--- a/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.cpp
+++ b/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.cpp
@@ -27,9 +27,11 @@
 
 #include "Connection.h"
 #include "MessageID.h"
+#include "OriginAndDatabases.h"
 #include "WebCoreArgumentCoders.h"
 #include "WebDatabaseManagerProxyMessages.h"
 #include "WebProcess.h"
+#include <WebCore/DatabaseDetails.h>
 #include <WebCore/DatabaseTracker.h>
 #include <WebCore/SecurityOrigin.h>
 
@@ -53,6 +55,48 @@ void WebDatabaseManager::didReceiveMessage(CoreIPC::Connection* connection, Core
     didReceiveWebDatabaseManagerMessage(connection, messageID, arguments);
 }
 
+void WebDatabaseManager::getDatabasesByOrigin(uint64_t callbackID) const
+{
+    // FIXME: This could be made more efficient by adding a function to DatabaseTracker
+    // to get both the origins and the Vector of DatabaseDetails for each origin in one
+    // shot.  That would avoid taking the numerous locks this requires.
+
+    Vector<RefPtr<SecurityOrigin> > origins;
+    DatabaseTracker::tracker().origins(origins);
+
+    Vector<OriginAndDatabases> originAndDatabasesVector;
+    originAndDatabasesVector.reserveInitialCapacity(origins.size());
+
+    for (size_t i = 0; i < origins.size(); ++i) {
+        OriginAndDatabases originAndDatabases;
+
+        Vector<String> nameVector;
+        if (!DatabaseTracker::tracker().databaseNamesForOrigin(origins[i].get(), nameVector))
+            continue;
+
+        Vector<DatabaseDetails> detailsVector;
+        detailsVector.reserveInitialCapacity(nameVector.size());
+        for (size_t j = 0; j < nameVector.size(); j++) {
+            DatabaseDetails details = DatabaseTracker::tracker().detailsForNameAndOrigin(nameVector[j], origins[i].get());
+            if (details.name().isNull())
+                continue;
+
+            detailsVector.append(details);
+        }
+
+        if (detailsVector.isEmpty())
+            continue;
+
+        originAndDatabases.originIdentifier = origins[i]->databaseIdentifier();
+        originAndDatabases.originQuota = DatabaseTracker::tracker().quotaForOrigin(origins[i].get());
+        originAndDatabases.originUsage = DatabaseTracker::tracker().usageForOrigin(origins[i].get());
+        originAndDatabases.databases.swap(detailsVector); 
+        originAndDatabasesVector.append(originAndDatabases);
+    }
+
+    WebProcess::shared().connection()->send(Messages::WebDatabaseManagerProxy::DidGetDatabasesByOrigin(originAndDatabasesVector, callbackID), 0);
+}
+
 void WebDatabaseManager::getDatabaseOrigins(uint64_t callbackID) const
 {
     Vector<RefPtr<SecurityOrigin> > origins;
@@ -66,6 +110,15 @@ void WebDatabaseManager::getDatabaseOrigins(uint64_t callbackID) const
     WebProcess::shared().connection()->send(Messages::WebDatabaseManagerProxy::DidGetDatabaseOrigins(identifiers, callbackID), 0);
 }
 
+void WebDatabaseManager::deleteDatabaseWithNameForOrigin(const String& databaseIdentifier, const String& originIdentifier) const
+{
+    RefPtr<SecurityOrigin> origin = SecurityOrigin::createFromDatabaseIdentifier(originIdentifier);
+    if (!origin)
+        return;
+
+    DatabaseTracker::tracker().deleteDatabase(origin.get(), databaseIdentifier);
+}
+
 void WebDatabaseManager::deleteDatabasesForOrigin(const String& originIdentifier) const
 {
     RefPtr<SecurityOrigin> origin = SecurityOrigin::createFromDatabaseIdentifier(originIdentifier);
@@ -80,4 +133,17 @@ void WebDatabaseManager::deleteAllDatabases() const
     DatabaseTracker::tracker().deleteAllDatabases();
 }
 
+void WebDatabaseManager::setQuotaForOrigin(const String& originIdentifier, unsigned long long quota) const
+{
+    // If the quota is set to a value lower than the current usage, that quota will
+    // "stick" but no data will be purged to meet the new quota. This will simply
+    // prevent new data from being added to databases in that origin.
+
+    RefPtr<SecurityOrigin> origin = SecurityOrigin::createFromDatabaseIdentifier(originIdentifier);
+    if (!origin)
+        return;
+
+    DatabaseTracker::tracker().setQuota(origin.get(), quota);
+}
+
 } // namespace WebKit
diff --git a/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.h b/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.h
index eb23601..686892a 100644
--- a/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.h
+++ b/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.h
@@ -38,21 +38,26 @@ class MessageID;
 
 namespace WebKit {
 
-class WebDatabaseManager : public Noncopyable {
+class WebDatabaseManager {
+    WTF_MAKE_NONCOPYABLE(WebDatabaseManager);
 public:
     static WebDatabaseManager& shared();
 
-    void getDatabaseOrigins(uint64_t callbackID) const;
-    void deleteDatabasesForOrigin(const String& originIdentifier) const;
-    void deleteAllDatabases() const;
-
     void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
 
 private:
     WebDatabaseManager();
 
+    // Implemented in generated WebDatabaseManagerMessageReceiver.cpp
     void didReceiveWebDatabaseManagerMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
 
+    void getDatabasesByOrigin(uint64_t callbackID) const;
+    void getDatabaseOrigins(uint64_t callbackID) const;
+    void deleteDatabaseWithNameForOrigin(const String& databaseIdentifier, const String& originIdentifier) const;
+    void deleteDatabasesForOrigin(const String& originIdentifier) const;
+    void deleteAllDatabases() const;
+    void setQuotaForOrigin(const String& originIdentifier, unsigned long long quota) const;
+
     String databaseDirectory() const;
 };
 
diff --git a/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.messages.in b/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.messages.in
index 1aab378..e928ef6 100644
--- a/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.messages.in
+++ b/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.messages.in
@@ -21,7 +21,10 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 messages -> WebDatabaseManager {
+    void GetDatabasesByOrigin(uint64_t callbackID)
     void GetDatabaseOrigins(uint64_t callbackID)
+    void DeleteDatabaseWithNameForOrigin(WTF::String databaseIdentifier, WTF::String originIdentifier)
     void DeleteDatabasesForOrigin(WTF::String originIdentifier)
     void DeleteAllDatabases()
+    void SetQuotaForOrigin(WTF::String originIdentifier, uint64_t quota)
 }
diff --git a/WebKit2/win/WebKit2.vcproj b/WebKit2/win/WebKit2.vcproj
index dd43e08..2e325dd 100755
--- a/WebKit2/win/WebKit2.vcproj
+++ b/WebKit2/win/WebKit2.vcproj
@@ -471,6 +471,14 @@
 				>
 			</File>
 			<File
+				RelativePath="..\Shared\OriginAndDatabases.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\Shared\OriginAndDatabases.h"
+				>
+			</File>
+			<File
 				RelativePath="..\Shared\PlatformPopupMenuData.cpp"
 				>
 			</File>

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list