Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : #include "ChromeUtils.h"
7 :
8 : #include "mozilla/Base64.h"
9 : #include "mozilla/BasePrincipal.h"
10 :
11 : namespace mozilla {
12 : namespace dom {
13 :
14 : /* static */ void
15 0 : ThreadSafeChromeUtils::NondeterministicGetWeakMapKeys(GlobalObject& aGlobal,
16 : JS::Handle<JS::Value> aMap,
17 : JS::MutableHandle<JS::Value> aRetval,
18 : ErrorResult& aRv)
19 : {
20 0 : if (!aMap.isObject()) {
21 0 : aRetval.setUndefined();
22 : } else {
23 0 : JSContext* cx = aGlobal.Context();
24 0 : JS::Rooted<JSObject*> objRet(cx);
25 0 : JS::Rooted<JSObject*> mapObj(cx, &aMap.toObject());
26 0 : if (!JS_NondeterministicGetWeakMapKeys(cx, mapObj, &objRet)) {
27 0 : aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
28 : } else {
29 0 : aRetval.set(objRet ? JS::ObjectValue(*objRet) : JS::UndefinedValue());
30 : }
31 : }
32 0 : }
33 :
34 : /* static */ void
35 0 : ThreadSafeChromeUtils::NondeterministicGetWeakSetKeys(GlobalObject& aGlobal,
36 : JS::Handle<JS::Value> aSet,
37 : JS::MutableHandle<JS::Value> aRetval,
38 : ErrorResult& aRv)
39 : {
40 0 : if (!aSet.isObject()) {
41 0 : aRetval.setUndefined();
42 : } else {
43 0 : JSContext* cx = aGlobal.Context();
44 0 : JS::Rooted<JSObject*> objRet(cx);
45 0 : JS::Rooted<JSObject*> setObj(cx, &aSet.toObject());
46 0 : if (!JS_NondeterministicGetWeakSetKeys(cx, setObj, &objRet)) {
47 0 : aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
48 : } else {
49 0 : aRetval.set(objRet ? JS::ObjectValue(*objRet) : JS::UndefinedValue());
50 : }
51 : }
52 0 : }
53 :
54 : /* static */ void
55 0 : ThreadSafeChromeUtils::Base64URLEncode(GlobalObject& aGlobal,
56 : const ArrayBufferViewOrArrayBuffer& aSource,
57 : const Base64URLEncodeOptions& aOptions,
58 : nsACString& aResult,
59 : ErrorResult& aRv)
60 : {
61 0 : size_t length = 0;
62 0 : uint8_t* data = nullptr;
63 0 : if (aSource.IsArrayBuffer()) {
64 0 : const ArrayBuffer& buffer = aSource.GetAsArrayBuffer();
65 0 : buffer.ComputeLengthAndData();
66 0 : length = buffer.Length();
67 0 : data = buffer.Data();
68 0 : } else if (aSource.IsArrayBufferView()) {
69 0 : const ArrayBufferView& view = aSource.GetAsArrayBufferView();
70 0 : view.ComputeLengthAndData();
71 0 : length = view.Length();
72 0 : data = view.Data();
73 : } else {
74 0 : MOZ_CRASH("Uninitialized union: expected buffer or view");
75 : }
76 :
77 0 : auto paddingPolicy = aOptions.mPad ? Base64URLEncodePaddingPolicy::Include :
78 0 : Base64URLEncodePaddingPolicy::Omit;
79 0 : nsresult rv = mozilla::Base64URLEncode(length, data, paddingPolicy, aResult);
80 0 : if (NS_WARN_IF(NS_FAILED(rv))) {
81 0 : aResult.Truncate();
82 0 : aRv.Throw(rv);
83 : }
84 0 : }
85 :
86 : /* static */ void
87 0 : ThreadSafeChromeUtils::Base64URLDecode(GlobalObject& aGlobal,
88 : const nsACString& aString,
89 : const Base64URLDecodeOptions& aOptions,
90 : JS::MutableHandle<JSObject*> aRetval,
91 : ErrorResult& aRv)
92 : {
93 : Base64URLDecodePaddingPolicy paddingPolicy;
94 0 : switch (aOptions.mPadding) {
95 : case Base64URLDecodePadding::Require:
96 0 : paddingPolicy = Base64URLDecodePaddingPolicy::Require;
97 0 : break;
98 :
99 : case Base64URLDecodePadding::Ignore:
100 0 : paddingPolicy = Base64URLDecodePaddingPolicy::Ignore;
101 0 : break;
102 :
103 : case Base64URLDecodePadding::Reject:
104 0 : paddingPolicy = Base64URLDecodePaddingPolicy::Reject;
105 0 : break;
106 :
107 : default:
108 0 : aRv.Throw(NS_ERROR_INVALID_ARG);
109 0 : return;
110 : }
111 0 : FallibleTArray<uint8_t> data;
112 0 : nsresult rv = mozilla::Base64URLDecode(aString, paddingPolicy, data);
113 0 : if (NS_WARN_IF(NS_FAILED(rv))) {
114 0 : aRv.Throw(rv);
115 0 : return;
116 : }
117 :
118 0 : JS::Rooted<JSObject*> buffer(aGlobal.Context(),
119 0 : ArrayBuffer::Create(aGlobal.Context(),
120 0 : data.Length(),
121 0 : data.Elements()));
122 0 : if (NS_WARN_IF(!buffer)) {
123 0 : aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
124 0 : return;
125 : }
126 0 : aRetval.set(buffer);
127 : }
128 :
129 : /* static */ void
130 0 : ChromeUtils::OriginAttributesToSuffix(dom::GlobalObject& aGlobal,
131 : const dom::OriginAttributesDictionary& aAttrs,
132 : nsCString& aSuffix)
133 :
134 : {
135 0 : OriginAttributes attrs(aAttrs);
136 0 : attrs.CreateSuffix(aSuffix);
137 0 : }
138 :
139 : /* static */ bool
140 0 : ChromeUtils::OriginAttributesMatchPattern(dom::GlobalObject& aGlobal,
141 : const dom::OriginAttributesDictionary& aAttrs,
142 : const dom::OriginAttributesPatternDictionary& aPattern)
143 : {
144 0 : OriginAttributes attrs(aAttrs);
145 0 : OriginAttributesPattern pattern(aPattern);
146 0 : return pattern.Matches(attrs);
147 : }
148 :
149 : /* static */ void
150 0 : ChromeUtils::CreateOriginAttributesFromOrigin(dom::GlobalObject& aGlobal,
151 : const nsAString& aOrigin,
152 : dom::OriginAttributesDictionary& aAttrs,
153 : ErrorResult& aRv)
154 : {
155 0 : OriginAttributes attrs;
156 0 : nsAutoCString suffix;
157 0 : if (!attrs.PopulateFromOrigin(NS_ConvertUTF16toUTF8(aOrigin), suffix)) {
158 0 : aRv.Throw(NS_ERROR_FAILURE);
159 0 : return;
160 : }
161 0 : aAttrs = attrs;
162 : }
163 :
164 : /* static */ void
165 0 : ChromeUtils::FillNonDefaultOriginAttributes(dom::GlobalObject& aGlobal,
166 : const dom::OriginAttributesDictionary& aAttrs,
167 : dom::OriginAttributesDictionary& aNewAttrs)
168 : {
169 0 : aNewAttrs = aAttrs;
170 0 : }
171 :
172 :
173 : /* static */ bool
174 0 : ChromeUtils::IsOriginAttributesEqual(dom::GlobalObject& aGlobal,
175 : const dom::OriginAttributesDictionary& aA,
176 : const dom::OriginAttributesDictionary& aB)
177 : {
178 0 : return IsOriginAttributesEqual(aA, aB);
179 : }
180 :
181 : /* static */ bool
182 0 : ChromeUtils::IsOriginAttributesEqual(const dom::OriginAttributesDictionary& aA,
183 : const dom::OriginAttributesDictionary& aB)
184 : {
185 0 : return aA.mAppId == aB.mAppId &&
186 0 : aA.mInIsolatedMozBrowser == aB.mInIsolatedMozBrowser &&
187 0 : aA.mUserContextId == aB.mUserContextId &&
188 0 : aA.mPrivateBrowsingId == aB.mPrivateBrowsingId;
189 : }
190 :
191 : } // namespace dom
192 : } // namespace mozilla
|