[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

andreip at google.com andreip at google.com
Wed Dec 22 14:20:57 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 1b2e47174aeb1efa746e3559d12fcb912c4f9d32
Author: andreip at google.com <andreip at google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Oct 6 22:52:22 2010 +0000

    2010-10-06  Andrei Popescu  <andreip at google.com>
    
            Reviewed by Jeremy Orlow.
    
            IDBDatabase and IDBObjectStore metadata is not recovered correctly when the setVersion transactions aborts.
            https://bugs.webkit.org/show_bug.cgi?id=47245
    
            * storage/indexeddb/database-basics-expected.txt:
            * storage/indexeddb/database-basics.html:
            * storage/indexeddb/objectstore-basics-expected.txt:
            * storage/indexeddb/objectstore-basics.html:
            * storage/indexeddb/resources/shared.js:
            (unexpectedAbortCallback):
            (unexpectedCompleteCallback):
            (deleteAllObjectStores):
            * storage/indexeddb/transaction-basics-expected.txt:
            * storage/indexeddb/transaction-basics.html:
    2010-10-06  Andrei Popescu  <andreip at google.com>
    
            Reviewed by Jeremy Orlow.
    
            IDBDatabase and IDBObjectStore metadata is not recovered correctly when the setVersion transactions aborts.
            https://bugs.webkit.org/show_bug.cgi?id=47245
    
            Recover metadata properly by adding abort tasks that
            are run when a transaction aborts.
    
            * storage/IDBDatabase.cpp:
            (WebCore::IDBDatabase::createObjectStore):
            (WebCore::IDBDatabase::removeObjectStore):
            * storage/IDBDatabaseBackendImpl.cpp:
            (WebCore::IDBDatabaseBackendImpl::createObjectStore):
            (WebCore::IDBDatabaseBackendImpl::removeObjectStore):
            (WebCore::IDBDatabaseBackendImpl::setVersion):
            (WebCore::IDBDatabaseBackendImpl::removeObjectStoreFromMap):
            (WebCore::IDBDatabaseBackendImpl::addObjectStoreToMap):
            (WebCore::IDBDatabaseBackendImpl::resetVersion):
            * storage/IDBDatabaseBackendImpl.h:
            * storage/IDBObjectStoreBackendImpl.cpp:
            (WebCore::IDBObjectStoreBackendImpl::createIndex):
            (WebCore::IDBObjectStoreBackendImpl::removeIndex):
            (WebCore::IDBObjectStoreBackendImpl::removeIndexFromMap):
            (WebCore::IDBObjectStoreBackendImpl::addIndexToMap):
            * storage/IDBObjectStoreBackendImpl.h:
            * storage/IDBTransactionBackendImpl.cpp:
            (WebCore::IDBTransactionBackendImpl::scheduleTask):
            (WebCore::IDBTransactionBackendImpl::abort):
            * storage/IDBTransactionBackendImpl.h:
            * storage/IDBTransactionBackendInterface.h:
            * storage/IDBTransactionCoordinator.h:
    2010-10-06  Andrei Popescu  <andreip at google.com>
    
            Reviewed by Jeremy Orlow.
    
            IDBDatabase and IDBObjectStore metadata is not recovered correctly when the setVersion transactions aborts.
            https://bugs.webkit.org/show_bug.cgi?id=47245
    
            * src/IDBTransactionBackendProxy.cpp:
            (WebCore::IDBTransactionBackendProxy::scheduleTask):
            * src/IDBTransactionBackendProxy.h:
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@69247 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index df7d0db..f3d9d56 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,21 @@
+2010-10-06  Andrei Popescu  <andreip at google.com>
+
+        Reviewed by Jeremy Orlow.
+
+        IDBDatabase and IDBObjectStore metadata is not recovered correctly when the setVersion transactions aborts.
+        https://bugs.webkit.org/show_bug.cgi?id=47245
+
+        * storage/indexeddb/database-basics-expected.txt:
+        * storage/indexeddb/database-basics.html:
+        * storage/indexeddb/objectstore-basics-expected.txt:
+        * storage/indexeddb/objectstore-basics.html:
+        * storage/indexeddb/resources/shared.js:
+        (unexpectedAbortCallback):
+        (unexpectedCompleteCallback):
+        (deleteAllObjectStores):
+        * storage/indexeddb/transaction-basics-expected.txt:
+        * storage/indexeddb/transaction-basics.html:
+
 2010-10-06  Albert J. Wong  <ajwong at chromium.org>
 
         [chromium] Unreviewed. Build fix. Mark flaky tests.
diff --git a/LayoutTests/storage/indexeddb/database-basics-expected.txt b/LayoutTests/storage/indexeddb/database-basics-expected.txt
index d054778..374150c 100644
--- a/LayoutTests/storage/indexeddb/database-basics-expected.txt
+++ b/LayoutTests/storage/indexeddb/database-basics-expected.txt
@@ -88,6 +88,39 @@ PASS db.objectStores.length is 1
 PASS db.objectStores.contains('') is false
 PASS db.objectStores.contains('test456') is false
 PASS db.objectStores.contains('test123') is true
+db.setVersion("version c")
+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
+
+PASS db.version is "version c"
+PASS db.name is "name"
+PASS db.objectStores is ['test123']
+PASS db.objectStores.length is 1
+PASS db.objectStores.contains('') is false
+PASS db.objectStores.contains('test456') is false
+PASS db.objectStores.contains('test123') is true
+db.createObjectStore("test456")
+setVersionTrans = event.result
+PASS setVersionTrans !== null is true
+PASS db.version is "version b"
+PASS db.objectStores is ['test123']
+PASS db.objectStores.length is 1
+PASS db.objectStores.contains('') is false
+PASS db.objectStores.contains('test456') is false
+PASS db.objectStores.contains('test123') is true
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/LayoutTests/storage/indexeddb/database-basics.html b/LayoutTests/storage/indexeddb/database-basics.html
index 2ebcf0b..fe0cb19 100644
--- a/LayoutTests/storage/indexeddb/database-basics.html
+++ b/LayoutTests/storage/indexeddb/database-basics.html
@@ -73,18 +73,52 @@ function createObjectStore()
     shouldBe("db.objectStores.contains('')", "false");
 
     objectStore = evalAndLog('db.createObjectStore("test123")');
-    checkObjectStore(objectStore);
+    checkObjectStore();
+    commitAndContinue();
 }
 
-function checkObjectStore(objectStore)
+function checkObjectStore()
 {
     shouldBe("db.objectStores", "['test123']");
     shouldBe("db.objectStores.length", "1");
     shouldBe("db.objectStores.contains('')", "false");
     shouldBe("db.objectStores.contains('test456')", "false");
-    shouldBe("db.objectStores.contains('test123')", "true");
-
-    done();
+    shouldBe("db.objectStores.contains('test123')", "true");
+}
+
+function commitAndContinue()
+{
+    window.setTimeout(testSetVersionAbort, 0);
+}
+
+function testSetVersionAbort()
+{
+    result = evalAndLog('db.setVersion("version c")');
+    verifyResult(result);
+    result.onsuccess = createAnotherObjectStore;
+    result.onerror = unexpectedErrorCallback;
+}
+
+function createAnotherObjectStore()
+{
+    verifySuccessEvent(event);
+    shouldBeEqualToString("db.version", "version c");
+    shouldBeEqualToString("db.name", "name");
+    checkObjectStore();
+
+    objectStore = evalAndLog('db.createObjectStore("test456")');
+    var setVersionTrans = evalAndLog("setVersionTrans = event.result");
+    shouldBeTrue("setVersionTrans !== null");
+    setVersionTrans.oncomplete = unexpectedCompleteCallback;
+    setVersionTrans.onabort = checkMetadata;
+    setVersionTrans.abort();
+}
+
+function checkMetadata()
+{
+    shouldBeEqualToString("db.version", "version b");
+    checkObjectStore();
+    done();
 }
 
 test();
diff --git a/LayoutTests/storage/indexeddb/objectstore-basics-expected.txt b/LayoutTests/storage/indexeddb/objectstore-basics-expected.txt
index 9f21de0..6ff87c8 100644
--- a/LayoutTests/storage/indexeddb/objectstore-basics-expected.txt
+++ b/LayoutTests/storage/indexeddb/objectstore-basics-expected.txt
@@ -50,20 +50,50 @@ PASS store.name is "storeName"
 PASS store.keyPath is null
 PASS storeNames.contains('storeName') is true
 PASS storeNames.length is 1
-Ask for a store that doesn't exist:
+Ask for an index that doesn't exist:
 index = store.index('asdf')
 PASS index is null
 PASS index is null
 createIndex():
-store.createIndex('indexName', 'x', true)
+index = store.createIndex('indexName', 'x', true)
 PASS index !== null is true
 PASS store.indexNames.contains('indexName') is true
 index = store.index('indexName')
 PASS index !== null is true
-Ask for a store that doesn't exist:
+Ask for an index that doesn't exist:
 index = store.index('asdf')
 PASS index is null
 PASS index is null.
+db.setVersion("version fail")
+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
+
+PASS db.version is "version fail"
+setVersionTrans = event.result
+PASS setVersionTrans !== null is true
+store = setVersionTrans.objectStore('storeName')
+index = store.createIndex('indexFail', 'x')
+PASS db.version is "new version"
+PASS store.indexNames is ['indexName']
+PASS store.indexNames.length is 1
+PASS store.indexNames.contains('') is false
+PASS store.indexNames.contains('indexFail') is false
+PASS store.indexNames.contains('indexName') is true
+transaction = db.transaction()
+store = transaction.objectStore('storeName')
 store.add({x: 'value'}, 'key')
 PASS 'onsuccess' in result is true
 PASS 'onerror' in result is true
diff --git a/LayoutTests/storage/indexeddb/objectstore-basics.html b/LayoutTests/storage/indexeddb/objectstore-basics.html
index d930f4b..130f82a 100644
--- a/LayoutTests/storage/indexeddb/objectstore-basics.html
+++ b/LayoutTests/storage/indexeddb/objectstore-basics.html
@@ -48,7 +48,7 @@ function setVersionSuccess()
 function createObjectStore()
 {
     debug("creatObjectStore():");
-    var store = evalAndLog("store = db.createObjectStore('storeName', null)");
+    window.store = evalAndLog("store = db.createObjectStore('storeName', null)");
     var storeNames = evalAndLog("storeNames = db.objectStores");
 
     shouldBeEqualToString("store.name", "storeName");
@@ -57,7 +57,7 @@ function createObjectStore()
     shouldBe("storeNames.length", "1");
     // FIXME: test all of object store's methods.
 
-    debug("Ask for a store that doesn't exist:");
+    debug("Ask for an index that doesn't exist:");
     try {
         index = evalAndLog("index = store.index('asdf')");
         shouldBeNull("index"); // Returning null is wrong, but less wrong than returning an actual object!
@@ -68,27 +68,74 @@ function createObjectStore()
     }
 
     createIndex();
-}
-
-function createIndex()
+}
+
+function createIndex()
 {
     debug("createIndex():");
-    window.index = evalAndLog("store.createIndex('indexName', 'x', true)"); // true == unique requirement.
-    shouldBeTrue("index !== null");
-    shouldBeTrue("store.indexNames.contains('indexName')");
-    index = evalAndLog("index = store.index('indexName')");
-    shouldBeTrue("index !== null");
-
-    debug("Ask for a store that doesn't exist:");
-    try {
+    var index = evalAndLog("index = store.createIndex('indexName', 'x', true)"); // true == unique requirement.
+    shouldBeTrue("index !== null");
+    shouldBeTrue("store.indexNames.contains('indexName')");
+    index = evalAndLog("index = store.index('indexName')");
+    shouldBeTrue("index !== null");
+
+    debug("Ask for an index that doesn't exist:");
+    try {
         index = evalAndLog("index = store.index('asdf')");
         shouldBeNull("index"); // Returning null is wrong, but less wrong than returning an actual object!
-        testPassed("index is null.");
-        // FIXME: testFailed("Asking for a store that doesn't exist should have thrown.");
-    } catch (err) {
-        // FIXME: Verify the correct exception thrown.
-    }
+        testPassed("index is null.");
+        // FIXME: testFailed("Asking for a store that doesn't exist should have thrown.");
+    } catch (err) {
+        // FIXME: Verify the correct exception thrown.
+    }
+    commitAndContinue();    
+}
+
+function commitAndContinue()
+{
+    window.setTimeout(testSetVersionAbort, 0);
+}
+
+function testSetVersionAbort()
+{
+    result = evalAndLog('db.setVersion("version fail")');
+    verifyResult(result);
+    result.onsuccess = createAnotherIndex;
+    result.onerror = unexpectedErrorCallback;
+}
+
+function createAnotherIndex()
+{
+    verifySuccessEvent(event);
+    shouldBeEqualToString("db.version", "version fail");
+
+    var setVersionTrans = evalAndLog("setVersionTrans = event.result");
+    shouldBeTrue("setVersionTrans !== null");
+    setVersionTrans.oncomplete = unexpectedCompleteCallback;
+    setVersionTrans.onabort = checkMetadata;
+    window.store = evalAndLog("store = setVersionTrans.objectStore('storeName')");
+    var index = evalAndLog("index = store.createIndex('indexFail', 'x')");
+
+    setVersionTrans.abort();
+}
+
+function checkMetadata()
+{
+    shouldBeEqualToString("db.version", "new version");
+    shouldBe("store.indexNames", "['indexName']");
+    shouldBe("store.indexNames.length", "1");
+    shouldBe("store.indexNames.contains('')", "false");
+    shouldBe("store.indexNames.contains('indexFail')", "false");
+    shouldBe("store.indexNames.contains('indexName')", "true");
+    addData();
+}
+
 
+function addData()
+{
+    var transaction = evalAndLog("transaction = db.transaction()");
+    transaction.onabort = unexpectedAbortCallback;
+    window.store = evalAndLog("store = transaction.objectStore('storeName')");
     result = evalAndLog("store.add({x: 'value'}, 'key')");
     verifyResult(result);
     result.onsuccess = addSuccess;
diff --git a/LayoutTests/storage/indexeddb/resources/shared.js b/LayoutTests/storage/indexeddb/resources/shared.js
index e695bc4..5a3f50f 100644
--- a/LayoutTests/storage/indexeddb/resources/shared.js
+++ b/LayoutTests/storage/indexeddb/resources/shared.js
@@ -76,14 +76,22 @@ function unexpectedAbortCallback()
     testFailed("Abort function called unexpectedly!");
     debug("");
     verifyAbortEvent(event);
-    done();
+    done();
+}
+
+function unexpectedCompleteCallback()
+{
+    testFailed("oncomplete function called unexpectedly!");
+    debug("");
+    verifyCompleteEvent(event);
+    done();
 }
 
-// FIXME: remove the onfinished parameter.
-function deleteAllObjectStores(db, onfinished)
+// FIXME: remove the onfinished parameter.
+function deleteAllObjectStores(db, onfinished)
 {
-    for (i = 0; i < db.objectStores.length; ++i)
-        db.removeObjectStore(db.objectStores.item(i));
+    while (db.objectStores.length)
+        db.removeObjectStore(db.objectStores.item(0));
 
     debug("Deleted all object stores.");
     onfinished();
diff --git a/LayoutTests/storage/indexeddb/transaction-basics-expected.txt b/LayoutTests/storage/indexeddb/transaction-basics-expected.txt
index 5ad34a1..1a18eed 100644
--- a/LayoutTests/storage/indexeddb/transaction-basics-expected.txt
+++ b/LayoutTests/storage/indexeddb/transaction-basics-expected.txt
@@ -11,7 +11,7 @@ PASS 'onerror' in result is true
 PASS 'readyState' in result is true
 An event should fire shortly...
 
-createObjectStoreCallback():
+openSuccess():
 Success event fired:
 PASS 'result' in event is true
 PASS 'code' in event is false
@@ -24,6 +24,132 @@ 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.
+PASS window.db.objectStores is []
+PASS window.db.objectStores.length is 0
+PASS window.db.objectStores.contains('storeFail') is false
+PASS window.db.objectStores is []
+PASS window.db.objectStores.length is 0
+PASS window.db.objectStores.contains('storeFail') is false
+result = startSetVersion('version fail')
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+addRemoveIDBObjects():
+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
+
+trans = event.result
+PASS trans !== null is true
+store = db.createObjectStore('storeFail', null)
+index = store.createIndex('indexFail', 'x', false)
+db.removeObjectStore('storeFail')
+store.removeIndex('indexFail')
+PASS window.db.objectStores is []
+PASS window.db.objectStores.length is 0
+PASS window.db.objectStores.contains('storeFail') is false
+result = startSetVersion('version fail')
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+addRemoveAddIDBObjects():
+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
+
+trans = event.result
+PASS trans !== null is true
+store = db.createObjectStore('storeFail', null)
+index = store.createIndex('indexFail', 'x', false)
+db.removeObjectStore('storeFail')
+store.removeIndex('indexFail')
+store = db.createObjectStore('storeFail', null)
+index = store.createIndex('indexFail', 'x', false)
+PASS window.db.objectStores is []
+PASS window.db.objectStores.length is 0
+PASS window.db.objectStores.contains('storeFail') is false
+result = startSetVersion('version fail')
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+addIDBObjects():
+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
+
+trans = event.result
+PASS trans !== null is true
+store = db.createObjectStore('storeFail', null)
+index = store.createIndex('indexFail', 'x', false)
+PASS db.objectStores is ['storeFail']
+PASS db.objectStores.length is 1
+PASS db.objectStores.contains('storeFail') is true
+result = startSetVersion('version fail')
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+removeIDBObjects():
+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
+
+trans = event.result
+PASS trans !== null is true
+store = trans.objectStore('storeFail')
+store.removeIndex('indexFail')
+db.removeObjectStore('storeFail')
+PASS db.objectStores is ['storeFail']
+PASS db.objectStores.length is 1
+PASS db.objectStores.contains('storeFail') is true
 db.setVersion('new version')
 PASS 'onsuccess' in result is true
 PASS 'onerror' in result is true
diff --git a/LayoutTests/storage/indexeddb/transaction-basics.html b/LayoutTests/storage/indexeddb/transaction-basics.html
index 0557708..2461a8c 100644
--- a/LayoutTests/storage/indexeddb/transaction-basics.html
+++ b/LayoutTests/storage/indexeddb/transaction-basics.html
@@ -23,14 +23,179 @@ function test()
     verifyResult(result);
     result.onsuccess = openSuccess;
     result.onerror = unexpectedErrorCallback;
+}
+
+function openSuccess()
+{
+    debug("openSuccess():");
+    verifySuccessEvent(event);
+    window.db = evalAndLog("db = event.result");
+    result = evalAndLog("result = db.setVersion('version 1')");
+    result.onsuccess = cleanDatabase;
+    result.onerror = unexpectedErrorCallback;
+}
+
+function cleanDatabase()
+{
+    verifySuccessEvent(event);
+    deleteAllObjectStores(db, checkMetadataEmpty);
+    commitAndContinue(testSetVersionAbort1);
+}
+
+function testSetVersionAbort1()
+{
+    checkMetadataEmpty();
+    result = evalAndLog("result = startSetVersion('version fail')");
+    result.onsuccess = addRemoveIDBObjects;
+}
+
+function addRemoveIDBObjects()
+{
+    debug("addRemoveIDBObjects():");
+    verifySuccessEvent(event);
+    var trans = evalAndLog("trans = event.result");
+    shouldBeTrue("trans !== null");
+    trans.onabort = testSetVersionAbort2;
+    trans.oncomplete = unexpectedCompleteCallback;
+
+    var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
+    var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");
+
+    evalAndLog("db.removeObjectStore('storeFail')");
+    evalAndLog("store.removeIndex('indexFail')");
+
+    trans.abort();
+}
+
+function testSetVersionAbort2()
+{
+    checkMetadataEmpty();
+    result = evalAndLog("result = startSetVersion('version fail')");
+    result.onsuccess = addRemoveAddIDBObjects;
+}
+
+function addRemoveAddIDBObjects()
+{
+    debug("addRemoveAddIDBObjects():");
+    verifySuccessEvent(event);
+    var trans = evalAndLog("trans = event.result");
+    shouldBeTrue("trans !== null");
+    trans.onabort = testSetVersionAbort3;
+    trans.oncomplete = unexpectedCompleteCallback;
+
+    var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
+    var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");
+
+    evalAndLog("db.removeObjectStore('storeFail')");
+    evalAndLog("store.removeIndex('indexFail')");
+
+    var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
+    var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");
+
+    trans.abort();
+}
+
+function testSetVersionAbort3()
+{
+    checkMetadataEmpty();
+    result = evalAndLog("result = startSetVersion('version fail')");
+    result.onsuccess = addIDBObjects;
+}
+
+function addIDBObjects()
+{
+    debug("addIDBObjects():");
+    verifySuccessEvent(event);
+    var trans = evalAndLog("trans = event.result");
+    shouldBeTrue("trans !== null");
+    trans.onabort = testSetVersionAbort4;
+    trans.oncomplete = unexpectedCompleteCallback;
+
+    var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
+    var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");
+
+    trans.abort();
+}
+
+function testSetVersionAbort4()
+{
+    checkMetadataEmpty();
+    result = evalAndLog("result = startSetVersion('version fail')");
+    result.onsuccess = addIDBObjectsAndCommit;
+}
+
+function addIDBObjects()
+{
+    debug("addIDBObjects():");
+    verifySuccessEvent(event);
+    var trans = evalAndLog("trans = event.result");
+    shouldBeTrue("trans !== null");
+    trans.onabort = unexpectedAbortCallback;
+
+    var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
+    var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");
+
+    commitAndContinue(testSetVersionAbort5);
+}
+
+function commitAndContinue(continueFunction)
+{
+    window.setTimeout(continueFunction, 0);
+}
+
+function testSetVersionAbort5()
+{
+    checkMetadataExistingObjectStore();
+    result = evalAndLog("result = startSetVersion('version fail')");
+    result.onsuccess = removeIDBObjects;
+}
+
+function removeIDBObjects()
+{
+    debug("removeIDBObjects():");
+    verifySuccessEvent(event);
+    var trans = evalAndLog("trans = event.result");
+    shouldBeTrue("trans !== null");
+    trans.onabort = testSetVersionAbort6;
+    trans.oncomplete = unexpectedCompleteCallback;
+
+    var store = evalAndLog("store = trans.objectStore('storeFail')");
+    evalAndLog("store.removeIndex('indexFail')");
+    evalAndLog("db.removeObjectStore('storeFail')");
+
+    trans.abort();
+}
+
+function testSetVersionAbort6()
+{
+    checkMetadataExistingObjectStore();
+    setNewVersion();
+}
+
+function startSetVersion(versionName)
+{
+    result = db.setVersion(versionName);
+    verifyResult(result);
+    result.onerror = unexpectedErrorCallback;
+    return result;
+}
+
+function checkMetadataEmpty()
+{
+    shouldBe("window.db.objectStores", "[]");
+    shouldBe("window.db.objectStores.length", "0");
+    shouldBe("window.db.objectStores.contains('storeFail')", "false");
+}
+
+function checkMetadataExistingObjectStore()
+{
+    shouldBe("db.objectStores", "['storeFail']");
+    shouldBe("db.objectStores.length", "1");
+    shouldBe("db.objectStores.contains('storeFail')", "true");
 }
 
-function openSuccess()
+function setNewVersion()
 {
-    debug("createObjectStoreCallback():");
-    verifySuccessEvent(event);
-    db = evalAndLog("db = event.result");
-
     result = evalAndLog("db.setVersion('new version')");
     verifyResult(result);
     result.onsuccess = setVersionSuccess;
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 77c312d..bbcf576 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,37 @@
+2010-10-06  Andrei Popescu  <andreip at google.com>
+
+        Reviewed by Jeremy Orlow.
+
+        IDBDatabase and IDBObjectStore metadata is not recovered correctly when the setVersion transactions aborts.
+        https://bugs.webkit.org/show_bug.cgi?id=47245
+
+        Recover metadata properly by adding abort tasks that
+        are run when a transaction aborts.
+ 
+        * storage/IDBDatabase.cpp:
+        (WebCore::IDBDatabase::createObjectStore):
+        (WebCore::IDBDatabase::removeObjectStore):
+        * storage/IDBDatabaseBackendImpl.cpp:
+        (WebCore::IDBDatabaseBackendImpl::createObjectStore):
+        (WebCore::IDBDatabaseBackendImpl::removeObjectStore):
+        (WebCore::IDBDatabaseBackendImpl::setVersion):
+        (WebCore::IDBDatabaseBackendImpl::removeObjectStoreFromMap):
+        (WebCore::IDBDatabaseBackendImpl::addObjectStoreToMap):
+        (WebCore::IDBDatabaseBackendImpl::resetVersion):
+        * storage/IDBDatabaseBackendImpl.h:
+        * storage/IDBObjectStoreBackendImpl.cpp:
+        (WebCore::IDBObjectStoreBackendImpl::createIndex):
+        (WebCore::IDBObjectStoreBackendImpl::removeIndex):
+        (WebCore::IDBObjectStoreBackendImpl::removeIndexFromMap):
+        (WebCore::IDBObjectStoreBackendImpl::addIndexToMap):
+        * storage/IDBObjectStoreBackendImpl.h:
+        * storage/IDBTransactionBackendImpl.cpp:
+        (WebCore::IDBTransactionBackendImpl::scheduleTask):
+        (WebCore::IDBTransactionBackendImpl::abort):
+        * storage/IDBTransactionBackendImpl.h:
+        * storage/IDBTransactionBackendInterface.h:
+        * storage/IDBTransactionCoordinator.h:
+
 2010-10-06  David Hyatt  <hyatt at apple.com>
 
         Reviewed by Dan Bernstein.
diff --git a/WebCore/storage/IDBDatabase.cpp b/WebCore/storage/IDBDatabase.cpp
index 046e9a9..f84ea68 100644
--- a/WebCore/storage/IDBDatabase.cpp
+++ b/WebCore/storage/IDBDatabase.cpp
@@ -57,7 +57,11 @@ void IDBDatabase::setSetVersionTransaction(IDBTransactionBackendInterface* trans
 
 PassRefPtr<IDBObjectStore> IDBDatabase::createObjectStore(const String& name, const String& keyPath, bool autoIncrement)
 {
-    // FIXME: Raise a NOT_ALLOWED_ERR if m_setVersionTransaction is 0.
+    if (!m_setVersionTransaction) {
+        // FIXME: Raise a NOT_ALLOWED_ERR if m_setVersionTransaction is 0.
+        return 0
+    }
+
     RefPtr<IDBObjectStoreBackendInterface> objectStore = m_backend->createObjectStore(name, keyPath, autoIncrement, m_setVersionTransaction.get());
     if (!objectStore)
         return 0;
@@ -66,6 +70,9 @@ PassRefPtr<IDBObjectStore> IDBDatabase::createObjectStore(const String& name, co
 
 void IDBDatabase::removeObjectStore(const String& name)
 {
+    // FIXME: Raise a NOT_ALLOWED_ERR if m_setVersionTransaction is 0.
+    if (!m_setVersionTransaction)
+        return;
     m_backend->removeObjectStore(name, m_setVersionTransaction.get());
 }
 
diff --git a/WebCore/storage/IDBDatabaseBackendImpl.cpp b/WebCore/storage/IDBDatabaseBackendImpl.cpp
index 67644b1..be6d136 100644
--- a/WebCore/storage/IDBDatabaseBackendImpl.cpp
+++ b/WebCore/storage/IDBDatabaseBackendImpl.cpp
@@ -136,13 +136,15 @@ PassRefPtr<IDBObjectStoreBackendInterface>  IDBDatabaseBackendImpl::createObject
 
     RefPtr<IDBObjectStoreBackendImpl> objectStore = IDBObjectStoreBackendImpl::create(this, name, keyPath, autoIncrement);
     ASSERT(objectStore->name() == name);
-    m_objectStores.set(name, objectStore);
 
     RefPtr<IDBDatabaseBackendImpl> database = this;
     RefPtr<IDBTransactionBackendInterface> transactionPtr = transaction;
-    if (!transaction->scheduleTask(createCallbackTask(&IDBDatabaseBackendImpl::createObjectStoreInternal, database, objectStore, transactionPtr)))
+    if (!transaction->scheduleTask(createCallbackTask(&IDBDatabaseBackendImpl::createObjectStoreInternal, database, objectStore, transactionPtr),
+                                   createCallbackTask(&IDBDatabaseBackendImpl::removeObjectStoreFromMap, database, objectStore))) {
         return 0;
+    }
 
+    m_objectStores.set(name, objectStore);
     return objectStore.release();
 }
 
@@ -186,11 +188,14 @@ void IDBDatabaseBackendImpl::removeObjectStore(const String& name, IDBTransactio
         // FIXME: Raise NOT_FOUND_ERR.
         return;
     }
-    m_objectStores.remove(name);
     RefPtr<IDBDatabaseBackendImpl> database = this;
     RefPtr<IDBTransactionBackendInterface> transactionPtr = transaction;
-    transaction->scheduleTask(createCallbackTask(&IDBDatabaseBackendImpl::removeObjectStoreInternal, database, objectStore, transactionPtr));
-    // FIXME: Raise NOT_ALLOWED_ERR if the above fails.    
+    if (!transaction->scheduleTask(createCallbackTask(&IDBDatabaseBackendImpl::removeObjectStoreInternal, database, objectStore, transactionPtr),
+                                   createCallbackTask(&IDBDatabaseBackendImpl::addObjectStoreToMap, database, objectStore))) {
+        // FIXME: Raise NOT_ALLOWED_ERR if the above fails.
+        return;
+    }
+    m_objectStores.remove(name);
 }
 
 void IDBDatabaseBackendImpl::removeObjectStoreInternal(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl> database, PassRefPtr<IDBObjectStoreBackendImpl> objectStore, PassRefPtr<IDBTransactionBackendInterface> transaction)
@@ -209,8 +214,10 @@ void IDBDatabaseBackendImpl::setVersion(const String& version, PassRefPtr<IDBCal
     RefPtr<IDBCallbacks> callbacks = prpCallbacks;
     RefPtr<DOMStringList> objectStores = DOMStringList::create();
     RefPtr<IDBTransactionBackendInterface> transaction = m_transactionCoordinator->createTransaction(objectStores.get(), IDBTransaction::VERSION_CHANGE, 0, this);
-    if (!transaction->scheduleTask(createCallbackTask(&IDBDatabaseBackendImpl::setVersionInternal, database, version, callbacks, transaction)))
+    if (!transaction->scheduleTask(createCallbackTask(&IDBDatabaseBackendImpl::setVersionInternal, database, version, callbacks, transaction),
+                                   createCallbackTask(&IDBDatabaseBackendImpl::resetVersion, database, m_version))) {
         callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::NOT_ALLOWED_ERR, "setVersion must be called from within a setVersion transaction."));
+    }
 }
 
 void IDBDatabaseBackendImpl::setVersionInternal(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl> database, const String& version, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBTransactionBackendInterface> transaction)
@@ -246,6 +253,25 @@ void IDBDatabaseBackendImpl::loadObjectStores()
     }
 }
 
+void IDBDatabaseBackendImpl::removeObjectStoreFromMap(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl> database, PassRefPtr<IDBObjectStoreBackendImpl> objectStore)
+{
+    ASSERT(database->m_objectStores.contains(objectStore->name()));
+    database->m_objectStores.remove(objectStore->name());
+}
+
+void IDBDatabaseBackendImpl::addObjectStoreToMap(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl> database, PassRefPtr<IDBObjectStoreBackendImpl> objectStore)
+{
+    RefPtr<IDBObjectStoreBackendImpl> objectStorePtr = objectStore;
+    ASSERT(!database->m_objectStores.contains(objectStorePtr->name()));
+    database->m_objectStores.set(objectStorePtr->name(), objectStorePtr);
+}
+
+void IDBDatabaseBackendImpl::resetVersion(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl> database, const String& version)
+{
+    database->m_version = version;
+}
+
+
 } // namespace WebCore
 
 #endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebCore/storage/IDBDatabaseBackendImpl.h b/WebCore/storage/IDBDatabaseBackendImpl.h
index 0cb483d..84bd42c 100644
--- a/WebCore/storage/IDBDatabaseBackendImpl.h
+++ b/WebCore/storage/IDBDatabaseBackendImpl.h
@@ -73,6 +73,11 @@ private:
     static void removeObjectStoreInternal(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl>, PassRefPtr<IDBObjectStoreBackendImpl>, PassRefPtr<IDBTransactionBackendInterface>);
     static void setVersionInternal(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl>, const String& version, PassRefPtr<IDBCallbacks>, PassRefPtr<IDBTransactionBackendInterface>);
 
+    // These are used as setVersion transaction abort tasks.
+    static void removeObjectStoreFromMap(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl>, PassRefPtr<IDBObjectStoreBackendImpl>);
+    static void addObjectStoreToMap(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl>, PassRefPtr<IDBObjectStoreBackendImpl>);
+    static void resetVersion(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl>, const String& version);
+
     OwnPtr<SQLiteDatabase> m_sqliteDatabase;
     String m_name;
     String m_description;
diff --git a/WebCore/storage/IDBObjectStoreBackendImpl.cpp b/WebCore/storage/IDBObjectStoreBackendImpl.cpp
index cfd8a95..09fd971 100644
--- a/WebCore/storage/IDBObjectStoreBackendImpl.cpp
+++ b/WebCore/storage/IDBObjectStoreBackendImpl.cpp
@@ -272,13 +272,15 @@ PassRefPtr<IDBIndexBackendInterface> IDBObjectStoreBackendImpl::createIndex(cons
 
     RefPtr<IDBIndexBackendImpl> index = IDBIndexBackendImpl::create(this, name, keyPath, unique);
     ASSERT(index->name() == name);
-    m_indexes.set(name, index);
 
     RefPtr<IDBObjectStoreBackendImpl> objectStore = this;
     RefPtr<IDBTransactionBackendInterface> transactionPtr = transaction;
-    if (!transaction->scheduleTask(createCallbackTask(&IDBObjectStoreBackendImpl::createIndexInternal, objectStore, index, transaction)))
+    if (!transaction->scheduleTask(createCallbackTask(&IDBObjectStoreBackendImpl::createIndexInternal, objectStore, index, transaction),
+                                   createCallbackTask(&IDBObjectStoreBackendImpl::removeIndexFromMap, objectStore, index))) {
         return 0;
+    }
 
+    m_indexes.set(name, index);
     return index.release();
 }
 
@@ -320,11 +322,15 @@ void IDBObjectStoreBackendImpl::removeIndex(const String& name, IDBTransactionBa
         // FIXME: Raise NOT_FOUND_ERR.
         return;
     }
-    m_indexes.remove(name);
+
     RefPtr<IDBObjectStoreBackendImpl> objectStore = this;
     RefPtr<IDBTransactionBackendInterface> transactionPtr = transaction;
-    transaction->scheduleTask(createCallbackTask(&IDBObjectStoreBackendImpl::removeIndexInternal, objectStore, index, transactionPtr));
-    // FIXME: Raise NOT_ALLOWED_ERR if the above statement fails.
+    if (!transaction->scheduleTask(createCallbackTask(&IDBObjectStoreBackendImpl::removeIndexInternal, objectStore, index, transactionPtr),
+                                   createCallbackTask(&IDBObjectStoreBackendImpl::addIndexToMap, objectStore, index))) {
+        // FIXME: Raise NOT_ALLOWED_ERR if the above statement fails.
+        return;
+    }
+    m_indexes.remove(name);
 }
 
 void IDBObjectStoreBackendImpl::removeIndexInternal(ScriptExecutionContext*, PassRefPtr<IDBObjectStoreBackendImpl> objectStore, PassRefPtr<IDBIndexBackendImpl> index, PassRefPtr<IDBTransactionBackendInterface> transaction)
@@ -404,6 +410,20 @@ SQLiteDatabase& IDBObjectStoreBackendImpl::sqliteDatabase() const
     return m_database->sqliteDatabase();
 }
 
+void IDBObjectStoreBackendImpl::removeIndexFromMap(ScriptExecutionContext*, PassRefPtr<IDBObjectStoreBackendImpl> objectStore, PassRefPtr<IDBIndexBackendImpl> index)
+{
+    ASSERT(objectStore->m_indexes.contains(index->name()));
+    objectStore->m_indexes.remove(index->name());
+}
+
+void IDBObjectStoreBackendImpl::addIndexToMap(ScriptExecutionContext*, PassRefPtr<IDBObjectStoreBackendImpl> objectStore, PassRefPtr<IDBIndexBackendImpl> index)
+{
+    RefPtr<IDBIndexBackendImpl> indexPtr = index;
+    ASSERT(!objectStore->m_indexes.contains(indexPtr->name()));
+    objectStore->m_indexes.set(indexPtr->name(), indexPtr);
+}
+
+
 } // namespace WebCore
 
 #endif
diff --git a/WebCore/storage/IDBObjectStoreBackendImpl.h b/WebCore/storage/IDBObjectStoreBackendImpl.h
index 74fc0dd..31f9908 100644
--- a/WebCore/storage/IDBObjectStoreBackendImpl.h
+++ b/WebCore/storage/IDBObjectStoreBackendImpl.h
@@ -89,6 +89,10 @@ private:
     static void removeIndexInternal(ScriptExecutionContext*, PassRefPtr<IDBObjectStoreBackendImpl>, PassRefPtr<IDBIndexBackendImpl>, PassRefPtr<IDBTransactionBackendInterface>);
     static void openCursorInternal(ScriptExecutionContext*, PassRefPtr<IDBObjectStoreBackendImpl>, PassRefPtr<IDBKeyRange> range, unsigned short direction, PassRefPtr<IDBCallbacks>, PassRefPtr<IDBTransactionBackendInterface>);
 
+    // These are used as setVersion transaction abort tasks.
+    static void removeIndexFromMap(ScriptExecutionContext*, PassRefPtr<IDBObjectStoreBackendImpl>, PassRefPtr<IDBIndexBackendImpl>);
+    static void addIndexToMap(ScriptExecutionContext*, PassRefPtr<IDBObjectStoreBackendImpl>, PassRefPtr<IDBIndexBackendImpl>);
+
     static const int64_t InvalidId = 0;
 
     RefPtr<IDBDatabaseBackendImpl> m_database;
diff --git a/WebCore/storage/IDBTransactionBackendImpl.cpp b/WebCore/storage/IDBTransactionBackendImpl.cpp
index 0ad77f7..3ec3bb4 100644
--- a/WebCore/storage/IDBTransactionBackendImpl.cpp
+++ b/WebCore/storage/IDBTransactionBackendImpl.cpp
@@ -60,12 +60,15 @@ PassRefPtr<IDBObjectStoreBackendInterface> IDBTransactionBackendImpl::objectStor
     return m_database->objectStore(name, 0); // FIXME: remove mode param.
 }
 
-bool IDBTransactionBackendImpl::scheduleTask(PassOwnPtr<ScriptExecutionContext::Task> task)
+bool IDBTransactionBackendImpl::scheduleTask(PassOwnPtr<ScriptExecutionContext::Task> task, PassOwnPtr<ScriptExecutionContext::Task> abortTask)
 {
     if (m_state == Finished)
         return false;
 
     m_taskQueue.append(task);
+    if (abortTask)
+        m_abortTaskQueue.prepend(abortTask);
+
     if (m_state == Unused)
         start();
 
@@ -81,6 +84,14 @@ void IDBTransactionBackendImpl::abort()
     m_taskTimer.stop();
     m_taskEventTimer.stop();
     m_transaction->rollback();
+
+    // Run the abort tasks, if any.
+    while (!m_abortTaskQueue.isEmpty()) {
+        OwnPtr<ScriptExecutionContext::Task> task(m_abortTaskQueue.first().release());
+        m_abortTaskQueue.removeFirst();
+        task->performTask(0);
+    }
+
     m_callbacks->onAbort();
     m_database->transactionCoordinator()->didFinishTransaction(this);
 }
diff --git a/WebCore/storage/IDBTransactionBackendImpl.h b/WebCore/storage/IDBTransactionBackendImpl.h
index cf40eba..5f7409b 100644
--- a/WebCore/storage/IDBTransactionBackendImpl.h
+++ b/WebCore/storage/IDBTransactionBackendImpl.h
@@ -47,7 +47,7 @@ public:
 
     virtual PassRefPtr<IDBObjectStoreBackendInterface> objectStore(const String& name);
     virtual unsigned short mode() const { return m_mode; }
-    virtual bool scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>);
+    virtual bool scheduleTask(PassOwnPtr<ScriptExecutionContext::Task> task, PassOwnPtr<ScriptExecutionContext::Task> abortTask);
     virtual void didCompleteTaskEvents();
     virtual void abort();
     virtual int id() const { return m_id; }
@@ -82,6 +82,7 @@ private:
 
     typedef Deque<OwnPtr<ScriptExecutionContext::Task> > TaskQueue;
     TaskQueue m_taskQueue;
+    TaskQueue m_abortTaskQueue;
 
     OwnPtr<SQLiteTransaction> m_transaction;
 
diff --git a/WebCore/storage/IDBTransactionBackendInterface.h b/WebCore/storage/IDBTransactionBackendInterface.h
index db95d03..65b097d 100644
--- a/WebCore/storage/IDBTransactionBackendInterface.h
+++ b/WebCore/storage/IDBTransactionBackendInterface.h
@@ -50,7 +50,7 @@ public:
 
     virtual PassRefPtr<IDBObjectStoreBackendInterface> objectStore(const String& name) = 0;
     virtual unsigned short mode() const = 0;
-    virtual bool scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>) = 0;
+    virtual bool scheduleTask(PassOwnPtr<ScriptExecutionContext::Task> task, PassOwnPtr<ScriptExecutionContext::Task> abortTask = 0) = 0;
     virtual void didCompleteTaskEvents() = 0;
     virtual void abort() = 0;
     virtual int id() const = 0;
diff --git a/WebCore/storage/IDBTransactionCoordinator.h b/WebCore/storage/IDBTransactionCoordinator.h
index 5e54ab4..fddb003 100644
--- a/WebCore/storage/IDBTransactionCoordinator.h
+++ b/WebCore/storage/IDBTransactionCoordinator.h
@@ -69,8 +69,8 @@ private:
     // This map owns all transactions known to the coordinator.
     HashMap<int, RefPtr<IDBTransactionBackendImpl> > m_transactions;
     // Transactions in different states are grouped below.
-    ListHashSet<IDBTransactionBackendImpl* > m_startedTransactions;
-    HashSet<IDBTransactionBackendImpl* > m_runningTransactions;
+    ListHashSet<IDBTransactionBackendImpl*> m_startedTransactions;
+    HashSet<IDBTransactionBackendImpl*> m_runningTransactions;
     int m_nextID;
 };
 
diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index b47e4d6..71937e8 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,14 @@
+2010-10-06  Andrei Popescu  <andreip at google.com>
+
+        Reviewed by Jeremy Orlow.
+
+        IDBDatabase and IDBObjectStore metadata is not recovered correctly when the setVersion transactions aborts.
+        https://bugs.webkit.org/show_bug.cgi?id=47245
+
+        * src/IDBTransactionBackendProxy.cpp:
+        (WebCore::IDBTransactionBackendProxy::scheduleTask):
+        * src/IDBTransactionBackendProxy.h:
+
 2010-10-06  Victor Wang  <victorw at chromium.org>
 
         Reviewed by Darin Fisher.
diff --git a/WebKit/chromium/src/IDBTransactionBackendProxy.cpp b/WebKit/chromium/src/IDBTransactionBackendProxy.cpp
index 81b7cee..4b19ee4 100644
--- a/WebKit/chromium/src/IDBTransactionBackendProxy.cpp
+++ b/WebKit/chromium/src/IDBTransactionBackendProxy.cpp
@@ -71,7 +71,7 @@ void IDBTransactionBackendProxy::abort()
     m_webIDBTransaction->abort();
 }
 
-bool IDBTransactionBackendProxy::scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>)
+bool IDBTransactionBackendProxy::scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>, PassOwnPtr<ScriptExecutionContext::Task>)
 {
     // This should never be reached as it's the impl objects who get to
     // execute tasks in the browser process.
diff --git a/WebKit/chromium/src/IDBTransactionBackendProxy.h b/WebKit/chromium/src/IDBTransactionBackendProxy.h
index 3daf73e..0c56f19 100644
--- a/WebKit/chromium/src/IDBTransactionBackendProxy.h
+++ b/WebKit/chromium/src/IDBTransactionBackendProxy.h
@@ -45,7 +45,7 @@ public:
     virtual PassRefPtr<IDBObjectStoreBackendInterface> objectStore(const String& name);
     virtual unsigned short mode() const;
     virtual void abort();
-    virtual bool scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>);
+    virtual bool scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>, PassOwnPtr<ScriptExecutionContext::Task>);
     virtual void didCompleteTaskEvents();
     virtual int id() const;
     virtual void setCallbacks(IDBTransactionCallbacks*);

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list