blob: e8c8dce2610721e8783897112d83fc81991068e7 [file] [log] [blame]
/*
* 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);
}
}