| /* | 
 |  * Copyright (C) 2011 Google Inc. All rights reserved. | 
 |  * | 
 |  * Redistribution and use in source and binary forms, with or without | 
 |  * modification, are permitted provided that the following conditions are | 
 |  * met: | 
 |  * | 
 |  *     * Redistributions of source code must retain the above copyright | 
 |  * notice, this list of conditions and the following disclaimer. | 
 |  *     * Redistributions in binary form must reproduce the above | 
 |  * copyright notice, this list of conditions and the following disclaimer | 
 |  * in the documentation and/or other materials provided with the | 
 |  * distribution. | 
 |  *     * Neither the name of Google Inc. nor the names of its | 
 |  * contributors may be used to endorse or promote products derived from | 
 |  * this software without specific prior written permission. | 
 |  * | 
 |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
 |  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
 |  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
 |  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
 |  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
 |  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
 |  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
 |  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
 |  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
 |  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
 |  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
 |  */ | 
 |  | 
 | #pragma once | 
 |  | 
 | #include "ContentSecurityPolicyResponseHeaders.h" | 
 | #include "CrossOriginAccessControl.h" | 
 | #include "CrossOriginEmbedderPolicy.h" | 
 | #include "FetchOptions.h" | 
 | #include "HTTPHeaderNames.h" | 
 | #include "ServiceWorkerTypes.h" | 
 | #include "StoredCredentialsPolicy.h" | 
 | #include <wtf/EnumTraits.h> | 
 | #include <wtf/HashSet.h> | 
 | #include <wtf/Vector.h> | 
 | #include <wtf/text/WTFString.h> | 
 |  | 
 | namespace WebCore { | 
 |  | 
 | enum class SendCallbackPolicy : uint8_t { | 
 |     SendCallbacks, | 
 |     DoNotSendCallbacks | 
 | }; | 
 | static constexpr unsigned bitWidthOfSendCallbackPolicy = 1; | 
 |  | 
 | // FIXME: These options are named poorly. We only implement force disabling content sniffing, not enabling it, | 
 | // and even that only on some platforms. | 
 | enum class ContentSniffingPolicy : bool { | 
 |     SniffContent, | 
 |     DoNotSniffContent | 
 | }; | 
 | static constexpr unsigned bitWidthOfContentSniffingPolicy = 1; | 
 |  | 
 | enum class DataBufferingPolicy : uint8_t { | 
 |     BufferData, | 
 |     DoNotBufferData | 
 | }; | 
 | static constexpr unsigned bitWidthOfDataBufferingPolicy = 1; | 
 |  | 
 | enum class SecurityCheckPolicy : uint8_t { | 
 |     SkipSecurityCheck, | 
 |     DoSecurityCheck | 
 | }; | 
 | static constexpr unsigned bitWidthOfSecurityCheckPolicy = 1; | 
 |  | 
 | enum class CertificateInfoPolicy : uint8_t { | 
 |     IncludeCertificateInfo, | 
 |     DoNotIncludeCertificateInfo | 
 | }; | 
 | static constexpr unsigned bitWidthOfCertificateInfoPolicy = 1; | 
 |  | 
 | enum class ContentSecurityPolicyImposition : uint8_t { | 
 |     SkipPolicyCheck, | 
 |     DoPolicyCheck | 
 | }; | 
 | static constexpr unsigned bitWidthOfContentSecurityPolicyImposition = 1; | 
 |  | 
 | enum class DefersLoadingPolicy : uint8_t { | 
 |     AllowDefersLoading, | 
 |     DisallowDefersLoading | 
 | }; | 
 | static constexpr unsigned bitWidthOfDefersLoadingPolicy = 1; | 
 |  | 
 | enum class CachingPolicy : uint8_t { | 
 |     AllowCaching, | 
 |     DisallowCaching | 
 | }; | 
 | static constexpr unsigned bitWidthOfCachingPolicy = 1; | 
 |  | 
 | enum class ClientCredentialPolicy : bool { | 
 |     CannotAskClientForCredentials, | 
 |     MayAskClientForCredentials | 
 | }; | 
 | static constexpr unsigned bitWidthOfClientCredentialPolicy = 1; | 
 |  | 
 | enum class SameOriginDataURLFlag : uint8_t { | 
 |     Set, | 
 |     Unset | 
 | }; | 
 | static constexpr unsigned bitWidthOfSameOriginDataURLFlag = 1; | 
 |  | 
 | enum class InitiatorContext : uint8_t { | 
 |     Document, | 
 |     Worker, | 
 | }; | 
 | static constexpr unsigned bitWidthOfInitiatorContext = 1; | 
 |  | 
 | enum class ServiceWorkersMode : uint8_t { | 
 |     All, | 
 |     None, | 
 |     Only // An error will happen if service worker is not handling the fetch. Used to bypass preflight safely. | 
 | }; | 
 | static constexpr unsigned bitWidthOfServiceWorkersMode = 2; | 
 |  | 
 | enum class ApplicationCacheMode : uint8_t { | 
 |     Use, | 
 |     Bypass | 
 | }; | 
 | static constexpr unsigned bitWidthOfApplicationCacheMode = 1; | 
 |  | 
 | // FIXME: These options are named poorly. We only implement force disabling content encoding sniffing, not enabling it, | 
 | // and even that only on some platforms. | 
 | enum class ContentEncodingSniffingPolicy : bool { | 
 |     Sniff, | 
 |     DoNotSniff | 
 | }; | 
 | static constexpr unsigned bitWidthOfContentEncodingSniffingPolicy = 1; | 
 |  | 
 | enum class PreflightPolicy : uint8_t { | 
 |     Consider, | 
 |     Force, | 
 |     Prevent | 
 | }; | 
 | static constexpr unsigned bitWidthOfPreflightPolicy = 2; | 
 |  | 
 | enum class LoadedFromOpaqueSource : uint8_t { | 
 |     Yes, | 
 |     No | 
 | }; | 
 | static constexpr unsigned bitWidthOfLoadedFromOpaqueSource = 1; | 
 |  | 
 | struct ResourceLoaderOptions : public FetchOptions { | 
 |     ResourceLoaderOptions() | 
 |         : ResourceLoaderOptions(FetchOptions()) | 
 |     { | 
 |     } | 
 |  | 
 |     ResourceLoaderOptions(FetchOptions options) | 
 |         : FetchOptions { WTFMove(options) } | 
 |         , sendLoadCallbacks(SendCallbackPolicy::DoNotSendCallbacks) | 
 |         , sniffContent(ContentSniffingPolicy::DoNotSniffContent) | 
 |         , sniffContentEncoding(ContentEncodingSniffingPolicy::Sniff) | 
 |         , dataBufferingPolicy(DataBufferingPolicy::BufferData) | 
 |         , storedCredentialsPolicy(StoredCredentialsPolicy::DoNotUse) | 
 |         , securityCheck(SecurityCheckPolicy::DoSecurityCheck) | 
 |         , certificateInfoPolicy(CertificateInfoPolicy::DoNotIncludeCertificateInfo) | 
 |         , contentSecurityPolicyImposition(ContentSecurityPolicyImposition::DoPolicyCheck) | 
 |         , defersLoadingPolicy(DefersLoadingPolicy::AllowDefersLoading) | 
 |         , cachingPolicy(CachingPolicy::AllowCaching) | 
 |         , sameOriginDataURLFlag(SameOriginDataURLFlag::Unset) | 
 |         , initiatorContext(InitiatorContext::Document) | 
 |         , serviceWorkersMode(ServiceWorkersMode::All) | 
 |         , applicationCacheMode(ApplicationCacheMode::Use) | 
 |         , clientCredentialPolicy(ClientCredentialPolicy::CannotAskClientForCredentials) | 
 |         , preflightPolicy(PreflightPolicy::Consider) | 
 |         , loadedFromOpaqueSource(LoadedFromOpaqueSource::No) | 
 |     { } | 
 |  | 
 |     ResourceLoaderOptions(SendCallbackPolicy sendLoadCallbacks, ContentSniffingPolicy sniffContent, DataBufferingPolicy dataBufferingPolicy, StoredCredentialsPolicy storedCredentialsPolicy, ClientCredentialPolicy credentialPolicy, FetchOptions::Credentials credentials, SecurityCheckPolicy securityCheck, FetchOptions::Mode mode, CertificateInfoPolicy certificateInfoPolicy, ContentSecurityPolicyImposition contentSecurityPolicyImposition, DefersLoadingPolicy defersLoadingPolicy, CachingPolicy cachingPolicy) | 
 |         : sendLoadCallbacks(sendLoadCallbacks) | 
 |         , sniffContent(sniffContent) | 
 |         , sniffContentEncoding(ContentEncodingSniffingPolicy::Sniff) | 
 |         , dataBufferingPolicy(dataBufferingPolicy) | 
 |         , storedCredentialsPolicy(storedCredentialsPolicy) | 
 |         , securityCheck(securityCheck) | 
 |         , certificateInfoPolicy(certificateInfoPolicy) | 
 |         , contentSecurityPolicyImposition(contentSecurityPolicyImposition) | 
 |         , defersLoadingPolicy(defersLoadingPolicy) | 
 |         , cachingPolicy(cachingPolicy) | 
 |         , sameOriginDataURLFlag(SameOriginDataURLFlag::Unset) | 
 |         , initiatorContext(InitiatorContext::Document) | 
 |         , serviceWorkersMode(ServiceWorkersMode::All) | 
 |         , applicationCacheMode(ApplicationCacheMode::Use) | 
 |         , clientCredentialPolicy(credentialPolicy) | 
 |         , preflightPolicy(PreflightPolicy::Consider) | 
 |         , loadedFromOpaqueSource(LoadedFromOpaqueSource::No) | 
 |  | 
 |     { | 
 |         this->credentials = credentials; | 
 |         this->mode = mode; | 
 |     } | 
 |  | 
 | #if ENABLE(SERVICE_WORKER) | 
 |     Markable<ServiceWorkerRegistrationIdentifier, ServiceWorkerRegistrationIdentifier::MarkableTraits> serviceWorkerRegistrationIdentifier; | 
 | #endif | 
 |     Markable<ContentSecurityPolicyResponseHeaders, ContentSecurityPolicyResponseHeaders::MarkableTraits> cspResponseHeaders; | 
 |     std::optional<CrossOriginEmbedderPolicy> crossOriginEmbedderPolicy; | 
 |     OptionSet<HTTPHeadersToKeepFromCleaning> httpHeadersToKeep; | 
 |     uint8_t maxRedirectCount { 20 }; | 
 |  | 
 |     SendCallbackPolicy sendLoadCallbacks : bitWidthOfSendCallbackPolicy; | 
 |     ContentSniffingPolicy sniffContent : bitWidthOfContentSniffingPolicy; | 
 |     ContentEncodingSniffingPolicy sniffContentEncoding : bitWidthOfContentEncodingSniffingPolicy; | 
 |     DataBufferingPolicy dataBufferingPolicy : bitWidthOfDataBufferingPolicy; | 
 |     StoredCredentialsPolicy storedCredentialsPolicy : bitWidthOfStoredCredentialsPolicy; | 
 |     SecurityCheckPolicy securityCheck : bitWidthOfSecurityCheckPolicy; | 
 |     CertificateInfoPolicy certificateInfoPolicy : bitWidthOfCertificateInfoPolicy; | 
 |     ContentSecurityPolicyImposition contentSecurityPolicyImposition : bitWidthOfContentSecurityPolicyImposition; | 
 |     DefersLoadingPolicy defersLoadingPolicy : bitWidthOfDefersLoadingPolicy; | 
 |     CachingPolicy cachingPolicy : bitWidthOfCachingPolicy; | 
 |     SameOriginDataURLFlag sameOriginDataURLFlag : bitWidthOfSameOriginDataURLFlag; | 
 |     InitiatorContext initiatorContext : bitWidthOfInitiatorContext; | 
 |     ServiceWorkersMode serviceWorkersMode : bitWidthOfServiceWorkersMode; | 
 |     ApplicationCacheMode applicationCacheMode : bitWidthOfApplicationCacheMode; | 
 |     ClientCredentialPolicy clientCredentialPolicy : bitWidthOfClientCredentialPolicy; | 
 |     PreflightPolicy preflightPolicy : bitWidthOfPreflightPolicy; | 
 |     LoadedFromOpaqueSource loadedFromOpaqueSource : bitWidthOfLoadedFromOpaqueSource; | 
 | }; | 
 |  | 
 | } // namespace WebCore | 
 |  | 
 | namespace WTF { | 
 |  | 
 | template<> struct EnumTraits<WebCore::PreflightPolicy> { | 
 |     using values = EnumValues< | 
 |         WebCore::PreflightPolicy, | 
 |         WebCore::PreflightPolicy::Consider, | 
 |         WebCore::PreflightPolicy::Force, | 
 |         WebCore::PreflightPolicy::Prevent | 
 |     >; | 
 | }; | 
 |  | 
 | template<> struct EnumTraits<WebCore::ServiceWorkersMode> { | 
 |     using values = EnumValues< | 
 |         WebCore::ServiceWorkersMode, | 
 |         WebCore::ServiceWorkersMode::All, | 
 |         WebCore::ServiceWorkersMode::None, | 
 |         WebCore::ServiceWorkersMode::Only | 
 |     >; | 
 | }; | 
 |  | 
 | } // namespace WTF |