Chromium Code Reviews| Index: third_party/WebKit/Source/platform/weborigin/SchemeRegistry.cpp |
| diff --git a/third_party/WebKit/Source/platform/weborigin/SchemeRegistry.cpp b/third_party/WebKit/Source/platform/weborigin/SchemeRegistry.cpp |
| index ab648fe5e365012856642d61abce8350a35eecf8..604a28c36bc31e996221c0e0117ddab57aad0ea5 100644 |
| --- a/third_party/WebKit/Source/platform/weborigin/SchemeRegistry.cpp |
| +++ b/third_party/WebKit/Source/platform/weborigin/SchemeRegistry.cpp |
| @@ -27,27 +27,14 @@ |
| #include "platform/weborigin/SchemeRegistry.h" |
| #include "wtf/ThreadSpecific.h" |
| +#include "wtf/Threading.h" |
| #include "wtf/ThreadingPrimitives.h" |
| #include "wtf/text/StringBuilder.h" |
| namespace blink { |
| -static Mutex& mutex() { |
| - // The first call to this should be made before or during blink |
| - // initialization to avoid racy static local initialization. |
| - DEFINE_STATIC_LOCAL(Mutex, m, ()); |
| - return m; |
| -} |
| - |
| -// Defines static local variable after making sure that a lock is held. |
| -// (We can't use DEFINE_STATIC_LOCAL for this because it asserts thread |
| -// safety, which is externally guaranteed by the local mutex() lock) |
| -#define DEFINE_STATIC_LOCAL_WITH_LOCK(type, name, arguments) \ |
| - ASSERT(mutex().locked()); \ |
| - static type& name = *new type arguments |
| - |
| static URLSchemesSet& localURLSchemes() { |
| - DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, localSchemes, ()); |
| + DEFINE_STATIC_LOCAL(URLSchemesSet, localSchemes, ()); |
| if (localSchemes.isEmpty()) |
| localSchemes.add("file"); |
| @@ -56,58 +43,55 @@ static URLSchemesSet& localURLSchemes() { |
| } |
| static URLSchemesSet& displayIsolatedURLSchemes() { |
| - DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, displayIsolatedSchemes, ()); |
| + DEFINE_STATIC_LOCAL(URLSchemesSet, displayIsolatedSchemes, ()); |
| return displayIsolatedSchemes; |
| } |
| static URLSchemesSet& secureSchemes() { |
| - DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, secureSchemes, |
| - ({ |
| - "https", "about", "data", "wss", |
| - })); |
| + DEFINE_STATIC_LOCAL(URLSchemesSet, secureSchemes, |
| + ({ |
| + "https", "about", "data", "wss", |
| + })); |
| return secureSchemes; |
| } |
| static URLSchemesSet& schemesWithUniqueOrigins() { |
| - DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, schemesWithUniqueOrigins, |
| - ({ |
| - "about", "javascript", "data", |
| - })); |
| + DEFINE_STATIC_LOCAL(URLSchemesSet, schemesWithUniqueOrigins, |
| + ({ |
| + "about", "javascript", "data", |
| + })); |
| return schemesWithUniqueOrigins; |
| } |
| static URLSchemesSet& emptyDocumentSchemes() { |
| - DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, emptyDocumentSchemes, |
| - ({ |
| - "about", |
| - })); |
| + DEFINE_STATIC_LOCAL(URLSchemesSet, emptyDocumentSchemes, ({ |
| + "about", |
| + })); |
| return emptyDocumentSchemes; |
| } |
| static HashSet<String>& schemesForbiddenFromDomainRelaxation() { |
| - DEFINE_STATIC_LOCAL_WITH_LOCK(HashSet<String>, schemes, ()); |
| + DEFINE_STATIC_LOCAL(HashSet<String>, schemes, ()); |
| return schemes; |
| } |
| static URLSchemesSet& notAllowingJavascriptURLsSchemes() { |
| - DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, notAllowingJavascriptURLsSchemes, |
| - ()); |
| + DEFINE_STATIC_LOCAL(URLSchemesSet, notAllowingJavascriptURLsSchemes, ()); |
| return notAllowingJavascriptURLsSchemes; |
| } |
| void SchemeRegistry::registerURLSchemeAsLocal(const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| localURLSchemes().add(scheme); |
| } |
| const URLSchemesSet& SchemeRegistry::localSchemes() { |
| - MutexLocker locker(mutex()); |
| return localURLSchemes(); |
| } |
| static URLSchemesSet& CORSEnabledSchemes() { |
| - DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, CORSEnabledSchemes, ()); |
| + DEFINE_STATIC_LOCAL(URLSchemesSet, CORSEnabledSchemes, ()); |
| if (CORSEnabledSchemes.isEmpty()) { |
| CORSEnabledSchemes.add("http"); |
| @@ -119,7 +103,7 @@ static URLSchemesSet& CORSEnabledSchemes() { |
| } |
| static URLSchemesSet& serviceWorkerSchemes() { |
| - DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, serviceWorkerSchemes, ()); |
| + DEFINE_STATIC_LOCAL(URLSchemesSet, serviceWorkerSchemes, ()); |
| if (serviceWorkerSchemes.isEmpty()) { |
| // HTTP is required because http://localhost is considered secure. |
| @@ -133,7 +117,7 @@ static URLSchemesSet& serviceWorkerSchemes() { |
| } |
| static URLSchemesSet& fetchAPISchemes() { |
| - DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, fetchAPISchemes, ()); |
| + DEFINE_STATIC_LOCAL(URLSchemesSet, fetchAPISchemes, ()); |
| if (fetchAPISchemes.isEmpty()) { |
| fetchAPISchemes.add("http"); |
| @@ -144,26 +128,23 @@ static URLSchemesSet& fetchAPISchemes() { |
| } |
| static URLSchemesSet& firstPartyWhenTopLevelSchemes() { |
| - DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, firstPartyWhenTopLevelSchemes, |
| - ()); |
| + DEFINE_STATIC_LOCAL(URLSchemesSet, firstPartyWhenTopLevelSchemes, ()); |
| return firstPartyWhenTopLevelSchemes; |
| } |
| static URLSchemesMap<SchemeRegistry::PolicyAreas>& |
| ContentSecurityPolicyBypassingSchemes() { |
| - DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesMap<SchemeRegistry::PolicyAreas>, |
| - schemes, ()); |
| + DEFINE_STATIC_LOCAL(URLSchemesMap<SchemeRegistry::PolicyAreas>, schemes, ()); |
| return schemes; |
| } |
| static URLSchemesSet& secureContextBypassingSchemes() { |
| - DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, secureContextBypassingSchemes, |
| - ()); |
| + DEFINE_STATIC_LOCAL(URLSchemesSet, secureContextBypassingSchemes, ()); |
| return secureContextBypassingSchemes; |
| } |
| static URLSchemesSet& allowedInReferrerSchemes() { |
| - DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, allowedInReferrerSchemes, ()); |
| + DEFINE_STATIC_LOCAL(URLSchemesSet, allowedInReferrerSchemes, ()); |
| if (allowedInReferrerSchemes.isEmpty()) { |
| allowedInReferrerSchemes.add("http"); |
| @@ -174,21 +155,32 @@ static URLSchemesSet& allowedInReferrerSchemes() { |
| } |
| 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.
|
| - // Instantiate the mutex object. |
| - mutex(); |
| + localURLSchemes(); |
| + displayIsolatedURLSchemes(); |
| + secureSchemes(); |
| + schemesWithUniqueOrigins(); |
| + emptyDocumentSchemes(); |
| + schemesForbiddenFromDomainRelaxation(); |
| + notAllowingJavascriptURLsSchemes(); |
| + CORSEnabledSchemes(); |
| + serviceWorkerSchemes(); |
| + fetchAPISchemes(); |
| + firstPartyWhenTopLevelSchemes(); |
| + ContentSecurityPolicyBypassingSchemes(); |
| + secureContextBypassingSchemes(); |
| + allowedInReferrerSchemes(); |
| } |
| bool SchemeRegistry::shouldTreatURLSchemeAsLocal(const String& scheme) { |
| DCHECK_EQ(scheme, scheme.lower()); |
| if (scheme.isEmpty()) |
| return false; |
| - MutexLocker locker(mutex()); |
| return localURLSchemes().contains(scheme); |
| } |
| void SchemeRegistry::registerURLSchemeAsNoAccess(const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| schemesWithUniqueOrigins().add(scheme); |
| } |
| @@ -196,13 +188,12 @@ bool SchemeRegistry::shouldTreatURLSchemeAsNoAccess(const String& scheme) { |
| DCHECK_EQ(scheme, scheme.lower()); |
| if (scheme.isEmpty()) |
| return false; |
| - MutexLocker locker(mutex()); |
| return schemesWithUniqueOrigins().contains(scheme); |
| } |
| void SchemeRegistry::registerURLSchemeAsDisplayIsolated(const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| displayIsolatedURLSchemes().add(scheme); |
| } |
| @@ -211,7 +202,6 @@ bool SchemeRegistry::shouldTreatURLSchemeAsDisplayIsolated( |
| DCHECK_EQ(scheme, scheme.lower()); |
| if (scheme.isEmpty()) |
| return false; |
| - MutexLocker locker(mutex()); |
| return displayIsolatedURLSchemes().contains(scheme); |
| } |
| @@ -222,8 +212,8 @@ bool SchemeRegistry::shouldTreatURLSchemeAsRestrictingMixedContent( |
| } |
| void SchemeRegistry::registerURLSchemeAsSecure(const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| secureSchemes().add(scheme); |
| } |
| @@ -231,13 +221,12 @@ bool SchemeRegistry::shouldTreatURLSchemeAsSecure(const String& scheme) { |
| DCHECK_EQ(scheme, scheme.lower()); |
| if (scheme.isEmpty()) |
| return false; |
| - MutexLocker locker(mutex()); |
| return secureSchemes().contains(scheme); |
| } |
| void SchemeRegistry::registerURLSchemeAsEmptyDocument(const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| emptyDocumentSchemes().add(scheme); |
| } |
| @@ -245,18 +234,17 @@ bool SchemeRegistry::shouldLoadURLSchemeAsEmptyDocument(const String& scheme) { |
| DCHECK_EQ(scheme, scheme.lower()); |
| if (scheme.isEmpty()) |
| return false; |
| - MutexLocker locker(mutex()); |
| return emptyDocumentSchemes().contains(scheme); |
| } |
| void SchemeRegistry::setDomainRelaxationForbiddenForURLScheme( |
| bool forbidden, |
| const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| if (scheme.isEmpty()) |
| return; |
| - MutexLocker locker(mutex()); |
| if (forbidden) |
| schemesForbiddenFromDomainRelaxation().add(scheme); |
| else |
| @@ -268,7 +256,6 @@ bool SchemeRegistry::isDomainRelaxationForbiddenForURLScheme( |
| DCHECK_EQ(scheme, scheme.lower()); |
| if (scheme.isEmpty()) |
| return false; |
| - MutexLocker locker(mutex()); |
| return schemesForbiddenFromDomainRelaxation().contains(scheme); |
| } |
| @@ -279,8 +266,8 @@ bool SchemeRegistry::canDisplayOnlyIfCanRequest(const String& scheme) { |
| void SchemeRegistry::registerURLSchemeAsNotAllowingJavascriptURLs( |
| const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| notAllowingJavascriptURLsSchemes().add(scheme); |
| } |
| @@ -289,13 +276,12 @@ bool SchemeRegistry::shouldTreatURLSchemeAsNotAllowingJavascriptURLs( |
| DCHECK_EQ(scheme, scheme.lower()); |
| if (scheme.isEmpty()) |
| return false; |
| - MutexLocker locker(mutex()); |
| return notAllowingJavascriptURLsSchemes().contains(scheme); |
| } |
| void SchemeRegistry::registerURLSchemeAsCORSEnabled(const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| CORSEnabledSchemes().add(scheme); |
| } |
| @@ -303,19 +289,13 @@ bool SchemeRegistry::shouldTreatURLSchemeAsCORSEnabled(const String& scheme) { |
| DCHECK_EQ(scheme, scheme.lower()); |
| if (scheme.isEmpty()) |
| return false; |
| - MutexLocker locker(mutex()); |
| return CORSEnabledSchemes().contains(scheme); |
| } |
| String SchemeRegistry::listOfCORSEnabledURLSchemes() { |
| StringBuilder builder; |
| bool addSeparator = false; |
| - URLSchemesSet schemes; |
| - { |
| - MutexLocker locker(mutex()); |
| - schemes = CORSEnabledSchemes(); |
| - } |
| - for (const auto& scheme : schemes) { |
| + for (const auto& scheme : CORSEnabledSchemes()) { |
| if (addSeparator) |
| builder.append(", "); |
| else |
| @@ -332,8 +312,8 @@ bool SchemeRegistry::shouldTreatURLSchemeAsLegacy(const String& scheme) { |
| void SchemeRegistry::registerURLSchemeAsAllowingServiceWorkers( |
| const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| serviceWorkerSchemes().add(scheme); |
| } |
| @@ -342,14 +322,13 @@ bool SchemeRegistry::shouldTreatURLSchemeAsAllowingServiceWorkers( |
| DCHECK_EQ(scheme, scheme.lower()); |
| if (scheme.isEmpty()) |
| return false; |
| - MutexLocker locker(mutex()); |
| return serviceWorkerSchemes().contains(scheme); |
| } |
| void SchemeRegistry::registerURLSchemeAsSupportingFetchAPI( |
| const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| fetchAPISchemes().add(scheme); |
| } |
| @@ -358,21 +337,20 @@ bool SchemeRegistry::shouldTreatURLSchemeAsSupportingFetchAPI( |
| DCHECK_EQ(scheme, scheme.lower()); |
| if (scheme.isEmpty()) |
| return false; |
| - MutexLocker locker(mutex()); |
| return fetchAPISchemes().contains(scheme); |
| } |
| void SchemeRegistry::registerURLSchemeAsFirstPartyWhenTopLevel( |
| const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| firstPartyWhenTopLevelSchemes().add(scheme); |
| } |
| void SchemeRegistry::removeURLSchemeAsFirstPartyWhenTopLevel( |
| const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| firstPartyWhenTopLevelSchemes().remove(scheme); |
| } |
| @@ -381,19 +359,18 @@ bool SchemeRegistry::shouldTreatURLSchemeAsFirstPartyWhenTopLevel( |
| DCHECK_EQ(scheme, scheme.lower()); |
| if (scheme.isEmpty()) |
| return false; |
| - MutexLocker locker(mutex()); |
| return firstPartyWhenTopLevelSchemes().contains(scheme); |
| } |
| void SchemeRegistry::registerURLSchemeAsAllowedForReferrer( |
| const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| allowedInReferrerSchemes().add(scheme); |
| } |
| void SchemeRegistry::removeURLSchemeAsAllowedForReferrer(const String& scheme) { |
| - MutexLocker locker(mutex()); |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| allowedInReferrerSchemes().remove(scheme); |
| } |
| @@ -402,22 +379,21 @@ bool SchemeRegistry::shouldTreatURLSchemeAsAllowedForReferrer( |
| DCHECK_EQ(scheme, scheme.lower()); |
| if (scheme.isEmpty()) |
| return false; |
| - MutexLocker locker(mutex()); |
| return allowedInReferrerSchemes().contains(scheme); |
| } |
| void SchemeRegistry::registerURLSchemeAsBypassingContentSecurityPolicy( |
| const String& scheme, |
| PolicyAreas policyAreas) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| ContentSecurityPolicyBypassingSchemes().add(scheme, policyAreas); |
| } |
| void SchemeRegistry::removeURLSchemeRegisteredAsBypassingContentSecurityPolicy( |
| const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| ContentSecurityPolicyBypassingSchemes().remove(scheme); |
| } |
| @@ -430,15 +406,14 @@ bool SchemeRegistry::schemeShouldBypassContentSecurityPolicy( |
| // get() returns 0 (PolicyAreaNone) if there is no entry in the map. |
| // Thus by default, schemes do not bypass CSP. |
| - MutexLocker locker(mutex()); |
| return (ContentSecurityPolicyBypassingSchemes().get(scheme) & policyAreas) == |
| policyAreas; |
| } |
| void SchemeRegistry::registerURLSchemeBypassingSecureContextCheck( |
| const String& scheme) { |
| + DCHECK(WTF::isBeforeThreadCreated()); |
| DCHECK_EQ(scheme, scheme.lower()); |
| - MutexLocker locker(mutex()); |
| secureContextBypassingSchemes().add(scheme.lower()); |
| } |
| @@ -446,7 +421,6 @@ bool SchemeRegistry::schemeShouldBypassSecureContextCheck( |
| const String& scheme) { |
| if (scheme.isEmpty()) |
| return false; |
| - MutexLocker locker(mutex()); |
| return secureContextBypassingSchemes().contains(scheme.lower()); |
| } |