[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