Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/indexedDB/IDBCursor.h
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#ifndef mozilla_dom_idbcursor_h__
8
#define mozilla_dom_idbcursor_h__
9
10
#include "IndexedDatabase.h"
11
#include "js/RootingAPI.h"
12
#include "mozilla/Attributes.h"
13
#include "mozilla/dom/IDBCursorBinding.h"
14
#include "mozilla/dom/indexedDB/Key.h"
15
#include "nsCycleCollectionParticipant.h"
16
#include "nsWrapperCache.h"
17
18
class nsPIDOMWindowInner;
19
20
namespace mozilla {
21
22
class ErrorResult;
23
24
namespace dom {
25
26
class IDBIndex;
27
class IDBObjectStore;
28
class IDBRequest;
29
class IDBTransaction;
30
class OwningIDBObjectStoreOrIDBIndex;
31
32
namespace indexedDB {
33
class BackgroundCursorChild;
34
}
35
36
class IDBCursor final
37
  : public nsISupports
38
  , public nsWrapperCache
39
{
40
public:
41
  typedef indexedDB::Key Key;
42
  typedef indexedDB::StructuredCloneReadInfo StructuredCloneReadInfo;
43
44
  enum Direction
45
  {
46
    NEXT = 0,
47
    NEXT_UNIQUE,
48
    PREV,
49
    PREV_UNIQUE,
50
51
    // Only needed for IPC serialization helper, should never be used in code.
52
    DIRECTION_INVALID
53
  };
54
55
private:
56
  enum Type
57
  {
58
    Type_ObjectStore,
59
    Type_ObjectStoreKey,
60
    Type_Index,
61
    Type_IndexKey,
62
  };
63
64
  indexedDB::BackgroundCursorChild* mBackgroundActor;
65
66
  RefPtr<IDBRequest> mRequest;
67
  RefPtr<IDBObjectStore> mSourceObjectStore;
68
  RefPtr<IDBIndex> mSourceIndex;
69
70
  // mSourceObjectStore or mSourceIndex will hold this alive.
71
  IDBTransaction* mTransaction;
72
73
  JS::Heap<JSObject*> mScriptOwner;
74
75
  // These are cycle-collected!
76
  JS::Heap<JS::Value> mCachedKey;
77
  JS::Heap<JS::Value> mCachedPrimaryKey;
78
  JS::Heap<JS::Value> mCachedValue;
79
80
  Key mKey;
81
  Key mSortKey;
82
  Key mPrimaryKey;
83
  StructuredCloneReadInfo mCloneInfo;
84
85
  const Type mType;
86
  const Direction mDirection;
87
88
  bool mHaveCachedKey : 1;
89
  bool mHaveCachedPrimaryKey : 1;
90
  bool mHaveCachedValue : 1;
91
  bool mRooted : 1;
92
  bool mContinueCalled : 1;
93
  bool mHaveValue : 1;
94
95
public:
96
  static already_AddRefed<IDBCursor>
97
  Create(indexedDB::BackgroundCursorChild* aBackgroundActor,
98
         const Key& aKey,
99
         StructuredCloneReadInfo&& aCloneInfo);
100
101
  static already_AddRefed<IDBCursor>
102
  Create(indexedDB::BackgroundCursorChild* aBackgroundActor,
103
         const Key& aKey);
104
105
  static already_AddRefed<IDBCursor>
106
  Create(indexedDB::BackgroundCursorChild* aBackgroundActor,
107
         const Key& aKey,
108
         const Key& aSortKey,
109
         const Key& aPrimaryKey,
110
         StructuredCloneReadInfo&& aCloneInfo);
111
112
  static already_AddRefed<IDBCursor>
113
  Create(indexedDB::BackgroundCursorChild* aBackgroundActor,
114
         const Key& aKey,
115
         const Key& aSortKey,
116
         const Key& aPrimaryKey);
117
118
  static Direction
119
  ConvertDirection(IDBCursorDirection aDirection);
120
121
  void
122
  AssertIsOnOwningThread() const
123
#ifdef DEBUG
124
  ;
125
#else
126
0
  { }
127
#endif
128
129
  nsPIDOMWindowInner*
130
  GetParentObject() const;
131
132
  void
133
  GetSource(OwningIDBObjectStoreOrIDBIndex& aSource) const;
134
135
  IDBCursorDirection
136
  GetDirection() const;
137
138
  void
139
  GetKey(JSContext* aCx,
140
         JS::MutableHandle<JS::Value> aResult,
141
         ErrorResult& aRv);
142
143
  void
144
  GetPrimaryKey(JSContext* aCx,
145
                JS::MutableHandle<JS::Value> aResult,
146
                ErrorResult& aRv);
147
148
  void
149
  GetValue(JSContext* aCx,
150
           JS::MutableHandle<JS::Value> aResult,
151
           ErrorResult& aRv);
152
153
  void
154
  Continue(JSContext* aCx, JS::Handle<JS::Value> aKey, ErrorResult& aRv);
155
156
  void
157
  ContinuePrimaryKey(JSContext* aCx,
158
                     JS::Handle<JS::Value> aKey,
159
                     JS::Handle<JS::Value> aPrimaryKey,
160
                     ErrorResult& aRv);
161
162
  void
163
  Advance(uint32_t aCount, ErrorResult& aRv);
164
165
  already_AddRefed<IDBRequest>
166
  Update(JSContext* aCx, JS::Handle<JS::Value> aValue, ErrorResult& aRv);
167
168
  already_AddRefed<IDBRequest>
169
  Delete(JSContext* aCx, ErrorResult& aRv);
170
171
  void
172
  Reset();
173
174
  void
175
  Reset(Key&& aKey, StructuredCloneReadInfo&& aValue);
176
177
  void
178
  Reset(Key&& aKey);
179
180
  void
181
  Reset(Key&& aKey, Key&& aSortKey, Key&& aPrimaryKey, StructuredCloneReadInfo&& aValue);
182
183
  void
184
  Reset(Key&& aKey, Key&& aSortKey, Key&& aPrimaryKey);
185
186
  void
187
  ClearBackgroundActor()
188
0
  {
189
0
    AssertIsOnOwningThread();
190
0
191
0
    mBackgroundActor = nullptr;
192
0
  }
193
194
  NS_DECL_CYCLE_COLLECTING_ISUPPORTS
195
  NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(IDBCursor)
196
197
  // nsWrapperCache
198
  virtual JSObject*
199
  WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
200
201
private:
202
  IDBCursor(Type aType,
203
            indexedDB::BackgroundCursorChild* aBackgroundActor,
204
            const Key& aKey);
205
206
  ~IDBCursor();
207
208
  // Checks if this is a locale aware cursor (ie. the index's sortKey is unset)
209
  bool
210
  IsLocaleAware() const;
211
212
  void
213
  DropJSObjects();
214
215
  bool
216
  IsSourceDeleted() const;
217
};
218
219
} // namespace dom
220
} // namespace mozilla
221
222
#endif // mozilla_dom_idbcursor_h__