Title: [126516] trunk/Source
Revision
126516
Author
[email protected]
Date
2012-08-23 17:41:38 -0700 (Thu, 23 Aug 2012)

Log Message

IndexedDB: Expose mechanism for database to force a connection to close
https://bugs.webkit.org/show_bug.cgi?id=91010

Reviewed by Tony Chang.

Source/WebCore:

In response to user action (e.g. "delete my browsing data") a connection may
need to be forcibly terminated. This allows an event to be sent to a connection
from the back end via IDBDatabaseCallbacks to initiate closing the connection.

Test: [chromium] webkit_unit_test --gtest_filter='IDBDatabaseBackendTest.ForcedClose'

* Modules/indexeddb/IDBDatabase.cpp:
(WebCore::IDBDatabase::forceClose): Abort all transactions and close.
(WebCore):
* Modules/indexeddb/IDBDatabase.h:
(IDBDatabase): Entry point.
* Modules/indexeddb/IDBDatabaseCallbacks.h:
(IDBDatabaseCallbacks): Event plumbing from back end.
* Modules/indexeddb/IDBDatabaseCallbacksImpl.cpp:
(WebCore::IDBDatabaseCallbacksImpl::onForcedClose): Ditto.
(WebCore):
* Modules/indexeddb/IDBDatabaseCallbacksImpl.h:
(IDBDatabaseCallbacksImpl): Ditto.
* inspector/InspectorIndexedDBAgent.cpp:
(WebCore): Method stub.

Source/WebKit/chromium:

In Chromium, the browsing data deleter has a WebIDBDatabase handle which
it can use to terminate a connection. This handles forcefully closing
the front end connections and the back end, to unblock disk cleanup.

* public/WebIDBDatabase.h:
(WebKit::WebIDBDatabase::forceClose): Entry point.
* public/WebIDBDatabaseCallbacks.h:
(WebKit::WebIDBDatabaseCallbacks::onForcedClose): Plumbing back to front.
* src/IDBDatabaseCallbacksProxy.cpp:
(WebKit::IDBDatabaseCallbacksProxy::onForcedClose): Plumbing back to front.
(WebKit):
* src/IDBDatabaseCallbacksProxy.h:
(IDBDatabaseCallbacksProxy): Plumbing.
* src/WebIDBDatabaseCallbacksImpl.cpp:
(WebKit::WebIDBDatabaseCallbacksImpl::onForcedClose): Plumbing back to front.
(WebKit):
* src/WebIDBDatabaseCallbacksImpl.h:
(WebIDBDatabaseCallbacksImpl): Plumbing back to front.
* src/WebIDBDatabaseImpl.cpp:
(WebKit::WebIDBDatabaseImpl::close): Tidy up dropping the callback reference.
(WebKit):
(WebKit::WebIDBDatabaseImpl::forceClose): Terminate the connection by notifying
the back end and the front end, while avoid re-entrant badness.
* src/WebIDBDatabaseImpl.h: Header tweak for unit test.
(WebIDBDatabaseImpl):
* tests/IDBDatabaseBackendTest.cpp: Added unit test to exercise connections.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (126515 => 126516)


--- trunk/Source/WebCore/ChangeLog	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebCore/ChangeLog	2012-08-24 00:41:38 UTC (rev 126516)
@@ -1,3 +1,31 @@
+2012-08-23  Joshua Bell  <[email protected]>
+
+        IndexedDB: Expose mechanism for database to force a connection to close
+        https://bugs.webkit.org/show_bug.cgi?id=91010
+
+        Reviewed by Tony Chang.
+
+        In response to user action (e.g. "delete my browsing data") a connection may
+        need to be forcibly terminated. This allows an event to be sent to a connection
+        from the back end via IDBDatabaseCallbacks to initiate closing the connection.
+
+        Test: [chromium] webkit_unit_test --gtest_filter='IDBDatabaseBackendTest.ForcedClose'
+
+        * Modules/indexeddb/IDBDatabase.cpp:
+        (WebCore::IDBDatabase::forceClose): Abort all transactions and close.
+        (WebCore):
+        * Modules/indexeddb/IDBDatabase.h:
+        (IDBDatabase): Entry point.
+        * Modules/indexeddb/IDBDatabaseCallbacks.h:
+        (IDBDatabaseCallbacks): Event plumbing from back end.
+        * Modules/indexeddb/IDBDatabaseCallbacksImpl.cpp:
+        (WebCore::IDBDatabaseCallbacksImpl::onForcedClose): Ditto.
+        (WebCore):
+        * Modules/indexeddb/IDBDatabaseCallbacksImpl.h:
+        (IDBDatabaseCallbacksImpl): Ditto.
+        * inspector/InspectorIndexedDBAgent.cpp:
+        (WebCore): Method stub.
+
 2012-08-23  James Robinson  <[email protected]>
 
         [chromium] Convert WebAnimationCurve subtypes into pure virtual

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp (126515 => 126516)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp	2012-08-24 00:41:38 UTC (rev 126516)
@@ -272,6 +272,14 @@
     return transaction(context, prpStoreNames, modeString, ec);
 }
 
+void IDBDatabase::forceClose()
+{
+    ExceptionCode ec = 0;
+    for (HashSet<IDBTransaction*>::iterator it = m_transactions.begin(); it != m_transactions.end(); ++it)
+        (*it)->abort(ec);
+    this->close();
+}
+
 void IDBDatabase::close()
 {
     if (m_closePending)

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.h (126515 => 126516)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.h	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.h	2012-08-24 00:41:38 UTC (rev 126516)
@@ -88,6 +88,7 @@
     virtual const AtomicString& interfaceName() const;
     virtual ScriptExecutionContext* scriptExecutionContext() const;
 
+    void forceClose();
     void registerFrontendCallbacks();
     const IDBDatabaseMetadata metadata() const { return m_metadata; }
     void enqueueEvent(PassRefPtr<Event>);

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacks.h (126515 => 126516)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacks.h	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacks.h	2012-08-24 00:41:38 UTC (rev 126516)
@@ -37,6 +37,7 @@
 public:
     virtual ~IDBDatabaseCallbacks() { }
 
+    virtual void onForcedClose() = 0;
     virtual void onVersionChange(const String& version) = 0;
     virtual void onVersionChange(int64_t oldVersion, int64_t newVersion) = 0;
 };

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacksImpl.cpp (126515 => 126516)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacksImpl.cpp	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacksImpl.cpp	2012-08-24 00:41:38 UTC (rev 126516)
@@ -46,6 +46,12 @@
 {
 }
 
+void IDBDatabaseCallbacksImpl::onForcedClose()
+{
+    if (m_database)
+        m_database->forceClose();
+}
+
 void IDBDatabaseCallbacksImpl::onVersionChange(const String& version)
 {
     if (m_database)

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacksImpl.h (126515 => 126516)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacksImpl.h	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacksImpl.h	2012-08-24 00:41:38 UTC (rev 126516)
@@ -41,6 +41,7 @@
     static PassRefPtr<IDBDatabaseCallbacksImpl> create(IDBDatabase*);
     virtual ~IDBDatabaseCallbacksImpl();
 
+    virtual void onForcedClose();
     virtual void onVersionChange(const String& version);
     virtual void onVersionChange(int64_t oldVersion, int64_t newVersion);
     void unregisterDatabase(IDBDatabase*);

Modified: trunk/Source/WebCore/inspector/InspectorIndexedDBAgent.cpp (126515 => 126516)


--- trunk/Source/WebCore/inspector/InspectorIndexedDBAgent.cpp	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebCore/inspector/InspectorIndexedDBAgent.cpp	2012-08-24 00:41:38 UTC (rev 126516)
@@ -130,6 +130,7 @@
 
     virtual void onVersionChange(const String& version) { }
     virtual void onVersionChange(int64_t oldVersion, int64_t newVersion) { }
+    virtual void onForcedClose() { }
 private:
     InspectorIDBDatabaseCallbacks() { }
 };

Modified: trunk/Source/WebKit/chromium/ChangeLog (126515 => 126516)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-08-24 00:41:38 UTC (rev 126516)
@@ -1,3 +1,37 @@
+2012-08-23  Joshua Bell  <[email protected]>
+
+        IndexedDB: Expose mechanism for database to force a connection to close
+        https://bugs.webkit.org/show_bug.cgi?id=91010
+
+        Reviewed by Tony Chang.
+
+        In Chromium, the browsing data deleter has a WebIDBDatabase handle which
+        it can use to terminate a connection. This handles forcefully closing
+        the front end connections and the back end, to unblock disk cleanup.
+
+        * public/WebIDBDatabase.h:
+        (WebKit::WebIDBDatabase::forceClose): Entry point.
+        * public/WebIDBDatabaseCallbacks.h:
+        (WebKit::WebIDBDatabaseCallbacks::onForcedClose): Plumbing back to front.
+        * src/IDBDatabaseCallbacksProxy.cpp:
+        (WebKit::IDBDatabaseCallbacksProxy::onForcedClose): Plumbing back to front.
+        (WebKit):
+        * src/IDBDatabaseCallbacksProxy.h:
+        (IDBDatabaseCallbacksProxy): Plumbing.
+        * src/WebIDBDatabaseCallbacksImpl.cpp:
+        (WebKit::WebIDBDatabaseCallbacksImpl::onForcedClose): Plumbing back to front.
+        (WebKit):
+        * src/WebIDBDatabaseCallbacksImpl.h:
+        (WebIDBDatabaseCallbacksImpl): Plumbing back to front.
+        * src/WebIDBDatabaseImpl.cpp:
+        (WebKit::WebIDBDatabaseImpl::close): Tidy up dropping the callback reference.
+        (WebKit):
+        (WebKit::WebIDBDatabaseImpl::forceClose): Terminate the connection by notifying
+        the back end and the front end, while avoid re-entrant badness.
+        * src/WebIDBDatabaseImpl.h: Header tweak for unit test.
+        (WebIDBDatabaseImpl):
+        * tests/IDBDatabaseBackendTest.cpp: Added unit test to exercise connections.
+
 2012-08-23  James Robinson  <[email protected]>
 
         [chromium] Convert WebAnimationCurve subtypes into pure virtual

Modified: trunk/Source/WebKit/chromium/public/WebIDBDatabase.h (126515 => 126516)


--- trunk/Source/WebKit/chromium/public/WebIDBDatabase.h	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebKit/chromium/public/WebIDBDatabase.h	2012-08-24 00:41:38 UTC (rev 126516)
@@ -64,6 +64,7 @@
         return 0;
     }
     virtual void close() { WEBKIT_ASSERT_NOT_REACHED(); }
+    virtual void forceClose() { WEBKIT_ASSERT_NOT_REACHED(); }
 
     virtual void open(WebIDBDatabaseCallbacks*) { WEBKIT_ASSERT_NOT_REACHED(); }
 

Modified: trunk/Source/WebKit/chromium/public/WebIDBDatabaseCallbacks.h (126515 => 126516)


--- trunk/Source/WebKit/chromium/public/WebIDBDatabaseCallbacks.h	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebKit/chromium/public/WebIDBDatabaseCallbacks.h	2012-08-24 00:41:38 UTC (rev 126516)
@@ -35,6 +35,7 @@
 public:
     virtual ~WebIDBDatabaseCallbacks() { }
 
+    virtual void onForcedClose() { WEBKIT_ASSERT_NOT_REACHED(); }
     virtual void onVersionChange(long long oldVersion, long long newVersion) { WEBKIT_ASSERT_NOT_REACHED(); }
     virtual void onVersionChange(const WebString& requestedVersion) { WEBKIT_ASSERT_NOT_REACHED(); }
 };

Modified: trunk/Source/WebKit/chromium/src/IDBDatabaseCallbacksProxy.cpp (126515 => 126516)


--- trunk/Source/WebKit/chromium/src/IDBDatabaseCallbacksProxy.cpp	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebKit/chromium/src/IDBDatabaseCallbacksProxy.cpp	2012-08-24 00:41:38 UTC (rev 126516)
@@ -48,6 +48,11 @@
 {
 }
 
+void IDBDatabaseCallbacksProxy::onForcedClose()
+{
+    m_callbacks->onForcedClose();
+}
+
 void IDBDatabaseCallbacksProxy::onVersionChange(int64_t oldVersion, int64_t newVersion)
 {
     m_callbacks->onVersionChange(oldVersion, newVersion);

Modified: trunk/Source/WebKit/chromium/src/IDBDatabaseCallbacksProxy.h (126515 => 126516)


--- trunk/Source/WebKit/chromium/src/IDBDatabaseCallbacksProxy.h	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebKit/chromium/src/IDBDatabaseCallbacksProxy.h	2012-08-24 00:41:38 UTC (rev 126516)
@@ -40,6 +40,7 @@
     static PassRefPtr<IDBDatabaseCallbacksProxy> create(PassOwnPtr<WebIDBDatabaseCallbacks>);
     virtual ~IDBDatabaseCallbacksProxy();
 
+    virtual void onForcedClose();
     virtual void onVersionChange(const String& requestedVersion);
     virtual void onVersionChange(int64_t oldVersion, int64_t newVersion);
 

Modified: trunk/Source/WebKit/chromium/src/WebIDBDatabaseCallbacksImpl.cpp (126515 => 126516)


--- trunk/Source/WebKit/chromium/src/WebIDBDatabaseCallbacksImpl.cpp	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebKit/chromium/src/WebIDBDatabaseCallbacksImpl.cpp	2012-08-24 00:41:38 UTC (rev 126516)
@@ -44,6 +44,11 @@
 {
 }
 
+void WebIDBDatabaseCallbacksImpl::onForcedClose()
+{
+    m_callbacks->onForcedClose();
+}
+
 void WebIDBDatabaseCallbacksImpl::onVersionChange(long long oldVersion, long long newVersion)
 {
     m_callbacks->onVersionChange(oldVersion, newVersion);

Modified: trunk/Source/WebKit/chromium/src/WebIDBDatabaseCallbacksImpl.h (126515 => 126516)


--- trunk/Source/WebKit/chromium/src/WebIDBDatabaseCallbacksImpl.h	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebKit/chromium/src/WebIDBDatabaseCallbacksImpl.h	2012-08-24 00:41:38 UTC (rev 126516)
@@ -43,6 +43,7 @@
     WebIDBDatabaseCallbacksImpl(PassRefPtr<WebCore::IDBDatabaseCallbacks>);
     virtual ~WebIDBDatabaseCallbacksImpl();
 
+    virtual void onForcedClose();
     virtual void onVersionChange(long long oldVersion, long long newVersion);
     virtual void onVersionChange(const WebString& version);
 

Modified: trunk/Source/WebKit/chromium/src/WebIDBDatabaseImpl.cpp (126515 => 126516)


--- trunk/Source/WebKit/chromium/src/WebIDBDatabaseImpl.cpp	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebKit/chromium/src/WebIDBDatabaseImpl.cpp	2012-08-24 00:41:38 UTC (rev 126516)
@@ -99,10 +99,20 @@
         m_closePending = true;
         return;
     }
-    m_databaseBackend->close(m_databaseCallbacks);
-    m_databaseCallbacks = 0;
+    m_databaseBackend->close(m_databaseCallbacks.release());
 }
 
+void WebIDBDatabaseImpl::forceClose()
+{
+    if (!m_databaseCallbacks) {
+        m_closePending = true;
+        return;
+    }
+    RefPtr<IDBDatabaseCallbacksProxy> callbacks = m_databaseCallbacks.release();
+    m_databaseBackend->close(callbacks);
+    callbacks->onForcedClose();
+}
+
 void WebIDBDatabaseImpl::open(WebIDBDatabaseCallbacks* callbacks)
 {
     ASSERT(!m_databaseCallbacks);

Modified: trunk/Source/WebKit/chromium/src/WebIDBDatabaseImpl.h (126515 => 126516)


--- trunk/Source/WebKit/chromium/src/WebIDBDatabaseImpl.h	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebKit/chromium/src/WebIDBDatabaseImpl.h	2012-08-24 00:41:38 UTC (rev 126516)
@@ -28,6 +28,7 @@
 
 #if ENABLE(INDEXED_DATABASE)
 
+#include "IDBDatabaseCallbacksProxy.h"
 #include "platform/WebCommon.h"
 #include "WebExceptionCode.h"
 #include "WebIDBDatabase.h"
@@ -38,7 +39,6 @@
 
 namespace WebKit {
 
-class IDBDatabaseCallbacksProxy;
 class WebIDBDatabaseCallbacks;
 class WebIDBDatabaseMetadata;
 class WebIDBObjectStore;
@@ -56,6 +56,7 @@
     virtual void deleteObjectStore(const WebString& name, const WebIDBTransaction&, WebExceptionCode&);
     virtual void setVersion(const WebString& version, WebIDBCallbacks*, WebExceptionCode&);
     virtual WebIDBTransaction* transaction(const WebDOMStringList& names, unsigned short mode, WebExceptionCode&);
+    virtual void forceClose();
     virtual void close();
 
     // FIXME: Rename "open" to registerFrontendCallbacks.

Modified: trunk/Source/WebKit/chromium/tests/IDBDatabaseBackendTest.cpp (126515 => 126516)


--- trunk/Source/WebKit/chromium/tests/IDBDatabaseBackendTest.cpp	2012-08-24 00:40:33 UTC (rev 126515)
+++ trunk/Source/WebKit/chromium/tests/IDBDatabaseBackendTest.cpp	2012-08-24 00:41:38 UTC (rev 126516)
@@ -32,12 +32,17 @@
 #include "IDBIndexBackendImpl.h"
 #include "IDBObjectStoreBackendImpl.h"
 #include "IDBTransactionCoordinator.h"
+#include "WebIDBDatabaseCallbacksImpl.h"
+#include "WebIDBDatabaseImpl.h"
 
 #include <gtest/gtest.h>
 
 #if ENABLE(INDEXED_DATABASE)
 
 using namespace WebCore;
+using WebKit::WebIDBDatabase;
+using WebKit::WebIDBDatabaseCallbacksImpl;
+using WebKit::WebIDBDatabaseImpl;
 
 namespace {
 
@@ -101,6 +106,7 @@
     virtual ~FakeIDBDatabaseCallbacks() { }
     virtual void onVersionChange(const String& version) OVERRIDE { }
     virtual void onVersionChange(int64_t oldVersion, int64_t newVersion) OVERRIDE { }
+    virtual void onForcedClose() OVERRIDE { }
 private:
     FakeIDBDatabaseCallbacks() { }
 };
@@ -134,6 +140,72 @@
     EXPECT_TRUE(backingStore->hasOneRef());
 }
 
+class MockIDBDatabaseBackendProxy : public IDBDatabaseBackendInterface {
+public:
+    static PassRefPtr<MockIDBDatabaseBackendProxy> create(WebIDBDatabaseImpl& database)
+    {
+        return adoptRef(new MockIDBDatabaseBackendProxy(database));
+    }
+
+    ~MockIDBDatabaseBackendProxy()
+    {
+        EXPECT_TRUE(m_wasRegisterFrontendCallbacksCalled);
+    }
+
+    virtual IDBDatabaseMetadata metadata() const { return IDBDatabaseMetadata(); }
+    virtual PassRefPtr<IDBObjectStoreBackendInterface> createObjectStore(const String& name, const IDBKeyPath&, bool autoIncrement, IDBTransactionBackendInterface*, ExceptionCode&) { return 0; }
+    virtual void deleteObjectStore(const String& name, IDBTransactionBackendInterface*, ExceptionCode&) { }
+    virtual void setVersion(const String& version, PassRefPtr<IDBCallbacks>, PassRefPtr<IDBDatabaseCallbacks>, ExceptionCode&) { }
+    virtual PassRefPtr<IDBTransactionBackendInterface> transaction(DOMStringList* storeNames, unsigned short mode, ExceptionCode&) { return 0; }
+
+    virtual void close(PassRefPtr<IDBDatabaseCallbacks>)
+    {
+        m_wasCloseCalled = true;
+        m_webDatabase.close();
+    }
+    virtual void registerFrontendCallbacks(PassRefPtr<IDBDatabaseCallbacks> connection)
+    {
+        m_wasRegisterFrontendCallbacksCalled = true;
+        m_webDatabase.open(new WebIDBDatabaseCallbacksImpl(connection));
+    }
+
+private:
+    MockIDBDatabaseBackendProxy(WebIDBDatabaseImpl& webDatabase)
+        : m_wasRegisterFrontendCallbacksCalled(false)
+        , m_wasCloseCalled(false)
+        , m_webDatabase(webDatabase) { }
+
+    bool m_wasRegisterFrontendCallbacksCalled;
+    bool m_wasCloseCalled;
+
+    WebIDBDatabaseImpl& m_webDatabase;
+};
+
+TEST(IDBDatabaseBackendTest, ForcedClose)
+{
+    RefPtr<IDBFakeBackingStore> backingStore = adoptRef(new IDBFakeBackingStore());
+    EXPECT_TRUE(backingStore->hasOneRef());
+
+    IDBTransactionCoordinator* coordinator = 0;
+    IDBFactoryBackendImpl* factory = 0;
+    RefPtr<IDBDatabaseBackendImpl> backend = IDBDatabaseBackendImpl::create("db", backingStore.get(), coordinator, factory, "uniqueid");
+    EXPECT_GT(backingStore->refCount(), 1);
+
+    WebIDBDatabaseImpl webDatabase(backend);
+
+    RefPtr<MockIDBCallbacks> request1 = MockIDBCallbacks::create();
+    backend->openConnection(request1);
+
+    RefPtr<MockIDBDatabaseBackendProxy> proxy = MockIDBDatabaseBackendProxy::create(webDatabase);
+
+    ScriptExecutionContext* context = 0;
+    RefPtr<IDBDatabase> idbDatabase = IDBDatabase::create(context, proxy);
+    idbDatabase->registerFrontendCallbacks();
+
+    webDatabase.forceClose();
+    EXPECT_TRUE(backingStore->hasOneRef());
+}
+
 } // namespace
 
 #endif // ENABLE(INDEXED_DATABASE)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to