| // Copyright 2018 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. |
| |
| #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_RECORD_H_ |
| #define THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_RECORD_H_ |
| |
| #include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom-blink.h" |
| #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" |
| #include "third_party/blink/renderer/bindings/core/v8/script_promise_property.h" |
| #include "third_party/blink/renderer/core/dom/dom_exception.h" |
| #include "third_party/blink/renderer/modules/modules_export.h" |
| #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" |
| #include "third_party/blink/renderer/platform/heap/handle.h" |
| |
| namespace blink { |
| |
| class Request; |
| class Response; |
| class ScriptState; |
| |
| class MODULES_EXPORT BackgroundFetchRecord final : public ScriptWrappable { |
| DEFINE_WRAPPERTYPEINFO(); |
| |
| public: |
| // The record can be in one of these states. |kSettled| can mean success or |
| // failure based on whether or not there's a valid response to settle the |
| // responseReady promise with. |
| enum class State { |
| kPending, |
| kAborted, |
| kSettled, |
| }; |
| |
| BackgroundFetchRecord(Request* request, ScriptState* script_state); |
| ~BackgroundFetchRecord() override; |
| |
| Request* request() const; |
| ScriptPromise responseReady(ScriptState* script_state); |
| |
| // Updates |record_state_| from kPending to kAborted or kSettled. Must be |
| // called when |record_state_| is kPending. |
| void UpdateState(State updated_state); |
| |
| // Resolve the responseReady promise with |response|, and update |
| // |record_state_|. Must be called when |record_state_| is kPending. |
| // Must not be called with a null response; |
| void SetResponseAndUpdateState(mojom::blink::FetchAPIResponsePtr& response); |
| |
| bool IsRecordPending(); |
| void Trace(blink::Visitor* visitor) override; |
| |
| private: |
| using ResponseReadyProperty = |
| ScriptPromiseProperty<Member<BackgroundFetchRecord>, |
| Member<Response>, |
| Member<DOMException>>; |
| |
| // Resolves a pending |response_read_property_| with |response|, if it's not |
| // null. |
| // If |response| is null, we do nothing if the record isn't final yet. If |
| // |record_state_| is State::kSettled in this case, we reject the promise. |
| // This is because the record will not be updated with a valid |response|. |
| void ResolveResponseReadyProperty(Response* response); |
| |
| Member<Request> request_; |
| Member<ResponseReadyProperty> response_ready_property_; |
| |
| // Since BackgroundFetchRecord can only be accessed from the world that |
| // created it, there's no danger of ScriptState leaking across worlds. |
| Member<ScriptState> script_state_; |
| |
| State record_state_ = State::kPending; |
| }; |
| |
| } // namespace blink |
| |
| #endif // THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_RECORD_H_ |