summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/modules/service_worker/respond_with_observer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/service_worker/respond_with_observer.cc')
-rw-r--r--chromium/third_party/blink/renderer/modules/service_worker/respond_with_observer.cc101
1 files changed, 101 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/modules/service_worker/respond_with_observer.cc b/chromium/third_party/blink/renderer/modules/service_worker/respond_with_observer.cc
new file mode 100644
index 00000000000..564b748a583
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/service_worker/respond_with_observer.cc
@@ -0,0 +1,101 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/modules/service_worker/respond_with_observer.h"
+
+#include "third_party/blink/public/platform/modules/service_worker/web_service_worker_response.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_function.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_value.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context.h"
+#include "third_party/blink/renderer/modules/service_worker/wait_until_observer.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
+#include "v8/include/v8.h"
+
+using blink::mojom::ServiceWorkerResponseError;
+
+namespace blink {
+
+void RespondWithObserver::ContextDestroyed(ExecutionContext*) {
+ if (observer_) {
+ DCHECK_EQ(kPending, state_);
+ observer_.Clear();
+ }
+ state_ = kDone;
+}
+
+void RespondWithObserver::WillDispatchEvent() {
+ event_dispatch_time_ = WTF::CurrentTime();
+}
+
+void RespondWithObserver::DidDispatchEvent(
+ DispatchEventResult dispatch_result) {
+ DCHECK(GetExecutionContext());
+ if (state_ != kInitial)
+ return;
+
+ if (dispatch_result == DispatchEventResult::kNotCanceled) {
+ OnNoResponse();
+ } else {
+ OnResponseRejected(ServiceWorkerResponseError::kDefaultPrevented);
+ }
+
+ state_ = kDone;
+ observer_.Clear();
+}
+
+void RespondWithObserver::RespondWith(ScriptState* script_state,
+ ScriptPromise script_promise,
+ ExceptionState& exception_state) {
+ if (state_ != kInitial) {
+ exception_state.ThrowDOMException(
+ DOMExceptionCode::kInvalidStateError,
+ "The event has already been responded to.");
+ return;
+ }
+
+ state_ = kPending;
+ observer_->WaitUntil(
+ script_state, script_promise, exception_state,
+ WTF::BindRepeating(&RespondWithObserver::ResponseWasFulfilled,
+ WrapPersistent(this), exception_state.Context(),
+ WTF::Unretained(exception_state.InterfaceName()),
+ WTF::Unretained(exception_state.PropertyName())),
+ WTF::BindRepeating(&RespondWithObserver::ResponseWasRejected,
+ WrapPersistent(this),
+ ServiceWorkerResponseError::kPromiseRejected));
+}
+
+void RespondWithObserver::ResponseWasRejected(ServiceWorkerResponseError error,
+ const ScriptValue& value) {
+ OnResponseRejected(error);
+ state_ = kDone;
+ observer_.Clear();
+}
+
+void RespondWithObserver::ResponseWasFulfilled(
+ ExceptionState::ContextType context_type,
+ const char* interface_name,
+ const char* property_name,
+ const ScriptValue& value) {
+ OnResponseFulfilled(value, context_type, interface_name, property_name);
+ state_ = kDone;
+ observer_.Clear();
+}
+
+RespondWithObserver::RespondWithObserver(ExecutionContext* context,
+ int event_id,
+ WaitUntilObserver* observer)
+ : ContextLifecycleObserver(context),
+ event_id_(event_id),
+ state_(kInitial),
+ observer_(observer) {}
+
+void RespondWithObserver::Trace(blink::Visitor* visitor) {
+ visitor->Trace(observer_);
+ ContextLifecycleObserver::Trace(visitor);
+}
+
+} // namespace blink