Line data Source code
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 file,
5 : * You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #ifndef mozilla_dom_quota_originorpatternstring_h__
8 : #define mozilla_dom_quota_originorpatternstring_h__
9 :
10 : #include "mozilla/dom/quota/QuotaCommon.h"
11 :
12 : #include "mozilla/BasePrincipal.h"
13 :
14 : BEGIN_QUOTA_NAMESPACE
15 :
16 : class OriginScope
17 : {
18 : public:
19 : enum Type
20 : {
21 : eOrigin,
22 : ePattern,
23 : ePrefix,
24 : eNull
25 : };
26 :
27 : private:
28 : struct OriginAndAttributes
29 : {
30 : nsCString mOrigin;
31 : OriginAttributes mAttributes;
32 :
33 0 : OriginAndAttributes(const OriginAndAttributes& aOther)
34 0 : : mOrigin(aOther.mOrigin)
35 0 : , mAttributes(aOther.mAttributes)
36 : {
37 0 : MOZ_COUNT_CTOR(OriginAndAttributes);
38 0 : }
39 :
40 0 : explicit OriginAndAttributes(const nsACString& aOrigin)
41 0 : : mOrigin(aOrigin)
42 : {
43 0 : nsCString originNoSuffix;
44 0 : MOZ_ALWAYS_TRUE(mAttributes.PopulateFromOrigin(aOrigin, originNoSuffix));
45 :
46 0 : MOZ_COUNT_CTOR(OriginAndAttributes);
47 0 : }
48 :
49 0 : ~OriginAndAttributes()
50 0 : {
51 0 : MOZ_COUNT_DTOR(OriginAndAttributes);
52 0 : }
53 : };
54 :
55 : union {
56 : // eOrigin
57 : OriginAndAttributes* mOriginAndAttributes;
58 :
59 : // ePattern
60 : mozilla::OriginAttributesPattern* mPattern;
61 :
62 : // ePrefix
63 : nsCString* mPrefix;
64 :
65 : // eNull
66 : void* mDummy;
67 : };
68 :
69 : Type mType;
70 :
71 : public:
72 : static OriginScope
73 0 : FromOrigin(const nsACString& aOrigin)
74 : {
75 0 : return OriginScope(aOrigin, true);
76 : }
77 :
78 : static OriginScope
79 : FromPattern(const mozilla::OriginAttributesPattern& aPattern)
80 : {
81 : return OriginScope(aPattern);
82 : }
83 :
84 : static OriginScope
85 : FromJSONPattern(const nsAString& aJSONPattern)
86 : {
87 : return OriginScope(aJSONPattern);
88 : }
89 :
90 : static OriginScope
91 : FromPrefix(const nsACString& aPrefix)
92 : {
93 : return OriginScope(aPrefix, false);
94 : }
95 :
96 : static OriginScope
97 0 : FromNull()
98 : {
99 0 : return OriginScope();
100 : }
101 :
102 0 : OriginScope(const OriginScope& aOther)
103 0 : {
104 0 : if (aOther.IsOrigin()) {
105 0 : mOriginAndAttributes =
106 0 : new OriginAndAttributes(*aOther.mOriginAndAttributes);
107 0 : } else if (aOther.IsPattern()) {
108 0 : mPattern = new mozilla::OriginAttributesPattern(*aOther.mPattern);
109 0 : } else if (aOther.IsPrefix()) {
110 0 : mPrefix = new nsCString(*aOther.mPrefix);
111 : } else {
112 0 : mDummy = aOther.mDummy;
113 : }
114 :
115 0 : mType = aOther.mType;
116 0 : }
117 :
118 0 : ~OriginScope()
119 0 : {
120 0 : Destroy();
121 0 : }
122 :
123 : bool
124 0 : IsOrigin() const
125 : {
126 0 : return mType == eOrigin;
127 : }
128 :
129 : bool
130 0 : IsPattern() const
131 : {
132 0 : return mType == ePattern;
133 : }
134 :
135 : bool
136 0 : IsPrefix() const
137 : {
138 0 : return mType == ePrefix;
139 : }
140 :
141 : bool
142 0 : IsNull() const
143 : {
144 0 : return mType == eNull;
145 : }
146 :
147 : Type
148 : GetType() const
149 : {
150 : return mType;
151 : }
152 :
153 : void
154 0 : SetFromOrigin(const nsACString& aOrigin)
155 : {
156 0 : Destroy();
157 :
158 0 : mOriginAndAttributes = new OriginAndAttributes(aOrigin);
159 :
160 0 : mType = eOrigin;
161 0 : }
162 :
163 : void
164 : SetFromPattern(const mozilla::OriginAttributesPattern& aPattern)
165 : {
166 : Destroy();
167 :
168 : mPattern = new mozilla::OriginAttributesPattern(aPattern);
169 :
170 : mType = ePattern;
171 : }
172 :
173 : void
174 0 : SetFromJSONPattern(const nsAString& aJSONPattern)
175 : {
176 0 : Destroy();
177 :
178 0 : mPattern = new mozilla::OriginAttributesPattern();
179 0 : MOZ_ALWAYS_TRUE(mPattern->Init(aJSONPattern));
180 :
181 0 : mType = ePattern;
182 0 : }
183 :
184 : void
185 0 : SetFromPrefix(const nsACString& aPrefix)
186 : {
187 0 : Destroy();
188 :
189 0 : mPrefix = new nsCString(aPrefix);
190 :
191 0 : mType = ePrefix;
192 0 : }
193 :
194 : void
195 : SetFromNull()
196 : {
197 : Destroy();
198 :
199 : mDummy = nullptr;
200 :
201 : mType = eNull;
202 : }
203 :
204 : const nsACString&
205 0 : GetOrigin() const
206 : {
207 0 : MOZ_ASSERT(IsOrigin());
208 0 : MOZ_ASSERT(mOriginAndAttributes);
209 :
210 0 : return mOriginAndAttributes->mOrigin;
211 : }
212 :
213 : void
214 0 : SetOrigin(const nsACString& aOrigin)
215 : {
216 0 : MOZ_ASSERT(IsOrigin());
217 0 : MOZ_ASSERT(mOriginAndAttributes);
218 0 : mOriginAndAttributes->mOrigin = aOrigin;
219 0 : }
220 :
221 : const mozilla::OriginAttributes&
222 : GetOriginAttributes() const
223 : {
224 : MOZ_ASSERT(IsOrigin());
225 : MOZ_ASSERT(mOriginAndAttributes);
226 : return mOriginAndAttributes->mAttributes;
227 : }
228 :
229 : const mozilla::OriginAttributesPattern&
230 : GetPattern() const
231 : {
232 : MOZ_ASSERT(IsPattern());
233 : MOZ_ASSERT(mPattern);
234 : return *mPattern;
235 : }
236 :
237 : const nsACString&
238 0 : GetPrefix() const
239 : {
240 0 : MOZ_ASSERT(IsPrefix());
241 0 : MOZ_ASSERT(mPrefix);
242 :
243 0 : return *mPrefix;
244 : }
245 :
246 : void
247 0 : SetPrefix(const nsACString& aPrefix)
248 : {
249 0 : MOZ_ASSERT(IsPrefix());
250 0 : MOZ_ASSERT(mPrefix);
251 :
252 0 : *mPrefix = aPrefix;
253 0 : }
254 :
255 0 : bool MatchesOrigin(const OriginScope& aOther) const
256 : {
257 0 : MOZ_ASSERT(aOther.IsOrigin());
258 0 : MOZ_ASSERT(aOther.mOriginAndAttributes);
259 :
260 : bool match;
261 :
262 0 : if (IsOrigin()) {
263 0 : MOZ_ASSERT(mOriginAndAttributes);
264 0 : match = mOriginAndAttributes->mOrigin.Equals(
265 0 : aOther.mOriginAndAttributes->mOrigin);
266 0 : } else if (IsPattern()) {
267 0 : MOZ_ASSERT(mPattern);
268 0 : match = mPattern->Matches(aOther.mOriginAndAttributes->mAttributes);
269 0 : } else if (IsPrefix()) {
270 0 : MOZ_ASSERT(mPrefix);
271 0 : match = StringBeginsWith(aOther.mOriginAndAttributes->mOrigin, *mPrefix);
272 : } else {
273 0 : match = true;
274 : }
275 :
276 0 : return match;
277 : }
278 :
279 0 : bool MatchesPattern(const OriginScope& aOther) const
280 : {
281 0 : MOZ_ASSERT(aOther.IsPattern());
282 0 : MOZ_ASSERT(aOther.mPattern);
283 :
284 : bool match;
285 :
286 0 : if (IsOrigin()) {
287 0 : MOZ_ASSERT(mOriginAndAttributes);
288 0 : match = aOther.mPattern->Matches(mOriginAndAttributes->mAttributes);
289 0 : } else if (IsPattern()) {
290 0 : MOZ_ASSERT(mPattern);
291 0 : match = mPattern->Overlaps(*aOther.mPattern);
292 0 : } else if (IsPrefix()) {
293 0 : MOZ_ASSERT(mPrefix);
294 : // The match will be always true here because any origin attributes
295 : // pattern overlaps any origin prefix (an origin prefix targets all
296 : // origin attributes).
297 0 : match = true;
298 : } else {
299 0 : match = true;
300 : }
301 :
302 0 : return match;
303 : }
304 :
305 0 : bool MatchesPrefix(const OriginScope& aOther) const
306 : {
307 0 : MOZ_ASSERT(aOther.IsPrefix());
308 0 : MOZ_ASSERT(aOther.mPrefix);
309 :
310 : bool match;
311 :
312 0 : if (IsOrigin()) {
313 0 : MOZ_ASSERT(mOriginAndAttributes);
314 0 : match = StringBeginsWith(mOriginAndAttributes->mOrigin, *aOther.mPrefix);
315 0 : } else if (IsPattern()) {
316 0 : MOZ_ASSERT(mPattern);
317 : // The match will be always true here because any origin attributes
318 : // pattern overlaps any origin prefix (an origin prefix targets all
319 : // origin attributes).
320 0 : match = true;
321 0 : } else if (IsPrefix()) {
322 0 : MOZ_ASSERT(mPrefix);
323 0 : match = mPrefix->Equals(*aOther.mPrefix);
324 : } else {
325 0 : match = true;
326 : }
327 :
328 0 : return match;
329 : }
330 :
331 0 : bool Matches(const OriginScope& aOther) const
332 : {
333 : bool match;
334 :
335 0 : if (aOther.IsOrigin()) {
336 0 : match = MatchesOrigin(aOther);
337 0 : } else if (aOther.IsPattern()) {
338 0 : match = MatchesPattern(aOther);
339 0 : } else if (aOther.IsPrefix()) {
340 0 : match = MatchesPrefix(aOther);
341 : } else {
342 0 : match = true;
343 : }
344 :
345 0 : return match;
346 : }
347 :
348 : OriginScope
349 0 : Clone()
350 : {
351 0 : if (IsOrigin()) {
352 0 : MOZ_ASSERT(mOriginAndAttributes);
353 0 : return OriginScope(*mOriginAndAttributes);
354 : }
355 :
356 0 : if (IsPattern()) {
357 0 : MOZ_ASSERT(mPattern);
358 0 : return OriginScope(*mPattern);
359 : }
360 :
361 0 : if (IsPrefix()) {
362 0 : MOZ_ASSERT(mPrefix);
363 0 : return OriginScope(*mPrefix, false);
364 : }
365 :
366 0 : MOZ_ASSERT(IsNull());
367 0 : return OriginScope();
368 : }
369 :
370 : private:
371 0 : explicit OriginScope(const OriginAndAttributes& aOriginAndAttributes)
372 0 : : mOriginAndAttributes(new OriginAndAttributes(aOriginAndAttributes))
373 0 : , mType(eOrigin)
374 0 : { }
375 :
376 0 : explicit OriginScope(const nsACString& aOriginOrPrefix, bool aOrigin)
377 0 : {
378 0 : if (aOrigin) {
379 0 : mOriginAndAttributes = new OriginAndAttributes(aOriginOrPrefix);
380 0 : mType = eOrigin;
381 : } else {
382 0 : mPrefix = new nsCString(aOriginOrPrefix);
383 0 : mType = ePrefix;
384 : }
385 0 : }
386 :
387 0 : explicit OriginScope(const mozilla::OriginAttributesPattern& aPattern)
388 0 : : mPattern(new mozilla::OriginAttributesPattern(aPattern))
389 0 : , mType(ePattern)
390 0 : { }
391 :
392 : explicit OriginScope(const nsAString& aJSONPattern)
393 : : mPattern(new mozilla::OriginAttributesPattern())
394 : , mType(ePattern)
395 : {
396 : MOZ_ALWAYS_TRUE(mPattern->Init(aJSONPattern));
397 : }
398 :
399 0 : OriginScope()
400 0 : : mDummy(nullptr)
401 0 : , mType(eNull)
402 0 : { }
403 :
404 : void
405 0 : Destroy()
406 : {
407 0 : if (IsOrigin()) {
408 0 : MOZ_ASSERT(mOriginAndAttributes);
409 0 : delete mOriginAndAttributes;
410 0 : mOriginAndAttributes = nullptr;
411 0 : } else if (IsPattern()) {
412 0 : MOZ_ASSERT(mPattern);
413 0 : delete mPattern;
414 0 : mPattern = nullptr;
415 0 : } else if (IsPrefix()) {
416 0 : MOZ_ASSERT(mPrefix);
417 0 : delete mPrefix;
418 0 : mPrefix = nullptr;
419 : }
420 0 : }
421 :
422 : bool
423 : operator==(const OriginScope& aOther) = delete;
424 : };
425 :
426 : END_QUOTA_NAMESPACE
427 :
428 : #endif // mozilla_dom_quota_originorpatternstring_h__
|