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

Unified Diff: third_party/WebKit/Source/platform/weborigin/SchemeRegistry.cpp

Issue 2474303004: Remove mutex locks in SchemeRegistry (Closed)
Patch Set: #include 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 202b35019696c530528b1f38f515eedaac1fb819..b3c6d8699266caa8053745301ed35306360a1f02 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,66 +43,63 @@ static URLSchemesSet& localURLSchemes() {
}
static URLSchemesSet& displayIsolatedURLSchemes() {
- DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, displayIsolatedSchemes, ());
+ DEFINE_STATIC_LOCAL(URLSchemesSet, displayIsolatedSchemes, ());
return displayIsolatedSchemes;
}
static URLSchemesSet& mixedContentRestrictingSchemes() {
- DEFINE_STATIC_LOCAL_WITH_LOCK(URLSchemesSet, mixedContentRestrictingSchemes,
- ({
- "https",
- }));
+ DEFINE_STATIC_LOCAL(URLSchemesSet, mixedContentRestrictingSchemes,
+ ({
+ "https",
+ }));
return mixedContentRestrictingSchemes;
}
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());
kinuko 2016/11/06 11:14:25 Given that we're deprecating ASSERT could we chang
Charlie Harrison 2016/11/07 17:57:48 Unfortunately, it seems like DCHECK requires its a
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");
@@ -127,7 +111,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.
@@ -141,7 +125,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");
@@ -152,26 +136,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");
@@ -182,21 +163,33 @@ static URLSchemesSet& allowedInReferrerSchemes() {
}
void SchemeRegistry::initialize() {
kinuko 2016/11/06 11:14:25 There're a lot :( Should we quickly check if it d
Charlie Harrison 2016/11/07 17:30:31 I locally added a SCOPED_BLINK_UMA_HISTOGRAM_TIMER
- // Instantiate the mutex object.
- mutex();
+ localURLSchemes();
+ displayIsolatedURLSchemes();
+ mixedContentRestrictingSchemes();
+ 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);
}
@@ -204,13 +197,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);
}
@@ -219,14 +211,13 @@ bool SchemeRegistry::shouldTreatURLSchemeAsDisplayIsolated(
DCHECK_EQ(scheme, scheme.lower());
if (scheme.isEmpty())
return false;
- MutexLocker locker(mutex());
return displayIsolatedURLSchemes().contains(scheme);
}
void SchemeRegistry::registerURLSchemeAsRestrictingMixedContent(
const String& scheme) {
+ DCHECK(WTF::isBeforeThreadCreated());
DCHECK_EQ(scheme, scheme.lower());
- MutexLocker locker(mutex());
mixedContentRestrictingSchemes().add(scheme);
}
@@ -235,13 +226,12 @@ bool SchemeRegistry::shouldTreatURLSchemeAsRestrictingMixedContent(
DCHECK_EQ(scheme, scheme.lower());
if (scheme.isEmpty())
return false;
- MutexLocker locker(mutex());
return mixedContentRestrictingSchemes().contains(scheme);
}
void SchemeRegistry::registerURLSchemeAsSecure(const String& scheme) {
+ DCHECK(WTF::isBeforeThreadCreated());
DCHECK_EQ(scheme, scheme.lower());
- MutexLocker locker(mutex());
secureSchemes().add(scheme);
}
@@ -249,13 +239,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);
}
@@ -263,18 +252,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
@@ -286,7 +274,6 @@ bool SchemeRegistry::isDomainRelaxationForbiddenForURLScheme(
DCHECK_EQ(scheme, scheme.lower());
if (scheme.isEmpty())
return false;
- MutexLocker locker(mutex());
return schemesForbiddenFromDomainRelaxation().contains(scheme);
}
@@ -297,8 +284,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);
}
@@ -307,13 +294,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);
}
@@ -321,19 +307,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
@@ -350,8 +330,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);
}
@@ -360,14 +340,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);
}
@@ -376,21 +355,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);
}
@@ -399,19 +377,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);
}
@@ -420,22 +397,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);
}
@@ -448,15 +424,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());
}
@@ -464,7 +439,6 @@ bool SchemeRegistry::schemeShouldBypassSecureContextCheck(
const String& scheme) {
if (scheme.isEmpty())
return false;
- MutexLocker locker(mutex());
return secureContextBypassingSchemes().contains(scheme.lower());
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698