2011-01-27 David Grogan <dgrogan@google.com>
authorjorlow@chromium.org <jorlow@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 27 Jan 2011 19:24:23 +0000 (19:24 +0000)
committerjorlow@chromium.org <jorlow@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 27 Jan 2011 19:24:23 +0000 (19:24 +0000)
        Reviewed by Jeremy Orlow.

        initial support for close() in indexeddb backend
        https://bugs.webkit.org/show_bug.cgi?id=53150

        * storage/indexeddb/transaction-after-close-expected.txt: Added.
        * storage/indexeddb/transaction-after-close.html: Added.
2011-01-27  David Grogan  <dgrogan@google.com>

        Reviewed by Jeremy Orlow.

        initial support for close() in indexeddb backend
        https://bugs.webkit.org/show_bug.cgi?id=53150

        Test: storage/indexeddb/transaction-after-close.html

        * storage/IDBDatabase.cpp:
        (WebCore::IDBDatabase::IDBDatabase):
        (WebCore::IDBDatabase::transaction):
        (WebCore::IDBDatabase::close):
        * storage/IDBDatabase.h:
        * storage/IDBDatabase.idl:
        * storage/IDBDatabaseBackendImpl.cpp:
        (WebCore::IDBDatabaseBackendImpl::transaction):
        (WebCore::IDBDatabaseBackendImpl::close):

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

LayoutTests/ChangeLog
LayoutTests/storage/indexeddb/transaction-after-close-expected.txt [new file with mode: 0644]
LayoutTests/storage/indexeddb/transaction-after-close.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/storage/IDBDatabase.cpp
Source/WebCore/storage/IDBDatabase.h
Source/WebCore/storage/IDBDatabase.idl

index 38671cd..a4a8e12 100644 (file)
@@ -1,3 +1,13 @@
+2011-01-27  David Grogan  <dgrogan@google.com>
+
+        Reviewed by Jeremy Orlow.
+
+        initial support for close() in indexeddb backend
+        https://bugs.webkit.org/show_bug.cgi?id=53150
+
+        * storage/indexeddb/transaction-after-close-expected.txt: Added.
+        * storage/indexeddb/transaction-after-close.html: Added.
+
 2011-01-27  Dirk Schulze  <krit@webkit.org>
 
         Reviewed by Nikolas Zimmermann.
diff --git a/LayoutTests/storage/indexeddb/transaction-after-close-expected.txt b/LayoutTests/storage/indexeddb/transaction-after-close-expected.txt
new file mode 100644 (file)
index 0000000..653bd87
--- /dev/null
@@ -0,0 +1,95 @@
+Test closing a database connection in IndexedDB.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS 'webkitIndexedDB' in window is true
+PASS webkitIndexedDB == null is false
+webkitIndexedDB.open('some db name')
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+openSuccess():
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+db = event.result
+result = db.setVersion('version 1')
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+Deleted all object stores.
+store = db.createObjectStore('store')
+request = store.put('x', 'y')
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+running first transaction
+currentTransaction = db.transaction([], webkitIDBTransaction.READ_WRITE)
+objectStore.put('a', 'b')
+db.close()
+Expecting exception from db.transaction([], webkitIDBTransaction.READ_WRITE)
+PASS code is webkitIDBDatabaseException.NOT_ALLOWED_ERR
+
+verify that we can reopen the db after calling close
+webkitIndexedDB.open('some db name')
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+second_db = event.result
+currentTransaction = second_db.transaction([], webkitIDBTransaction.READ_WRITE)
+request = store.put('1', '2')
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/storage/indexeddb/transaction-after-close.html b/LayoutTests/storage/indexeddb/transaction-after-close.html
new file mode 100644 (file)
index 0000000..718c05a
--- /dev/null
@@ -0,0 +1,105 @@
+<html>\r
+<head>\r
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">\r
+<script src="../../fast/js/resources/js-test-pre.js"></script>\r
+<script src="../../fast/js/resources/js-test-post-function.js"></script>\r
+<script src="resources/shared.js"></script>\r
+</head>\r
+<body>\r
+<p id="description"></p>\r
+<div id="console"></div>\r
+<script>\r
+\r
+description("Test closing a database connection in IndexedDB.");\r
+if (window.layoutTestController)\r
+    layoutTestController.waitUntilDone();\r
+\r
+function test()\r
+{\r
+    shouldBeTrue("'webkitIndexedDB' in window");\r
+    shouldBeFalse("webkitIndexedDB == null");\r
+\r
+    result = evalAndLog("webkitIndexedDB.open('some db name')");\r
+    verifyResult(result);\r
+    result.onsuccess = openSuccess;\r
+    result.onerror = unexpectedErrorCallback;\r
+}\r
+\r
+function openSuccess()\r
+{\r
+    debug("openSuccess():");\r
+    verifySuccessEvent(event);\r
+    window.db = evalAndLog("db = event.result");\r
+    result = evalAndLog("result = db.setVersion('version 1')");\r
+    result.onsuccess = inSetVersion;\r
+    result.onerror = unexpectedErrorCallback;\r
+}\r
+\r
+function inSetVersion()\r
+{\r
+    verifySuccessEvent(event);\r
+    deleteAllObjectStores(db, doSetVersionStuff);\r
+}\r
+\r
+function doSetVersionStuff()\r
+{\r
+    event.result.oncomplete = runFirstRegularTransaction;\r
+    event.result.onabort = unexpectedAbortCallback;\r
+    store = evalAndLog("store = db.createObjectStore('store')");\r
+    request = evalAndLog("request = store.put('x', 'y')");\r
+    request.onsuccess = onPutSuccess;\r
+    request.onerror = unexpectedErrorCallback;\r
+}\r
+\r
+function onPutSuccess()\r
+{\r
+    verifySuccessEvent(event);\r
+}\r
+\r
+function runFirstRegularTransaction()\r
+{\r
+    debug("running first transaction")\r
+    currentTransaction = evalAndLog("currentTransaction = db.transaction([], webkitIDBTransaction.READ_WRITE)");\r
+    currentTransaction.onabort = unexpectedAbortCallback;\r
+    currentTransaction.oncomplete = firstTransactionComplete;\r
+    objectStore = currentTransaction.objectStore('store');\r
+    result = evalAndLog("objectStore.put('a', 'b')");\r
+    result.onerror = unexpectedErrorCallback;\r
+}\r
+\r
+function firstTransactionComplete()\r
+{\r
+    evalAndLog("db.close()");\r
+    evalAndExpectException("db.transaction([], webkitIDBTransaction.READ_WRITE)", "webkitIDBDatabaseException.NOT_ALLOWED_ERR");\r
+\r
+    debug("")\r
+    debug("verify that we can reopen the db after calling close")\r
+    result = evalAndLog("webkitIndexedDB.open('some db name')");\r
+    verifyResult(result);\r
+    result.onsuccess = onSecondOpen\r
+    result.onerror = unexpectedErrorCallback;\r
+}\r
+\r
+function onSecondOpen() {\r
+    verifySuccessEvent(event);\r
+    second_db = evalAndLog("second_db = event.result");\r
+    currentTransaction = evalAndLog("currentTransaction = second_db.transaction([], webkitIDBTransaction.READ_WRITE)");\r
+    store = currentTransaction.objectStore('store');\r
+    request = evalAndLog("request = store.put('1', '2')");\r
+    request.onsuccess = onFinalPutSuccess;\r
+    request.onerror = unexpectedErrorCallback;\r
+    currentTransaction.oncomplete = done;\r
+    currentTransaction.onabort = unexpectedAbortCallback;\r
+}\r
+\r
+function onFinalPutSuccess() {\r
+    verifySuccessEvent(event);\r
+}\r
+\r
+var successfullyParsed = true;\r
+\r
+test();\r
+\r
+</script>\r
+</body>\r
+</html>\r
index cb0e415..c13e311 100644 (file)
@@ -1,3 +1,22 @@
+2011-01-27  David Grogan  <dgrogan@google.com>
+
+        Reviewed by Jeremy Orlow.
+
+        initial support for close() in indexeddb backend
+        https://bugs.webkit.org/show_bug.cgi?id=53150
+
+        Test: storage/indexeddb/transaction-after-close.html
+
+        * storage/IDBDatabase.cpp:
+        (WebCore::IDBDatabase::IDBDatabase):
+        (WebCore::IDBDatabase::transaction):
+        (WebCore::IDBDatabase::close):
+        * storage/IDBDatabase.h:
+        * storage/IDBDatabase.idl:
+        * storage/IDBDatabaseBackendImpl.cpp:
+        (WebCore::IDBDatabaseBackendImpl::transaction):
+        (WebCore::IDBDatabaseBackendImpl::close):
+
 2011-01-27  Dirk Schulze  <krit@webkit.org>
 
         Reviewed by Nikolas Zimmermann.
index a82565f..cce3054 100644 (file)
@@ -46,6 +46,7 @@ const unsigned long defaultTimeout = 0; // Infinite.
 
 IDBDatabase::IDBDatabase(PassRefPtr<IDBDatabaseBackendInterface> backend)
     : m_backend(backend)
+    , m_noNewTransactions(false)
 {
     // We pass a reference of this object before it can be adopted.
     relaxAdoptionRequirement();
@@ -109,6 +110,10 @@ PassRefPtr<IDBTransaction> IDBDatabase::transaction(ScriptExecutionContext* cont
         ec = IDBDatabaseException::CONSTRAINT_ERR;
         return 0;
     }
+    if (m_noNewTransactions) {
+        ec = IDBDatabaseException::NOT_ALLOWED_ERR;
+        return 0;
+    }
 
     // We need to create a new transaction synchronously. Locks are acquired asynchronously. Operations
     // can be queued against the transaction at any point. They will start executing as soon as the
@@ -126,7 +131,7 @@ PassRefPtr<IDBTransaction> IDBDatabase::transaction(ScriptExecutionContext* cont
 
 void IDBDatabase::close()
 {
-    m_backend->close();
+    m_noNewTransactions = true;
 }
 
 } // namespace WebCore
index 8720036..a80d5a2 100644 (file)
@@ -76,6 +76,8 @@ private:
 
     RefPtr<IDBDatabaseBackendInterface> m_backend;
     RefPtr<IDBTransactionBackendInterface> m_setVersionTransaction;
+
+    bool m_noNewTransactions;
 };
 
 } // namespace WebCore
index e3b7508..4e40a10 100644 (file)
@@ -40,8 +40,7 @@ module storage {
             raises (IDBDatabaseException);
         [CallWith=ScriptExecutionContext] IDBTransaction transaction(in [Optional] DOMStringList storeNames, in [Optional] unsigned short mode, in [Optional] unsigned long timeout)
             raises (IDBDatabaseException);
-        // FIXME: Implement.
-        //void close();
+        void close();
     };
 
 }