Index: third_party/WebKit/Source/modules/serviceworkers/WaitUntilObserver.h |
diff --git a/third_party/WebKit/Source/modules/serviceworkers/WaitUntilObserver.h b/third_party/WebKit/Source/modules/serviceworkers/WaitUntilObserver.h |
index 85fd3a1fc13e205ef84835777b8ff367834c404f..d78e22bc37fcd13fdebe4c32e49082555de23f4a 100644 |
--- a/third_party/WebKit/Source/modules/serviceworkers/WaitUntilObserver.h |
+++ b/third_party/WebKit/Source/modules/serviceworkers/WaitUntilObserver.h |
@@ -9,6 +9,7 @@ |
#include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h" |
#include "platform/Timer.h" |
#include "platform/wtf/Forward.h" |
+#include "platform/wtf/Functional.h" |
namespace blink { |
@@ -21,6 +22,8 @@ class ScriptState; |
class MODULES_EXPORT WaitUntilObserver final |
: public GarbageCollectedFinalized<WaitUntilObserver> { |
public: |
+ using PromiseSettledCallback = Function<void(const ScriptValue&)>; |
+ |
enum EventType { |
kActivate, |
kFetch, |
@@ -47,17 +50,19 @@ class MODULES_EXPORT WaitUntilObserver final |
// all waitUntil promises to settle. |
void DidDispatchEvent(bool event_dispatch_failed); |
- // Observes the promise and delays calling the continuation until |
- // the given promise is resolved or rejected. |
- void WaitUntil(ScriptState*, ScriptPromise, ExceptionState&); |
- |
- // These methods can be called when the lifecycle of ExtendableEvent |
- // observed by this WaitUntilObserver should be extended by other reason |
- // than ExtendableEvent.waitUntil. |
- // Note: There is no need to call decrementPendingActivity() after the context |
- // is being destroyed. |
- void IncrementPendingActivity(); |
- void DecrementPendingActivity(); |
+ // Observes the promise and delays reporting to ServiceWorkerGlobalScopeClient |
+ // that the event completed until the given promise is resolved or rejected. |
+ // WaitUntil may be called multiple times. The event is extended until all |
+ // promises have settled. |
+ // If provided, |on_promise_fulfilled| or |on_promise_rejected| is invoked |
+ // once |script_promise| fulfills or rejects. This enables the caller to do |
+ // custom handling. |
+ void WaitUntil( |
+ ScriptState*, |
+ ScriptPromise /* script_promise */, |
+ ExceptionState&, |
+ std::unique_ptr<PromiseSettledCallback> on_promise_fulfilled = nullptr, |
+ std::unique_ptr<PromiseSettledCallback> on_promise_rejected = nullptr); |
DECLARE_VIRTUAL_TRACE(); |
@@ -66,31 +71,38 @@ class MODULES_EXPORT WaitUntilObserver final |
class ThenFunction; |
enum class EventDispatchState { |
- // Event dispatch has not yet finished. |
+ // Event dispatch has not yet started. |
kInitial, |
+ // Event dispatch has started but not yet finished. |
+ kDispatching, |
// Event dispatch completed. There may still be outstanding waitUntil |
// promises that must settle before notifying ServiceWorkerGlobalScopeClient |
// that the event finished. |
- kCompleted, |
+ kDispatched, |
// Event dispatch failed. Any outstanding waitUntil promises are ignored. |
kFailed |
}; |
WaitUntilObserver(ExecutionContext*, EventType, int event_id); |
- // Called when a promise passed to a waitUntil() call that is associated with |
- // this observer was fulfilled. |
+ void IncrementPendingPromiseCount(); |
+ void DecrementPendingPromiseCount(); |
+ |
+ // Enqueued as a microtask when a promise passed to a waitUntil() call that is |
+ // associated with this observer was fulfilled. |
void OnPromiseFulfilled(); |
- // Called when a promise passed to a waitUntil() call that is associated with |
- // this observer was rejected. |
+ // Enqueued as a microtask when a promise passed to a waitUntil() call that is |
+ // associated with this observer was rejected. |
void OnPromiseRejected(); |
void ConsumeWindowInteraction(TimerBase*); |
+ void MaybeCompleteEvent(); |
+ |
Member<ExecutionContext> execution_context_; |
EventType type_; |
int event_id_; |
- int pending_activity_ = 0; |
+ int pending_promises_ = 0; |
EventDispatchState event_dispatch_state_ = EventDispatchState::kInitial; |
bool has_rejected_promise_ = false; |
double event_dispatch_time_ = 0; |