Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(579)

Unified Diff: third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp

Issue 2877543003: [ServiceWorker] Allow waitUntil to be called multiple times asynchronously (Closed)
Patch Set: Address comments from falken@ Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp
diff --git a/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp b/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp
index 4d347a7f9e40dde6a1f9786c12944a801fe689f1..9ba069ad2b5d617cd5328f2a9525c9f221e3112f 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp
+++ b/third_party/WebKit/Source/modules/serviceworkers/RespondWithObserver.cpp
@@ -16,52 +16,6 @@
namespace blink {
-class RespondWithObserver::ThenFunction final : public ScriptFunction {
- public:
- enum ResolveType {
- kFulfilled,
- kRejected,
- };
-
- static v8::Local<v8::Function> CreateFunction(ScriptState* script_state,
- RespondWithObserver* observer,
- ResolveType type) {
- ThenFunction* self = new ThenFunction(script_state, observer, type);
- return self->BindToV8Function();
- }
-
- DEFINE_INLINE_VIRTUAL_TRACE() {
- visitor->Trace(observer_);
- ScriptFunction::Trace(visitor);
- }
-
- private:
- ThenFunction(ScriptState* script_state,
- RespondWithObserver* observer,
- ResolveType type)
- : ScriptFunction(script_state),
- observer_(observer),
- resolve_type_(type) {}
-
- ScriptValue Call(ScriptValue value) override {
- DCHECK(observer_);
- DCHECK(resolve_type_ == kFulfilled || resolve_type_ == kRejected);
- if (resolve_type_ == kRejected) {
- observer_->ResponseWasRejected(
- kWebServiceWorkerResponseErrorPromiseRejected);
- value =
- ScriptPromise::Reject(value.GetScriptState(), value).GetScriptValue();
- } else {
- observer_->ResponseWasFulfilled(value);
- }
- observer_ = nullptr;
- return value;
- }
-
- Member<RespondWithObserver> observer_;
- ResolveType resolve_type_;
-};
-
void RespondWithObserver::ContextDestroyed(ExecutionContext*) {
if (observer_) {
DCHECK_EQ(kPending, state_);
@@ -80,13 +34,12 @@ void RespondWithObserver::DidDispatchEvent(
if (state_ != kInitial)
return;
- if (dispatch_result != DispatchEventResult::kNotCanceled) {
- observer_->IncrementPendingActivity();
- ResponseWasRejected(kWebServiceWorkerResponseErrorDefaultPrevented);
- return;
+ if (dispatch_result == DispatchEventResult::kNotCanceled) {
+ OnNoResponse();
+ } else {
+ OnResponseRejected(kWebServiceWorkerResponseErrorDefaultPrevented);
}
- OnNoResponse();
state_ = kDone;
observer_.Clear();
}
@@ -101,25 +54,25 @@ void RespondWithObserver::RespondWith(ScriptState* script_state,
}
state_ = kPending;
- observer_->IncrementPendingActivity();
- script_promise.Then(ThenFunction::CreateFunction(script_state, this,
- ThenFunction::kFulfilled),
- ThenFunction::CreateFunction(script_state, this,
- ThenFunction::kRejected));
+ observer_->WaitUntil(
+ script_state, script_promise, exception_state,
+ WTF::Bind(&RespondWithObserver::ResponseWasFulfilled,
+ WrapPersistent(this)),
+ WTF::Bind(&RespondWithObserver::ResponseWasRejected, WrapPersistent(this),
+ kWebServiceWorkerResponseErrorPromiseRejected));
}
void RespondWithObserver::ResponseWasRejected(
- WebServiceWorkerResponseError error) {
+ WebServiceWorkerResponseError error,
+ const ScriptValue& value) {
OnResponseRejected(error);
state_ = kDone;
- observer_->DecrementPendingActivity();
observer_.Clear();
}
void RespondWithObserver::ResponseWasFulfilled(const ScriptValue& value) {
OnResponseFulfilled(value);
state_ = kDone;
- observer_->DecrementPendingActivity();
observer_.Clear();
}

Powered by Google App Engine
This is Rietveld 408576698