Changeset 115902 in webkit
- Timestamp:
- May 2, 2012, 4:03:42 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r115901 r115902 1 2012-05-02 Joshua Bell <jsbell@chromium.org> 2 3 IndexedDB: Handle generated keys up to 2^53 4 https://bugs.webkit.org/show_bug.cgi?id=85114 5 6 Reviewed by Tony Chang. 7 8 * storage/indexeddb/key-generator-expected.txt: 9 * storage/indexeddb/resources/key-generator.js: 10 (get defineTest): 11 1 12 2012-05-02 Zhenyao Mo <zmo@google.com> 2 13 -
trunk/LayoutTests/storage/indexeddb/key-generator-expected.txt
r112490 r115902 143 143 PASS Got "d" for key: 2 144 144 db.close() 145 146 Verify that keys above 2^53 result in errors. 147 request = indexedDB.deleteDatabase('key-generator') 148 request = indexedDB.open('key-generator') 149 db = request.result 150 request = db.setVersion('1') 151 trans = request.result 152 trans1 = db.transaction(['store'], IDBTransaction.READ_WRITE) 153 store_t1 = trans1.objectStore('store') 154 store_t1.put('a') 155 request = store.get(1) 156 store_t1.put('b', 9007199254740992) 157 request = store.get(9007199254740992) 158 store_t1.put('c') 159 store_t1.put('d', 2) 160 request = store.get(2) 161 PASS Got "a" for key: 1 162 PASS Got "b" for key: 9007199254740992 163 Error event fired auto-incrementing past 2^53 (as expected) 164 PASS event.target.errorCode is IDBDatabaseException.DATA_ERR 165 event.preventDefault() 166 PASS Got "d" for key: 2 167 db.close() 145 168 PASS successfullyParsed is true 146 169 -
trunk/LayoutTests/storage/indexeddb/resources/key-generator.js
r112202 r115902 204 204 ); 205 205 206 defineTest( 207 'Verify that keys above 2^53 result in errors.', 208 function (db, trans) { 209 db.createObjectStore('store', { autoIncrement: true }); 210 }, 211 212 function (db, callback) { 213 evalAndLog("trans1 = db.transaction(['store'], IDBTransaction.READ_WRITE)"); 214 evalAndLog("store_t1 = trans1.objectStore('store')"); 215 evalAndLog("store_t1.put('a')"); 216 check(store_t1, 1, 'a'); 217 evalAndLog("store_t1.put('b', 9007199254740992)"); 218 check(store_t1, 9007199254740992, 'b'); 219 request = evalAndLog("store_t1.put('c')"); 220 request.onsuccess = unexpectedSuccessCallback; 221 request.onerror = function () { 222 debug("Error event fired auto-incrementing past 2^53 (as expected)"); 223 shouldBe("event.target.errorCode", "IDBDatabaseException.DATA_ERR"); 224 evalAndLog("event.preventDefault()"); 225 }; 226 evalAndLog("store_t1.put('d', 2)"); 227 check(store_t1, 2, 'd'); 228 229 trans1.oncomplete = callback; 230 } 231 ); 232 206 233 test(); -
trunk/Source/WebCore/ChangeLog
r115897 r115902 1 2012-05-02 Joshua Bell <jsbell@chromium.org> 2 3 IndexedDB: Handle generated keys up to 2^53 4 https://bugs.webkit.org/show_bug.cgi?id=85114 5 6 The spec defines the behavior for generated keys up to 2^53 7 (the maximum integer storable as an ECMAScript number) and 8 the error case when going beyond that. Ensure that we can 9 handle values up to that point and generate errors beyond. 10 11 Reviewed by Tony Chang. 12 13 Test: storage/indexeddb/key-generator.html 14 15 * Modules/indexeddb/IDBBackingStore.h: 16 (IDBBackingStore): 17 * Modules/indexeddb/IDBLevelDBBackingStore.cpp: 18 (WebCore::IDBLevelDBBackingStore::nextAutoIncrementNumber): 19 * Modules/indexeddb/IDBLevelDBBackingStore.h: 20 (IDBLevelDBBackingStore): 21 * Modules/indexeddb/IDBObjectStoreBackendImpl.cpp: 22 (WebCore::IDBObjectStoreBackendImpl::putInternal): 23 (WebCore::IDBObjectStoreBackendImpl::genAutoIncrementKey): 24 * Modules/indexeddb/IDBObjectStoreBackendImpl.h: 25 (IDBObjectStoreBackendImpl): 26 1 27 2012-05-02 Adam Klein <adamk@chromium.org> 2 28 -
trunk/Source/WebCore/Modules/indexeddb/IDBBackingStore.h
r115282 r115902 68 68 virtual void clearObjectStore(int64_t databaseId, int64_t objectStoreId) = 0; 69 69 virtual void deleteObjectStoreRecord(int64_t databaseId, int64_t objectStoreId, const ObjectStoreRecordIdentifier*) = 0; 70 virtual doublenextAutoIncrementNumber(int64_t databaseId, int64_t objectStoreId) = 0;70 virtual int64_t nextAutoIncrementNumber(int64_t databaseId, int64_t objectStoreId) = 0; 71 71 virtual bool keyExistsInObjectStore(int64_t databaseId, int64_t objectStoreId, const IDBKey&, ObjectStoreRecordIdentifier* foundRecordIdentifier) = 0; 72 72 -
trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBBackingStore.cpp
r115743 r115902 603 603 } 604 604 605 doubleIDBLevelDBBackingStore::nextAutoIncrementNumber(int64_t databaseId, int64_t objectStoreId)605 int64_t IDBLevelDBBackingStore::nextAutoIncrementNumber(int64_t databaseId, int64_t objectStoreId) 606 606 { 607 607 ASSERT(m_currentTransaction); … … 611 611 OwnPtr<LevelDBIterator> it = m_currentTransaction->createIterator(); 612 612 613 int maxNumericKey = 0; 614 615 // FIXME: Be more efficient: seek to something after the object store data, then reverse. 613 int64_t maxNumericKey = 0; 614 615 // FIXME: This does a forward scan over all keys. Improve it. 616 // Since all dates > all numbers, create Date(-Infinity) and seek backwards. 616 617 617 618 for (it->seek(startKey); it->isValid() && compareKeys(it->key(), stopKey) < 0; it->next()) { -
trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBBackingStore.h
r109493 r115902 59 59 virtual void clearObjectStore(int64_t databaseId, int64_t objectStoreId); 60 60 virtual void deleteObjectStoreRecord(int64_t databaseId, int64_t objectStoreId, const ObjectStoreRecordIdentifier*); 61 virtual doublenextAutoIncrementNumber(int64_t databaseId, int64_t objectStoreId);61 virtual int64_t nextAutoIncrementNumber(int64_t databaseId, int64_t objectStoreId); 62 62 virtual bool keyExistsInObjectStore(int64_t databaseId, int64_t objectStoreId, const IDBKey&, ObjectStoreRecordIdentifier* foundRecordIdentifier); 63 63 -
trunk/Source/WebCore/Modules/indexeddb/IDBObjectStoreBackendImpl.cpp
r114805 r115902 256 256 if (!key) { 257 257 RefPtr<IDBKey> autoIncKey = objectStore->genAutoIncrementKey(); 258 if (!autoIncKey->valid()) { 259 callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::DATA_ERR, "Maximum key generator value reached.")); 260 return; 261 } 258 262 if (hasKeyPath) { 259 263 RefPtr<SerializedScriptValue> valueAfterInjection = injectKeyIntoKeyPath(autoIncKey, value, objectStore->m_keyPath); … … 680 684 PassRefPtr<IDBKey> IDBObjectStoreBackendImpl::genAutoIncrementKey() 681 685 { 686 const int64_t kMaxGeneratorValue = 9007199254740992; // Maximum integer storable as ECMAScript number. 687 if (m_autoIncrementNumber > kMaxGeneratorValue) 688 return IDBKey::createInvalid(); 682 689 if (m_autoIncrementNumber > 0) 683 690 return IDBKey::createNumber(m_autoIncrementNumber++); 684 691 685 m_autoIncrementNumber = static_cast<int>(m_backingStore->nextAutoIncrementNumber(m_databaseId, id())); 692 m_autoIncrementNumber = m_backingStore->nextAutoIncrementNumber(m_databaseId, id()); 693 if (m_autoIncrementNumber > kMaxGeneratorValue) 694 return IDBKey::createInvalid(); 686 695 return IDBKey::createNumber(m_autoIncrementNumber++); 687 696 } -
trunk/Source/WebCore/Modules/indexeddb/IDBObjectStoreBackendImpl.h
r114805 r115902 116 116 typedef HashMap<String, RefPtr<IDBIndexBackendImpl> > IndexMap; 117 117 IndexMap m_indexes; 118 int m_autoIncrementNumber;118 int64_t m_autoIncrementNumber; 119 119 }; 120 120
Note:
See TracChangeset
for help on using the changeset viewer.