2 * Copyright (C) 2009 Google Inc. All rights reserved.
3 * Copyright (C) 2013-2017 Apple Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
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
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.
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.
34 #include "PlatformExportMacros.h"
35 #include <wtf/NeverDestroyed.h>
39 // A class that stores static enablers for all experimental features. Note that
40 // the method names must line up with the JavaScript method they enable for code
41 // generation to work properly.
43 class RuntimeEnabledFeatures {
44 WTF_MAKE_NONCOPYABLE(RuntimeEnabledFeatures);
46 void setDOMIteratorEnabled(bool isEnabled) { m_isDOMIteratorEnabled = isEnabled; }
47 bool domIteratorEnabled() const { return m_isDOMIteratorEnabled; }
49 void setGeolocationEnabled(bool isEnabled) { m_isGeolocationEnabled = isEnabled; }
50 bool geolocationEnabled() const { return m_isGeolocationEnabled; }
52 void setLinkPreloadEnabled(bool isEnabled) { m_isLinkPreloadEnabled = isEnabled; }
53 bool linkPreloadEnabled() const { return m_isLinkPreloadEnabled; }
55 void setResourceTimingEnabled(bool isEnabled) { m_isResourceTimingEnabled = isEnabled; }
56 bool resourceTimingEnabled() const { return m_isResourceTimingEnabled; }
58 void setUserTimingEnabled(bool isEnabled) { m_isUserTimingEnabled = isEnabled; }
59 bool userTimingEnabled() const { return m_isUserTimingEnabled; }
61 bool performanceTimelineEnabled() const { return resourceTimingEnabled() || userTimingEnabled(); }
63 void setShadowDOMEnabled(bool isEnabled) { m_isShadowDOMEnabled = isEnabled; }
64 bool shadowDOMEnabled() const { return m_isShadowDOMEnabled; }
66 void setInputEventsEnabled(bool isEnabled) { m_inputEventsEnabled = isEnabled; }
67 bool inputEventsEnabled() const { return m_inputEventsEnabled; }
69 void setInteractiveFormValidationEnabled(bool isEnabled) { m_isInteractiveFormValidationEnabled = isEnabled; }
70 bool interactiveFormValidationEnabled() const { return m_isInteractiveFormValidationEnabled; }
72 void setCustomElementsEnabled(bool areEnabled) { m_areCustomElementsEnabled = areEnabled; }
73 bool customElementsEnabled() const { return m_areCustomElementsEnabled; }
75 void setModernMediaControlsEnabled(bool areEnabled) { m_areModernMediaControlsEnabled = areEnabled; }
76 bool modernMediaControlsEnabled() const { return m_areModernMediaControlsEnabled; }
78 void setCredentialManagementEnabled(bool isEnabled) { m_isCredentialManagementEnabled = isEnabled; }
79 bool credentialManagementEnabled() const { return m_isCredentialManagementEnabled; }
81 #if ENABLE(INDEXED_DATABASE_IN_WORKERS)
82 void setIndexedDBWorkersEnabled(bool isEnabled) { m_isIndexedDBWorkersEnabled = isEnabled; }
83 bool indexedDBWorkersEnabled() const { return m_isIndexedDBWorkersEnabled; }
86 #if ENABLE(FONT_LOAD_EVENTS)
87 void setFontLoadEventsEnabled(bool isEnabled) { m_isFontLoadEventsEnabled = isEnabled; }
88 bool fontLoadEventsEnabled() const { return m_isFontLoadEventsEnabled; }
91 #if ENABLE(MEDIA_STREAM)
92 bool mediaDevicesEnabled() const { return m_isMediaDevicesEnabled; }
93 void setMediaDevicesEnabled(bool isEnabled) { m_isMediaDevicesEnabled = isEnabled; }
94 bool mediaStreamEnabled() const { return m_isMediaStreamEnabled; }
95 void setMediaStreamEnabled(bool isEnabled) { m_isMediaStreamEnabled = isEnabled; }
99 bool peerConnectionEnabled() const { return m_isPeerConnectionEnabled; }
100 void setPeerConnectionEnabled(bool isEnabled) { m_isPeerConnectionEnabled = isEnabled; }
101 bool webRTCLegacyAPIEnabled() const { return m_webRTCLegacyAPIEnabled; }
102 void setWebRTCLegacyAPIEnabled(bool isEnabled) { m_webRTCLegacyAPIEnabled = isEnabled; }
105 #if ENABLE(LEGACY_CSS_VENDOR_PREFIXES)
106 void setLegacyCSSVendorPrefixesEnabled(bool isEnabled) { m_isLegacyCSSVendorPrefixesEnabled = isEnabled; }
107 bool legacyCSSVendorPrefixesEnabled() const { return m_isLegacyCSSVendorPrefixesEnabled; }
110 #if ENABLE(INPUT_TYPE_DATE)
111 bool inputTypeDateEnabled() const { return m_isInputTypeDateEnabled; }
112 void setInputTypeDateEnabled(bool isEnabled) { m_isInputTypeDateEnabled = isEnabled; }
115 #if ENABLE(INPUT_TYPE_DATETIME_INCOMPLETE)
116 bool inputTypeDateTimeEnabled() const { return m_isInputTypeDateTimeEnabled; }
117 void setInputTypeDateTimeEnabled(bool isEnabled) { m_isInputTypeDateTimeEnabled = isEnabled; }
120 #if ENABLE(INPUT_TYPE_DATETIMELOCAL)
121 bool inputTypeDateTimeLocalEnabled() const { return m_isInputTypeDateTimeLocalEnabled; }
122 void setInputTypeDateTimeLocalEnabled(bool isEnabled) { m_isInputTypeDateTimeLocalEnabled = isEnabled; }
125 #if ENABLE(INPUT_TYPE_MONTH)
126 bool inputTypeMonthEnabled() const { return m_isInputTypeMonthEnabled; }
127 void setInputTypeMonthEnabled(bool isEnabled) { m_isInputTypeMonthEnabled = isEnabled; }
130 #if ENABLE(INPUT_TYPE_TIME)
131 bool inputTypeTimeEnabled() const { return m_isInputTypeTimeEnabled; }
132 void setInputTypeTimeEnabled(bool isEnabled) { m_isInputTypeTimeEnabled = isEnabled; }
135 #if ENABLE(INPUT_TYPE_WEEK)
136 bool inputTypeWeekEnabled() const { return m_isInputTypeWeekEnabled; }
137 void setInputTypeWeekEnabled(bool isEnabled) { m_isInputTypeWeekEnabled = isEnabled; }
141 void setGamepadsEnabled(bool areEnabled) { m_areGamepadsEnabled = areEnabled; }
142 bool gamepadsEnabled() const { return m_areGamepadsEnabled; }
145 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
146 // FIXME: This is not used.
147 void setAnimationTriggersEnabled(bool areEnabled) { m_areAnimationTriggersEnabled = areEnabled; }
148 bool animationTriggersEnabled() const { return m_areAnimationTriggersEnabled; }
151 #if ENABLE(WEB_ANIMATIONS)
152 void setWebAnimationsEnabled(bool areEnabled) { m_areWebAnimationsEnabled = areEnabled; }
153 bool webAnimationsEnabled() const { return m_areWebAnimationsEnabled; }
157 void setWebGL2Enabled(bool isEnabled) { m_isWebGL2Enabled = isEnabled; }
158 bool webGL2Enabled() const { return m_isWebGL2Enabled; }
162 void setWebGPUEnabled(bool isEnabled) { m_isWebGPUEnabled = isEnabled; }
163 bool webGPUEnabled() const { return m_isWebGPUEnabled; }
166 #if ENABLE(FETCH_API)
167 void setFetchAPIEnabled(bool isEnabled) { m_isFetchAPIEnabled = isEnabled; }
168 bool fetchAPIEnabled() const { return m_isFetchAPIEnabled; }
171 #if ENABLE(STREAMS_API)
172 void setReadableByteStreamAPIEnabled(bool isEnabled) { m_isReadableByteStreamAPIEnabled = isEnabled; }
173 bool readableByteStreamAPIEnabled() const { return m_isReadableByteStreamAPIEnabled; }
174 void setWritableStreamAPIEnabled(bool isEnabled) { m_isWritableStreamAPIEnabled = isEnabled; }
175 bool writableStreamAPIEnabled() const { return m_isWritableStreamAPIEnabled; }
178 #if ENABLE(DOWNLOAD_ATTRIBUTE)
179 void setDownloadAttributeEnabled(bool isEnabled) { m_isDownloadAttributeEnabled = isEnabled; }
180 bool downloadAttributeEnabled() const { return m_isDownloadAttributeEnabled; }
183 void setCSSGridLayoutEnabled(bool isEnabled) { m_cssGridLayoutEnabled = isEnabled; }
184 bool isCSSGridLayoutEnabled() const { return m_cssGridLayoutEnabled; }
186 #if ENABLE(INTERSECTION_OBSERVER)
187 void setIntersectionObserverEnabled(bool isEnabled) { m_intersectionObserverEnabled = isEnabled; }
188 bool intersectionObserverEnabled() const { return m_intersectionObserverEnabled; }
191 #if ENABLE(ENCRYPTED_MEDIA)
192 void setEncryptedMediaAPIEnabled(bool isEnabled) { m_encryptedMediaAPIEnabled = isEnabled; }
193 bool encryptedMediaAPIEnabled() const { return m_encryptedMediaAPIEnabled; }
196 #if ENABLE(SUBTLE_CRYPTO)
197 void setSubtleCryptoEnabled(bool isEnabled) { m_isSubtleCryptoEnabled = isEnabled; }
198 bool subtleCryptoEnabled() const { return m_isSubtleCryptoEnabled; }
202 bool audioEnabled() const;
203 bool htmlMediaElementEnabled() const;
204 bool htmlAudioElementEnabled() const;
205 bool htmlVideoElementEnabled() const;
206 bool htmlSourceElementEnabled() const;
207 bool mediaControllerEnabled() const;
208 bool mediaErrorEnabled() const;
209 bool timeRangesEnabled() const;
212 #if ENABLE(WEB_SOCKETS)
213 bool webSocketEnabled() const;
216 WEBCORE_EXPORT static RuntimeEnabledFeatures& sharedFeatures();
219 // Never instantiate.
220 RuntimeEnabledFeatures();
222 bool m_areModernMediaControlsEnabled { false };
223 bool m_isLinkPreloadEnabled { false };
224 bool m_isResourceTimingEnabled { false };
225 bool m_isUserTimingEnabled { false };
226 bool m_isInteractiveFormValidationEnabled { false };
227 bool m_isCredentialManagementEnabled { false };
229 bool m_isDOMIteratorEnabled { true };
230 bool m_isGeolocationEnabled { true };
231 bool m_isShadowDOMEnabled { true };
232 bool m_areCustomElementsEnabled { true };
233 bool m_inputEventsEnabled { true };
235 #if ENABLE(INDEXED_DATABASE_IN_WORKERS)
236 bool m_isIndexedDBWorkersEnabled { true };
239 #if ENABLE(MEDIA_STREAM)
240 bool m_isMediaDevicesEnabled { false };
241 bool m_isMediaStreamEnabled { true };
245 bool m_isPeerConnectionEnabled { true };
246 bool m_webRTCLegacyAPIEnabled { true };
249 #if ENABLE(LEGACY_CSS_VENDOR_PREFIXES)
250 bool m_isLegacyCSSVendorPrefixesEnabled { false };
253 #if ENABLE(INPUT_TYPE_DATE)
254 bool m_isInputTypeDateEnabled { true };
257 #if ENABLE(INPUT_TYPE_DATETIME_INCOMPLETE)
258 bool m_isInputTypeDateTimeEnabled { false };
261 #if ENABLE(INPUT_TYPE_DATETIMELOCAL)
262 bool m_isInputTypeDateTimeLocalEnabled { true };
265 #if ENABLE(INPUT_TYPE_MONTH)
266 bool m_isInputTypeMonthEnabled { true };
269 #if ENABLE(INPUT_TYPE_TIME)
270 bool m_isInputTypeTimeEnabled { true };
273 #if ENABLE(INPUT_TYPE_WEEK)
274 bool m_isInputTypeWeekEnabled { true };
277 #if ENABLE(FONT_LOAD_EVENTS)
278 bool m_isFontLoadEventsEnabled { true };
282 bool m_areGamepadsEnabled { false };
285 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
286 bool m_areAnimationTriggersEnabled { false };
289 #if ENABLE(STREAMS_API)
290 bool m_isReadableByteStreamAPIEnabled { false };
291 bool m_isWritableStreamAPIEnabled { false };
294 #if ENABLE(WEB_ANIMATIONS)
295 bool m_areWebAnimationsEnabled { false };
299 bool m_isWebGL2Enabled { false };
303 bool m_isWebGPUEnabled { false };
306 #if ENABLE(FETCH_API)
307 bool m_isFetchAPIEnabled { true };
310 #if ENABLE(DOWNLOAD_ATTRIBUTE)
311 bool m_isDownloadAttributeEnabled { false };
314 bool m_cssGridLayoutEnabled { true };
316 #if ENABLE(ENCRYPTED_MEDIA)
317 bool m_encryptedMediaAPIEnabled { false };
320 #if ENABLE(INTERSECTION_OBSERVER)
321 bool m_intersectionObserverEnabled { false };
324 #if ENABLE(SUBTLE_CRYPTO)
325 bool m_isSubtleCryptoEnabled { true };
328 friend class WTF::NeverDestroyed<RuntimeEnabledFeatures>;
331 } // namespace WebCore