Source/WebCore/ChangeLog

 12019-09-09 Sihui Liu <sihui_liu@apple.com>
 2
 3 Layout Test imported/w3c/web-platform-tests/IndexedDB/fire-error-event-exception.html is a Flaky Failure
 4 https://bugs.webkit.org/show_bug.cgi?id=201481
 5 <rdar://problem/55046055>
 6
 7 Reviewed by NOBODY (OOPS!).
 8
 9 We should not schedule timer if we know the timer function will be no-op.
 10
 11 * Modules/indexeddb/IDBTransaction.cpp:
 12 (WebCore::IDBTransaction::removeRequest):
 13 (WebCore::IDBTransaction::scheduleOperation):
 14 (WebCore::IDBTransaction::trySchedulePendingOperationTimer):
 15 (WebCore::IDBTransaction::pendingOperationTimerFired):
 16 (WebCore::IDBTransaction::commit):
 17 (WebCore::IDBTransaction::didStart):
 18 (WebCore::IDBTransaction::operationCompletedOnClient):
 19 (WebCore::IDBTransaction::deactivate):
 20 (WebCore::IDBTransaction::schedulePendingOperationTimer): Deleted.
 21 * Modules/indexeddb/IDBTransaction.h:
 22
1232019-09-05 Keith Rollin <krollin@apple.com>
224
325 Fix implicit conversion that loses precision

Source/WebCore/Modules/indexeddb/IDBTransaction.cpp

@@void IDBTransaction::removeRequest(IDBRequest& request)
383383{
384384 ASSERT(&m_database->originThread() == &Thread::current());
385385 m_openRequests.remove(&request);
 386
 387 trySchedulePendingOperationTimer();
386388}
387389
388390void IDBTransaction::scheduleOperation(Ref<IDBClient::TransactionOperation>&& operation)

@@void IDBTransaction::scheduleOperation(Ref<IDBClient::TransactionOperation>&& op
394396 m_pendingTransactionOperationQueue.append(operation.copyRef());
395397 m_transactionOperationMap.set(identifier, WTFMove(operation));
396398
397  schedulePendingOperationTimer();
 399 trySchedulePendingOperationTimer();
398400}
399401
400 void IDBTransaction::schedulePendingOperationTimer()
 402void IDBTransaction::trySchedulePendingOperationTimer()
401403{
402404 ASSERT(&m_database->originThread() == &Thread::current());
403405
 406 if (!m_startedOnServer)
 407 return;
 408
 409 // If the last in-progress operation we've sent to the server is not an IDBRequest operation,
 410 // then we have to wait until it completes before sending any more.
 411 if (!m_transactionOperationsInProgressQueue.isEmpty() && !m_transactionOperationsInProgressQueue.last()->nextRequestCanGoToServer())
 412 return;
 413
 414 if (m_pendingTransactionOperationQueue.isEmpty() && (!m_transactionOperationMap.isEmpty() || !m_openRequests.isEmpty() || isFinishedOrFinishing()))
 415 return;
 416
404417 if (!m_pendingOperationTimer.isActive())
405418 m_pendingOperationTimer.startOneShot(0_s);
406419}

@@void IDBTransaction::pendingOperationTimerFired()
410423 LOG(IndexedDB, "IDBTransaction::pendingOperationTimerFired (%p)", this);
411424 ASSERT(&m_database->originThread() == &Thread::current());
412425
413  if (!m_startedOnServer)
414  return;
415 
416  // If the last in-progress operation we've sent to the server is not an IDBRequest operation,
417  // then we have to wait until it completes before sending any more.
418  if (!m_transactionOperationsInProgressQueue.isEmpty() && !m_transactionOperationsInProgressQueue.last()->nextRequestCanGoToServer())
419  return;
420 
421426 // We want to batch operations together without spinning the runloop for performance,
422427 // but don't want to affect responsiveness of the main thread.
423428 // This number is a good compromise in ad-hoc testing.

@@void IDBTransaction::finishedDispatchEventForRequest(IDBRequest& request)
505510
506511void IDBTransaction::commit()
507512{
 513 WTFLogAlways("sihuil: [%p]IDBTransaction::commit()", this);
508514 LOG(IndexedDB, "IDBTransaction::commit");
509515 ASSERT(&m_database->originThread() == &Thread::current());
510516 ASSERT(!isFinishedOrFinishing());

@@void IDBTransaction::didStart(const IDBError& error)
557563 return;
558564 }
559565
560  schedulePendingOperationTimer();
 566 trySchedulePendingOperationTimer();
561567}
562568
563569void IDBTransaction::notifyDidAbort(const IDBError& error)

@@void IDBTransaction::operationCompletedOnClient(IDBClient::TransactionOperation&
14101416 m_transactionOperationMap.remove(operation.identifier());
14111417 m_transactionOperationsInProgressQueue.removeFirst();
14121418
1413  schedulePendingOperationTimer();
 1419 trySchedulePendingOperationTimer();
14141420}
14151421
14161422void IDBTransaction::establishOnServer()

@@void IDBTransaction::deactivate()
14381444 if (m_state == IndexedDB::TransactionState::Active)
14391445 m_state = IndexedDB::TransactionState::Inactive;
14401446
1441  schedulePendingOperationTimer();
 1447 trySchedulePendingOperationTimer();
14421448}
14431449
14441450void IDBTransaction::connectionClosedFromServer(const IDBError& error)

Source/WebCore/Modules/indexeddb/IDBTransaction.h

@@private:
229229 void completeNoncursorRequest(IDBRequest&, const IDBResultData&);
230230 void completeCursorRequest(IDBRequest&, const IDBResultData&);
231231
232  void schedulePendingOperationTimer();
 232 void trySchedulePendingOperationTimer();
233233 void scheduleCompletedOperationTimer();
234234
235235 Ref<IDBDatabase> m_database;