Move headers to keep from a HTTPHeaderNameSet to an OptionSet
https://bugs.webkit.org/show_bug.cgi?id=202977

Reviewed by Anders Carlsson.

Source/WebCore:

Covered by existing tests.
New representation is smaller and more efficient to process.

* loader/CrossOriginAccessControl.cpp:
(WebCore::httpHeadersToKeepFromCleaning):
(WebCore::cleanHTTPRequestHeadersForAccessControl):
* loader/CrossOriginAccessControl.h:
(WebCore::cleanHTTPRequestHeadersForAccessControl): Deleted.
* loader/ResourceLoaderOptions.h:

Source/WebKit:

* NetworkProcess/NetworkResourceLoadParameters.cpp:
(WebKit::NetworkResourceLoadParameters::decode):
* NetworkProcess/NetworkResourceLoadParameters.h:


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@251155 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index d20b82c..09b7d80 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,20 @@
+2019-10-15  youenn fablet  <youenn@apple.com>
+
+        Move headers to keep from a HTTPHeaderNameSet to an OptionSet
+        https://bugs.webkit.org/show_bug.cgi?id=202977
+
+        Reviewed by Anders Carlsson.
+
+        Covered by existing tests.
+        New representation is smaller and more efficient to process.
+
+        * loader/CrossOriginAccessControl.cpp:
+        (WebCore::httpHeadersToKeepFromCleaning):
+        (WebCore::cleanHTTPRequestHeadersForAccessControl):
+        * loader/CrossOriginAccessControl.h:
+        (WebCore::cleanHTTPRequestHeadersForAccessControl): Deleted.
+        * loader/ResourceLoaderOptions.h:
+
 2019-10-15  Zalan Bujtas  <zalan@apple.com>
 
         [LFC][TFC] Use <col> to adjust the preferred column width.
diff --git a/Source/WebCore/loader/CrossOriginAccessControl.cpp b/Source/WebCore/loader/CrossOriginAccessControl.cpp
index 224b1b5..936c0b8 100644
--- a/Source/WebCore/loader/CrossOriginAccessControl.cpp
+++ b/Source/WebCore/loader/CrossOriginAccessControl.cpp
@@ -134,34 +134,34 @@
         && redirectURL.pass().isEmpty();
 }
 
-HTTPHeaderNameSet httpHeadersToKeepFromCleaning(const HTTPHeaderMap& headers)
+OptionSet<HTTPHeadersToKeepFromCleaning> httpHeadersToKeepFromCleaning(const HTTPHeaderMap& headers)
 {
-    HTTPHeaderNameSet headersToKeep;
+    OptionSet<HTTPHeadersToKeepFromCleaning> headersToKeep;
     if (headers.contains(HTTPHeaderName::ContentType))
-        headersToKeep.add(HTTPHeaderName::ContentType);
+        headersToKeep.add(HTTPHeadersToKeepFromCleaning::ContentType);
     if (headers.contains(HTTPHeaderName::Referer))
-        headersToKeep.add(HTTPHeaderName::Referer);
+        headersToKeep.add(HTTPHeadersToKeepFromCleaning::Referer);
     if (headers.contains(HTTPHeaderName::Origin))
-        headersToKeep.add(HTTPHeaderName::Origin);
+        headersToKeep.add(HTTPHeadersToKeepFromCleaning::Origin);
     if (headers.contains(HTTPHeaderName::UserAgent))
-        headersToKeep.add(HTTPHeaderName::UserAgent);
+        headersToKeep.add(HTTPHeadersToKeepFromCleaning::UserAgent);
     if (headers.contains(HTTPHeaderName::AcceptEncoding))
-        headersToKeep.add(HTTPHeaderName::AcceptEncoding);
+        headersToKeep.add(HTTPHeadersToKeepFromCleaning::AcceptEncoding);
     return headersToKeep;
 }
 
-void cleanHTTPRequestHeadersForAccessControl(ResourceRequest& request, const HashSet<HTTPHeaderName, WTF::IntHash<HTTPHeaderName>, WTF::StrongEnumHashTraits<HTTPHeaderName>>& headersToKeep)
+void cleanHTTPRequestHeadersForAccessControl(ResourceRequest& request, OptionSet<HTTPHeadersToKeepFromCleaning> headersToKeep)
 {
     // Remove headers that may have been added by the network layer that cause access control to fail.
-    if (!headersToKeep.contains(HTTPHeaderName::ContentType) && !isCrossOriginSafeRequestHeader(HTTPHeaderName::ContentType, request.httpContentType()))
+    if (!headersToKeep.contains(HTTPHeadersToKeepFromCleaning::ContentType) && !isCrossOriginSafeRequestHeader(HTTPHeaderName::ContentType, request.httpContentType()))
         request.clearHTTPContentType();
-    if (!headersToKeep.contains(HTTPHeaderName::Referer))
+    if (!headersToKeep.contains(HTTPHeadersToKeepFromCleaning::Referer))
         request.clearHTTPReferrer();
-    if (!headersToKeep.contains(HTTPHeaderName::Origin))
+    if (!headersToKeep.contains(HTTPHeadersToKeepFromCleaning::Origin))
         request.clearHTTPOrigin();
-    if (!headersToKeep.contains(HTTPHeaderName::UserAgent))
+    if (!headersToKeep.contains(HTTPHeadersToKeepFromCleaning::UserAgent))
         request.clearHTTPUserAgent();
-    if (!headersToKeep.contains(HTTPHeaderName::AcceptEncoding))
+    if (!headersToKeep.contains(HTTPHeadersToKeepFromCleaning::AcceptEncoding))
         request.clearHTTPAcceptEncoding();
 }
 
diff --git a/Source/WebCore/loader/CrossOriginAccessControl.h b/Source/WebCore/loader/CrossOriginAccessControl.h
index 0e0f746..1932467 100644
--- a/Source/WebCore/loader/CrossOriginAccessControl.h
+++ b/Source/WebCore/loader/CrossOriginAccessControl.h
@@ -30,7 +30,7 @@
 #include "ReferrerPolicy.h"
 #include "StoredCredentialsPolicy.h"
 #include <wtf/Forward.h>
-#include <wtf/HashSet.h>
+#include <wtf/OptionSet.h>
 
 namespace WebCore {
 
@@ -56,9 +56,16 @@
 
 bool isValidCrossOriginRedirectionURL(const URL&);
 
-using HTTPHeaderNameSet = HashSet<HTTPHeaderName, WTF::IntHash<HTTPHeaderName>, WTF::StrongEnumHashTraits<HTTPHeaderName>>;
-HTTPHeaderNameSet httpHeadersToKeepFromCleaning(const HTTPHeaderMap&);
-WEBCORE_EXPORT void cleanHTTPRequestHeadersForAccessControl(ResourceRequest&, const HTTPHeaderNameSet& = { });
+enum class HTTPHeadersToKeepFromCleaning {
+    ContentType = 1 << 0,
+    Referer = 1 << 1,
+    Origin = 1 << 2,
+    UserAgent = 1 << 3,
+    AcceptEncoding = 1 << 4
+};
+
+OptionSet<HTTPHeadersToKeepFromCleaning> httpHeadersToKeepFromCleaning(const HTTPHeaderMap&);
+WEBCORE_EXPORT void cleanHTTPRequestHeadersForAccessControl(ResourceRequest&, OptionSet<HTTPHeadersToKeepFromCleaning>);
 
 WEBCORE_EXPORT bool passesAccessControlCheck(const ResourceResponse&, StoredCredentialsPolicy, SecurityOrigin&, String& errorDescription);
 WEBCORE_EXPORT bool validatePreflightResponse(const ResourceRequest&, const ResourceResponse&, StoredCredentialsPolicy, SecurityOrigin&, String& errorDescription);
diff --git a/Source/WebCore/loader/ResourceLoaderOptions.h b/Source/WebCore/loader/ResourceLoaderOptions.h
index dbea1bf..4a49008 100644
--- a/Source/WebCore/loader/ResourceLoaderOptions.h
+++ b/Source/WebCore/loader/ResourceLoaderOptions.h
@@ -152,7 +152,7 @@
 #if ENABLE(SERVICE_WORKER)
     Optional<ServiceWorkerRegistrationIdentifier> serviceWorkerRegistrationIdentifier;
 #endif
-    HTTPHeaderNameSet httpHeadersToKeep;
+    OptionSet<HTTPHeadersToKeepFromCleaning> httpHeadersToKeep;
     Optional<ContentSecurityPolicyResponseHeaders> cspResponseHeaders;
     unsigned maxRedirectCount { 20 };
 
diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog
index d366139..5ebd03e 100644
--- a/Source/WebKit/ChangeLog
+++ b/Source/WebKit/ChangeLog
@@ -1,3 +1,14 @@
+2019-10-15  youenn fablet  <youenn@apple.com>
+
+        Move headers to keep from a HTTPHeaderNameSet to an OptionSet
+        https://bugs.webkit.org/show_bug.cgi?id=202977
+
+        Reviewed by Anders Carlsson.
+
+        * NetworkProcess/NetworkResourceLoadParameters.cpp:
+        (WebKit::NetworkResourceLoadParameters::decode):
+        * NetworkProcess/NetworkResourceLoadParameters.h:
+
 2019-10-15  Jiewen Tan  <jiewen_tan@apple.com>
 
         [WebAuthn] Rename -[WKUIDelegatePrivate webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:] to -[WKUIDelegatePrivate _webView:runWebAuthenticationPanel:initiatedByFrame:completionHandler:]
diff --git a/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp b/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp
index 8dbd25e..8660544d 100644
--- a/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp
+++ b/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp
@@ -262,7 +262,7 @@
         return WTF::nullopt;
     result.serviceWorkerRegistrationIdentifier = *serviceWorkerRegistrationIdentifier;
 
-    Optional<HTTPHeaderNameSet> httpHeadersToKeep;
+    Optional<OptionSet<HTTPHeadersToKeepFromCleaning>> httpHeadersToKeep;
     decoder >> httpHeadersToKeep;
     if (!httpHeadersToKeep)
         return WTF::nullopt;
diff --git a/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h b/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h
index e87dc7a..46c1704 100644
--- a/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h
+++ b/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h
@@ -64,7 +64,7 @@
 #if ENABLE(SERVICE_WORKER)
     WebCore::ServiceWorkersMode serviceWorkersMode { WebCore::ServiceWorkersMode::None };
     Optional<WebCore::ServiceWorkerRegistrationIdentifier> serviceWorkerRegistrationIdentifier;
-    WebCore::HTTPHeaderNameSet httpHeadersToKeep;
+    OptionSet<WebCore::HTTPHeadersToKeepFromCleaning> httpHeadersToKeep;
 #endif
 
 #if ENABLE(CONTENT_EXTENSIONS)