summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.h
blob: 8a5533298889efe02a75c3cb77ac15775564ba29 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
// Copyright 2017 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_REGISTRATION_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_REGISTRATION_H_

#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom-blink.h"
#include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
#include "third_party/blink/renderer/core/dom/events/event_target.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"

namespace blink {

class BackgroundFetchRecord;
class CacheQueryOptions;
class ExceptionState;
class ScriptPromiseResolver;
class ScriptState;
class ServiceWorkerRegistration;
class RequestOrUSVString;

// Represents an individual Background Fetch registration. Gives developers
// access to its properties, options, and enables them to abort the fetch.
class BackgroundFetchRegistration final
    : public EventTargetWithInlineData,
      public ActiveScriptWrappable<BackgroundFetchRegistration>,
      public blink::mojom::blink::BackgroundFetchRegistrationObserver {
  DEFINE_WRAPPERTYPEINFO();
  USING_PRE_FINALIZER(BackgroundFetchRegistration, Dispose);
  USING_GARBAGE_COLLECTED_MIXIN(BackgroundFetchRegistration);

 public:
  BackgroundFetchRegistration(
      const String& developer_id,
      uint64_t upload_total,
      uint64_t uploaded,
      uint64_t download_total,
      uint64_t downloaded,
      mojom::BackgroundFetchResult result,
      mojom::BackgroundFetchFailureReason failure_reason);

  BackgroundFetchRegistration(
      ServiceWorkerRegistration* service_worker_registration,
      mojom::blink::BackgroundFetchRegistrationPtr registration);

  ~BackgroundFetchRegistration() override;

  // Initializes the BackgroundFetchRegistration to be associated with the given
  // ServiceWorkerRegistration. It will register itself as an observer for
  // progress events, powering the `progress` JavaScript event.
  void Initialize(
      ServiceWorkerRegistration* registration,
      mojo::PendingRemote<mojom::blink::BackgroundFetchRegistrationService>
          registration_service);

  // BackgroundFetchRegistrationObserver implementation.
  void OnProgress(uint64_t upload_total,
                  uint64_t uploaded,
                  uint64_t download_total,
                  uint64_t downloaded,
                  mojom::BackgroundFetchResult result,
                  mojom::BackgroundFetchFailureReason failure_reason) override;
  void OnRecordsUnavailable() override;

  // Called when the |request| is complete. |response| points to the response
  // received, if any.
  void OnRequestCompleted(mojom::blink::FetchAPIRequestPtr request,
                          mojom::blink::FetchAPIResponsePtr response) override;

  // Web Exposed attribute defined in the IDL file. Corresponds to the
  // |developer_id| used elsewhere in the codebase.
  String id() const;
  ScriptPromise match(ScriptState* script_state,
                      const RequestOrUSVString& request,
                      const CacheQueryOptions* options,
                      ExceptionState& exception_state);
  ScriptPromise matchAll(ScriptState* scrip_state,
                         ExceptionState& exception_state);
  ScriptPromise matchAll(ScriptState* script_state,
                         const RequestOrUSVString& request,
                         const CacheQueryOptions* options,
                         ExceptionState& exception_state);

  uint64_t uploadTotal() const;
  uint64_t uploaded() const;
  uint64_t downloadTotal() const;
  uint64_t downloaded() const;
  bool recordsAvailable() const;
  const String result() const;
  const String failureReason() const;

  DEFINE_ATTRIBUTE_EVENT_LISTENER(progress, kProgress)

  ScriptPromise abort(ScriptState* script_state);

  // EventTargetWithInlineData implementation.
  const AtomicString& InterfaceName() const override;
  ExecutionContext* GetExecutionContext() const override;

  void Dispose();

  void Trace(Visitor* visitor) override;

  // Keeps the object alive until there are non-zero number of |observers_|.
  bool HasPendingActivity() const final;

  void UpdateUI(
      const String& in_title,
      const SkBitmap& in_icon,
      mojom::blink::BackgroundFetchRegistrationService::UpdateUICallback
          callback);

 private:
  void DidAbort(ScriptPromiseResolver* resolver,
                mojom::blink::BackgroundFetchError error);
  ScriptPromise MatchImpl(
      ScriptState* script_state,
      base::Optional<RequestOrUSVString> request,
      mojom::blink::CacheQueryOptionsPtr cache_query_options,
      ExceptionState& exception_state,
      bool match_all);
  void DidGetMatchingRequests(
      ScriptPromiseResolver* resolver,
      bool return_all,
      Vector<mojom::blink::BackgroundFetchSettledFetchPtr> settled_fetches);

  // Updates the |record| with a |response|, if one is available, else marks
  // the |record|'s request as aborted or failed.
  void UpdateRecord(BackgroundFetchRecord* record,
                    mojom::blink::FetchAPIResponsePtr& response);

  bool IsAborted();

  Member<ServiceWorkerRegistration> registration_;

  // Corresponds to IDL 'id' attribute. Not unique - an active registration can
  // have the same |developer_id_| as one or more inactive registrations.
  String developer_id_;

  uint64_t upload_total_;
  uint64_t uploaded_;
  uint64_t download_total_;
  uint64_t downloaded_;
  bool records_available_ = true;
  mojom::BackgroundFetchResult result_;
  mojom::BackgroundFetchFailureReason failure_reason_;
  HeapVector<Member<BackgroundFetchRecord>> observers_;

  mojo::Remote<mojom::blink::BackgroundFetchRegistrationService>
      registration_service_;

  mojo::Receiver<blink::mojom::blink::BackgroundFetchRegistrationObserver>
      observer_receiver_{this};
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_REGISTRATION_H_