IndexedDB: Correct database version after aborted upgrade
authorjsbell@chromium.org <jsbell@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Dec 2012 07:17:04 +0000 (07:17 +0000)
committerjsbell@chromium.org <jsbell@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Dec 2012 07:17:04 +0000 (07:17 +0000)
https://bugs.webkit.org/show_bug.cgi?id=103763

Reviewed by Tony Chang.

Source/WebCore:

After an aborted "versionchange" transaction, the IDBDatabase would fetch a fresh snapshot
of the metadata from the back end. If the back end had already started a new "versionchange"
transaction the snapshot would be bogus. Instead, save a copy of the IDBDatabase's metadata
and roll back to that, as is done for IDBObjectStore.

Tests: storage/indexeddb/intversion-abort-in-initial-upgradeneeded.html
       storage/indexeddb/mozilla/versionchange-abort.html
       storage/indexeddb/unblocked-version-changes.html

* Modules/indexeddb/IDBDatabase.cpp:
(WebCore::IDBDatabase::IDBDatabase):
(WebCore::IDBDatabase::transactionCreated):
* Modules/indexeddb/IDBDatabase.h:
(WebCore::IDBDatabase::setMetadata): Let IDBOpenDBRequest and IDBTransaction tinker.
* Modules/indexeddb/IDBOpenDBRequest.cpp:
(WebCore::IDBOpenDBRequest::onUpgradeNeeded): Fetch new and compute old metadata.
(WebCore::IDBOpenDBRequest::onSuccess): Fetch new metadata, in case upgrade changed it.
* Modules/indexeddb/IDBTransaction.cpp:
(WebCore::IDBTransaction::create): Stash the old metadata, in case of rollback.
(WebCore::IDBTransaction::IDBTransaction):
(WebCore::IDBTransaction::onAbort): Revert the database as well as the stores.
* Modules/indexeddb/IDBTransaction.h:
(IDBTransaction):

Source/WebKit/chromium:

Pass previously created proxy along in an open onSuccess, rather than a useless wrapper.

* src/WebIDBCallbacksImpl.cpp:
(WebKit::WebIDBCallbacksImpl::WebIDBCallbacksImpl):
(WebKit::WebIDBCallbacksImpl::onSuccess):
(WebKit::WebIDBCallbacksImpl::onUpgradeNeeded):
* src/WebIDBCallbacksImpl.h:
(WebCore):
(WebIDBCallbacksImpl):

LayoutTests:

Update test expectations and tweak a test so it's testing what it claimed.

* storage/indexeddb/intversion-abort-in-initial-upgradeneeded-expected.txt:
* storage/indexeddb/mozilla/resources/versionchange-abort.js:
(postAbort):
* storage/indexeddb/mozilla/versionchange-abort-expected.txt:
* storage/indexeddb/resources/unblocked-version-changes.js:
(onUpgradeNeeded):
* storage/indexeddb/unblocked-version-changes-expected.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@136475 268f45cc-cd09-0410-ab3c-d52691b4dbfc

15 files changed:
LayoutTests/ChangeLog
LayoutTests/storage/indexeddb/intversion-abort-in-initial-upgradeneeded-expected.txt
LayoutTests/storage/indexeddb/mozilla/resources/versionchange-abort.js
LayoutTests/storage/indexeddb/mozilla/versionchange-abort-expected.txt
LayoutTests/storage/indexeddb/resources/unblocked-version-changes.js
LayoutTests/storage/indexeddb/unblocked-version-changes-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/Modules/indexeddb/IDBDatabase.cpp
Source/WebCore/Modules/indexeddb/IDBDatabase.h
Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.cpp
Source/WebCore/Modules/indexeddb/IDBTransaction.cpp
Source/WebCore/Modules/indexeddb/IDBTransaction.h
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/src/WebIDBCallbacksImpl.cpp
Source/WebKit/chromium/src/WebIDBCallbacksImpl.h

index c22e386..4214d33 100644 (file)
@@ -1,3 +1,20 @@
+2012-12-03  Joshua Bell  <jsbell@chromium.org>
+
+        IndexedDB: Correct database version after aborted upgrade
+        https://bugs.webkit.org/show_bug.cgi?id=103763
+
+        Reviewed by Tony Chang.
+
+        Update test expectations and tweak a test so it's testing what it claimed.
+
+        * storage/indexeddb/intversion-abort-in-initial-upgradeneeded-expected.txt:
+        * storage/indexeddb/mozilla/resources/versionchange-abort.js:
+        (postAbort):
+        * storage/indexeddb/mozilla/versionchange-abort-expected.txt:
+        * storage/indexeddb/resources/unblocked-version-changes.js:
+        (onUpgradeNeeded):
+        * storage/indexeddb/unblocked-version-changes-expected.txt:
+
 2012-12-03  Roger Fong  <roger_fong@apple.com>
 
         Unreviewed. Gardening of Apple Windows port.
index 63dc003..7c886d7 100644 (file)
@@ -16,14 +16,14 @@ PASS db.version is 2
 transaction.abort()
 
 onAbort():
-FAIL event.target.db.version should be 0 (of type number). Was  (of type string).
+PASS event.target.db.version is 0
 PASS request.transaction is non-null.
 
 onError():
 PASS db is event.target.result
 PASS request is event.target
 PASS event.target.error.name is "AbortError"
-FAIL event.target.result.version should be 0 (of type number). Was  (of type string).
+PASS event.target.result.version is 0
 PASS request.transaction is null
 PASS successfullyParsed is true
 
index d947a1a..5d01944 100644 (file)
@@ -32,7 +32,6 @@ function prepareDatabase()
 
 function postAbort()
 {
-    debug("FIXME: Fails because of http://wkb.ug/102412");
     shouldBe("db.version", "0");
     shouldBe("db.objectStoreNames.length", "0");
 
index 7f60e0a..d9fd60f 100644 (file)
@@ -13,8 +13,7 @@ PASS db.objectStoreNames.length is 1
 index = objectStore.createIndex('bar', 'baz');
 PASS objectStore.indexNames.length is 1
 event.target.transaction.abort();
-FIXME: Fails because of http://wkb.ug/102412
-FAIL db.version should be 0 (of type number). Was  (of type string).
+PASS db.version is 0
 PASS db.objectStoreNames.length is 0
 PASS successfullyParsed is true
 
index 9663636..8b2d63a 100644 (file)
@@ -29,12 +29,15 @@ function onUpgradeNeeded(evt)
     preamble(evt);
     evalAndLog("db = request.result");
     shouldBe("db.version", "2");
+    evalAndLog("transaction = request.transaction");
 
     evalAndLog("request = indexedDB.open(dbname, 3)");
     request.onerror = unexpectedErrorCallback;
     request.onupgradeneeded = onUpgradeNeeded2;
     request.onsuccess = onSuccess;
 
+    evalAndLog("transaction.abort()");
+    // FIXME: Explicit db.close() call should not be necessary. http://wkbug.com/102298
     evalAndLog("db.close()");
 }
 
@@ -59,4 +62,4 @@ function onSuccess(evt)
     finishJSTest();
 }
 
-test();
\ No newline at end of file
+test();
index 1f18318..25dc6c8 100644 (file)
@@ -14,11 +14,13 @@ request = indexedDB.open(dbname, 2)
 onUpgradeNeeded():
 db = request.result
 PASS db.version is 2
+transaction = request.transaction
 request = indexedDB.open(dbname, 3)
+transaction.abort()
 db.close()
 
 onError():
-FAIL db.version should be 0. Was 2.
+PASS db.version is 0
 
 onUpgradeNeeded2():
 db = request.result
index 596d743..431c932 100644 (file)
@@ -1,3 +1,34 @@
+2012-12-03  Joshua Bell  <jsbell@chromium.org>
+
+        IndexedDB: Correct database version after aborted upgrade
+        https://bugs.webkit.org/show_bug.cgi?id=103763
+
+        Reviewed by Tony Chang.
+
+        After an aborted "versionchange" transaction, the IDBDatabase would fetch a fresh snapshot
+        of the metadata from the back end. If the back end had already started a new "versionchange"
+        transaction the snapshot would be bogus. Instead, save a copy of the IDBDatabase's metadata
+        and roll back to that, as is done for IDBObjectStore.
+
+        Tests: storage/indexeddb/intversion-abort-in-initial-upgradeneeded.html
+               storage/indexeddb/mozilla/versionchange-abort.html
+               storage/indexeddb/unblocked-version-changes.html
+
+        * Modules/indexeddb/IDBDatabase.cpp:
+        (WebCore::IDBDatabase::IDBDatabase):
+        (WebCore::IDBDatabase::transactionCreated):
+        * Modules/indexeddb/IDBDatabase.h:
+        (WebCore::IDBDatabase::setMetadata): Let IDBOpenDBRequest and IDBTransaction tinker.
+        * Modules/indexeddb/IDBOpenDBRequest.cpp:
+        (WebCore::IDBOpenDBRequest::onUpgradeNeeded): Fetch new and compute old metadata.
+        (WebCore::IDBOpenDBRequest::onSuccess): Fetch new metadata, in case upgrade changed it.
+        * Modules/indexeddb/IDBTransaction.cpp:
+        (WebCore::IDBTransaction::create): Stash the old metadata, in case of rollback.
+        (WebCore::IDBTransaction::IDBTransaction):
+        (WebCore::IDBTransaction::onAbort): Revert the database as well as the stores.
+        * Modules/indexeddb/IDBTransaction.h:
+        (IDBTransaction):
+
 2012-12-03  Rafael Weinstein  <rafaelw@chromium.org>
 
         Implement HTMLTemplateElement
index 73823c5..a1aa9f7 100644 (file)
@@ -68,7 +68,6 @@ IDBDatabase::IDBDatabase(ScriptExecutionContext* context, PassRefPtr<IDBDatabase
 {
     // We pass a reference of this object before it can be adopted.
     relaxAdoptionRequirement();
-    m_metadata = m_backend->metadata();
 }
 
 IDBDatabase::~IDBDatabase()
@@ -93,7 +92,6 @@ void IDBDatabase::transactionCreated(IDBTransaction* transaction)
     if (transaction->isVersionChange()) {
         ASSERT(!m_versionChangeTransaction);
         m_versionChangeTransaction = transaction;
-        m_metadata = m_backend->metadata();
     }
 }
 
@@ -106,7 +104,6 @@ void IDBDatabase::transactionFinished(IDBTransaction* transaction)
     if (transaction->isVersionChange()) {
         ASSERT(m_versionChangeTransaction == transaction);
         m_versionChangeTransaction = 0;
-        m_metadata = m_backend->metadata();
     }
 
     if (m_closePending && m_transactions.isEmpty())
index a8ab94d..9a27f25 100644 (file)
@@ -55,6 +55,7 @@ public:
     static PassRefPtr<IDBDatabase> create(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendInterface>, PassRefPtr<IDBDatabaseCallbacks>);
     ~IDBDatabase();
 
+    void setMetadata(const IDBDatabaseMetadata& metadata) { m_metadata = metadata; }
     void transactionCreated(IDBTransaction*);
     void transactionFinished(IDBTransaction*);
 
@@ -106,7 +107,6 @@ public:
 private:
     IDBDatabase(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendInterface>, PassRefPtr<IDBDatabaseCallbacks>);
 
-
     // EventTarget
     virtual void refEventTarget() { ref(); }
     virtual void derefEventTarget() { deref(); }
index f2e76d7..7b6f8c6 100644 (file)
@@ -84,32 +84,43 @@ void IDBOpenDBRequest::onUpgradeNeeded(int64_t oldVersion, PassRefPtr<IDBTransac
     ASSERT(m_databaseCallbacks);
 
     RefPtr<IDBDatabaseBackendInterface> databaseBackend = prpDatabaseBackend;
+    // FIXME: This potentially expensive (synchronous) call into the backend could be removed if the metadata
+    // were passed in during the (asynchronous) onUpgradeNeeded call from the backend. http://wkbug.com/103920
+    IDBDatabaseMetadata metadata = databaseBackend->metadata();
+
     RefPtr<IDBTransactionBackendInterface> transactionBackend = prpTransactionBackend;
     RefPtr<IDBDatabase> idbDatabase = IDBDatabase::create(scriptExecutionContext(), databaseBackend, m_databaseCallbacks);
+    idbDatabase->setMetadata(metadata);
     m_databaseCallbacks->connect(idbDatabase.get());
     m_databaseCallbacks = 0;
 
+    if (oldVersion == IDBDatabaseMetadata::NoIntVersion) {
+        // This database hasn't had an integer version before.
+        oldVersion = IDBDatabaseMetadata::DefaultIntVersion;
+    }
+    metadata.intVersion = oldVersion;
+
     int64_t transactionId = IDBDatabase::nextTransactionId();
-    RefPtr<IDBTransaction> frontend = IDBTransaction::create(scriptExecutionContext(), transactionId, transactionBackend, Vector<String>(), IDBTransaction::VERSION_CHANGE, idbDatabase.get(), this);
+    RefPtr<IDBTransaction> frontend = IDBTransaction::create(scriptExecutionContext(), transactionId, transactionBackend, idbDatabase.get(), this, metadata);
     transactionBackend->setCallbacks(frontend.get());
     m_transaction = frontend;
     m_result = IDBAny::create(idbDatabase.release());
 
-    if (oldVersion == IDBDatabaseMetadata::NoIntVersion) {
-        // This database hasn't had an integer version before.
-        oldVersion = IDBDatabaseMetadata::DefaultIntVersion;
-    }
     if (m_version == IDBDatabaseMetadata::NoIntVersion)
         m_version = 1;
     enqueueEvent(IDBUpgradeNeededEvent::create(oldVersion, m_version, eventNames().upgradeneededEvent));
 }
 
-void IDBOpenDBRequest::onSuccess(PassRefPtr<IDBDatabaseBackendInterface> backend)
+void IDBOpenDBRequest::onSuccess(PassRefPtr<IDBDatabaseBackendInterface> prpBackend)
 {
     IDB_TRACE("IDBOpenDBRequest::onSuccess()");
     if (!shouldEnqueueEvent())
         return;
 
+    RefPtr<IDBDatabaseBackendInterface> backend = prpBackend;
+    // FIXME: This potentially expensive (synchronous) call into the backend could be removed if the metadata
+    // were passed in during the (asynchronous) onSuccess call from the backend. http://wkbug.com/103920
+    IDBDatabaseMetadata metadata = backend->metadata();
     RefPtr<IDBDatabase> idbDatabase;
     if (m_result) {
         idbDatabase = m_result->idbDatabase();
@@ -117,11 +128,12 @@ void IDBOpenDBRequest::onSuccess(PassRefPtr<IDBDatabaseBackendInterface> backend
         ASSERT(!m_databaseCallbacks);
     } else {
         ASSERT(m_databaseCallbacks);
-        idbDatabase = IDBDatabase::create(scriptExecutionContext(), backend, m_databaseCallbacks);
+        idbDatabase = IDBDatabase::create(scriptExecutionContext(), backend.release(), m_databaseCallbacks);
         m_databaseCallbacks->connect(idbDatabase.get());
         m_databaseCallbacks = 0;
         m_result = IDBAny::create(idbDatabase.get());
     }
+    idbDatabase->setMetadata(metadata);
     enqueueEvent(Event::create(eventNames().successEvent, false, false));
 }
 
index 479f12a..00b9d16 100644 (file)
@@ -47,12 +47,14 @@ namespace WebCore {
 PassRefPtr<IDBTransaction> IDBTransaction::create(ScriptExecutionContext* context, int64_t id, PassRefPtr<IDBTransactionBackendInterface> backend, const Vector<String>& objectStoreNames, IDBTransaction::Mode mode, IDBDatabase* db)
 {
     IDBOpenDBRequest* openDBRequest = 0;
-    return create(context, id, backend, objectStoreNames, mode, db, openDBRequest);
+    RefPtr<IDBTransaction> transaction(adoptRef(new IDBTransaction(context, id, backend, objectStoreNames, mode, db, openDBRequest, IDBDatabaseMetadata())));
+    transaction->suspendIfNeeded();
+    return transaction.release();
 }
 
-PassRefPtr<IDBTransaction> IDBTransaction::create(ScriptExecutionContext* context, int64_t id, PassRefPtr<IDBTransactionBackendInterface> backend, const Vector<String>& objectStoreNames, IDBTransaction::Mode mode, IDBDatabase* db, IDBOpenDBRequest* openDBRequest)
+PassRefPtr<IDBTransaction> IDBTransaction::create(ScriptExecutionContext* context, int64_t id, PassRefPtr<IDBTransactionBackendInterface> backend, IDBDatabase* db, IDBOpenDBRequest* openDBRequest, const IDBDatabaseMetadata& previousMetadata)
 {
-    RefPtr<IDBTransaction> transaction(adoptRef(new IDBTransaction(context, id, backend, objectStoreNames, mode, db, openDBRequest)));
+    RefPtr<IDBTransaction> transaction(adoptRef(new IDBTransaction(context, id, backend, Vector<String>(), VERSION_CHANGE, db, openDBRequest, previousMetadata)));
     transaction->suspendIfNeeded();
     return transaction.release();
 }
@@ -88,7 +90,7 @@ const AtomicString& IDBTransaction::modeReadWriteLegacy()
 }
 
 
-IDBTransaction::IDBTransaction(ScriptExecutionContext* context, int64_t id, PassRefPtr<IDBTransactionBackendInterface> backend, const Vector<String>& objectStoreNames, IDBTransaction::Mode mode, IDBDatabase* db, IDBOpenDBRequest* openDBRequest)
+IDBTransaction::IDBTransaction(ScriptExecutionContext* context, int64_t id, PassRefPtr<IDBTransactionBackendInterface> backend, const Vector<String>& objectStoreNames, IDBTransaction::Mode mode, IDBDatabase* db, IDBOpenDBRequest* openDBRequest, const IDBDatabaseMetadata& previousMetadata)
     : ActiveDOMObject(context, this)
     , m_backend(backend)
     , m_id(id)
@@ -99,6 +101,7 @@ IDBTransaction::IDBTransaction(ScriptExecutionContext* context, int64_t id, Pass
     , m_state(Active)
     , m_hasPendingActivity(true)
     , m_contextStopped(false)
+    , m_previousMetadata(previousMetadata)
 {
     ASSERT(m_backend);
 
@@ -307,6 +310,7 @@ void IDBTransaction::onAbort(PassRefPtr<IDBDatabaseError> error)
     if (isVersionChange()) {
         for (IDBObjectStoreMetadataMap::iterator it = m_objectStoreCleanupMap.begin(); it != m_objectStoreCleanupMap.end(); ++it)
             it->key->setMetadata(it->value);
+        m_database->setMetadata(m_previousMetadata);
     }
     m_objectStoreCleanupMap.clear();
     closeOpenCursors();
index 6a970c6..682eb9c 100644 (file)
@@ -34,6 +34,7 @@
 #include "EventListener.h"
 #include "EventNames.h"
 #include "EventTarget.h"
+#include "IDBMetadata.h"
 #include "IDBTransactionCallbacks.h"
 #include "ScriptWrappable.h"
 #include <wtf/HashSet.h>
@@ -57,7 +58,7 @@ public:
     };
 
     static PassRefPtr<IDBTransaction> create(ScriptExecutionContext*, int64_t, PassRefPtr<IDBTransactionBackendInterface>, const Vector<String>& objectStoreNames, Mode, IDBDatabase*);
-    static PassRefPtr<IDBTransaction> create(ScriptExecutionContext*, int64_t, PassRefPtr<IDBTransactionBackendInterface>, const Vector<String>& objectStoreNames, Mode, IDBDatabase*, IDBOpenDBRequest*);
+    static PassRefPtr<IDBTransaction> create(ScriptExecutionContext*, int64_t, PassRefPtr<IDBTransactionBackendInterface>, IDBDatabase*, IDBOpenDBRequest*, const IDBDatabaseMetadata& previousMetadata);
     virtual ~IDBTransaction();
 
     static const AtomicString& modeReadOnly();
@@ -123,7 +124,7 @@ public:
     using RefCounted<IDBTransactionCallbacks>::deref;
 
 private:
-    IDBTransaction(ScriptExecutionContext*, int64_t, PassRefPtr<IDBTransactionBackendInterface>, const Vector<String>&, Mode, IDBDatabase*, IDBOpenDBRequest*);
+    IDBTransaction(ScriptExecutionContext*, int64_t, PassRefPtr<IDBTransactionBackendInterface>, const Vector<String>&, Mode, IDBDatabase*, IDBOpenDBRequest*, const IDBDatabaseMetadata&);
 
     void enqueueEvent(PassRefPtr<Event>);
     void closeOpenCursors();
@@ -166,6 +167,7 @@ private:
 
     typedef HashMap<RefPtr<IDBObjectStore>, IDBObjectStoreMetadata> IDBObjectStoreMetadataMap;
     IDBObjectStoreMetadataMap m_objectStoreCleanupMap;
+    IDBDatabaseMetadata m_previousMetadata;
 
     HashSet<IDBCursor*> m_openCursors;
 
index 5a36a79..977d697 100644 (file)
@@ -1,3 +1,20 @@
+2012-12-03  Joshua Bell  <jsbell@chromium.org>
+
+        IndexedDB: Correct database version after aborted upgrade
+        https://bugs.webkit.org/show_bug.cgi?id=103763
+
+        Reviewed by Tony Chang.
+
+        Pass previously created proxy along in an open onSuccess, rather than a useless wrapper.
+
+        * src/WebIDBCallbacksImpl.cpp:
+        (WebKit::WebIDBCallbacksImpl::WebIDBCallbacksImpl):
+        (WebKit::WebIDBCallbacksImpl::onSuccess):
+        (WebKit::WebIDBCallbacksImpl::onUpgradeNeeded):
+        * src/WebIDBCallbacksImpl.h:
+        (WebCore):
+        (WebIDBCallbacksImpl):
+
 2012-12-03  Rafael Weinstein  <rafaelw@chromium.org>
 
         Implement HTMLTemplateElement
index dcf303b..57c0319 100644 (file)
@@ -49,7 +49,6 @@ namespace WebKit {
 
 WebIDBCallbacksImpl::WebIDBCallbacksImpl(PassRefPtr<IDBCallbacks> callbacks)
     : m_callbacks(callbacks)
-    , m_didCreateDatabaseProxy(false)
 {
 }
 
@@ -74,8 +73,8 @@ void WebIDBCallbacksImpl::onSuccess(WebIDBCursor* cursor, const WebIDBKey& key,
 
 void WebIDBCallbacksImpl::onSuccess(WebIDBDatabase* webKitInstance)
 {
-    if (m_didCreateDatabaseProxy) {
-        m_callbacks->onSuccess(IDBDatabaseBackendProxy::create(adoptPtr(static_cast<WebIDBDatabase*>(0))));
+    if (m_databaseProxy) {
+        m_callbacks->onSuccess(m_databaseProxy.release());
         return;
     }
     m_callbacks->onSuccess(IDBDatabaseBackendProxy::create(adoptPtr(webKitInstance)));
@@ -123,8 +122,8 @@ void WebIDBCallbacksImpl::onBlocked(long long oldVersion)
 
 void WebIDBCallbacksImpl::onUpgradeNeeded(long long oldVersion, WebIDBTransaction* transaction, WebIDBDatabase* database)
 {
-    m_didCreateDatabaseProxy = true;
-    m_callbacks->onUpgradeNeeded(oldVersion, IDBTransactionBackendProxy::create(adoptPtr(transaction)), IDBDatabaseBackendProxy::create(adoptPtr(database)));
+    m_databaseProxy = IDBDatabaseBackendProxy::create(adoptPtr(database));
+    m_callbacks->onUpgradeNeeded(oldVersion, IDBTransactionBackendProxy::create(adoptPtr(transaction)), m_databaseProxy);
 }
 
 } // namespace WebKit
index 8f8c02a..4b10649 100644 (file)
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefPtr.h>
 
-namespace WebCore { class IDBCallbacks; }
+namespace WebCore {
+
+class IDBCallbacks;
+class IDBDatabaseBackendInterface;
+
+} // namespace WebCore
 
 namespace WebKit {
 
@@ -57,7 +62,7 @@ public:
 
 private:
     RefPtr<WebCore::IDBCallbacks> m_callbacks;
-    bool m_didCreateDatabaseProxy;
+    RefPtr<WebCore::IDBDatabaseBackendInterface> m_databaseProxy;
 };
 
 } // namespace WebKit