/*
 * Copyright (C) 2016-2021 Apple 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:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. 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.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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.
 */

#include "config.h"
#include "TestOptions.h"

#include "TestOptionsGeneratedKeys.h"

namespace WTR {

const std::vector<std::string>& TestOptions::supportedBoolWebPreferenceFeatures()
{
    // FIXME: Remove this once there is a viable mechanism for reseting WebPreferences between tests,
    // at which point, we will not need to manually reset every supported preference for each test.

    static std::vector<std::string> supported = [] {
        std::vector<std::string> keys;
        for (const auto& [key, value] : defaults().boolWebPreferenceFeatures)
            keys.push_back(key);
        return keys;
    }();
    return supported;
}

const std::vector<std::string>& TestOptions::supportedUInt32WebPreferenceFeatures()
{
    // FIXME: Remove this once there is a viable mechanism for reseting WebPreferences between tests,
    // at which point, we will not need to manually reset every supported preference for each test.

    static std::vector<std::string> supported = [] {
        std::vector<std::string> keys;
        for (const auto& [key, value] : defaults().uint32WebPreferenceFeatures)
            keys.push_back(key);
        return keys;
    }();
    return supported;
}

const TestFeatures& TestOptions::defaults()
{
    static TestFeatures features;
    if (features.boolWebPreferenceFeatures.empty()) {
        features.boolWebPreferenceFeatures = {
#if PLATFORM(COCOA)
            // These are non-experimental WebPreference values that must always be set as they
            // differ from the default set in the WebPreferences*.yaml configuration.
            { "AllowsInlineMediaPlayback", true },
            { "CanvasUsesAcceleratedDrawing", true },
            { "ColorFilterEnabled", true },
            { "CustomPasteboardDataEnabled", true },
            { "DOMPasteAllowed", true },
            { "DeveloperExtrasEnabled", true },
            { "DirectoryUploadEnabled", true },
            { "DownloadAttributeEnabled", true },
            { "EncryptedMediaAPIEnabled", true },
            { "FullScreenEnabled", true },
            { "GamepadsEnabled", true },
            { "HiddenPageCSSAnimationSuspensionEnabled", false },
            { "InlineMediaPlaybackRequiresPlaysInlineAttribute", false },
            { "JavaEnabled", false },
            { "JavaScriptCanAccessClipboard", true },
            { "JavaScriptCanOpenWindowsAutomatically", true },
            { "LargeImageAsyncDecodingEnabled", false },
            { "LinkPreloadEnabled", true },
            { "MediaCapabilitiesEnabled", true },
            { "MediaDataLoadsAutomatically", true },
            { "MediaDevicesEnabled", true },
            { "MediaPreloadingEnabled", true },
            { "MockScrollbarsEnabled", true },
            { "NPAPIPlugInsEnabledForTestingInWebKitLegacy", true },
            { "NeedsStorageAccessFromFileURLsQuirk", false },
            { "OfflineWebApplicationCacheEnabled", true },
            { "RequiresUserGestureForAudioPlayback", false },
            { "RequiresUserGestureForMediaPlayback", false },
            { "RequiresUserGestureForVideoPlayback", false },
            { "ShouldPrintBackgrounds", true },
            { "ShrinksStandaloneImagesToFit", true },
            { "SubpixelAntialiasedLayerTextEnabled", false },
            { "TextAreasAreResizable", true },
            { "TextAutosizingEnabled", false },
            { "UsesBackForwardCache", false },
            { "WebAudioEnabled", true },
            { "WebSQLEnabled", true },
            { "XSSAuditorEnabled", false },

            // FIXME: These experimental features are currently the only ones not enabled for WebKitLegacy, we
            // should either enable them or stop exposing them (as we do with with preferences like HTTP3Enabled).
            // All other experimental features are automatically enabled regardless of their specified defaults.
            { "AsyncClipboardAPIEnabled", false },
            { "CSSOMViewSmoothScrollingEnabled", false },
            { "ContactPickerAPIEnabled", false },
            { "CoreMathMLEnabled", false },
            { "GenericCueAPIEnabled", false },
            { "IntersectionObserverEnabled", false },
            { "IsLoggedInAPIEnabled", false },
            { "LazyIframeLoadingEnabled", false },
            { "LazyImageLoadingEnabled", false },
            { "RequestIdleCallbackEnabled", false },
            { "ResizeObserverEnabled", false },
            { "WebAuthenticationEnabled", false },
            { "WebGPUEnabled", false },
#elif PLATFORM(WIN)
            // These are WebPreference values that must always be set as they may
            // differ from the default set in the WebPreferences*.yaml configuration.
            { "AcceleratedDrawingEnabled", false },
            { "AllowCrossOriginSubresourcesToAskForCredentials", false },
            { "AllowFileAccessFromFileURLs", true },
            { "AllowTopNavigationToDataURLs", true },
            { "AllowUniversalAccessFromFileURLs", true },
            { "AspectRatioEnabled", true },
            { "AsyncClipboardAPIEnabled", false },
            { "AttachmentElementEnabled", false },
            { "CSSContainmentEnabled", false },
            { "CSSCounterStyleAtRuleImageSymbolsEnabled", false },
            { "CSSCounterStyleAtRulesEnabled", false },
            { "CSSGradientInterpolationColorSpacesEnabled", true },
            { "CSSGradientPremultipliedAlphaInterpolationEnabled", true },
            { "CSSLogicalEnabled", false },
            { "CSSOMViewSmoothScrollingEnabled", false },
            { "CanvasColorSpaceEnabled", true },
            { "ColorFilterEnabled", false },
            { "ContactPickerAPIEnabled", false },
            { "CoreMathMLEnabled", false },
            { "DOMPasteAllowed", true },
            { "DeveloperExtrasEnabled", true },
            { "HiddenPageDOMTimerThrottlingEnabled", false },
            { "InspectorAdditionsEnabled", false },
            { "IntersectionObserverEnabled", false },
            { "JavaScriptCanAccessClipboard", true },
            { "JavaScriptCanOpenWindowsAutomatically", true },
            { "JavaScriptEnabled", true },
            { "KeygenElementEnabled", false },
            { "LayoutFormattingContextIntegrationEnabled", true },
            { "LineHeightUnitsEnabled", false },
            { "LoadsImagesAutomatically", true },
            { "MainContentUserGestureOverrideEnabled", false },
            { "MenuItemElementEnabled", false },
            { "MockScrollbarsControllerEnabled", false },
            { "ModernMediaControlsEnabled", true },
            { "NeedsStorageAccessFromFileURLsQuirk", false },
            { "OverscrollBehaviorEnabled", true },
            { "PerformanceNavigationTimingAPIEnabled", true },
            { "PluginsEnabled", true },
            { "PrivateClickMeasurementEnabled", false },
            { "RequestIdleCallbackEnabled", false },
            { "ResizeObserverEnabled", false },
            { "SelectionAcrossShadowBoundariesEnabled", true },
            { "ShrinksStandaloneImagesToFit", true },
            { "SpatialNavigationEnabled", false },
            { "TabsToLinks", false },
            { "TelephoneNumberParsingEnabled", false },
            { "UsesBackForwardCache", false },
            { "WebGPUEnabled", false },
            { "XSSAuditorEnabled", false },
#endif
#if ENABLE(GPU_PROCESS) && ENABLE(WEBGL)
            { "UseGPUProcessForWebGLEnabled", false },
#endif
        };
#if PLATFORM(WIN)
        features.uint32WebPreferenceFeatures = {
            { "MinimumFontSize", 0 },
        };
#endif
#if PLATFORM(COCOA)
        features.stringWebPreferenceFeatures = {
            { "CursiveFontFamily", "Apple Chancery" },
            { "FantasyFontFamily", "Papyrus" },
            { "FixedFontFamily", "Courier" },
            { "PictographFontFamily", "Apple Color Emoji" },
            { "SansSerifFontFamily", "Helvetica" },
            { "SerifFontFamily", "Times" },
            { "StandardFontFamily", "Times" },
        };
#endif
    }
    return features;
}

const std::unordered_map<std::string, TestHeaderKeyType>& TestOptions::keyTypeMapping()
{
    static const std::unordered_map<std::string, TestHeaderKeyType> map {
        GENERATED_WEB_PREFERENCE_KEY_TYPE_MAPPINGS

        { "dumpJSConsoleLogInStdErr", TestHeaderKeyType::BoolTestRunner },
        { "enableDragDestinationActionLoad", TestHeaderKeyType::BoolTestRunner },
        { "layerBackedWebView", TestHeaderKeyType::BoolTestRunner },
        { "useEphemeralSession", TestHeaderKeyType::BoolTestRunner },

        { "additionalSupportedImageTypes", TestHeaderKeyType::StringTestRunner },
        { "jscOptions", TestHeaderKeyType::StringTestRunner },
    };

    return map;
}

bool TestOptions::webViewIsCompatibleWithOptions(const TestOptions& other) const
{
    return m_features == other.m_features;
}

template<typename T> T featureValue(std::string key, T defaultValue, const std::unordered_map<std::string, T>& map)
{
    auto it = map.find(key);
    if (it != map.end())
        return it->second;
    return defaultValue;
}

bool TestOptions::boolTestRunnerFeatureValue(std::string key, bool defaultValue) const
{
    return featureValue(key, defaultValue, m_features.boolTestRunnerFeatures);
}

std::string TestOptions::stringTestRunnerFeatureValue(std::string key, std::string defaultValue) const
{
    return featureValue(key, defaultValue, m_features.stringTestRunnerFeatures);
}

}
