Diff
Modified: trunk/LayoutTests/ChangeLog (136474 => 136475)
--- trunk/LayoutTests/ChangeLog 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/LayoutTests/ChangeLog 2012-12-04 07:17:04 UTC (rev 136475)
@@ -1,3 +1,20 @@
+2012-12-03 Joshua Bell <jsb...@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_f...@apple.com>
Unreviewed. Gardening of Apple Windows port.
Modified: trunk/LayoutTests/storage/indexeddb/intversion-abort-in-initial-upgradeneeded-expected.txt (136474 => 136475)
--- trunk/LayoutTests/storage/indexeddb/intversion-abort-in-initial-upgradeneeded-expected.txt 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/LayoutTests/storage/indexeddb/intversion-abort-in-initial-upgradeneeded-expected.txt 2012-12-04 07:17:04 UTC (rev 136475)
@@ -16,14 +16,14 @@
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
Modified: trunk/LayoutTests/storage/indexeddb/mozilla/resources/versionchange-abort.js (136474 => 136475)
--- trunk/LayoutTests/storage/indexeddb/mozilla/resources/versionchange-abort.js 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/LayoutTests/storage/indexeddb/mozilla/resources/versionchange-abort.js 2012-12-04 07:17:04 UTC (rev 136475)
@@ -32,7 +32,6 @@
function postAbort()
{
- debug("FIXME: Fails because of http://wkb.ug/102412");
shouldBe("db.version", "0");
shouldBe("db.objectStoreNames.length", "0");
Modified: trunk/LayoutTests/storage/indexeddb/mozilla/versionchange-abort-expected.txt (136474 => 136475)
--- trunk/LayoutTests/storage/indexeddb/mozilla/versionchange-abort-expected.txt 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/LayoutTests/storage/indexeddb/mozilla/versionchange-abort-expected.txt 2012-12-04 07:17:04 UTC (rev 136475)
@@ -13,8 +13,7 @@
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
Modified: trunk/LayoutTests/storage/indexeddb/resources/unblocked-version-changes.js (136474 => 136475)
--- trunk/LayoutTests/storage/indexeddb/resources/unblocked-version-changes.js 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/LayoutTests/storage/indexeddb/resources/unblocked-version-changes.js 2012-12-04 07:17:04 UTC (rev 136475)
@@ -29,12 +29,15 @@
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 @@
finishJSTest();
}
-test();
\ No newline at end of file
+test();
Modified: trunk/LayoutTests/storage/indexeddb/unblocked-version-changes-expected.txt (136474 => 136475)
--- trunk/LayoutTests/storage/indexeddb/unblocked-version-changes-expected.txt 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/LayoutTests/storage/indexeddb/unblocked-version-changes-expected.txt 2012-12-04 07:17:04 UTC (rev 136475)
@@ -14,11 +14,13 @@
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
Modified: trunk/Source/WebCore/ChangeLog (136474 => 136475)
--- trunk/Source/WebCore/ChangeLog 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/Source/WebCore/ChangeLog 2012-12-04 07:17:04 UTC (rev 136475)
@@ -1,3 +1,34 @@
+2012-12-03 Joshua Bell <jsb...@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 <rafa...@chromium.org>
Implement HTMLTemplateElement
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp (136474 => 136475)
--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp 2012-12-04 07:17:04 UTC (rev 136475)
@@ -68,7 +68,6 @@
{
// We pass a reference of this object before it can be adopted.
relaxAdoptionRequirement();
- m_metadata = m_backend->metadata();
}
IDBDatabase::~IDBDatabase()
@@ -93,7 +92,6 @@
if (transaction->isVersionChange()) {
ASSERT(!m_versionChangeTransaction);
m_versionChangeTransaction = transaction;
- m_metadata = m_backend->metadata();
}
}
@@ -106,7 +104,6 @@
if (transaction->isVersionChange()) {
ASSERT(m_versionChangeTransaction == transaction);
m_versionChangeTransaction = 0;
- m_metadata = m_backend->metadata();
}
if (m_closePending && m_transactions.isEmpty())
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.h (136474 => 136475)
--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.h 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.h 2012-12-04 07:17:04 UTC (rev 136475)
@@ -55,6 +55,7 @@
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 @@
private:
IDBDatabase(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendInterface>, PassRefPtr<IDBDatabaseCallbacks>);
-
// EventTarget
virtual void refEventTarget() { ref(); }
virtual void derefEventTarget() { deref(); }
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.cpp (136474 => 136475)
--- trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.cpp 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.cpp 2012-12-04 07:17:04 UTC (rev 136475)
@@ -84,32 +84,43 @@
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 @@
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));
}
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp (136474 => 136475)
--- trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp 2012-12-04 07:17:04 UTC (rev 136475)
@@ -47,12 +47,14 @@
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 @@
}
-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 @@
, m_state(Active)
, m_hasPendingActivity(true)
, m_contextStopped(false)
+ , m_previousMetadata(previousMetadata)
{
ASSERT(m_backend);
@@ -307,6 +310,7 @@
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();
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h (136474 => 136475)
--- trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h 2012-12-04 07:17:04 UTC (rev 136475)
@@ -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 @@
};
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 @@
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 @@
typedef HashMap<RefPtr<IDBObjectStore>, IDBObjectStoreMetadata> IDBObjectStoreMetadataMap;
IDBObjectStoreMetadataMap m_objectStoreCleanupMap;
+ IDBDatabaseMetadata m_previousMetadata;
HashSet<IDBCursor*> m_openCursors;
Modified: trunk/Source/WebKit/chromium/ChangeLog (136474 => 136475)
--- trunk/Source/WebKit/chromium/ChangeLog 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/Source/WebKit/chromium/ChangeLog 2012-12-04 07:17:04 UTC (rev 136475)
@@ -1,3 +1,20 @@
+2012-12-03 Joshua Bell <jsb...@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 <rafa...@chromium.org>
Implement HTMLTemplateElement
Modified: trunk/Source/WebKit/chromium/src/WebIDBCallbacksImpl.cpp (136474 => 136475)
--- trunk/Source/WebKit/chromium/src/WebIDBCallbacksImpl.cpp 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/Source/WebKit/chromium/src/WebIDBCallbacksImpl.cpp 2012-12-04 07:17:04 UTC (rev 136475)
@@ -49,7 +49,6 @@
WebIDBCallbacksImpl::WebIDBCallbacksImpl(PassRefPtr<IDBCallbacks> callbacks)
: m_callbacks(callbacks)
- , m_didCreateDatabaseProxy(false)
{
}
@@ -74,8 +73,8 @@
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::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
Modified: trunk/Source/WebKit/chromium/src/WebIDBCallbacksImpl.h (136474 => 136475)
--- trunk/Source/WebKit/chromium/src/WebIDBCallbacksImpl.h 2012-12-04 06:59:22 UTC (rev 136474)
+++ trunk/Source/WebKit/chromium/src/WebIDBCallbacksImpl.h 2012-12-04 07:17:04 UTC (rev 136475)
@@ -32,8 +32,13 @@
#include <wtf/PassRefPtr.h>
#include <wtf/RefPtr.h>
-namespace WebCore { class IDBCallbacks; }
+namespace WebCore {
+class IDBCallbacks;
+class IDBDatabaseBackendInterface;
+
+} // namespace WebCore
+
namespace WebKit {
class WebIDBCallbacksImpl : public WebIDBCallbacks {
@@ -57,7 +62,7 @@
private:
RefPtr<WebCore::IDBCallbacks> m_callbacks;
- bool m_didCreateDatabaseProxy;
+ RefPtr<WebCore::IDBDatabaseBackendInterface> m_databaseProxy;
};
} // namespace WebKit