1/* 2 * Copyright (C) 2009 Google Inc. All rights reserved. 3 * Copyright (C) 2013 Apple Inc. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * * Redistributions in binary form must reproduce the above 12 * copyright notice, this list of conditions and the following disclaimer 13 * in the documentation and/or other materials provided with the 14 * distribution. 15 * * Neither the name of Google Inc. nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#ifndef RuntimeEnabledFeatures_h 33#define RuntimeEnabledFeatures_h 34 35#include "PlatformExportMacros.h" 36#include <wtf/NeverDestroyed.h> 37 38namespace WebCore { 39 40// A class that stores static enablers for all experimental features. Note that 41// the method names must line up with the JavaScript method they enable for code 42// generation to work properly. 43 44class RuntimeEnabledFeatures { 45 WTF_MAKE_NONCOPYABLE(RuntimeEnabledFeatures); 46public: 47 void setLocalStorageEnabled(bool isEnabled) { m_isLocalStorageEnabled = isEnabled; } 48 bool localStorageEnabled() const { return m_isLocalStorageEnabled; } 49 50 void setSessionStorageEnabled(bool isEnabled) { m_isSessionStorageEnabled = isEnabled; } 51 bool sessionStorageEnabled() const { return m_isSessionStorageEnabled; } 52 53 void setWebkitNotificationsEnabled(bool isEnabled) { m_isWebkitNotificationsEnabled = isEnabled; } 54 bool webkitNotificationsEnabled() const { return m_isWebkitNotificationsEnabled; } 55 56 void setApplicationCacheEnabled(bool isEnabled) { m_isApplicationCacheEnabled = isEnabled; } 57 bool applicationCacheEnabled() const { return m_isApplicationCacheEnabled; } 58 59 void setDataTransferItemsEnabled(bool isEnabled) { m_isDataTransferItemsEnabled = isEnabled; } 60 bool dataTransferItemsEnabled() const { return m_isDataTransferItemsEnabled; } 61 62 void setGeolocationEnabled(bool isEnabled) { m_isGeolocationEnabled = isEnabled; } 63 bool geolocationEnabled() const { return m_isGeolocationEnabled; } 64 65 void setWebkitIndexedDBEnabled(bool isEnabled) { m_isIndexedDBEnabled = isEnabled; } 66 bool webkitIndexedDBEnabled() const { return m_isIndexedDBEnabled; } 67 bool indexedDBEnabled() const { return m_isIndexedDBEnabled; } 68 69#if ENABLE(CSS_EXCLUSIONS) 70 void setCSSExclusionsEnabled(bool isEnabled) { m_isCSSExclusionsEnabled = isEnabled; } 71 bool cssExclusionsEnabled() const { return m_isCSSExclusionsEnabled; } 72#else 73 void setCSSExclusionsEnabled(bool) { } 74 bool cssExclusionsEnabled() const { return false; } 75#endif 76 77#if ENABLE(CSS_SHAPES) 78 void setCSSShapesEnabled(bool isEnabled) { m_isCSSShapesEnabled = isEnabled; } 79 bool cssShapesEnabled() const { return m_isCSSShapesEnabled; } 80#else 81 void setCSSShapesEnabled(bool) { } 82 bool cssShapesEnabled() const { return false; } 83#endif 84 85#if ENABLE(CSS_REGIONS) 86 void setCSSRegionsEnabled(bool isEnabled) { m_isCSSRegionsEnabled = isEnabled; } 87 bool cssRegionsEnabled() const { return m_isCSSRegionsEnabled; } 88#else 89 void setCSSRegionsEnabled(bool) { } 90 bool cssRegionsEnabled() const { return false; } 91#endif 92 93 void setCSSCompositingEnabled(bool isEnabled) { m_isCSSCompositingEnabled = isEnabled; } 94 bool cssCompositingEnabled() const { return m_isCSSCompositingEnabled; } 95 96#if ENABLE(FONT_LOAD_EVENTS) 97 void setFontLoadEventsEnabled(bool isEnabled) { m_isFontLoadEventsEnabled = isEnabled; } 98 bool fontLoadEventsEnabled() const { return m_isFontLoadEventsEnabled; } 99#else 100 void setFontLoadEventsEnabled(bool) { } 101 bool fontLoadEventsEnabled() { return false; } 102#endif 103 104#if ENABLE(VIDEO) 105 bool audioEnabled() const; 106 bool htmlMediaElementEnabled() const; 107 bool htmlAudioElementEnabled() const; 108 bool htmlVideoElementEnabled() const; 109 bool htmlSourceElementEnabled() const; 110 bool mediaControllerEnabled() const; 111 bool mediaErrorEnabled() const; 112 bool timeRangesEnabled() const; 113#endif 114 115#if ENABLE(SHARED_WORKERS) 116 bool sharedWorkerEnabled() const; 117#endif 118 119#if ENABLE(WEB_SOCKETS) 120 bool webSocketEnabled() const; 121#endif 122 123#if ENABLE(TOUCH_EVENTS) 124 bool touchEnabled() const { return m_isTouchEnabled; } 125 void setTouchEnabled(bool isEnabled) { m_isTouchEnabled = isEnabled; } 126#endif 127 128 void setDeviceMotionEnabled(bool isEnabled) { m_isDeviceMotionEnabled = isEnabled; } 129 bool deviceMotionEnabled() const { return m_isDeviceMotionEnabled; } 130 bool deviceMotionEventEnabled() const { return m_isDeviceMotionEnabled; } 131 bool ondevicemotionEnabled() const { return m_isDeviceMotionEnabled; } 132 133 void setDeviceOrientationEnabled(bool isEnabled) { m_isDeviceOrientationEnabled = isEnabled; } 134 bool deviceOrientationEnabled() const { return m_isDeviceOrientationEnabled; } 135 bool deviceOrientationEventEnabled() const { return m_isDeviceOrientationEnabled; } 136 bool ondeviceorientationEnabled() const { return m_isDeviceOrientationEnabled; } 137 138 void setSpeechInputEnabled(bool isEnabled) { m_isSpeechInputEnabled = isEnabled; } 139 bool speechInputEnabled() const { return m_isSpeechInputEnabled; } 140 bool webkitSpeechEnabled() const { return m_isSpeechInputEnabled; } 141 bool webkitGrammarEnabled() const { return m_isSpeechInputEnabled; } 142 143#if ENABLE(SCRIPTED_SPEECH) 144 void setScriptedSpeechEnabled(bool isEnabled) { m_isScriptedSpeechEnabled = isEnabled; } 145 bool scriptedSpeechEnabled() const { return m_isScriptedSpeechEnabled; } 146 bool webkitSpeechRecognitionEnabled() const { return m_isScriptedSpeechEnabled; } 147 bool webkitSpeechRecognitionErrorEnabled() const { return m_isScriptedSpeechEnabled; } 148 bool webkitSpeechRecognitionEventEnabled() const { return m_isScriptedSpeechEnabled; } 149 bool webkitSpeechGrammarEnabled() const { return m_isScriptedSpeechEnabled; } 150 bool webkitSpeechGrammarListEnabled() const { return m_isScriptedSpeechEnabled; } 151#endif 152 153#if ENABLE(JAVASCRIPT_I18N_API) 154 bool javaScriptI18NAPIEnabled() const; 155 void setJavaScriptI18NAPIEnabled(bool isEnabled) { m_isJavaScriptI18NAPIEnabled = isEnabled; } 156#endif 157 158#if ENABLE(MEDIA_STREAM) 159 bool mediaStreamEnabled() const { return m_isMediaStreamEnabled; } 160 void setMediaStreamEnabled(bool isEnabled) { m_isMediaStreamEnabled = isEnabled; } 161 bool webkitGetUserMediaEnabled() const { return m_isMediaStreamEnabled; } 162 bool webkitMediaStreamEnabled() const { return m_isMediaStreamEnabled; } 163 164 bool peerConnectionEnabled() const { return m_isMediaStreamEnabled && m_isPeerConnectionEnabled; } 165 void setPeerConnectionEnabled(bool isEnabled) { m_isPeerConnectionEnabled = isEnabled; } 166 bool webkitRTCPeerConnectionEnabled() const { return peerConnectionEnabled(); } 167#endif 168 169#if ENABLE(LEGACY_CSS_VENDOR_PREFIXES) 170 void setLegacyCSSVendorPrefixesEnabled(bool isEnabled) { m_isLegacyCSSVendorPrefixesEnabled = isEnabled; } 171 bool legacyCSSVendorPrefixesEnabled() const { return m_isLegacyCSSVendorPrefixesEnabled; } 172#endif 173 174#if ENABLE(VIDEO_TRACK) 175 bool webkitVideoTrackEnabled() const { return m_isVideoTrackEnabled; } 176 void setWebkitVideoTrackEnabled(bool isEnabled) { m_isVideoTrackEnabled = isEnabled; } 177#endif 178 179#if ENABLE(INPUT_TYPE_DATE) 180 bool inputTypeDateEnabled() const { return m_isInputTypeDateEnabled; } 181 void setInputTypeDateEnabled(bool isEnabled) { m_isInputTypeDateEnabled = isEnabled; } 182#endif 183 184#if ENABLE(INPUT_TYPE_DATETIME_INCOMPLETE) 185 bool inputTypeDateTimeEnabled() const { return m_isInputTypeDateTimeEnabled; } 186 void setInputTypeDateTimeEnabled(bool isEnabled) { m_isInputTypeDateTimeEnabled = isEnabled; } 187#endif 188 189#if ENABLE(INPUT_TYPE_DATETIMELOCAL) 190 bool inputTypeDateTimeLocalEnabled() const { return m_isInputTypeDateTimeLocalEnabled; } 191 void setInputTypeDateTimeLocalEnabled(bool isEnabled) { m_isInputTypeDateTimeLocalEnabled = isEnabled; } 192#endif 193 194#if ENABLE(INPUT_TYPE_MONTH) 195 bool inputTypeMonthEnabled() const { return m_isInputTypeMonthEnabled; } 196 void setInputTypeMonthEnabled(bool isEnabled) { m_isInputTypeMonthEnabled = isEnabled; } 197#endif 198 199#if ENABLE(INPUT_TYPE_TIME) 200 bool inputTypeTimeEnabled() const { return m_isInputTypeTimeEnabled; } 201 void setInputTypeTimeEnabled(bool isEnabled) { m_isInputTypeTimeEnabled = isEnabled; } 202#endif 203 204#if ENABLE(INPUT_TYPE_WEEK) 205 bool inputTypeWeekEnabled() const { return m_isInputTypeWeekEnabled; } 206 void setInputTypeWeekEnabled(bool isEnabled) { m_isInputTypeWeekEnabled = isEnabled; } 207#endif 208 209#if ENABLE(CSP_NEXT) 210 bool experimentalContentSecurityPolicyFeaturesEnabled() const { return m_areExperimentalContentSecurityPolicyFeaturesEnabled; } 211 void setExperimentalContentSecurityPolicyFeaturesEnabled(bool isEnabled) { m_areExperimentalContentSecurityPolicyFeaturesEnabled = isEnabled; } 212#endif 213 214 bool langAttributeAwareFormControlUIEnabled() const { return m_isLangAttributeAwareFormControlUIEnabled; } 215 // The lang attribute support is incomplete and should only be turned on for tests. 216 void setLangAttributeAwareFormControlUIEnabled(bool isEnabled) { m_isLangAttributeAwareFormControlUIEnabled = isEnabled; } 217 218 void setPluginReplacementEnabled(bool isEnabled) { m_isPluginReplacementEnabled = isEnabled; } 219 bool pluginReplacementEnabled() const { return m_isPluginReplacementEnabled; } 220 221#if ENABLE(GAMEPAD) 222 void setGamepadsEnabled(bool areEnabled) { m_areGamepadsEnabled = areEnabled; } 223 bool gamepadsEnabled() const { return m_areGamepadsEnabled; } 224#endif 225 226 static RuntimeEnabledFeatures& sharedFeatures(); 227 228private: 229 // Never instantiate. 230 RuntimeEnabledFeatures(); 231 232 bool m_isLocalStorageEnabled; 233 bool m_isSessionStorageEnabled; 234 bool m_isWebkitNotificationsEnabled; 235 bool m_isApplicationCacheEnabled; 236 bool m_isDataTransferItemsEnabled; 237 bool m_isGeolocationEnabled; 238 bool m_isIndexedDBEnabled; 239 bool m_isTouchEnabled; 240 bool m_isDeviceMotionEnabled; 241 bool m_isDeviceOrientationEnabled; 242 bool m_isSpeechInputEnabled; 243 bool m_isCSSExclusionsEnabled; 244 bool m_isCSSShapesEnabled; 245 bool m_isCSSRegionsEnabled; 246 bool m_isCSSCompositingEnabled; 247 bool m_isLangAttributeAwareFormControlUIEnabled; 248 bool m_isPluginReplacementEnabled; 249 250#if ENABLE(SCRIPTED_SPEECH) 251 bool m_isScriptedSpeechEnabled; 252#endif 253 254#if ENABLE(JAVASCRIPT_I18N_API) 255 bool m_isJavaScriptI18NAPIEnabled; 256#endif 257 258#if ENABLE(MEDIA_STREAM) 259 bool m_isMediaStreamEnabled; 260 bool m_isPeerConnectionEnabled; 261#endif 262 263#if ENABLE(LEGACY_CSS_VENDOR_PREFIXES) 264 bool m_isLegacyCSSVendorPrefixesEnabled; 265#endif 266 267#if ENABLE(VIDEO_TRACK) 268 bool m_isVideoTrackEnabled; 269#endif 270 271#if ENABLE(INPUT_TYPE_DATE) 272 bool m_isInputTypeDateEnabled; 273#endif 274 275#if ENABLE(INPUT_TYPE_DATETIME_INCOMPLETE) 276 bool m_isInputTypeDateTimeEnabled; 277#endif 278 279#if ENABLE(INPUT_TYPE_DATETIMELOCAL) 280 bool m_isInputTypeDateTimeLocalEnabled; 281#endif 282 283#if ENABLE(INPUT_TYPE_MONTH) 284 bool m_isInputTypeMonthEnabled; 285#endif 286 287#if ENABLE(INPUT_TYPE_TIME) 288 bool m_isInputTypeTimeEnabled; 289#endif 290 291#if ENABLE(INPUT_TYPE_WEEK) 292 bool m_isInputTypeWeekEnabled; 293#endif 294 295#if ENABLE(CSP_NEXT) 296 bool m_areExperimentalContentSecurityPolicyFeaturesEnabled; 297#endif 298 299#if ENABLE(FONT_LOAD_EVENTS) 300 bool m_isFontLoadEventsEnabled; 301#endif 302 303#if ENABLE(GAMEPAD) 304 bool m_areGamepadsEnabled; 305#endif 306 307 friend class WTF::NeverDestroyed<RuntimeEnabledFeatures>; 308}; 309 310} // namespace WebCore 311 312#endif // RuntimeEnabledFeatures_h 313