summaryrefslogtreecommitdiffstats
path: root/dom/quota/StorageOriginAttributes.cpp
blob: bcdf47bce80548b1fa85f8528969750a8c52ce7a (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
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "StorageOriginAttributes.h"

#include "nsString.h"
#include "nsURLHelper.h"
#include "mozilla/Assertions.h"
#include "mozilla/dom/quota/QuotaManager.h"

namespace mozilla {

void StorageOriginAttributes::CreateSuffix(nsACString& aStr) const {
  nsCString str1;

  URLParams params;
  nsAutoString value;

  if (mInIsolatedMozBrowser) {
    params.Set(u"inBrowser"_ns, u"1"_ns);
  }

  str1.Truncate();

  params.Serialize(value, true);
  if (!value.IsEmpty()) {
    str1.AppendLiteral("^");
    str1.Append(NS_ConvertUTF16toUTF8(value));
  }

  // Make sure that the string don't contain characters that would get replaced
  // with the plus character by quota manager, potentially causing ambiguity.
  MOZ_ASSERT(str1.FindCharInSet(dom::quota::QuotaManager::kReplaceChars) ==
             kNotFound);

  // Let OriginAttributes::CreateSuffix serialize other origin attributes.
  nsCString str2;
  mOriginAttributes.CreateSuffix(str2);

  aStr.Truncate();

  if (str1.IsEmpty()) {
    aStr.Append(str2);
    return;
  }

  if (str2.IsEmpty()) {
    aStr.Append(str1);
    return;
  }

  // If both strings are not empty, we need to combine them.
  aStr.Append(str1);
  aStr.Append('&');
  aStr.Append(Substring(str2, 1, str2.Length() - 1));
}

bool StorageOriginAttributes::PopulateFromSuffix(const nsACString& aStr) {
  if (aStr.IsEmpty()) {
    return true;
  }

  if (aStr[0] != '^') {
    return false;
  }

  bool ok =
      URLParams::Parse(Substring(aStr, 1, aStr.Length() - 1), true,
                       [this](const nsAString& aName, const nsAString& aValue) {
                         if (aName.EqualsLiteral("inBrowser")) {
                           if (!aValue.EqualsLiteral("1")) {
                             return false;
                           }

                           mInIsolatedMozBrowser = true;
                           return true;
                         }

                         // Let OriginAttributes::PopulateFromSuffix parse other
                         // origin attributes.
                         return true;
                       });
  if (!ok) {
    return false;
  }

  return mOriginAttributes.PopulateFromSuffix(aStr);
}

bool StorageOriginAttributes::PopulateFromOrigin(const nsACString& aOrigin,
                                                 nsACString& aOriginNoSuffix) {
  // RFindChar is only available on nsCString.
  nsCString origin(aOrigin);
  int32_t pos = origin.RFindChar('^');

  if (pos == kNotFound) {
    aOriginNoSuffix = origin;
    return true;
  }

  aOriginNoSuffix = Substring(origin, 0, pos);
  return PopulateFromSuffix(Substring(origin, pos));
}

}  // namespace mozilla