Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(146)

Side by Side Diff: third_party/WebKit/Source/platform/weborigin/SchemeRegistry.cpp

Issue 2474303004: Remove mutex locks in SchemeRegistry (Closed)
Patch Set: tkent review Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010 Apple Inc. All Rights Reserved. 2 * Copyright (C) 2010 Apple Inc. All Rights Reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution. 11 * documentation and/or other materials provided with the distribution.
12 * 12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE, INC. ``AS IS'' AND ANY 13 * THIS SOFTWARE IS PROVIDED BY APPLE, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 * 24 *
25 */ 25 */
26 26
27 #include "platform/weborigin/SchemeRegistry.h" 27 #include "platform/weborigin/SchemeRegistry.h"
28 28
29 #include "wtf/ThreadSpecific.h" 29 #include "wtf/ThreadSpecific.h"
30 #include "wtf/Threading.h"
30 #include "wtf/ThreadingPrimitives.h" 31 #include "wtf/ThreadingPrimitives.h"
31 #include "wtf/text/StringBuilder.h" 32 #include "wtf/text/StringBuilder.h"
32 33
33 namespace blink { 34 namespace blink {
34 35
35 static Mutex& mutex() {
36 // The first call to this should be made before or during blink
37 // initialization to avoid racy static local initialization.
38 DEFINE_STATIC_LOCAL(Mutex, m, ());
39 return m;
40 }
41
42 // Defines static local variable after making sure that a lock is held.
43 // (We can't use DEFINE_STATIC_LOCAL for this because it asserts thread
44 // safety, which is externally guaranteed by the local mutex() lock)
45 #define DEFINE_STATIC_LOCAL_WITH_LOCK(type, name, arguments) \
46 ASSERT(mutex().locked()); \
47 static type& name = *new type arguments
48
49 static URLSchemesSet& localURLSchemes() { 36 static URLSchemesSet& localURLSchemes() {
50 DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, localSchemes, ()); 37 DEFINE_STATIC_LOCAL(URLSchemesSet, localSchemes, ());
51 38
52 if (localSchemes.isEmpty()) 39 if (localSchemes.isEmpty())
53 localSchemes.add("file"); 40 localSchemes.add("file");
54 41
55 return localSchemes; 42 return localSchemes;
56 } 43 }
57 44
58 static URLSchemesSet& displayIsolatedURLSchemes() { 45 static URLSchemesSet& displayIsolatedURLSchemes() {
59 DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, displayIsolatedSchemes, ()); 46 DEFINE_STATIC_LOCAL(URLSchemesSet, displayIsolatedSchemes, ());
60 return displayIsolatedSchemes; 47 return displayIsolatedSchemes;
61 } 48 }
62 49
63 static URLSchemesSet& secureSchemes() { 50 static URLSchemesSet& secureSchemes() {
64 DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, secureSchemes, 51 DEFINE_STATIC_LOCAL(URLSchemesSet, secureSchemes,
65 ({ 52 ({
66 "https", "about", "data", "wss", 53 "https", "about", "data", "wss",
67 })); 54 }));
68 return secureSchemes; 55 return secureSchemes;
69 } 56 }
70 57
71 static URLSchemesSet& schemesWithUniqueOrigins() { 58 static URLSchemesSet& schemesWithUniqueOrigins() {
72 DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, schemesWithUniqueOrigins, 59 DEFINE_STATIC_LOCAL(URLSchemesSet, schemesWithUniqueOrigins,
73 ({ 60 ({
74 "about", "javascript", "data", 61 "about", "javascript", "data",
75 })); 62 }));
76 return schemesWithUniqueOrigins; 63 return schemesWithUniqueOrigins;
77 } 64 }
78 65
79 static URLSchemesSet& emptyDocumentSchemes() { 66 static URLSchemesSet& emptyDocumentSchemes() {
80 DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, emptyDocumentSchemes, 67 DEFINE_STATIC_LOCAL(URLSchemesSet, emptyDocumentSchemes, ({
81 ({ 68 "about",
82 "about", 69 }));
83 }));
84 return emptyDocumentSchemes; 70 return emptyDocumentSchemes;
85 } 71 }
86 72
87 static HashSet<String>& schemesForbiddenFromDomainRelaxation() { 73 static HashSet<String>& schemesForbiddenFromDomainRelaxation() {
88 DEFINE_STATIC_LOCAL_WITH_LOCK(HashSet<String>, schemes, ()); 74 DEFINE_STATIC_LOCAL(HashSet<String>, schemes, ());
89 return schemes; 75 return schemes;
90 } 76 }
91 77
92 static URLSchemesSet& notAllowingJavascriptURLsSchemes() { 78 static URLSchemesSet& notAllowingJavascriptURLsSchemes() {
93 DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, notAllowingJavascriptURLsSchemes, 79 DEFINE_STATIC_LOCAL(URLSchemesSet, notAllowingJavascriptURLsSchemes, ());
94 ());
95 return notAllowingJavascriptURLsSchemes; 80 return notAllowingJavascriptURLsSchemes;
96 } 81 }
97 82
98 void SchemeRegistry::registerURLSchemeAsLocal(const String& scheme) { 83 void SchemeRegistry::registerURLSchemeAsLocal(const String& scheme) {
84 DCHECK(WTF::isBeforeThreadCreated());
99 DCHECK_EQ(scheme, scheme.lower()); 85 DCHECK_EQ(scheme, scheme.lower());
100 MutexLocker locker(mutex());
101 localURLSchemes().add(scheme); 86 localURLSchemes().add(scheme);
102 } 87 }
103 88
104 const URLSchemesSet& SchemeRegistry::localSchemes() { 89 const URLSchemesSet& SchemeRegistry::localSchemes() {
105 MutexLocker locker(mutex());
106 return localURLSchemes(); 90 return localURLSchemes();
107 } 91 }
108 92
109 static URLSchemesSet& CORSEnabledSchemes() { 93 static URLSchemesSet& CORSEnabledSchemes() {
110 DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, CORSEnabledSchemes, ()); 94 DEFINE_STATIC_LOCAL(URLSchemesSet, CORSEnabledSchemes, ());
111 95
112 if (CORSEnabledSchemes.isEmpty()) { 96 if (CORSEnabledSchemes.isEmpty()) {
113 CORSEnabledSchemes.add("http"); 97 CORSEnabledSchemes.add("http");
114 CORSEnabledSchemes.add("https"); 98 CORSEnabledSchemes.add("https");
115 CORSEnabledSchemes.add("data"); 99 CORSEnabledSchemes.add("data");
116 } 100 }
117 101
118 return CORSEnabledSchemes; 102 return CORSEnabledSchemes;
119 } 103 }
120 104
121 static URLSchemesSet& serviceWorkerSchemes() { 105 static URLSchemesSet& serviceWorkerSchemes() {
122 DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, serviceWorkerSchemes, ()); 106 DEFINE_STATIC_LOCAL(URLSchemesSet, serviceWorkerSchemes, ());
123 107
124 if (serviceWorkerSchemes.isEmpty()) { 108 if (serviceWorkerSchemes.isEmpty()) {
125 // HTTP is required because http://localhost is considered secure. 109 // HTTP is required because http://localhost is considered secure.
126 // Additional checks are performed to ensure that other http pages 110 // Additional checks are performed to ensure that other http pages
127 // are filtered out. 111 // are filtered out.
128 serviceWorkerSchemes.add("http"); 112 serviceWorkerSchemes.add("http");
129 serviceWorkerSchemes.add("https"); 113 serviceWorkerSchemes.add("https");
130 } 114 }
131 115
132 return serviceWorkerSchemes; 116 return serviceWorkerSchemes;
133 } 117 }
134 118
135 static URLSchemesSet& fetchAPISchemes() { 119 static URLSchemesSet& fetchAPISchemes() {
136 DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, fetchAPISchemes, ()); 120 DEFINE_STATIC_LOCAL(URLSchemesSet, fetchAPISchemes, ());
137 121
138 if (fetchAPISchemes.isEmpty()) { 122 if (fetchAPISchemes.isEmpty()) {
139 fetchAPISchemes.add("http"); 123 fetchAPISchemes.add("http");
140 fetchAPISchemes.add("https"); 124 fetchAPISchemes.add("https");
141 } 125 }
142 126
143 return fetchAPISchemes; 127 return fetchAPISchemes;
144 } 128 }
145 129
146 static URLSchemesSet& firstPartyWhenTopLevelSchemes() { 130 static URLSchemesSet& firstPartyWhenTopLevelSchemes() {
147 DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, firstPartyWhenTopLevelSchemes, 131 DEFINE_STATIC_LOCAL(URLSchemesSet, firstPartyWhenTopLevelSchemes, ());
148 ());
149 return firstPartyWhenTopLevelSchemes; 132 return firstPartyWhenTopLevelSchemes;
150 } 133 }
151 134
152 static URLSchemesMap<SchemeRegistry::PolicyAreas>& 135 static URLSchemesMap<SchemeRegistry::PolicyAreas>&
153 ContentSecurityPolicyBypassingSchemes() { 136 ContentSecurityPolicyBypassingSchemes() {
154 DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesMap<SchemeRegistry::PolicyAreas>, 137 DEFINE_STATIC_LOCAL(URLSchemesMap<SchemeRegistry::PolicyAreas>, schemes, ());
155 schemes, ());
156 return schemes; 138 return schemes;
157 } 139 }
158 140
159 static URLSchemesSet& secureContextBypassingSchemes() { 141 static URLSchemesSet& secureContextBypassingSchemes() {
160 DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, secureContextBypassingSchemes, 142 DEFINE_STATIC_LOCAL(URLSchemesSet, secureContextBypassingSchemes, ());
161 ());
162 return secureContextBypassingSchemes; 143 return secureContextBypassingSchemes;
163 } 144 }
164 145
165 static URLSchemesSet& allowedInReferrerSchemes() { 146 static URLSchemesSet& allowedInReferrerSchemes() {
166 DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, allowedInReferrerSchemes, ()); 147 DEFINE_STATIC_LOCAL(URLSchemesSet, allowedInReferrerSchemes, ());
167 148
168 if (allowedInReferrerSchemes.isEmpty()) { 149 if (allowedInReferrerSchemes.isEmpty()) {
169 allowedInReferrerSchemes.add("http"); 150 allowedInReferrerSchemes.add("http");
170 allowedInReferrerSchemes.add("https"); 151 allowedInReferrerSchemes.add("https");
171 } 152 }
172 153
173 return allowedInReferrerSchemes; 154 return allowedInReferrerSchemes;
174 } 155 }
175 156
176 void SchemeRegistry::initialize() { 157 void SchemeRegistry::initialize() {
kinuko 2016/11/09 03:56:37 Can we add comments about why we need this initial
Charlie Harrison 2016/11/09 15:31:39 Done.
177 // Instantiate the mutex object. 158 localURLSchemes();
178 mutex(); 159 displayIsolatedURLSchemes();
160 secureSchemes();
161 schemesWithUniqueOrigins();
162 emptyDocumentSchemes();
163 schemesForbiddenFromDomainRelaxation();
164 notAllowingJavascriptURLsSchemes();
165 CORSEnabledSchemes();
166 serviceWorkerSchemes();
167 fetchAPISchemes();
168 firstPartyWhenTopLevelSchemes();
169 ContentSecurityPolicyBypassingSchemes();
170 secureContextBypassingSchemes();
171 allowedInReferrerSchemes();
179 } 172 }
180 173
181 bool SchemeRegistry::shouldTreatURLSchemeAsLocal(const String& scheme) { 174 bool SchemeRegistry::shouldTreatURLSchemeAsLocal(const String& scheme) {
182 DCHECK_EQ(scheme, scheme.lower()); 175 DCHECK_EQ(scheme, scheme.lower());
183 if (scheme.isEmpty()) 176 if (scheme.isEmpty())
184 return false; 177 return false;
185 MutexLocker locker(mutex());
186 return localURLSchemes().contains(scheme); 178 return localURLSchemes().contains(scheme);
187 } 179 }
188 180
189 void SchemeRegistry::registerURLSchemeAsNoAccess(const String& scheme) { 181 void SchemeRegistry::registerURLSchemeAsNoAccess(const String& scheme) {
182 DCHECK(WTF::isBeforeThreadCreated());
190 DCHECK_EQ(scheme, scheme.lower()); 183 DCHECK_EQ(scheme, scheme.lower());
191 MutexLocker locker(mutex());
192 schemesWithUniqueOrigins().add(scheme); 184 schemesWithUniqueOrigins().add(scheme);
193 } 185 }
194 186
195 bool SchemeRegistry::shouldTreatURLSchemeAsNoAccess(const String& scheme) { 187 bool SchemeRegistry::shouldTreatURLSchemeAsNoAccess(const String& scheme) {
196 DCHECK_EQ(scheme, scheme.lower()); 188 DCHECK_EQ(scheme, scheme.lower());
197 if (scheme.isEmpty()) 189 if (scheme.isEmpty())
198 return false; 190 return false;
199 MutexLocker locker(mutex());
200 return schemesWithUniqueOrigins().contains(scheme); 191 return schemesWithUniqueOrigins().contains(scheme);
201 } 192 }
202 193
203 void SchemeRegistry::registerURLSchemeAsDisplayIsolated(const String& scheme) { 194 void SchemeRegistry::registerURLSchemeAsDisplayIsolated(const String& scheme) {
195 DCHECK(WTF::isBeforeThreadCreated());
204 DCHECK_EQ(scheme, scheme.lower()); 196 DCHECK_EQ(scheme, scheme.lower());
205 MutexLocker locker(mutex());
206 displayIsolatedURLSchemes().add(scheme); 197 displayIsolatedURLSchemes().add(scheme);
207 } 198 }
208 199
209 bool SchemeRegistry::shouldTreatURLSchemeAsDisplayIsolated( 200 bool SchemeRegistry::shouldTreatURLSchemeAsDisplayIsolated(
210 const String& scheme) { 201 const String& scheme) {
211 DCHECK_EQ(scheme, scheme.lower()); 202 DCHECK_EQ(scheme, scheme.lower());
212 if (scheme.isEmpty()) 203 if (scheme.isEmpty())
213 return false; 204 return false;
214 MutexLocker locker(mutex());
215 return displayIsolatedURLSchemes().contains(scheme); 205 return displayIsolatedURLSchemes().contains(scheme);
216 } 206 }
217 207
218 bool SchemeRegistry::shouldTreatURLSchemeAsRestrictingMixedContent( 208 bool SchemeRegistry::shouldTreatURLSchemeAsRestrictingMixedContent(
219 const String& scheme) { 209 const String& scheme) {
220 DCHECK_EQ(scheme, scheme.lower()); 210 DCHECK_EQ(scheme, scheme.lower());
221 return scheme == "https"; 211 return scheme == "https";
222 } 212 }
223 213
224 void SchemeRegistry::registerURLSchemeAsSecure(const String& scheme) { 214 void SchemeRegistry::registerURLSchemeAsSecure(const String& scheme) {
215 DCHECK(WTF::isBeforeThreadCreated());
225 DCHECK_EQ(scheme, scheme.lower()); 216 DCHECK_EQ(scheme, scheme.lower());
226 MutexLocker locker(mutex());
227 secureSchemes().add(scheme); 217 secureSchemes().add(scheme);
228 } 218 }
229 219
230 bool SchemeRegistry::shouldTreatURLSchemeAsSecure(const String& scheme) { 220 bool SchemeRegistry::shouldTreatURLSchemeAsSecure(const String& scheme) {
231 DCHECK_EQ(scheme, scheme.lower()); 221 DCHECK_EQ(scheme, scheme.lower());
232 if (scheme.isEmpty()) 222 if (scheme.isEmpty())
233 return false; 223 return false;
234 MutexLocker locker(mutex());
235 return secureSchemes().contains(scheme); 224 return secureSchemes().contains(scheme);
236 } 225 }
237 226
238 void SchemeRegistry::registerURLSchemeAsEmptyDocument(const String& scheme) { 227 void SchemeRegistry::registerURLSchemeAsEmptyDocument(const String& scheme) {
228 DCHECK(WTF::isBeforeThreadCreated());
239 DCHECK_EQ(scheme, scheme.lower()); 229 DCHECK_EQ(scheme, scheme.lower());
240 MutexLocker locker(mutex());
241 emptyDocumentSchemes().add(scheme); 230 emptyDocumentSchemes().add(scheme);
242 } 231 }
243 232
244 bool SchemeRegistry::shouldLoadURLSchemeAsEmptyDocument(const String& scheme) { 233 bool SchemeRegistry::shouldLoadURLSchemeAsEmptyDocument(const String& scheme) {
245 DCHECK_EQ(scheme, scheme.lower()); 234 DCHECK_EQ(scheme, scheme.lower());
246 if (scheme.isEmpty()) 235 if (scheme.isEmpty())
247 return false; 236 return false;
248 MutexLocker locker(mutex());
249 return emptyDocumentSchemes().contains(scheme); 237 return emptyDocumentSchemes().contains(scheme);
250 } 238 }
251 239
252 void SchemeRegistry::setDomainRelaxationForbiddenForURLScheme( 240 void SchemeRegistry::setDomainRelaxationForbiddenForURLScheme(
253 bool forbidden, 241 bool forbidden,
254 const String& scheme) { 242 const String& scheme) {
243 DCHECK(WTF::isBeforeThreadCreated());
255 DCHECK_EQ(scheme, scheme.lower()); 244 DCHECK_EQ(scheme, scheme.lower());
256 if (scheme.isEmpty()) 245 if (scheme.isEmpty())
257 return; 246 return;
258 247
259 MutexLocker locker(mutex());
260 if (forbidden) 248 if (forbidden)
261 schemesForbiddenFromDomainRelaxation().add(scheme); 249 schemesForbiddenFromDomainRelaxation().add(scheme);
262 else 250 else
263 schemesForbiddenFromDomainRelaxation().remove(scheme); 251 schemesForbiddenFromDomainRelaxation().remove(scheme);
264 } 252 }
265 253
266 bool SchemeRegistry::isDomainRelaxationForbiddenForURLScheme( 254 bool SchemeRegistry::isDomainRelaxationForbiddenForURLScheme(
267 const String& scheme) { 255 const String& scheme) {
268 DCHECK_EQ(scheme, scheme.lower()); 256 DCHECK_EQ(scheme, scheme.lower());
269 if (scheme.isEmpty()) 257 if (scheme.isEmpty())
270 return false; 258 return false;
271 MutexLocker locker(mutex());
272 return schemesForbiddenFromDomainRelaxation().contains(scheme); 259 return schemesForbiddenFromDomainRelaxation().contains(scheme);
273 } 260 }
274 261
275 bool SchemeRegistry::canDisplayOnlyIfCanRequest(const String& scheme) { 262 bool SchemeRegistry::canDisplayOnlyIfCanRequest(const String& scheme) {
276 DCHECK_EQ(scheme, scheme.lower()); 263 DCHECK_EQ(scheme, scheme.lower());
277 return scheme == "blob" || scheme == "filesystem"; 264 return scheme == "blob" || scheme == "filesystem";
278 } 265 }
279 266
280 void SchemeRegistry::registerURLSchemeAsNotAllowingJavascriptURLs( 267 void SchemeRegistry::registerURLSchemeAsNotAllowingJavascriptURLs(
281 const String& scheme) { 268 const String& scheme) {
269 DCHECK(WTF::isBeforeThreadCreated());
282 DCHECK_EQ(scheme, scheme.lower()); 270 DCHECK_EQ(scheme, scheme.lower());
283 MutexLocker locker(mutex());
284 notAllowingJavascriptURLsSchemes().add(scheme); 271 notAllowingJavascriptURLsSchemes().add(scheme);
285 } 272 }
286 273
287 bool SchemeRegistry::shouldTreatURLSchemeAsNotAllowingJavascriptURLs( 274 bool SchemeRegistry::shouldTreatURLSchemeAsNotAllowingJavascriptURLs(
288 const String& scheme) { 275 const String& scheme) {
289 DCHECK_EQ(scheme, scheme.lower()); 276 DCHECK_EQ(scheme, scheme.lower());
290 if (scheme.isEmpty()) 277 if (scheme.isEmpty())
291 return false; 278 return false;
292 MutexLocker locker(mutex());
293 return notAllowingJavascriptURLsSchemes().contains(scheme); 279 return notAllowingJavascriptURLsSchemes().contains(scheme);
294 } 280 }
295 281
296 void SchemeRegistry::registerURLSchemeAsCORSEnabled(const String& scheme) { 282 void SchemeRegistry::registerURLSchemeAsCORSEnabled(const String& scheme) {
283 DCHECK(WTF::isBeforeThreadCreated());
297 DCHECK_EQ(scheme, scheme.lower()); 284 DCHECK_EQ(scheme, scheme.lower());
298 MutexLocker locker(mutex());
299 CORSEnabledSchemes().add(scheme); 285 CORSEnabledSchemes().add(scheme);
300 } 286 }
301 287
302 bool SchemeRegistry::shouldTreatURLSchemeAsCORSEnabled(const String& scheme) { 288 bool SchemeRegistry::shouldTreatURLSchemeAsCORSEnabled(const String& scheme) {
303 DCHECK_EQ(scheme, scheme.lower()); 289 DCHECK_EQ(scheme, scheme.lower());
304 if (scheme.isEmpty()) 290 if (scheme.isEmpty())
305 return false; 291 return false;
306 MutexLocker locker(mutex());
307 return CORSEnabledSchemes().contains(scheme); 292 return CORSEnabledSchemes().contains(scheme);
308 } 293 }
309 294
310 String SchemeRegistry::listOfCORSEnabledURLSchemes() { 295 String SchemeRegistry::listOfCORSEnabledURLSchemes() {
311 StringBuilder builder; 296 StringBuilder builder;
312 bool addSeparator = false; 297 bool addSeparator = false;
313 URLSchemesSet schemes; 298 for (const auto& scheme : CORSEnabledSchemes()) {
314 {
315 MutexLocker locker(mutex());
316 schemes = CORSEnabledSchemes();
317 }
318 for (const auto& scheme : schemes) {
319 if (addSeparator) 299 if (addSeparator)
320 builder.append(", "); 300 builder.append(", ");
321 else 301 else
322 addSeparator = true; 302 addSeparator = true;
323 303
324 builder.append(scheme); 304 builder.append(scheme);
325 } 305 }
326 return builder.toString(); 306 return builder.toString();
327 } 307 }
328 308
329 bool SchemeRegistry::shouldTreatURLSchemeAsLegacy(const String& scheme) { 309 bool SchemeRegistry::shouldTreatURLSchemeAsLegacy(const String& scheme) {
330 return scheme == "ftp" || scheme == "gopher"; 310 return scheme == "ftp" || scheme == "gopher";
331 } 311 }
332 312
333 void SchemeRegistry::registerURLSchemeAsAllowingServiceWorkers( 313 void SchemeRegistry::registerURLSchemeAsAllowingServiceWorkers(
334 const String& scheme) { 314 const String& scheme) {
315 DCHECK(WTF::isBeforeThreadCreated());
335 DCHECK_EQ(scheme, scheme.lower()); 316 DCHECK_EQ(scheme, scheme.lower());
336 MutexLocker locker(mutex());
337 serviceWorkerSchemes().add(scheme); 317 serviceWorkerSchemes().add(scheme);
338 } 318 }
339 319
340 bool SchemeRegistry::shouldTreatURLSchemeAsAllowingServiceWorkers( 320 bool SchemeRegistry::shouldTreatURLSchemeAsAllowingServiceWorkers(
341 const String& scheme) { 321 const String& scheme) {
342 DCHECK_EQ(scheme, scheme.lower()); 322 DCHECK_EQ(scheme, scheme.lower());
343 if (scheme.isEmpty()) 323 if (scheme.isEmpty())
344 return false; 324 return false;
345 MutexLocker locker(mutex());
346 return serviceWorkerSchemes().contains(scheme); 325 return serviceWorkerSchemes().contains(scheme);
347 } 326 }
348 327
349 void SchemeRegistry::registerURLSchemeAsSupportingFetchAPI( 328 void SchemeRegistry::registerURLSchemeAsSupportingFetchAPI(
350 const String& scheme) { 329 const String& scheme) {
330 DCHECK(WTF::isBeforeThreadCreated());
351 DCHECK_EQ(scheme, scheme.lower()); 331 DCHECK_EQ(scheme, scheme.lower());
352 MutexLocker locker(mutex());
353 fetchAPISchemes().add(scheme); 332 fetchAPISchemes().add(scheme);
354 } 333 }
355 334
356 bool SchemeRegistry::shouldTreatURLSchemeAsSupportingFetchAPI( 335 bool SchemeRegistry::shouldTreatURLSchemeAsSupportingFetchAPI(
357 const String& scheme) { 336 const String& scheme) {
358 DCHECK_EQ(scheme, scheme.lower()); 337 DCHECK_EQ(scheme, scheme.lower());
359 if (scheme.isEmpty()) 338 if (scheme.isEmpty())
360 return false; 339 return false;
361 MutexLocker locker(mutex());
362 return fetchAPISchemes().contains(scheme); 340 return fetchAPISchemes().contains(scheme);
363 } 341 }
364 342
365 void SchemeRegistry::registerURLSchemeAsFirstPartyWhenTopLevel( 343 void SchemeRegistry::registerURLSchemeAsFirstPartyWhenTopLevel(
366 const String& scheme) { 344 const String& scheme) {
345 DCHECK(WTF::isBeforeThreadCreated());
367 DCHECK_EQ(scheme, scheme.lower()); 346 DCHECK_EQ(scheme, scheme.lower());
368 MutexLocker locker(mutex());
369 firstPartyWhenTopLevelSchemes().add(scheme); 347 firstPartyWhenTopLevelSchemes().add(scheme);
370 } 348 }
371 349
372 void SchemeRegistry::removeURLSchemeAsFirstPartyWhenTopLevel( 350 void SchemeRegistry::removeURLSchemeAsFirstPartyWhenTopLevel(
373 const String& scheme) { 351 const String& scheme) {
352 DCHECK(WTF::isBeforeThreadCreated());
374 DCHECK_EQ(scheme, scheme.lower()); 353 DCHECK_EQ(scheme, scheme.lower());
375 MutexLocker locker(mutex());
376 firstPartyWhenTopLevelSchemes().remove(scheme); 354 firstPartyWhenTopLevelSchemes().remove(scheme);
377 } 355 }
378 356
379 bool SchemeRegistry::shouldTreatURLSchemeAsFirstPartyWhenTopLevel( 357 bool SchemeRegistry::shouldTreatURLSchemeAsFirstPartyWhenTopLevel(
380 const String& scheme) { 358 const String& scheme) {
381 DCHECK_EQ(scheme, scheme.lower()); 359 DCHECK_EQ(scheme, scheme.lower());
382 if (scheme.isEmpty()) 360 if (scheme.isEmpty())
383 return false; 361 return false;
384 MutexLocker locker(mutex());
385 return firstPartyWhenTopLevelSchemes().contains(scheme); 362 return firstPartyWhenTopLevelSchemes().contains(scheme);
386 } 363 }
387 364
388 void SchemeRegistry::registerURLSchemeAsAllowedForReferrer( 365 void SchemeRegistry::registerURLSchemeAsAllowedForReferrer(
389 const String& scheme) { 366 const String& scheme) {
367 DCHECK(WTF::isBeforeThreadCreated());
390 DCHECK_EQ(scheme, scheme.lower()); 368 DCHECK_EQ(scheme, scheme.lower());
391 MutexLocker locker(mutex());
392 allowedInReferrerSchemes().add(scheme); 369 allowedInReferrerSchemes().add(scheme);
393 } 370 }
394 371
395 void SchemeRegistry::removeURLSchemeAsAllowedForReferrer(const String& scheme) { 372 void SchemeRegistry::removeURLSchemeAsAllowedForReferrer(const String& scheme) {
396 MutexLocker locker(mutex()); 373 DCHECK(WTF::isBeforeThreadCreated());
397 allowedInReferrerSchemes().remove(scheme); 374 allowedInReferrerSchemes().remove(scheme);
398 } 375 }
399 376
400 bool SchemeRegistry::shouldTreatURLSchemeAsAllowedForReferrer( 377 bool SchemeRegistry::shouldTreatURLSchemeAsAllowedForReferrer(
401 const String& scheme) { 378 const String& scheme) {
402 DCHECK_EQ(scheme, scheme.lower()); 379 DCHECK_EQ(scheme, scheme.lower());
403 if (scheme.isEmpty()) 380 if (scheme.isEmpty())
404 return false; 381 return false;
405 MutexLocker locker(mutex());
406 return allowedInReferrerSchemes().contains(scheme); 382 return allowedInReferrerSchemes().contains(scheme);
407 } 383 }
408 384
409 void SchemeRegistry::registerURLSchemeAsBypassingContentSecurityPolicy( 385 void SchemeRegistry::registerURLSchemeAsBypassingContentSecurityPolicy(
410 const String& scheme, 386 const String& scheme,
411 PolicyAreas policyAreas) { 387 PolicyAreas policyAreas) {
388 DCHECK(WTF::isBeforeThreadCreated());
412 DCHECK_EQ(scheme, scheme.lower()); 389 DCHECK_EQ(scheme, scheme.lower());
413 MutexLocker locker(mutex());
414 ContentSecurityPolicyBypassingSchemes().add(scheme, policyAreas); 390 ContentSecurityPolicyBypassingSchemes().add(scheme, policyAreas);
415 } 391 }
416 392
417 void SchemeRegistry::removeURLSchemeRegisteredAsBypassingContentSecurityPolicy( 393 void SchemeRegistry::removeURLSchemeRegisteredAsBypassingContentSecurityPolicy(
418 const String& scheme) { 394 const String& scheme) {
395 DCHECK(WTF::isBeforeThreadCreated());
419 DCHECK_EQ(scheme, scheme.lower()); 396 DCHECK_EQ(scheme, scheme.lower());
420 MutexLocker locker(mutex());
421 ContentSecurityPolicyBypassingSchemes().remove(scheme); 397 ContentSecurityPolicyBypassingSchemes().remove(scheme);
422 } 398 }
423 399
424 bool SchemeRegistry::schemeShouldBypassContentSecurityPolicy( 400 bool SchemeRegistry::schemeShouldBypassContentSecurityPolicy(
425 const String& scheme, 401 const String& scheme,
426 PolicyAreas policyAreas) { 402 PolicyAreas policyAreas) {
427 ASSERT(policyAreas != PolicyAreaNone); 403 ASSERT(policyAreas != PolicyAreaNone);
428 if (scheme.isEmpty() || policyAreas == PolicyAreaNone) 404 if (scheme.isEmpty() || policyAreas == PolicyAreaNone)
429 return false; 405 return false;
430 406
431 // get() returns 0 (PolicyAreaNone) if there is no entry in the map. 407 // get() returns 0 (PolicyAreaNone) if there is no entry in the map.
432 // Thus by default, schemes do not bypass CSP. 408 // Thus by default, schemes do not bypass CSP.
433 MutexLocker locker(mutex());
434 return (ContentSecurityPolicyBypassingSchemes().get(scheme) & policyAreas) == 409 return (ContentSecurityPolicyBypassingSchemes().get(scheme) & policyAreas) ==
435 policyAreas; 410 policyAreas;
436 } 411 }
437 412
438 void SchemeRegistry::registerURLSchemeBypassingSecureContextCheck( 413 void SchemeRegistry::registerURLSchemeBypassingSecureContextCheck(
439 const String& scheme) { 414 const String& scheme) {
415 DCHECK(WTF::isBeforeThreadCreated());
440 DCHECK_EQ(scheme, scheme.lower()); 416 DCHECK_EQ(scheme, scheme.lower());
441 MutexLocker locker(mutex());
442 secureContextBypassingSchemes().add(scheme.lower()); 417 secureContextBypassingSchemes().add(scheme.lower());
443 } 418 }
444 419
445 bool SchemeRegistry::schemeShouldBypassSecureContextCheck( 420 bool SchemeRegistry::schemeShouldBypassSecureContextCheck(
446 const String& scheme) { 421 const String& scheme) {
447 if (scheme.isEmpty()) 422 if (scheme.isEmpty())
448 return false; 423 return false;
449 MutexLocker locker(mutex());
450 return secureContextBypassingSchemes().contains(scheme.lower()); 424 return secureContextBypassingSchemes().contains(scheme.lower());
451 } 425 }
452 426
453 } // namespace blink 427 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/wtf/Threading.h » ('j') | third_party/WebKit/Source/wtf/Threading.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698