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)