/src/mozilla-central/dom/quota/OriginScope.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 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 | | #include "mozilla/Variant.h" |
14 | | |
15 | | BEGIN_QUOTA_NAMESPACE |
16 | | |
17 | | class OriginScope |
18 | | { |
19 | | class Origin |
20 | | { |
21 | | nsCString mOrigin; |
22 | | nsCString mOriginNoSuffix; |
23 | | UniquePtr<OriginAttributes> mAttributes; |
24 | | |
25 | | public: |
26 | | explicit Origin(const nsACString& aOrigin) |
27 | | : mOrigin(aOrigin) |
28 | 0 | { |
29 | 0 | InitMembers(); |
30 | 0 | } |
31 | | |
32 | | Origin(const Origin& aOther) |
33 | | : mOrigin(aOther.mOrigin) |
34 | | , mOriginNoSuffix(aOther.mOriginNoSuffix) |
35 | | , mAttributes(MakeUnique<OriginAttributes>(*aOther.mAttributes)) |
36 | 0 | { } |
37 | | |
38 | 0 | Origin(Origin&& aOther) = default; |
39 | | |
40 | | const nsACString& |
41 | | GetOrigin() const |
42 | 0 | { |
43 | 0 | return mOrigin; |
44 | 0 | } |
45 | | |
46 | | void |
47 | | SetOrigin(const nsACString& aOrigin) |
48 | 0 | { |
49 | 0 | mOrigin = aOrigin; |
50 | 0 |
|
51 | 0 | InitMembers(); |
52 | 0 | } |
53 | | |
54 | | const nsACString& |
55 | | GetOriginNoSuffix() const |
56 | 0 | { |
57 | 0 | return mOriginNoSuffix; |
58 | 0 | } |
59 | | |
60 | | const OriginAttributes& |
61 | | GetAttributes() const |
62 | 0 | { |
63 | 0 | MOZ_ASSERT(mAttributes); |
64 | 0 |
|
65 | 0 | return *mAttributes; |
66 | 0 | } |
67 | | |
68 | | private: |
69 | | void |
70 | | InitMembers() |
71 | 0 | { |
72 | 0 | mAttributes = MakeUnique<OriginAttributes>(); |
73 | 0 |
|
74 | 0 | MOZ_ALWAYS_TRUE(mAttributes->PopulateFromOrigin(mOrigin, |
75 | 0 | mOriginNoSuffix)); |
76 | 0 | } |
77 | | }; |
78 | | |
79 | | class Prefix |
80 | | { |
81 | | nsCString mOriginNoSuffix; |
82 | | |
83 | | public: |
84 | | explicit Prefix(const nsACString& aOriginNoSuffix) |
85 | | : mOriginNoSuffix(aOriginNoSuffix) |
86 | 0 | { } |
87 | | |
88 | | const nsCString& |
89 | | GetOriginNoSuffix() const |
90 | 0 | { |
91 | 0 | return mOriginNoSuffix; |
92 | 0 | } |
93 | | |
94 | | void |
95 | | SetOriginNoSuffix(const nsACString& aOriginNoSuffix) |
96 | 0 | { |
97 | 0 | mOriginNoSuffix = aOriginNoSuffix; |
98 | 0 | } |
99 | | }; |
100 | | |
101 | | class Pattern |
102 | | { |
103 | | UniquePtr<OriginAttributesPattern> mPattern; |
104 | | |
105 | | public: |
106 | | explicit Pattern(const OriginAttributesPattern& aPattern) |
107 | | : mPattern(MakeUnique<OriginAttributesPattern>(aPattern)) |
108 | 0 | { } |
109 | | |
110 | | explicit Pattern(const nsAString& aJSONPattern) |
111 | | : mPattern(MakeUnique<OriginAttributesPattern>()) |
112 | 0 | { |
113 | 0 | MOZ_ALWAYS_TRUE(mPattern->Init(aJSONPattern)); |
114 | 0 | } |
115 | | |
116 | | Pattern(const Pattern& aOther) |
117 | | : mPattern(MakeUnique<OriginAttributesPattern>(*aOther.mPattern)) |
118 | 0 | { } |
119 | | |
120 | 0 | Pattern(Pattern&& aOther) = default; |
121 | | |
122 | | const OriginAttributesPattern& |
123 | | GetPattern() const |
124 | 0 | { |
125 | 0 | MOZ_ASSERT(mPattern); |
126 | 0 |
|
127 | 0 | return *mPattern; |
128 | 0 | } |
129 | | |
130 | | void |
131 | | SetPattern(const OriginAttributesPattern& aPattern) |
132 | 0 | { |
133 | 0 | mPattern = MakeUnique<OriginAttributesPattern>(aPattern); |
134 | 0 | } |
135 | | |
136 | | nsString |
137 | | GetJSONPattern() const |
138 | | { |
139 | | MOZ_ASSERT(mPattern); |
140 | | |
141 | | nsString result; |
142 | | MOZ_ALWAYS_TRUE(mPattern->ToJSON(result)); |
143 | | |
144 | | return result; |
145 | | } |
146 | | }; |
147 | | |
148 | | struct Null |
149 | | { }; |
150 | | |
151 | | using DataType = Variant<Origin, Prefix, Pattern, Null>; |
152 | | |
153 | | DataType mData; |
154 | | |
155 | | public: |
156 | | OriginScope() |
157 | | : mData(Null()) |
158 | | { } |
159 | | |
160 | | static OriginScope |
161 | | FromOrigin(const nsACString& aOrigin) |
162 | 0 | { |
163 | 0 | return OriginScope(std::move(Origin(aOrigin))); |
164 | 0 | } |
165 | | |
166 | | static OriginScope |
167 | | FromPrefix(const nsACString& aPrefix) |
168 | 0 | { |
169 | 0 | return OriginScope(std::move(Prefix(aPrefix))); |
170 | 0 | } |
171 | | |
172 | | static OriginScope |
173 | | FromPattern(const OriginAttributesPattern& aPattern) |
174 | 0 | { |
175 | 0 | return OriginScope(std::move(Pattern(aPattern))); |
176 | 0 | } |
177 | | |
178 | | static OriginScope |
179 | | FromJSONPattern(const nsAString& aJSONPattern) |
180 | 0 | { |
181 | 0 | return OriginScope(std::move(Pattern(aJSONPattern))); |
182 | 0 | } |
183 | | |
184 | | static OriginScope |
185 | | FromNull() |
186 | 0 | { |
187 | 0 | return OriginScope(std::move(Null())); |
188 | 0 | } |
189 | | |
190 | | bool |
191 | | IsOrigin() const |
192 | 0 | { |
193 | 0 | return mData.is<Origin>(); |
194 | 0 | } |
195 | | |
196 | | bool |
197 | | IsPrefix() const |
198 | 0 | { |
199 | 0 | return mData.is<Prefix>(); |
200 | 0 | } |
201 | | |
202 | | bool |
203 | | IsPattern() const |
204 | | { |
205 | | return mData.is<Pattern>(); |
206 | | } |
207 | | |
208 | | bool |
209 | | IsNull() const |
210 | | { |
211 | | return mData.is<Null>(); |
212 | | } |
213 | | |
214 | | void |
215 | | SetFromOrigin(const nsACString& aOrigin) |
216 | 0 | { |
217 | 0 | mData = AsVariant(Origin(aOrigin)); |
218 | 0 | } |
219 | | |
220 | | void |
221 | | SetFromPrefix(const nsACString& aPrefix) |
222 | 0 | { |
223 | 0 | mData = AsVariant(Prefix(aPrefix)); |
224 | 0 | } |
225 | | |
226 | | void |
227 | | SetFromPattern(const OriginAttributesPattern& aPattern) |
228 | 0 | { |
229 | 0 | mData = AsVariant(Pattern(aPattern)); |
230 | 0 | } |
231 | | |
232 | | void |
233 | | SetFromJSONPattern(const nsAString& aJSONPattern) |
234 | 0 | { |
235 | 0 | mData = AsVariant(Pattern(aJSONPattern)); |
236 | 0 | } |
237 | | |
238 | | void |
239 | | SetFromNull() |
240 | | { |
241 | | mData = AsVariant(Null()); |
242 | | } |
243 | | |
244 | | const nsACString& |
245 | | GetOrigin() const |
246 | 0 | { |
247 | 0 | MOZ_ASSERT(IsOrigin()); |
248 | 0 |
|
249 | 0 | return mData.as<Origin>().GetOrigin(); |
250 | 0 | } |
251 | | |
252 | | void |
253 | | SetOrigin(const nsACString& aOrigin) |
254 | 0 | { |
255 | 0 | MOZ_ASSERT(IsOrigin()); |
256 | 0 |
|
257 | 0 | mData.as<Origin>().SetOrigin(aOrigin); |
258 | 0 | } |
259 | | |
260 | | const nsACString& |
261 | | GetOriginNoSuffix() const |
262 | 0 | { |
263 | 0 | MOZ_ASSERT(IsOrigin() || IsPrefix()); |
264 | 0 |
|
265 | 0 | if (IsOrigin()) { |
266 | 0 | return mData.as<Origin>().GetOriginNoSuffix(); |
267 | 0 | } |
268 | 0 | return mData.as<Prefix>().GetOriginNoSuffix(); |
269 | 0 | } |
270 | | |
271 | | void |
272 | | SetOriginNoSuffix(const nsACString& aOriginNoSuffix) |
273 | 0 | { |
274 | 0 | MOZ_ASSERT(IsPrefix()); |
275 | 0 |
|
276 | 0 | mData.as<Prefix>().SetOriginNoSuffix(aOriginNoSuffix); |
277 | 0 | } |
278 | | |
279 | | const OriginAttributesPattern& |
280 | | GetPattern() const |
281 | 0 | { |
282 | 0 | MOZ_ASSERT(IsPattern()); |
283 | 0 |
|
284 | 0 | return mData.as<Pattern>().GetPattern(); |
285 | 0 | } |
286 | | |
287 | | nsString |
288 | | GetJSONPattern() const |
289 | | { |
290 | | MOZ_ASSERT(IsPattern()); |
291 | | |
292 | | return mData.as<Pattern>().GetJSONPattern(); |
293 | | } |
294 | | |
295 | | void |
296 | | SetPattern(const OriginAttributesPattern& aPattern) |
297 | 0 | { |
298 | 0 | MOZ_ASSERT(IsPattern()); |
299 | 0 |
|
300 | 0 | mData.as<Pattern>().SetPattern(aPattern); |
301 | 0 | } |
302 | | |
303 | | bool |
304 | | Matches(const OriginScope& aOther) const |
305 | 0 | { |
306 | 0 | struct Matcher |
307 | 0 | { |
308 | 0 | const OriginScope& mThis; |
309 | 0 |
|
310 | 0 | explicit Matcher(const OriginScope& aThis) |
311 | 0 | : mThis(aThis) |
312 | 0 | { } |
313 | 0 |
|
314 | 0 | bool |
315 | 0 | match(const Origin& aOther) { |
316 | 0 | return mThis.MatchesOrigin(aOther); |
317 | 0 | } |
318 | 0 |
|
319 | 0 | bool |
320 | 0 | match(const Prefix& aOther) { |
321 | 0 | return mThis.MatchesPrefix(aOther); |
322 | 0 | } |
323 | 0 |
|
324 | 0 | bool |
325 | 0 | match(const Pattern& aOther) { |
326 | 0 | return mThis.MatchesPattern(aOther); |
327 | 0 | } |
328 | 0 |
|
329 | 0 | bool |
330 | 0 | match(const Null& aOther) { |
331 | 0 | return true; |
332 | 0 | } |
333 | 0 | }; |
334 | 0 |
|
335 | 0 | return aOther.mData.match(Matcher(*this)); |
336 | 0 | } |
337 | | |
338 | | OriginScope |
339 | | Clone() |
340 | 0 | { |
341 | 0 | return OriginScope(mData); |
342 | 0 | } |
343 | | |
344 | | private: |
345 | | // Move constructors |
346 | | explicit OriginScope(const Origin&& aOrigin) |
347 | | : mData(aOrigin) |
348 | 0 | { } |
349 | | |
350 | | explicit OriginScope(const Prefix&& aPrefix) |
351 | | : mData(aPrefix) |
352 | 0 | { } |
353 | | |
354 | | explicit OriginScope(const Pattern&& aPattern) |
355 | | : mData(aPattern) |
356 | 0 | { } |
357 | | |
358 | | explicit OriginScope(const Null&& aNull) |
359 | | : mData(aNull) |
360 | 0 | { } |
361 | | |
362 | | // Copy constructor |
363 | | explicit OriginScope(const DataType& aOther) |
364 | | : mData(aOther) |
365 | 0 | { } |
366 | | |
367 | | bool |
368 | | MatchesOrigin(const Origin& aOther) const |
369 | 0 | { |
370 | 0 | struct OriginMatcher |
371 | 0 | { |
372 | 0 | const Origin& mOther; |
373 | 0 |
|
374 | 0 | explicit OriginMatcher(const Origin& aOther) |
375 | 0 | : mOther(aOther) |
376 | 0 | { } |
377 | 0 |
|
378 | 0 | bool |
379 | 0 | match(const Origin& aThis) { |
380 | 0 | return aThis.GetOrigin().Equals(mOther.GetOrigin()); |
381 | 0 | } |
382 | 0 |
|
383 | 0 | bool |
384 | 0 | match(const Prefix& aThis) { |
385 | 0 | return aThis.GetOriginNoSuffix().Equals(mOther.GetOriginNoSuffix()); |
386 | 0 | } |
387 | 0 |
|
388 | 0 | bool |
389 | 0 | match(const Pattern& aThis) { |
390 | 0 | return aThis.GetPattern().Matches(mOther.GetAttributes()); |
391 | 0 | } |
392 | 0 |
|
393 | 0 | bool |
394 | 0 | match(const Null& aThis) { |
395 | 0 | // Null covers everything. |
396 | 0 | return true; |
397 | 0 | } |
398 | 0 | }; |
399 | 0 |
|
400 | 0 | return mData.match(OriginMatcher(aOther)); |
401 | 0 | } |
402 | | |
403 | | bool |
404 | | MatchesPrefix(const Prefix& aOther) const |
405 | 0 | { |
406 | 0 | struct PrefixMatcher |
407 | 0 | { |
408 | 0 | const Prefix& mOther; |
409 | 0 |
|
410 | 0 | explicit PrefixMatcher(const Prefix& aOther) |
411 | 0 | : mOther(aOther) |
412 | 0 | { } |
413 | 0 |
|
414 | 0 | bool |
415 | 0 | match(const Origin& aThis) { |
416 | 0 | return aThis.GetOriginNoSuffix().Equals(mOther.GetOriginNoSuffix()); |
417 | 0 | } |
418 | 0 |
|
419 | 0 | bool |
420 | 0 | match(const Prefix& aThis) { |
421 | 0 | return aThis.GetOriginNoSuffix().Equals(mOther.GetOriginNoSuffix()); |
422 | 0 | } |
423 | 0 |
|
424 | 0 | bool |
425 | 0 | match(const Pattern& aThis) { |
426 | 0 | // The match will be always true here because any origin attributes |
427 | 0 | // pattern overlaps any origin prefix (an origin prefix targets all |
428 | 0 | // origin attributes). |
429 | 0 | return true; |
430 | 0 | } |
431 | 0 |
|
432 | 0 | bool |
433 | 0 | match(const Null& aThis) { |
434 | 0 | // Null covers everything. |
435 | 0 | return true; |
436 | 0 | } |
437 | 0 | }; |
438 | 0 |
|
439 | 0 | return mData.match(PrefixMatcher(aOther)); |
440 | 0 | } |
441 | | |
442 | | bool |
443 | | MatchesPattern(const Pattern& aOther) const |
444 | 0 | { |
445 | 0 | struct PatternMatcher |
446 | 0 | { |
447 | 0 | const Pattern& mOther; |
448 | 0 |
|
449 | 0 | explicit PatternMatcher(const Pattern& aOther) |
450 | 0 | : mOther(aOther) |
451 | 0 | { } |
452 | 0 |
|
453 | 0 | bool |
454 | 0 | match(const Origin& aThis) { |
455 | 0 | return mOther.GetPattern().Matches(aThis.GetAttributes()); |
456 | 0 | } |
457 | 0 |
|
458 | 0 | bool |
459 | 0 | match(const Prefix& aThis) { |
460 | 0 | // The match will be always true here because any origin attributes |
461 | 0 | // pattern overlaps any origin prefix (an origin prefix targets all |
462 | 0 | // origin attributes). |
463 | 0 | return true; |
464 | 0 | } |
465 | 0 |
|
466 | 0 | bool |
467 | 0 | match(const Pattern& aThis) { |
468 | 0 | return aThis.GetPattern().Overlaps(mOther.GetPattern()); |
469 | 0 | } |
470 | 0 |
|
471 | 0 | bool |
472 | 0 | match(const Null& aThis) { |
473 | 0 | // Null covers everything. |
474 | 0 | return true; |
475 | 0 | } |
476 | 0 | }; |
477 | 0 |
|
478 | 0 | PatternMatcher patternMatcher(aOther); |
479 | 0 | return mData.match(PatternMatcher(aOther)); |
480 | 0 | } |
481 | | |
482 | | bool |
483 | | operator==(const OriginScope& aOther) = delete; |
484 | | }; |
485 | | |
486 | | END_QUOTA_NAMESPACE |
487 | | |
488 | | #endif // mozilla_dom_quota_originorpatternstring_h__ |