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);
}