blob: 9c0e87da10aec074a72253a606f5901e3237b8d1 [file] [log] [blame]
/*
* Copyright (C) 2020-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.
*/
#import "WebPreferencesDefaultValues.h"
#import "WebKitVersionChecks.h"
#import <Foundation/NSBundle.h>
#import <WebCore/RuntimeApplicationChecks.h>
#import <mach-o/dyld.h>
#import <pal/spi/cf/CFUtilitiesSPI.h>
#import <pal/spi/cocoa/FeatureFlagsSPI.h>
#import <wtf/cocoa/RuntimeApplicationChecksCocoa.h>
#import <wtf/spi/darwin/dyldSPI.h>
#import <wtf/text/WTFString.h>
#if PLATFORM(IOS_FAMILY)
#import <WebCore/Device.h>
#endif
namespace WebKit {
#if PLATFORM(COCOA)
// Because of <rdar://problem/60608008>, WebKit has to parse the feature flags plist file
bool isFeatureFlagEnabled(const char* featureName, bool defaultValue)
{
#if HAVE(SYSTEM_FEATURE_FLAGS)
#if PLATFORM(MAC)
static bool isSystemWebKit = [] {
auto *bundle = [NSBundle bundleForClass:NSClassFromString(@"WebResource")];
return [bundle.bundlePath hasPrefix:@"/System/"];
}();
return isSystemWebKit ? _os_feature_enabled_impl("WebKit", featureName) : defaultValue;
#else
UNUSED_PARAM(defaultValue);
return _os_feature_enabled_impl("WebKit", featureName);
#endif // PLATFORM(MAC)
#else
UNUSED_PARAM(featureName);
return defaultValue;
#endif // HAVE(SYSTEM_FEATURE_FLAGS)
}
#endif
#if HAVE(INCREMENTAL_PDF_APIS)
bool defaultIncrementalPDFEnabled()
{
return isFeatureFlagEnabled("incremental_pdf", false);
}
#endif
#if ENABLE(WEBXR)
bool defaultWebXREnabled()
{
return isFeatureFlagEnabled("WebXR", false);
}
#endif // ENABLE(WEBXR)
#if PLATFORM(IOS_FAMILY)
bool defaultAllowsInlineMediaPlayback()
{
return !WebCore::deviceClassIsSmallScreen();
}
bool defaultAllowsInlineMediaPlaybackAfterFullscreen()
{
return WebCore::deviceClassIsSmallScreen();
}
bool defaultAllowsPictureInPictureMediaPlayback()
{
static bool shouldAllowPictureInPictureMediaPlayback = linkedOnOrAfter(SDKVersion::FirstWithPictureInPictureMediaPlayback);
return shouldAllowPictureInPictureMediaPlayback;
}
bool defaultJavaScriptCanOpenWindowsAutomatically()
{
static bool shouldAllowWindowOpenWithoutUserGesture = WebCore::IOSApplication::isTheSecretSocietyHiddenMystery() && !linkedOnOrAfter(SDKVersion::FirstWithoutTheSecretSocietyHiddenMysteryWindowOpenQuirk);
return shouldAllowWindowOpenWithoutUserGesture;
}
bool defaultInlineMediaPlaybackRequiresPlaysInlineAttribute()
{
return WebCore::deviceClassIsSmallScreen();
}
bool defaultPassiveTouchListenersAsDefaultOnDocument()
{
static bool result = linkedOnOrAfter(SDKVersion::FirstThatDefaultsToPassiveTouchListenersOnDocument);
return result;
}
bool defaultRequiresUserGestureToLoadVideo()
{
static bool shouldRequireUserGestureToLoadVideo = linkedOnOrAfter(SDKVersion::FirstThatRequiresUserGestureToLoadVideo);
return shouldRequireUserGestureToLoadVideo;
}
bool defaultWebSQLEnabled()
{
// For backward compatibility, keep WebSQL working until apps are rebuilt with the iOS 14 SDK.
static bool webSQLEnabled = !linkedOnOrAfter(SDKVersion::FirstWithWebSQLDisabledByDefaultInLegacyWebKit);
return webSQLEnabled;
}
bool defaultAllowContentSecurityPolicySourceStarToMatchAnyProtocol()
{
static bool shouldAllowContentSecurityPolicySourceStarToMatchAnyProtocol = !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITH_CONTENT_SECURITY_POLICY_SOURCE_STAR_PROTOCOL_RESTRICTION);
return shouldAllowContentSecurityPolicySourceStarToMatchAnyProtocol;
}
#endif // PLATFORM(IOS_FAMILY)
#if PLATFORM(MAC)
bool defaultLoadDeferringEnabled()
{
return !WebCore::MacApplication::isAdobeInstaller();
}
bool defaultWindowFocusRestricted()
{
return !WebCore::MacApplication::isHRBlock();
}
bool defaultUsePreHTML5ParserQuirks()
{
// AOL Instant Messenger and Microsoft My Day contain markup incompatible
// with the new HTML5 parser. If these applications were linked against a
// version of WebKit prior to the introduction of the HTML5 parser, enable
// parser quirks to maintain compatibility. For details, see
// <https://bugs.webkit.org/show_bug.cgi?id=46134> and
// <https://bugs.webkit.org/show_bug.cgi?id=46334>.
static bool isApplicationNeedingParserQuirks = !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITH_HTML5_PARSER)
&& (WebCore::MacApplication::isAOLInstantMessenger() || WebCore::MacApplication::isMicrosoftMyDay());
// Mail.app must continue to display HTML email that contains quirky markup.
static bool isAppleMail = WebCore::MacApplication::isAppleMail();
return isApplicationNeedingParserQuirks || isAppleMail;
}
bool defaultNeedsAdobeFrameReloadingQuirk()
{
static bool needsQuirk = _CFAppVersionCheckLessThan(CFSTR("com.adobe.Acrobat"), -1, 9.0)
|| _CFAppVersionCheckLessThan(CFSTR("com.adobe.Acrobat.Pro"), -1, 9.0)
|| _CFAppVersionCheckLessThan(CFSTR("com.adobe.Reader"), -1, 9.0)
|| _CFAppVersionCheckLessThan(CFSTR("com.adobe.distiller"), -1, 9.0)
|| _CFAppVersionCheckLessThan(CFSTR("com.adobe.Contribute"), -1, 4.2)
|| _CFAppVersionCheckLessThan(CFSTR("com.adobe.dreamweaver-9.0"), -1, 9.1)
|| _CFAppVersionCheckLessThan(CFSTR("com.macromedia.fireworks"), -1, 9.1)
|| _CFAppVersionCheckLessThan(CFSTR("com.adobe.InCopy"), -1, 5.1)
|| _CFAppVersionCheckLessThan(CFSTR("com.adobe.InDesign"), -1, 5.1)
|| _CFAppVersionCheckLessThan(CFSTR("com.adobe.Soundbooth"), -1, 2);
return needsQuirk;
}
bool defaultScrollAnimatorEnabled()
{
static bool enabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"NSScrollAnimationEnabled"];
return enabled;
}
bool defaultTreatsAnyTextCSSLinkAsStylesheet()
{
static bool needsQuirk = !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITHOUT_LINK_ELEMENT_TEXT_CSS_QUIRK)
&& _CFAppVersionCheckLessThan(CFSTR("com.e-frontier.shade10"), -1, 10.6);
return needsQuirk;
}
bool defaultNeedsFrameNameFallbackToIdQuirk()
{
static bool needsQuirk = _CFAppVersionCheckLessThan(CFSTR("info.colloquy"), -1, 2.5);
return needsQuirk;
}
bool defaultNeedsKeyboardEventDisambiguationQuirks()
{
static bool needsQuirks = !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITH_IE_COMPATIBLE_KEYBOARD_EVENT_DISPATCH) && !WebCore::MacApplication::isSafari();
return needsQuirks;
}
#endif // PLATFORM(MAC)
bool defaultAttachmentElementEnabled()
{
#if PLATFORM(IOS_FAMILY)
return WebCore::IOSApplication::isMobileMail();
#else
return WebCore::MacApplication::isAppleMail();
#endif
}
bool defaultShouldRestrictBaseURLSchemes()
{
static bool shouldRestrictBaseURLSchemes = linkedOnOrAfter(SDKVersion::FirstThatRestrictsBaseURLSchemes);
return shouldRestrictBaseURLSchemes;
}
bool defaultUseLegacyBackgroundSizeShorthandBehavior()
{
#if PLATFORM(IOS_FAMILY)
static bool shouldUseLegacyBackgroundSizeShorthandBehavior = !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITHOUT_LEGACY_BACKGROUNDSIZE_SHORTHAND_BEHAVIOR);
#else
static bool shouldUseLegacyBackgroundSizeShorthandBehavior = WebCore::MacApplication::isVersions()
&& !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITHOUT_LEGACY_BACKGROUNDSIZE_SHORTHAND_BEHAVIOR);
#endif
return shouldUseLegacyBackgroundSizeShorthandBehavior;
}
bool defaultAllowDisplayOfInsecureContent()
{
static bool shouldAllowDisplayOfInsecureContent = !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITH_INSECURE_CONTENT_BLOCKING);
return shouldAllowDisplayOfInsecureContent;
}
bool defaultAllowRunningOfInsecureContent()
{
static bool shouldAllowRunningOfInsecureContent = !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITH_INSECURE_CONTENT_BLOCKING);
return shouldAllowRunningOfInsecureContent;
}
bool defaultShouldConvertInvalidURLsToBlank()
{
static bool shouldConvertInvalidURLsToBlank = linkedOnOrAfter(SDKVersion::FirstThatConvertsInvalidURLsToBlank);
return shouldConvertInvalidURLsToBlank;
}
#if PLATFORM(MAC)
bool defaultPassiveWheelListenersAsDefaultOnDocument()
{
static bool result = linkedOnOrAfter(SDKVersion::FirstThatDefaultsToPassiveWheelListenersOnDocument);
return result;
}
bool defaultWheelEventGesturesBecomeNonBlocking()
{
static bool result = linkedOnOrAfter(SDKVersion::FirstThatAllowsWheelEventGesturesToBecomeNonBlocking);
return result;
}
#endif
#if ENABLE(MEDIA_SOURCE) && PLATFORM(IOS_FAMILY)
bool defaultMediaSourceEnabled()
{
return !WebCore::deviceClassIsSmallScreen();
}
#endif
#if ENABLE(MEDIA_SOURCE)
bool defaultWebMParserEnabled()
{
return isFeatureFlagEnabled("webm_parser", true);
}
#endif
#if ENABLE(VP9)
bool defaultVP8DecoderEnabled()
{
return isFeatureFlagEnabled("vp8_decoder", true);
}
bool defaultVP9DecoderEnabled()
{
return isFeatureFlagEnabled("vp9_decoder", true);
}
#endif // ENABLE(VP9)
} // namespace WebKit