Coverage Report

Created: 2018-09-25 14:53

/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__