Index: third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp |
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp |
index 60a4b16686fa63563d07266abf6b096957dba3a4..ffcdd58592acdfb649cc08c391d5742c82fbe34f 100644 |
--- a/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp |
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp |
@@ -472,6 +472,7 @@ DispatchEventResult IDBRequest::dispatchEventInternal(Event* event) { |
if (setTransactionActive) |
m_transaction->setActive(true); |
+ m_didThrowInEventHandler = false; |
DispatchEventResult dispatchResult = |
IDBEventDispatcher::dispatch(event, targets); |
@@ -482,11 +483,16 @@ DispatchEventResult IDBRequest::dispatchEventInternal(Event* event) { |
// Possibly abort the transaction. This must occur after unregistering (so |
// this request doesn't receive a second error) and before deactivating |
// (which might trigger commit). |
- if (event->type() == EventTypeNames::error && |
- dispatchResult == DispatchEventResult::NotCanceled && |
- !m_requestAborted) { |
- m_transaction->setError(m_error); |
- m_transaction->abort(IGNORE_EXCEPTION_FOR_TESTING); |
+ if (!m_requestAborted) { |
+ if (m_didThrowInEventHandler) { |
+ m_transaction->setError(DOMException::create( |
+ AbortError, "Uncaught exception in event handler.")); |
+ m_transaction->abort(IGNORE_EXCEPTION_FOR_TESTING); |
+ } else if (event->type() == EventTypeNames::error && |
+ dispatchResult == DispatchEventResult::NotCanceled) { |
+ m_transaction->setError(m_error); |
+ m_transaction->abort(IGNORE_EXCEPTION_FOR_TESTING); |
+ } |
} |
// If this was the last request in the transaction's list, it may commit |
@@ -507,11 +513,7 @@ DispatchEventResult IDBRequest::dispatchEventInternal(Event* event) { |
} |
void IDBRequest::uncaughtExceptionInEventHandler() { |
- if (m_transaction && !m_requestAborted) { |
- m_transaction->setError(DOMException::create( |
- AbortError, "Uncaught exception in event handler.")); |
- m_transaction->abort(IGNORE_EXCEPTION_FOR_TESTING); |
- } |
+ m_didThrowInEventHandler = true; |
} |
void IDBRequest::transactionDidFinishAndDispatch() { |