Title: [237379] trunk/Source/WebCore
Revision
237379
Author
[email protected]
Date
2018-10-24 03:20:34 -0700 (Wed, 24 Oct 2018)

Log Message

topPrivatelyControlledDomain is slow
https://bugs.webkit.org/show_bug.cgi?id=190792

Reviewed by Alex Christensen and Chris Dumez.

It calls into some slowish CFNetwork code and ends up showing up in profiles.

* platform/mac/PublicSuffixMac.mm:
(WebCore::topPrivatelyControlledDomain):

Add a cache that avoids calls into frameworks.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (237378 => 237379)


--- trunk/Source/WebCore/ChangeLog	2018-10-24 10:03:31 UTC (rev 237378)
+++ trunk/Source/WebCore/ChangeLog	2018-10-24 10:20:34 UTC (rev 237379)
@@ -1,3 +1,17 @@
+2018-10-22  Antti Koivisto  <[email protected]>
+
+        topPrivatelyControlledDomain is slow
+        https://bugs.webkit.org/show_bug.cgi?id=190792
+
+        Reviewed by Alex Christensen and Chris Dumez.
+
+        It calls into some slowish CFNetwork code and ends up showing up in profiles.
+
+        * platform/mac/PublicSuffixMac.mm:
+        (WebCore::topPrivatelyControlledDomain):
+
+        Add a cache that avoids calls into frameworks.
+
 2018-10-22  Jer Noble  <[email protected]>
 
         Use WeakPtr and GenericTaskQueue within ObjC classes used by MediaPlayerPrivateAVFoundationObjC

Modified: trunk/Source/WebCore/platform/mac/PublicSuffixMac.mm (237378 => 237379)


--- trunk/Source/WebCore/platform/mac/PublicSuffixMac.mm	2018-10-24 10:03:31 UTC (rev 237378)
+++ trunk/Source/WebCore/platform/mac/PublicSuffixMac.mm	2018-10-24 10:20:34 UTC (rev 237379)
@@ -31,6 +31,8 @@
 #import "URL.h"
 #import "WebCoreNSURLExtras.h"
 #import <pal/spi/cf/CFNetworkSPI.h>
+#import <wtf/HashMap.h>
+#import <wtf/text/StringHash.h>
 
 namespace WebCore {
 
@@ -43,22 +45,37 @@
 
 String topPrivatelyControlledDomain(const String& domain)
 {
-    if (URL::hostIsIPAddress(domain))
-        return domain;
-
+    if (domain.isEmpty())
+        return { };
     if (!domain.isAllASCII())
         return domain;
-    
-    const auto& lowercaseDomain = domain.convertToASCIILowercase();
-    if (lowercaseDomain == "localhost")
-        return lowercaseDomain;
 
-    size_t separatorPosition;
-    for (unsigned labelStart = 0; (separatorPosition = lowercaseDomain.find('.', labelStart)) != notFound; labelStart = separatorPosition + 1) {
-        if (isPublicSuffix(lowercaseDomain.substring(separatorPosition + 1)))
-            return lowercaseDomain.substring(labelStart);
-    }
-    return String();
+    static NeverDestroyed<HashMap<String, String, ASCIICaseInsensitiveHash>> cache;
+    static Lock cacheLock;
+
+    auto isolatedDomain = domain.isolatedCopy();
+
+    auto locker = holdLock(cacheLock);
+
+    constexpr auto maximumSizeToPreventUnlimitedGrowth = 128;
+    if (cache.get().size() == maximumSizeToPreventUnlimitedGrowth)
+        cache.get().clear();
+
+    return cache.get().ensure(isolatedDomain, [&isolatedDomain] {
+        const auto lowercaseDomain = isolatedDomain.convertToASCIILowercase();
+        if (lowercaseDomain == "localhost")
+            return lowercaseDomain;
+
+        if (URL::hostIsIPAddress(lowercaseDomain))
+            return lowercaseDomain;
+
+        size_t separatorPosition;
+        for (unsigned labelStart = 0; (separatorPosition = lowercaseDomain.find('.', labelStart)) != notFound; labelStart = separatorPosition + 1) {
+            if (isPublicSuffix(lowercaseDomain.substring(separatorPosition + 1)))
+                return lowercaseDomain.substring(labelStart);
+        }
+        return String();
+    }).iterator->value.isolatedCopy();
 }
 
 String decodeHostName(const String& domain)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to