Title: [278837] trunk/Source/WebCore
Revision
278837
Author
cdu...@apple.com
Date
2021-06-14 10:47:46 -0700 (Mon, 14 Jun 2021)

Log Message

Avoid converting SecurityOrigins to Strings in SecurityPolicy
https://bugs.webkit.org/show_bug.cgi?id=226976

Reviewed by Geoffrey Garen.

Avoid converting SecurityOrigins to Strings in SecurityPolicy, by using a SecurityOriginData
as key in the originAccessMap instead of a String. Getting a SecurityOriginData from a
SecurityOrigin is very cheap.

* page/SecurityPolicy.cpp:
(WebCore::SecurityPolicy::isAccessAllowed):
(WebCore::SecurityPolicy::addOriginAccessAllowlistEntry):
(WebCore::SecurityPolicy::removeOriginAccessAllowlistEntry):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (278836 => 278837)


--- trunk/Source/WebCore/ChangeLog	2021-06-14 17:41:05 UTC (rev 278836)
+++ trunk/Source/WebCore/ChangeLog	2021-06-14 17:47:46 UTC (rev 278837)
@@ -1,3 +1,19 @@
+2021-06-14  Chris Dumez  <cdu...@apple.com>
+
+        Avoid converting SecurityOrigins to Strings in SecurityPolicy
+        https://bugs.webkit.org/show_bug.cgi?id=226976
+
+        Reviewed by Geoffrey Garen.
+
+        Avoid converting SecurityOrigins to Strings in SecurityPolicy, by using a SecurityOriginData
+        as key in the originAccessMap instead of a String. Getting a SecurityOriginData from a
+        SecurityOrigin is very cheap.
+
+        * page/SecurityPolicy.cpp:
+        (WebCore::SecurityPolicy::isAccessAllowed):
+        (WebCore::SecurityPolicy::addOriginAccessAllowlistEntry):
+        (WebCore::SecurityPolicy::removeOriginAccessAllowlistEntry):
+
 2021-06-14  Jonathan Bedard  <jbed...@apple.com>
 
         [Monterey] Support building WebKit (Part 2)

Modified: trunk/Source/WebCore/page/SecurityPolicy.cpp (278836 => 278837)


--- trunk/Source/WebCore/page/SecurityPolicy.cpp	2021-06-14 17:41:05 UTC (rev 278836)
+++ trunk/Source/WebCore/page/SecurityPolicy.cpp	2021-06-14 17:47:46 UTC (rev 278837)
@@ -44,8 +44,8 @@
 
 static SecurityPolicy::LocalLoadPolicy localLoadPolicy = SecurityPolicy::AllowLocalLoadsForLocalOnly;
 
-typedef Vector<OriginAccessEntry> OriginAccessAllowlist;
-typedef HashMap<String, std::unique_ptr<OriginAccessAllowlist>> OriginAccessMap;
+using OriginAccessAllowlist = Vector<OriginAccessEntry>;
+using OriginAccessMap = HashMap<SecurityOriginData, std::unique_ptr<OriginAccessAllowlist>>;
 
 static Lock originAccessMapLock;
 static OriginAccessMap& originAccessMap() WTF_REQUIRES_LOCK(originAccessMapLock)
@@ -207,7 +207,7 @@
     ASSERT(targetOrigin.equal(SecurityOrigin::create(targetURL).ptr()));
     {
         Locker locker { originAccessMapLock };
-        if (OriginAccessAllowlist* list = originAccessMap().get(activeOrigin.toString())) {
+        if (auto* list = originAccessMap().get(activeOrigin.data())) {
             for (auto& entry : *list) {
                 if (entry.matchesOrigin(targetOrigin))
                     return true;
@@ -233,15 +233,9 @@
     if (sourceOrigin.isUnique())
         return;
 
-    String sourceString = sourceOrigin.toString();
-
     Locker locker { originAccessMapLock };
-    OriginAccessMap::AddResult result = originAccessMap().add(sourceString, nullptr);
-    if (result.isNewEntry)
-        result.iterator->value = makeUnique<OriginAccessAllowlist>();
-
-    OriginAccessAllowlist* list = result.iterator->value.get();
-    list->append(OriginAccessEntry(destinationProtocol, destinationDomain, allowDestinationSubdomains ? OriginAccessEntry::AllowSubdomains : OriginAccessEntry::DisallowSubdomains, OriginAccessEntry::TreatIPAddressAsIPAddress));
+    auto* allowList = originAccessMap().ensure(sourceOrigin.data(), [] { return makeUnique<OriginAccessAllowlist>(); }).iterator->value.get();
+    allowList->append(OriginAccessEntry(destinationProtocol, destinationDomain, allowDestinationSubdomains ? OriginAccessEntry::AllowSubdomains : OriginAccessEntry::DisallowSubdomains, OriginAccessEntry::TreatIPAddressAsIPAddress));
 }
 
 void SecurityPolicy::removeOriginAccessAllowlistEntry(const SecurityOrigin& sourceOrigin, const String& destinationProtocol, const String& destinationDomain, bool allowDestinationSubdomains)
@@ -250,15 +244,13 @@
     if (sourceOrigin.isUnique())
         return;
 
-    String sourceString = sourceOrigin.toString();
-
     Locker locker { originAccessMapLock };
-    OriginAccessMap& map = originAccessMap();
-    OriginAccessMap::iterator it = map.find(sourceString);
+    auto& map = originAccessMap();
+    auto it = map.find(sourceOrigin.data());
     if (it == map.end())
         return;
 
-    OriginAccessAllowlist& list = *it->value;
+    auto& list = *it->value;
     OriginAccessEntry originAccessEntry(destinationProtocol, destinationDomain, allowDestinationSubdomains ? OriginAccessEntry::AllowSubdomains : OriginAccessEntry::DisallowSubdomains, OriginAccessEntry::TreatIPAddressAsIPAddress);
     if (!list.removeFirst(originAccessEntry))
         return;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to