Changeset 80038 in webkit
- Timestamp:
- Mar 1, 2011 2:05:36 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 2 deleted
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r80037 r80038 1 2011-03-01 Sheriff Bot <webkit.review.bot@gmail.com> 2 3 Unreviewed, rolling out r80028. 4 http://trac.webkit.org/changeset/80028 5 https://bugs.webkit.org/show_bug.cgi?id=55502 6 7 'caused crashes; rolling out while investigating' (Requested 8 by jorlow on #webkit). 9 10 * storage/indexeddb/transaction-abort-expected.txt: Removed. 11 * storage/indexeddb/transaction-abort.html: Removed. 12 1 13 2011-03-01 Carol Szabo <carol.szabo@nokia.com> 2 14 -
trunk/Source/WebCore/ChangeLog
r80037 r80038 1 2011-03-01 Sheriff Bot <webkit.review.bot@gmail.com> 2 3 Unreviewed, rolling out r80028. 4 http://trac.webkit.org/changeset/80028 5 https://bugs.webkit.org/show_bug.cgi?id=55502 6 7 'caused crashes; rolling out while investigating' (Requested 8 by jorlow on #webkit). 9 10 * dom/EventQueue.cpp: 11 (WebCore::EventQueue::enqueueEvent): 12 (WebCore::EventQueue::pendingEventTimerFired): 13 (WebCore::EventQueue::dispatchEvent): 14 * dom/EventQueue.h: 15 * dom/ExceptionCode.cpp: 16 * storage/IDBCursor.cpp: 17 (WebCore::IDBCursor::update): 18 (WebCore::IDBCursor::deleteFunction): 19 * storage/IDBDatabaseException.h: 20 * storage/IDBDatabaseException.idl: 21 * storage/IDBIndex.cpp: 22 (WebCore::IDBIndex::openCursor): 23 (WebCore::IDBIndex::openKeyCursor): 24 (WebCore::IDBIndex::get): 25 (WebCore::IDBIndex::getKey): 26 * storage/IDBObjectStore.cpp: 27 (WebCore::IDBObjectStore::get): 28 (WebCore::IDBObjectStore::add): 29 (WebCore::IDBObjectStore::put): 30 (WebCore::IDBObjectStore::deleteFunction): 31 (WebCore::IDBObjectStore::clear): 32 (WebCore::IDBObjectStore::openCursor): 33 * storage/IDBRequest.cpp: 34 (WebCore::IDBRequest::IDBRequest): 35 (WebCore::IDBRequest::~IDBRequest): 36 (WebCore::IDBRequest::readyState): 37 (WebCore::IDBRequest::dispatchEvent): 38 (WebCore::IDBRequest::enqueueEvent): 39 (WebCore::IDBRequest::source): 40 * storage/IDBRequest.h: 41 * storage/IDBTransaction.cpp: 42 (WebCore::IDBTransaction::onAbort): 43 * storage/IDBTransaction.h: 44 1 45 2011-03-01 Carol Szabo <carol.szabo@nokia.com> 2 46 -
trunk/Source/WebCore/dom/EventQueue.cpp
r80028 r80038 60 60 { 61 61 ASSERT(event->target()); 62 bool wasAdded = m_queuedEvents.add(event).second; 63 ASSERT_UNUSED(wasAdded, wasAdded); // It should not have already been in the list. 62 m_queuedEvents.append(event); 64 63 65 64 if (!m_pendingEventTimer->isActive()) … … 79 78 } 80 79 81 bool EventQueue::cancelEvent(Event* event)82 {83 bool found = m_queuedEvents.contains(event);84 m_queuedEvents.remove(event);85 if (m_queuedEvents.isEmpty())86 m_pendingEventTimer->stop();87 return found;88 }89 90 80 void EventQueue::pendingEventTimerFired() 91 81 { 92 82 ASSERT(!m_pendingEventTimer->isActive()); 93 ASSERT(!m_queuedEvents.isEmpty());94 83 84 Vector<RefPtr<Event> > queuedEvents; 85 queuedEvents.swap(m_queuedEvents); 86 95 87 m_nodesWithQueuedScrollEvents.clear(); 96 88 97 // Insert a marker for where we should stop. 98 ASSERT(!m_queuedEvents.contains(0)); 99 bool wasAdded = m_queuedEvents.add(0).second; 100 ASSERT_UNUSED(wasAdded, wasAdded); // It should not have already been in the list. 101 102 while (!m_queuedEvents.isEmpty()) { 103 ListHashSet<RefPtr<Event> >::iterator iter = m_queuedEvents.begin(); 104 RefPtr<Event> event = *iter; 105 m_queuedEvents.remove(iter); 106 if (!event) 107 break; 108 dispatchEvent(event.get()); 109 } 89 for (size_t i = 0; i < queuedEvents.size(); i++) 90 dispatchEvent(queuedEvents[i].release()); 110 91 } 111 92 … … 113 94 { 114 95 EventTarget* eventTarget = event->target(); 115 if (eventTarget->toDOMWindow()) 96 if (eventTarget->toNode()) 97 eventTarget->dispatchEvent(event); 98 else if (eventTarget->toDOMWindow()) 116 99 eventTarget->toDOMWindow()->dispatchEvent(event, 0); 117 100 else -
trunk/Source/WebCore/dom/EventQueue.h
r80028 r80038 29 29 30 30 #include <wtf/HashSet.h> 31 #include <wtf/ListHashSet.h>32 31 #include <wtf/Noncopyable.h> 33 32 #include <wtf/OwnPtr.h> 34 33 #include <wtf/PassOwnPtr.h> 35 34 #include <wtf/RefPtr.h> 35 #include <wtf/Vector.h> 36 36 37 37 namespace WebCore { … … 61 61 void enqueueEvent(PassRefPtr<Event>); 62 62 void enqueueScrollEvent(PassRefPtr<Node>, ScrollEventTargetType); 63 bool cancelEvent(Event*);64 63 65 64 private: … … 70 69 71 70 OwnPtr<EventQueueTimer> m_pendingEventTimer; 72 ListHashSet<RefPtr<Event> > m_queuedEvents;71 Vector<RefPtr<Event> > m_queuedEvents; 73 72 HashSet<Node*> m_nodesWithQueuedScrollEvents; 74 73 -
trunk/Source/WebCore/dom/ExceptionCode.cpp
r80028 r80038 224 224 "TIMEOUT_ERR", 225 225 "DEADLOCK_ERR", 226 "READ_ONLY_ERR", 227 "ABORT_ERR" 226 "READ_ONLY_ERR" 228 227 }; 229 228 … … 240 239 "TIMEOUT_ERR", // This can't be thrown. 241 240 "DEADLOCK_ERR", // This can't be thrown. 242 "Write operations cannot be preformed on a read-only transaction.", 243 "The transaction was aborted, so the request cannot be fulfilled." 241 "Write operations cannot be preformed on a read-only transaction." 244 242 }; 245 243 #endif -
trunk/Source/WebCore/storage/IDBCursor.cpp
r80028 r80038 73 73 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 74 74 m_backend->update(value, request, ec); 75 if (ec) { 76 request->markEarlyDeath(); 75 if (ec) 77 76 return 0; 78 }79 77 return request.release(); 80 78 } … … 94 92 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 95 93 m_backend->deleteFunction(request, ec); 96 if (ec) { 97 request->markEarlyDeath(); 94 if (ec) 98 95 return 0; 99 }100 96 return request.release(); 101 97 } -
trunk/Source/WebCore/storage/IDBDatabaseException.h
r80028 r80038 56 56 TIMEOUT_ERR = IDBDatabaseExceptionOffset + 10, 57 57 DEADLOCK_ERR = IDBDatabaseExceptionOffset + 11, 58 READ_ONLY_ERR = IDBDatabaseExceptionOffset + 12, 59 ABORT_ERR = IDBDatabaseExceptionOffset + 13 58 READ_ONLY_ERR = IDBDatabaseExceptionOffset + 12 60 59 }; 61 60 -
trunk/Source/WebCore/storage/IDBDatabaseException.idl
r80028 r80038 53 53 const unsigned short DEADLOCK_ERR = 11; 54 54 const unsigned short READ_ONLY_ERR = 12; 55 const unsigned short ABORT_ERR = 13;56 55 }; 57 56 -
trunk/Source/WebCore/storage/IDBIndex.cpp
r80028 r80038 63 63 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 64 64 m_backend->openCursor(keyRange, direction, request, m_transaction->backend(), ec); 65 if (ec) { 66 request->markEarlyDeath(); 65 if (ec) 67 66 return 0; 68 }69 67 return request; 70 68 } … … 80 78 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 81 79 m_backend->openKeyCursor(keyRange, direction, request, m_transaction->backend(), ec); 82 if (ec) { 83 request->markEarlyDeath(); 80 if (ec) 84 81 return 0; 85 }86 82 return request; 87 83 } … … 91 87 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 92 88 m_backend->get(key, request, m_transaction->backend(), ec); 93 if (ec) { 94 request->markEarlyDeath(); 89 if (ec) 95 90 return 0; 96 }97 91 return request; 98 92 } … … 102 96 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 103 97 m_backend->getKey(key, request, m_transaction->backend(), ec); 104 if (ec) { 105 request->markEarlyDeath(); 98 if (ec) 106 99 return 0; 107 }108 100 return request; 109 101 } -
trunk/Source/WebCore/storage/IDBObjectStore.cpp
r80028 r80038 72 72 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 73 73 m_objectStore->get(key, request, m_transaction->backend(), ec); 74 if (ec) { 75 request->markEarlyDeath(); 74 if (ec) 76 75 return 0; 77 }78 76 return request.release(); 79 77 } … … 83 81 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 84 82 m_objectStore->put(value, key, IDBObjectStoreBackendInterface::AddOnly, request, m_transaction->backend(), ec); 85 if (ec) { 86 request->markEarlyDeath(); 83 if (ec) 87 84 return 0; 88 } 89 return request.release(); 85 return request; 90 86 } 91 87 … … 94 90 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 95 91 m_objectStore->put(value, key, IDBObjectStoreBackendInterface::AddOrUpdate, request, m_transaction->backend(), ec); 96 if (ec) { 97 request->markEarlyDeath(); 92 if (ec) 98 93 return 0; 99 } 100 return request.release(); 94 return request; 101 95 } 102 96 … … 105 99 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 106 100 m_objectStore->deleteFunction(key, request, m_transaction->backend(), ec); 107 if (ec) { 108 request->markEarlyDeath(); 101 if (ec) 109 102 return 0; 110 } 111 return request.release(); 103 return request; 112 104 } 113 105 … … 116 108 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 117 109 m_objectStore->clear(request, m_transaction->backend(), ec); 118 if (ec) { 119 request->markEarlyDeath(); 110 if (ec) 120 111 return 0; 121 } 122 return request.release(); 112 return request; 123 113 } 124 114 … … 159 149 RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 160 150 m_objectStore->openCursor(range, direction, request, m_transaction->backend(), ec); 161 if (ec) { 162 request->markEarlyDeath(); 151 if (ec) 163 152 return 0; 164 }165 153 return request.release(); 166 154 } -
trunk/Source/WebCore/storage/IDBRequest.cpp
r80028 r80038 43 43 #include "IDBObjectStore.h" 44 44 #include "IDBPendingTransactionMonitor.h" 45 #include "IDBTransaction.h"46 45 47 46 namespace WebCore { … … 60 59 , m_finished(false) 61 60 { 62 if (m_transaction) { 63 m_transaction->registerRequest(this); 61 if (m_transaction) 64 62 IDBPendingTransactionMonitor::removePendingTransaction(m_transaction->backend()); 65 }66 63 } 67 64 68 65 IDBRequest::~IDBRequest() 69 66 { 70 ASSERT(m_readyState == DONE || m_readyState == EarlyDeath);71 if (m_transaction)72 m_transaction->unregisterRequest(this);73 67 } 74 68 … … 112 106 unsigned short IDBRequest::readyState() const 113 107 { 114 ASSERT(m_readyState == LOADING || m_readyState == DONE);115 108 return m_readyState; 116 }117 118 void IDBRequest::markEarlyDeath()119 {120 ASSERT(m_readyState == LOADING);121 m_readyState = EarlyDeath;122 109 } 123 110 … … 140 127 } 141 128 142 IDBAny* IDBRequest::source()143 {144 return m_source.get();145 }146 147 void IDBRequest::abort()148 {149 if (m_readyState != LOADING) {150 ASSERT(m_readyState == DONE);151 return;152 }153 154 ASSERT(scriptExecutionContext()->isDocument());155 EventQueue* eventQueue = static_cast<Document*>(scriptExecutionContext())->eventQueue();156 for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) {157 bool removed = eventQueue->cancelEvent(m_enqueuedEvents[i].get());158 ASSERT_UNUSED(removed, removed);159 }160 m_enqueuedEvents.clear();161 162 m_errorCode = 0;163 m_errorMessage = String();164 m_result.clear();165 onError(IDBDatabaseError::create(IDBDatabaseException::ABORT_ERR, "The transaction was aborted, so the request cannot be fulfilled."));166 }167 168 129 void IDBRequest::onError(PassRefPtr<IDBDatabaseError> error) 169 130 { … … 258 219 { 259 220 ASSERT(!m_finished); 260 ASSERT(m_enqueuedEvents.size());261 221 ASSERT(scriptExecutionContext()); 262 222 ASSERT(event->target() == this); … … 264 224 if (event->type() != eventNames().blockedEvent) 265 225 m_readyState = DONE; 266 267 for (size_t i = 0; i < m_enqueuedEvents.size(); ++i) {268 if (m_enqueuedEvents[i].get() == event.get())269 m_enqueuedEvents.remove(i);270 }271 226 272 227 Vector<RefPtr<EventTarget> > targets; … … 286 241 287 242 // If the result was of type IDBCursor, then we'll fire again. 243 // if (m_result && m_result->type() != IDBAny::IDBCursorType && event->type() != eventNames.blockedEvent) 288 244 if (m_result && m_result->type() != IDBAny::IDBCursorType) 289 245 m_finished = true; … … 314 270 EventQueue* eventQueue = static_cast<Document*>(scriptExecutionContext())->eventQueue(); 315 271 event->setTarget(this); 316 eventQueue->enqueueEvent(event.get()); 317 m_enqueuedEvents.append(event); 272 eventQueue->enqueueEvent(event); 273 } 274 275 IDBAny* IDBRequest::source() 276 { 277 return m_source.get(); 318 278 } 319 279 -
trunk/Source/WebCore/storage/IDBRequest.h
r80028 r80038 59 59 enum ReadyState { 60 60 LOADING = 1, 61 DONE = 2, 62 EarlyDeath = 3 61 DONE = 2 63 62 }; 64 63 unsigned short readyState() const; … … 67 66 DEFINE_ATTRIBUTE_EVENT_LISTENER(error); 68 67 69 void markEarlyDeath();70 68 bool resetReadyState(IDBTransaction*); 71 69 IDBAny* source(); 72 void abort();73 70 74 71 // IDBCallbacks … … 115 112 ReadyState m_readyState; 116 113 bool m_finished; // Is it possible that we'll fire any more events? If not, we're finished. 117 Vector<RefPtr<Event> > m_enqueuedEvents;118 114 119 115 EventTargetData m_eventTargetData; -
trunk/Source/WebCore/storage/IDBTransaction.cpp
r80028 r80038 104 104 } 105 105 106 void IDBTransaction::registerRequest(IDBRequest* request)107 {108 m_childRequests.add(request);109 }110 111 void IDBTransaction::unregisterRequest(IDBRequest* request)112 {113 // If we aborted the request, it will already have been removed.114 m_childRequests.remove(request);115 }116 117 106 void IDBTransaction::onAbort() 118 107 { 119 while (!m_childRequests.isEmpty()) {120 IDBRequest* request = *m_childRequests.begin();121 m_childRequests.remove(request);122 request->abort();123 }124 125 108 enqueueEvent(Event::create(eventNames().abortEvent, true, false)); 126 109 } -
trunk/Source/WebCore/storage/IDBTransaction.h
r80028 r80038 63 63 void abort(); 64 64 65 void registerRequest(IDBRequest*);66 void unregisterRequest(IDBRequest*);67 68 65 DEFINE_ATTRIBUTE_EVENT_LISTENER(abort); 69 66 DEFINE_ATTRIBUTE_EVENT_LISTENER(complete); … … 104 101 bool m_finished; // Is it possible that we'll fire any more events or allow any new transactions? If not, we're finished. 105 102 106 ListHashSet<IDBRequest*> m_childRequests;107 108 103 EventTargetData m_eventTargetData; 109 104 };
Note: See TracChangeset
for help on using the changeset viewer.