Changeset 86422 in webkit
- Timestamp:
- May 13, 2011 3:21:02 AM (13 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r86420 r86422 1 2011-05-05 Hans Wennborg <hans@chromium.org> 2 3 Reviewed by Steve Block. 4 5 IndexedDB: Transaction rollback prevented by open SQLite statement 6 https://bugs.webkit.org/show_bug.cgi?id=60032 7 8 Add test for veryfing that transaction roll-back works, even with a 9 previously opened cursor still around. 10 11 * storage/indexeddb/transaction-rollback-expected.txt: Added. 12 * storage/indexeddb/transaction-rollback.html: Added. 13 1 14 2011-05-13 Sergio Villar Senin <svillar@igalia.com> 2 15 -
trunk/Source/WebCore/ChangeLog
r86418 r86422 1 2011-05-05 Hans Wennborg <hans@chromium.org> 2 3 Reviewed by Steve Block. 4 5 IndexedDB: Transaction rollback prevented by open SQLite statement 6 https://bugs.webkit.org/show_bug.cgi?id=60032 7 8 Let the IDBTransactionbackendImpl keep track of all open cursors, and 9 "close" them (i.e. finalizing the underlying SQLiteStatement) before 10 committing or rolling back the transaction. This fixes the problem 11 with opened cursors preventing transaction rollback. 12 13 Test: storage/indexeddb/transaction-rollback.html 14 15 * storage/IDBBackingStore.h: 16 * storage/IDBCursorBackendImpl.cpp: 17 (WebCore::IDBCursorBackendImpl::IDBCursorBackendImpl): 18 (WebCore::IDBCursorBackendImpl::~IDBCursorBackendImpl): 19 (WebCore::IDBCursorBackendImpl::close): 20 * storage/IDBCursorBackendImpl.h: 21 * storage/IDBLevelDBBackingStore.cpp: 22 * storage/IDBSQLiteBackingStore.cpp: 23 * storage/IDBTransactionBackendImpl.cpp: 24 (WebCore::IDBTransactionBackendImpl::abort): 25 (WebCore::IDBTransactionBackendImpl::registerOpenCursor): 26 (WebCore::IDBTransactionBackendImpl::unregisterOpenCursor): 27 (WebCore::IDBTransactionBackendImpl::commit): 28 (WebCore::IDBTransactionBackendImpl::closeOpenCursors): 29 * storage/IDBTransactionBackendImpl.h: 30 * storage/IDBTransactionBackendInterface.h: 31 (WebCore::IDBTransactionBackendInterface::registerOpenCursor): 32 (WebCore::IDBTransactionBackendInterface::unregisterOpenCursor): 33 1 34 2011-05-13 Patrick Gansterer <paroga@webkit.org> 2 35 -
trunk/Source/WebCore/storage/IDBBackingStore.h
r83443 r86422 92 92 virtual PassRefPtr<ObjectStoreRecordIdentifier> objectStoreRecordIdentifier() = 0; 93 93 virtual int64_t indexDataId() = 0; 94 virtual ~Cursor() {}; 94 virtual void close() = 0; 95 virtual ~Cursor() { }; 95 96 }; 96 97 -
trunk/Source/WebCore/storage/IDBCursorBackendImpl.cpp
r80220 r86422 49 49 , m_objectStore(objectStore) 50 50 { 51 m_transaction->registerOpenCursor(this); 51 52 } 52 53 53 54 IDBCursorBackendImpl::~IDBCursorBackendImpl() 54 55 { 56 m_transaction->unregisterOpenCursor(this); 55 57 } 56 58 … … 121 123 } 122 124 125 void IDBCursorBackendImpl::close() 126 { 127 if (m_cursor) 128 m_cursor->close(); 129 } 130 123 131 } // namespace WebCore 124 132 -
trunk/Source/WebCore/storage/IDBCursorBackendImpl.h
r80315 r86422 62 62 virtual void continueFunction(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>, ExceptionCode&); 63 63 virtual void deleteFunction(PassRefPtr<IDBCallbacks>, ExceptionCode&); 64 void close(); 64 65 65 66 private: -
trunk/Source/WebCore/storage/IDBLevelDBBackingStore.cpp
r85122 r86422 813 813 virtual PassRefPtr<IDBBackingStore::ObjectStoreRecordIdentifier> objectStoreRecordIdentifier() = 0; // FIXME: I don't think this is actually used, so drop it. 814 814 virtual int64_t indexDataId() = 0; 815 virtual void close() { } 815 816 816 817 virtual bool loadCurrentRow() = 0; -
trunk/Source/WebCore/storage/IDBSQLiteBackingStore.cpp
r83443 r86422 709 709 virtual PassRefPtr<IDBBackingStore::ObjectStoreRecordIdentifier> objectStoreRecordIdentifier() = 0; 710 710 virtual int64_t indexDataId() = 0; 711 virtual void close() { m_query.finalize(); } 711 712 712 713 virtual void loadCurrentRow() = 0; -
trunk/Source/WebCore/storage/IDBTransactionBackendImpl.cpp
r80315 r86422 30 30 31 31 #include "IDBBackingStore.h" 32 #include "IDBCursorBackendImpl.h" 32 33 #include "IDBDatabaseBackendImpl.h" 33 34 #include "IDBDatabaseException.h" … … 114 115 m_taskTimer.stop(); 115 116 m_taskEventTimer.stop(); 117 118 closeOpenCursors(); 116 119 m_transaction->rollback(); 117 120 … … 129 132 } 130 133 134 void IDBTransactionBackendImpl::registerOpenCursor(IDBCursorBackendImpl* cursor) 135 { 136 m_openCursors.add(cursor); 137 } 138 139 void IDBTransactionBackendImpl::unregisterOpenCursor(IDBCursorBackendImpl* cursor) 140 { 141 m_openCursors.remove(cursor); 142 } 143 131 144 void IDBTransactionBackendImpl::didCompleteTaskEvents() 132 145 { … … 167 180 168 181 m_state = Finished; 182 closeOpenCursors(); 169 183 m_transaction->commit(); 170 184 m_callbacks->onComplete(); … … 211 225 } 212 226 227 void IDBTransactionBackendImpl::closeOpenCursors() 228 { 229 for (HashSet<IDBCursorBackendImpl*>::iterator i = m_openCursors.begin(); i != m_openCursors.end(); ++i) 230 (*i)->close(); 231 m_openCursors.clear(); 232 } 233 213 234 }; 214 235 -
trunk/Source/WebCore/storage/IDBTransactionBackendImpl.h
r80315 r86422 35 35 #include "Timer.h" 36 36 #include <wtf/Deque.h> 37 #include <wtf/HashSet.h> 37 38 #include <wtf/RefPtr.h> 38 39 … … 52 53 virtual void abort(); 53 54 virtual void setCallbacks(IDBTransactionCallbacks* callbacks) { m_callbacks = callbacks; } 55 virtual void registerOpenCursor(IDBCursorBackendImpl*); 56 virtual void unregisterOpenCursor(IDBCursorBackendImpl*); 54 57 55 58 void run(); … … 70 73 void taskTimerFired(Timer<IDBTransactionBackendImpl>*); 71 74 void taskEventTimerFired(Timer<IDBTransactionBackendImpl>*); 75 void closeOpenCursors(); 72 76 73 77 RefPtr<DOMStringList> m_objectStoreNames; … … 88 92 Timer<IDBTransactionBackendImpl> m_taskEventTimer; 89 93 int m_pendingEvents; 94 95 HashSet<IDBCursorBackendImpl*> m_openCursors; 90 96 }; 91 97 -
trunk/Source/WebCore/storage/IDBTransactionBackendInterface.h
r85713 r86422 37 37 namespace WebCore { 38 38 39 class IDBCursorBackendImpl; 39 40 class IDBObjectStoreBackendInterface; 40 41 class IDBTransactionCallbacks; … … 54 55 virtual void abort() = 0; 55 56 virtual void setCallbacks(IDBTransactionCallbacks*) = 0; 57 virtual void registerOpenCursor(IDBCursorBackendImpl*) = 0; 58 virtual void unregisterOpenCursor(IDBCursorBackendImpl*) = 0; 56 59 }; 57 60 -
trunk/Source/WebKit/chromium/ChangeLog
r86418 r86422 1 2011-05-05 Hans Wennborg <hans@chromium.org> 2 3 Reviewed by Steve Block. 4 5 IndexedDB: Transaction rollback prevented by open SQLite statement 6 https://bugs.webkit.org/show_bug.cgi?id=60032 7 8 Implement two new methods in IDBTransactionBackendInterface. 9 10 * src/IDBTransactionBackendProxy.cpp: 11 (WebKit::IDBTransactionBackendProxy::registerOpenCursor): 12 (WebKit::IDBTransactionBackendProxy::unregisterOpenCursor): 13 * src/IDBTransactionBackendProxy.h: 14 1 15 2011-05-13 Patrick Gansterer <paroga@webkit.org> 2 16 -
trunk/Source/WebKit/chromium/src/IDBTransactionBackendProxy.cpp
r86067 r86422 73 73 } 74 74 75 void IDBTransactionBackendProxy::registerOpenCursor(WebCore::IDBCursorBackendImpl*) 76 { 77 ASSERT_NOT_REACHED(); 78 } 79 80 void IDBTransactionBackendProxy::unregisterOpenCursor(WebCore::IDBCursorBackendImpl*) 81 { 82 ASSERT_NOT_REACHED(); 83 } 84 75 85 bool IDBTransactionBackendProxy::scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>, PassOwnPtr<ScriptExecutionContext::Task>) 76 86 { -
trunk/Source/WebKit/chromium/src/IDBTransactionBackendProxy.h
r82917 r86422 48 48 virtual void didCompleteTaskEvents(); 49 49 virtual void setCallbacks(WebCore::IDBTransactionCallbacks*); 50 virtual void registerOpenCursor(WebCore::IDBCursorBackendImpl*); 51 virtual void unregisterOpenCursor(WebCore::IDBCursorBackendImpl*); 50 52 51 53 WebIDBTransaction* getWebIDBTransaction() const { return m_webIDBTransaction.get(); }
Note: See TracChangeset
for help on using the changeset viewer.