Title: [137635] trunk
Revision
137635
Author
dgro...@chromium.org
Date
2012-12-13 12:10:07 -0800 (Thu, 13 Dec 2012)

Log Message

IndexedDB: Improve error messages
https://bugs.webkit.org/show_bug.cgi?id=104624

Reviewed by Tony Chang.

Source/WebCore:

Add detail to error messages so that they are more helpful and can be
traced back to a specific line of code.

Updated test: transaction-error.html

* Modules/indexeddb/IDBDatabaseBackendImpl.cpp:
(WebCore::IDBDatabaseBackendImpl::CreateObjectStoreOperation::perform):
(WebCore::IDBDatabaseBackendImpl::DeleteObjectStoreOperation::perform):
(WebCore::IDBDatabaseBackendImpl::VersionChangeOperation::perform):
(WebCore::IDBDatabaseBackendImpl::openConnection):
(WebCore::IDBDatabaseBackendImpl::openConnectionWithVersion):
(WebCore::IDBDatabaseBackendImpl::deleteDatabase):
(WebCore::IDBDatabaseBackendImpl::close):
* Modules/indexeddb/IDBFactoryBackendImpl.cpp:
(WebCore::IDBFactoryBackendImpl::getDatabaseNames):
(WebCore::IDBFactoryBackendImpl::deleteDatabase):
(WebCore::IDBFactoryBackendImpl::open):
* Modules/indexeddb/IDBObjectStoreBackendImpl.cpp:
(WebCore::IDBObjectStoreBackendImpl::setIndexKeys):
(WebCore::IDBObjectStoreBackendImpl::createIndex):
(WebCore::IDBObjectStoreBackendImpl::CreateIndexOperation::perform):
* Modules/indexeddb/IDBTransactionBackendImpl.cpp:
(WebCore::IDBTransactionBackendImpl::abort):
(WebCore::IDBTransactionBackendImpl::commit):

LayoutTests:

Updated error message and establish that non-ascii characters in index
names don't make it back to the browser properly.

* storage/indexeddb/resources/shared.js:
(unexpectedAbortCallback):
* storage/indexeddb/resources/transaction-error.js:
(testErrorFromCommit.trans.oncomplete.request.onupgradeneeded.trans.onabort):
(testErrorFromCommit.trans.oncomplete.request.onupgradeneeded):
(testErrorFromCommit.trans.oncomplete):
(testErrorFromCommit):
* storage/indexeddb/transaction-error-expected.txt:
* storage/indexeddb/transaction-error.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (137634 => 137635)


--- trunk/LayoutTests/ChangeLog	2012-12-13 20:07:58 UTC (rev 137634)
+++ trunk/LayoutTests/ChangeLog	2012-12-13 20:10:07 UTC (rev 137635)
@@ -1,3 +1,23 @@
+2012-12-13  David Grogan  <dgro...@chromium.org>
+
+        IndexedDB: Improve error messages
+        https://bugs.webkit.org/show_bug.cgi?id=104624
+
+        Reviewed by Tony Chang.
+
+        Updated error message and establish that non-ascii characters in index
+        names don't make it back to the browser properly.
+
+        * storage/indexeddb/resources/shared.js:
+        (unexpectedAbortCallback):
+        * storage/indexeddb/resources/transaction-error.js:
+        (testErrorFromCommit.trans.oncomplete.request.onupgradeneeded.trans.onabort):
+        (testErrorFromCommit.trans.oncomplete.request.onupgradeneeded):
+        (testErrorFromCommit.trans.oncomplete):
+        (testErrorFromCommit):
+        * storage/indexeddb/transaction-error-expected.txt:
+        * storage/indexeddb/transaction-error.html:
+
 2012-12-13  David Barton  <dbar...@mathscribe.com>
 
         Heap-use-after-free in WebCore::RenderBlock::finishDelayUpdateScrollInfo

Modified: trunk/LayoutTests/storage/indexeddb/resources/shared.js (137634 => 137635)


--- trunk/LayoutTests/storage/indexeddb/resources/shared.js	2012-12-13 20:07:58 UTC (rev 137634)
+++ trunk/LayoutTests/storage/indexeddb/resources/shared.js	2012-12-13 20:10:07 UTC (rev 137635)
@@ -53,7 +53,7 @@
 
 function unexpectedAbortCallback(e)
 {
-    testFailed("Abort function called unexpectedly!");
+    testFailed("Abort function called unexpectedly! Message: [" + e.target.webkitErrorMessage + "]");
     finishJSTest();
 }
 

Modified: trunk/LayoutTests/storage/indexeddb/resources/transaction-error.js (137634 => 137635)


--- trunk/LayoutTests/storage/indexeddb/resources/transaction-error.js	2012-12-13 20:07:58 UTC (rev 137634)
+++ trunk/LayoutTests/storage/indexeddb/resources/transaction-error.js	2012-12-13 20:10:07 UTC (rev 137635)
@@ -105,7 +105,8 @@
         request._onupgradeneeded_ = function() {
             evalAndLog("trans = request.transaction");
             debug("This should fail due to the unique constraint:");
-            evalAndLog("trans.objectStore('storeName').createIndex('indexName', 'id', {unique: true})");
+            evalAndLog("indexName = 'Also test utf8: \u6F22'");
+            evalAndLog("trans.objectStore('storeName').createIndex(indexName, 'id', {unique: true})");
             trans._oncomplete_ = unexpectedCompleteCallback;
             trans._onabort_ = function() {
                 debug("Transaction received abort event.");
@@ -113,6 +114,8 @@
                 shouldBe("trans.error.name", "'ConstraintError'");
                 debug("trans.webkitErrorMessage = " + trans.webkitErrorMessage);
                 shouldBeNonNull("trans.webkitErrorMessage");
+                debug("Note: This fails because of http://wkb.ug/37327");
+                shouldNotBe("trans.webkitErrorMessage.indexOf(indexName)", "-1");
                 debug("");
                 finishJSTest();
             };

Modified: trunk/LayoutTests/storage/indexeddb/transaction-error-expected.txt (137634 => 137635)


--- trunk/LayoutTests/storage/indexeddb/transaction-error-expected.txt	2012-12-13 20:07:58 UTC (rev 137634)
+++ trunk/LayoutTests/storage/indexeddb/transaction-error-expected.txt	2012-12-13 20:10:07 UTC (rev 137635)
@@ -50,12 +50,15 @@
 request = indexedDB.open(dbname, 2)
 trans = request.transaction
 This should fail due to the unique constraint:
-trans.objectStore('storeName').createIndex('indexName', 'id', {unique: true})
+indexName = 'Also test utf8: 漢'
+trans.objectStore('storeName').createIndex(indexName, 'id', {unique: true})
 Transaction received abort event.
 PASS trans.error is non-null.
 PASS trans.error.name is 'ConstraintError'
-trans.webkitErrorMessage = Duplicate index keys exist in the object store.
+trans.webkitErrorMessage = Unable to add key to index 'Also test utf8: æ¼¢': at least one key does not satisfy the uniqueness requirements.
 PASS trans.webkitErrorMessage is non-null.
+Note: This fails because of http://wkb.ug/37327
+FAIL trans.webkitErrorMessage.indexOf(indexName) should not be -1.
 
 PASS successfullyParsed is true
 

Modified: trunk/LayoutTests/storage/indexeddb/transaction-error.html (137634 => 137635)


--- trunk/LayoutTests/storage/indexeddb/transaction-error.html	2012-12-13 20:07:58 UTC (rev 137634)
+++ trunk/LayoutTests/storage/indexeddb/transaction-error.html	2012-12-13 20:10:07 UTC (rev 137635)
@@ -4,7 +4,7 @@
 <script src=""
 </head>
 <body>
-<script src=""
+<script src="" charset="utf-8"></script>
 <script src=""
 </body>
 </html>

Modified: trunk/Source/WebCore/ChangeLog (137634 => 137635)


--- trunk/Source/WebCore/ChangeLog	2012-12-13 20:07:58 UTC (rev 137634)
+++ trunk/Source/WebCore/ChangeLog	2012-12-13 20:10:07 UTC (rev 137635)
@@ -1,3 +1,35 @@
+2012-12-13  David Grogan  <dgro...@chromium.org>
+
+        IndexedDB: Improve error messages
+        https://bugs.webkit.org/show_bug.cgi?id=104624
+
+        Reviewed by Tony Chang.
+
+        Add detail to error messages so that they are more helpful and can be
+        traced back to a specific line of code.
+
+        Updated test: transaction-error.html
+
+        * Modules/indexeddb/IDBDatabaseBackendImpl.cpp:
+        (WebCore::IDBDatabaseBackendImpl::CreateObjectStoreOperation::perform):
+        (WebCore::IDBDatabaseBackendImpl::DeleteObjectStoreOperation::perform):
+        (WebCore::IDBDatabaseBackendImpl::VersionChangeOperation::perform):
+        (WebCore::IDBDatabaseBackendImpl::openConnection):
+        (WebCore::IDBDatabaseBackendImpl::openConnectionWithVersion):
+        (WebCore::IDBDatabaseBackendImpl::deleteDatabase):
+        (WebCore::IDBDatabaseBackendImpl::close):
+        * Modules/indexeddb/IDBFactoryBackendImpl.cpp:
+        (WebCore::IDBFactoryBackendImpl::getDatabaseNames):
+        (WebCore::IDBFactoryBackendImpl::deleteDatabase):
+        (WebCore::IDBFactoryBackendImpl::open):
+        * Modules/indexeddb/IDBObjectStoreBackendImpl.cpp:
+        (WebCore::IDBObjectStoreBackendImpl::setIndexKeys):
+        (WebCore::IDBObjectStoreBackendImpl::createIndex):
+        (WebCore::IDBObjectStoreBackendImpl::CreateIndexOperation::perform):
+        * Modules/indexeddb/IDBTransactionBackendImpl.cpp:
+        (WebCore::IDBTransactionBackendImpl::abort):
+        (WebCore::IDBTransactionBackendImpl::commit):
+
 2012-12-13  Claudio Saavedra  <csaave...@igalia.com>
 
         [GTK] Safeguard against possible NULL-dereference

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp (137634 => 137635)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp	2012-12-13 20:07:58 UTC (rev 137634)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp	2012-12-13 20:10:07 UTC (rev 137635)
@@ -301,7 +301,8 @@
 {
     IDB_TRACE("CreateObjectStoreOperation");
     if (!m_database->m_backingStore->createObjectStore(transaction->backingStoreTransaction(), m_database->id(), m_objectStore->id(), m_objectStore->name(), m_objectStore->keyPath(), m_objectStore->autoIncrement())) {
-        transaction->abort();
+        RefPtr<IDBDatabaseError> error = IDBDatabaseError::create(IDBDatabaseException::UnknownError, String::format("Internal error creating object store '%s'.", m_objectStore->name().utf8().data()));
+        transaction->abort(error.release());
         return;
     }
 }
@@ -383,7 +384,7 @@
     IDB_TRACE("DeleteObjectStoreOperation");
     bool ok = m_database->m_backingStore->deleteObjectStore(transaction->backingStoreTransaction(), m_database->id(), m_objectStore->id());
     if (!ok) {
-        RefPtr<IDBDatabaseError> error = IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error deleting object store.");
+        RefPtr<IDBDatabaseError> error = IDBDatabaseError::create(IDBDatabaseException::UnknownError, String::format("Internal error deleting object store '%s'.", m_objectStore->name().utf8().data()));
         transaction->abort(error);
     }
 }
@@ -396,7 +397,7 @@
     ASSERT(m_version > oldVersion);
     m_database->m_metadata.intVersion = m_version;
     if (!m_database->m_backingStore->updateIDBDatabaseIntVersion(transaction->backingStoreTransaction(), databaseId, m_database->m_metadata.intVersion)) {
-        RefPtr<IDBDatabaseError> error = IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Error writing data to stable storage.");
+        RefPtr<IDBDatabaseError> error = IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Error writing data to stable storage when updating version.");
         m_callbacks->onError(error);
         transaction->abort(error);
         return;
@@ -522,7 +523,7 @@
         return;
     }
     if (m_metadata.id == InvalidId && !openInternal()) {
-        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error."));
+        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error opening database with no version specified."));
         return;
     }
     if (m_metadata.version == NoStringVersion && m_metadata.intVersion == IDBDatabaseMetadata::NoIntVersion) {
@@ -584,7 +585,7 @@
         if (openInternal())
             ASSERT(m_metadata.intVersion == IDBDatabaseMetadata::NoIntVersion);
         else {
-            callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error."));
+            callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, String::format("Internal error opening connection with version %lld", static_cast<long long>(version))));
             return;
         }
     }
@@ -622,7 +623,7 @@
     }
     ASSERT(m_backingStore);
     if (!m_backingStore->deleteDatabase(m_metadata.name)) {
-        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error."));
+        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error deleting database."));
         return;
     }
     m_metadata.version = NoStringVersion;
@@ -659,8 +660,9 @@
     // FIXME: Add a test for the m_pendingOpenCalls and m_pendingOpenWithVersionCalls cases below.
     if (!connectionCount() && !m_pendingOpenCalls.size() && !m_pendingOpenWithVersionCalls.size() && !m_pendingDeleteCalls.size()) {
         TransactionMap transactions(m_transactions);
+        RefPtr<IDBDatabaseError> error = IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Connection is closing.");
         for (TransactionMap::const_iterator::Values it = transactions.values().begin(), end = transactions.values().end(); it != end; ++it)
-            (*it)->abort();
+            (*it)->abort(error);
 
         ASSERT(m_transactions.isEmpty());
 

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBFactoryBackendImpl.cpp (137634 => 137635)


--- trunk/Source/WebCore/Modules/indexeddb/IDBFactoryBackendImpl.cpp	2012-12-13 20:07:58 UTC (rev 137634)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBFactoryBackendImpl.cpp	2012-12-13 20:10:07 UTC (rev 137635)
@@ -82,7 +82,7 @@
 {
     RefPtr<IDBBackingStore> backingStore = openBackingStore(securityOrigin, dataDirectory);
     if (!backingStore) {
-        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error."));
+        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error opening backing store for indexedDB.webkitGetDatabaseNames."));
         return;
     }
 
@@ -110,7 +110,7 @@
     // FIXME: Everything from now on should be done on another thread.
     RefPtr<IDBBackingStore> backingStore = openBackingStore(securityOrigin, dataDirectory);
     if (!backingStore) {
-        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error."));
+        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error opening backing store for indexedDB.deleteDatabase."));
         return;
     }
 
@@ -120,7 +120,7 @@
         databaseBackend->deleteDatabase(callbacks);
         m_databaseBackendMap.remove(uniqueIdentifier);
     } else
-        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error."));
+        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error creating database backend for indexedDB.deleteDatabase."));
 }
 
 PassRefPtr<IDBBackingStore> IDBFactoryBackendImpl::openBackingStore(PassRefPtr<SecurityOrigin> securityOrigin, const String& dataDirectory)
@@ -151,7 +151,7 @@
     if (it == m_databaseBackendMap.end()) {
         RefPtr<IDBBackingStore> backingStore = openBackingStore(securityOrigin, dataDirectory);
         if (!backingStore) {
-            callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error."));
+            callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error opening backing store for indexedDB.open."));
             return;
         }
 
@@ -159,7 +159,7 @@
         if (databaseBackend)
             m_databaseBackendMap.set(uniqueIdentifier, databaseBackend.get());
         else {
-            callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error."));
+            callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error creating database backend for indexeddb.open."));
             return;
         }
     } else

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBObjectStoreBackendImpl.cpp (137634 => 137635)


--- trunk/Source/WebCore/Modules/indexeddb/IDBObjectStoreBackendImpl.cpp	2012-12-13 20:07:58 UTC (rev 137634)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBObjectStoreBackendImpl.cpp	2012-12-13 20:10:07 UTC (rev 137635)
@@ -467,7 +467,7 @@
         return;
     }
     if (!found) {
-        RefPtr<IDBDatabaseError> error = IDBDatabaseError::create(IDBDatabaseException::UnknownError, String::format("Internal error setting index keys for object store %s.", name().utf8().data()));
+        RefPtr<IDBDatabaseError> error = IDBDatabaseError::create(IDBDatabaseException::UnknownError, String::format("Internal error setting index keys for object store '%s'.", name().utf8().data()));
         transaction->abort(error.release());
         return;
     }
@@ -481,8 +481,7 @@
         return;
     }
     if (!obeysConstraints) {
-        // FIXME: Need to deal with errorMessage here. makeIndexWriters only fails on uniqueness constraint errors.
-        transaction->abort(IDBDatabaseError::create(IDBDatabaseException::ConstraintError, "Duplicate index keys exist in the object store."));
+        transaction->abort(IDBDatabaseError::create(IDBDatabaseException::ConstraintError, errorMessage));
         return;
     }
 
@@ -632,7 +631,7 @@
 
 PassRefPtr<IDBIndexBackendInterface> IDBObjectStoreBackendImpl::createIndex(int64_t id, const String& name, const IDBKeyPath& keyPath, bool unique, bool multiEntry, IDBTransactionBackendInterface* transactionPtr, ExceptionCode& ec)
 {
-    ASSERT_WITH_MESSAGE(!m_indexes.contains(id), "Indexes already contain %s", name.utf8().data());
+    ASSERT_WITH_MESSAGE(!m_indexes.contains(id), "Indexes already contain '%s'", name.utf8().data());
 
     RefPtr<IDBIndexBackendImpl> index = IDBIndexBackendImpl::create(m_database, this, IDBIndexMetadata(name, id, keyPath, unique, multiEntry));
     ASSERT(index->name() == name);
@@ -655,7 +654,7 @@
 {
     IDB_TRACE("CreateIndexOperation");
     if (!m_objectStore->backingStore()->createIndex(transaction->backingStoreTransaction(), m_objectStore->databaseId(), m_objectStore->id(), m_index->id(), m_index->name(), m_index->keyPath(), m_index->unique(), m_index->multiEntry())) {
-        transaction->abort();
+        transaction->abort(IDBDatabaseError::create(IDBDatabaseException::UnknownError, String::format("Internal error when trying to create index '%s'.", m_index->name().utf8().data())));
         return;
     }
 }

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendImpl.cpp (137634 => 137635)


--- trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendImpl.cpp	2012-12-13 20:07:58 UTC (rev 137634)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendImpl.cpp	2012-12-13 20:10:07 UTC (rev 137635)
@@ -105,7 +105,7 @@
 
 void IDBTransactionBackendImpl::abort()
 {
-    abort(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error."));
+    abort(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error (unknown cause)"));
 }
 
 void IDBTransactionBackendImpl::abort(PassRefPtr<IDBDatabaseError> error)
@@ -235,7 +235,7 @@
         m_callbacks->onComplete();
         m_database->transactionFinishedAndCompleteFired(this);
     } else {
-        m_callbacks->onAbort(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error."));
+        m_callbacks->onAbort(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error committing transaction."));
         m_database->transactionFinishedAndAbortFired(this);
     }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to