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/Forward.h>
36 #include <wtf/Noncopyable.h>
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.
44 class RuntimeEnabledFeatures {
45 WTF_MAKE_NONCOPYABLE(RuntimeEnabledFeatures);
47 void setDisplayContentsEnabled(bool isEnabled) { m_isDisplayContentsEnabled = isEnabled; }
48 bool displayContentsEnabled() const { return m_isDisplayContentsEnabled; }
50 void setLinkPreloadEnabled(bool isEnabled) { m_isLinkPreloadEnabled = isEnabled; }
51 bool linkPreloadEnabled() const { return m_isLinkPreloadEnabled; }
53 void setMediaPreloadingEnabled(bool isEnabled) { m_isMediaPreloadingEnabled = isEnabled; }
54 bool mediaPreloadingEnabled() const { return m_isMediaPreloadingEnabled; }
56 void setResourceTimingEnabled(bool isEnabled) { m_isResourceTimingEnabled = isEnabled; }
57 bool resourceTimingEnabled() const { return m_isResourceTimingEnabled; }
59 void setUserTimingEnabled(bool isEnabled) { m_isUserTimingEnabled = isEnabled; }
60 bool userTimingEnabled() const { return m_isUserTimingEnabled; }
62 bool performanceTimelineEnabled() const { return resourceTimingEnabled() || userTimingEnabled(); }
64 void setShadowDOMEnabled(bool isEnabled) { m_isShadowDOMEnabled = isEnabled; }
65 bool shadowDOMEnabled() const { return m_isShadowDOMEnabled; }
67 void setInputEventsEnabled(bool isEnabled) { m_inputEventsEnabled = isEnabled; }
68 bool inputEventsEnabled() const { return m_inputEventsEnabled; }
70 void setInteractiveFormValidationEnabled(bool isEnabled) { m_isInteractiveFormValidationEnabled = isEnabled; }
71 bool interactiveFormValidationEnabled() const { return m_isInteractiveFormValidationEnabled; }
73 void setCustomElementsEnabled(bool areEnabled) { m_areCustomElementsEnabled = areEnabled; }
74 bool customElementsEnabled() const { return m_areCustomElementsEnabled; }
76 void setMenuItemElementEnabled(bool isEnabled) { m_isMenuItemElementEnabled = isEnabled; }
77 bool menuItemElementEnabled() const { return m_isMenuItemElementEnabled; }
79 void setDirectoryUploadEnabled(bool isEnabled) { m_isDirectoryUploadEnabled = isEnabled; }
80 bool directoryUploadEnabled() const { return m_isDirectoryUploadEnabled; }
82 void setDataTransferItemsEnabled(bool areEnabled) { m_areDataTransferItemsEnabled = areEnabled; }
83 bool dataTransferItemsEnabled() const { return m_areDataTransferItemsEnabled; }
85 #if ENABLE(ATTACHMENT_ELEMENT)
86 void setAttachmentElementEnabled(bool areEnabled) { m_isAttachmentElementEnabled = areEnabled; }
87 bool attachmentElementEnabled() const { return m_isAttachmentElementEnabled; }
90 void setModernMediaControlsEnabled(bool areEnabled) { m_areModernMediaControlsEnabled = areEnabled; }
91 bool modernMediaControlsEnabled() const { return m_areModernMediaControlsEnabled; }
93 void setWebAuthenticationEnabled(bool isEnabled) { m_isWebAuthenticationEnabled = isEnabled; }
94 bool webAuthenticationEnabled() const { return m_isWebAuthenticationEnabled; }
96 void setIsSecureContextAttributeEnabled(bool isEnabled) { m_isSecureContextAttributeEnabled = isEnabled; }
97 bool isSecureContextAttributeEnabled() const { return m_isSecureContextAttributeEnabled; }
99 #if ENABLE(INDEXED_DATABASE_IN_WORKERS)
100 void setIndexedDBWorkersEnabled(bool isEnabled) { m_isIndexedDBWorkersEnabled = isEnabled; }
101 bool indexedDBWorkersEnabled() const { return m_isIndexedDBWorkersEnabled; }
104 #if ENABLE(MEDIA_STREAM)
105 bool mediaDevicesEnabled() const { return m_isMediaDevicesEnabled; }
106 void setMediaDevicesEnabled(bool isEnabled) { m_isMediaDevicesEnabled = isEnabled; }
107 bool mediaStreamEnabled() const { return m_isMediaStreamEnabled; }
108 void setMediaStreamEnabled(bool isEnabled) { m_isMediaStreamEnabled = isEnabled; }
109 bool screenCaptureEnabled() const { return m_isScreenCaptureEnabled; }
110 void setScreenCaptureEnabled(bool isEnabled) { m_isScreenCaptureEnabled = isEnabled; }
114 bool peerConnectionEnabled() const { return m_isPeerConnectionEnabled; }
115 void setPeerConnectionEnabled(bool isEnabled) { m_isPeerConnectionEnabled = isEnabled; }
116 bool webRTCLegacyAPIEnabled() const { return m_webRTCLegacyAPIEnabled; }
117 void setWebRTCLegacyAPIEnabled(bool isEnabled) { m_webRTCLegacyAPIEnabled = isEnabled; }
120 #if ENABLE(LEGACY_CSS_VENDOR_PREFIXES)
121 void setLegacyCSSVendorPrefixesEnabled(bool isEnabled) { m_isLegacyCSSVendorPrefixesEnabled = isEnabled; }
122 bool legacyCSSVendorPrefixesEnabled() const { return m_isLegacyCSSVendorPrefixesEnabled; }
125 #if ENABLE(INPUT_TYPE_DATE)
126 bool inputTypeDateEnabled() const { return m_isInputTypeDateEnabled; }
127 void setInputTypeDateEnabled(bool isEnabled) { m_isInputTypeDateEnabled = isEnabled; }
130 #if ENABLE(INPUT_TYPE_DATETIME_INCOMPLETE)
131 bool inputTypeDateTimeEnabled() const { return m_isInputTypeDateTimeEnabled; }
132 void setInputTypeDateTimeEnabled(bool isEnabled) { m_isInputTypeDateTimeEnabled = isEnabled; }
135 #if ENABLE(INPUT_TYPE_DATETIMELOCAL)
136 bool inputTypeDateTimeLocalEnabled() const { return m_isInputTypeDateTimeLocalEnabled; }
137 void setInputTypeDateTimeLocalEnabled(bool isEnabled) { m_isInputTypeDateTimeLocalEnabled = isEnabled; }
140 #if ENABLE(INPUT_TYPE_MONTH)
141 bool inputTypeMonthEnabled() const { return m_isInputTypeMonthEnabled; }
142 void setInputTypeMonthEnabled(bool isEnabled) { m_isInputTypeMonthEnabled = isEnabled; }
145 #if ENABLE(INPUT_TYPE_TIME)
146 bool inputTypeTimeEnabled() const { return m_isInputTypeTimeEnabled; }
147 void setInputTypeTimeEnabled(bool isEnabled) { m_isInputTypeTimeEnabled = isEnabled; }
150 #if ENABLE(INPUT_TYPE_WEEK)
151 bool inputTypeWeekEnabled() const { return m_isInputTypeWeekEnabled; }
152 void setInputTypeWeekEnabled(bool isEnabled) { m_isInputTypeWeekEnabled = isEnabled; }
156 void setGamepadsEnabled(bool areEnabled) { m_areGamepadsEnabled = areEnabled; }
157 bool gamepadsEnabled() const { return m_areGamepadsEnabled; }
160 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
161 // FIXME: This is not used.
162 void setAnimationTriggersEnabled(bool areEnabled) { m_areAnimationTriggersEnabled = areEnabled; }
163 bool animationTriggersEnabled() const { return m_areAnimationTriggersEnabled; }
166 void setWebAnimationsEnabled(bool areEnabled) { m_areWebAnimationsEnabled = areEnabled; }
167 bool webAnimationsEnabled() const { return m_areWebAnimationsEnabled; }
170 void setWebGL2Enabled(bool isEnabled) { m_isWebGL2Enabled = isEnabled; }
171 bool webGL2Enabled() const { return m_isWebGL2Enabled; }
175 void setWebGPUEnabled(bool isEnabled) { m_isWebGPUEnabled = isEnabled; }
176 bool webGPUEnabled() const { return m_isWebGPUEnabled; }
179 void setImageBitmapOffscreenCanvasEnabled(bool isEnabled) { m_isImageBitmapOffscreenCanvasEnabled = isEnabled; }
180 bool imageBitmapOffscreenCanvasEnabled() const { return m_isImageBitmapOffscreenCanvasEnabled; }
182 void setCacheAPIEnabled(bool isEnabled) { m_isCacheAPIEnabled = isEnabled; }
183 bool cacheAPIEnabled() const { return m_isCacheAPIEnabled; }
185 void setFetchAPIEnabled(bool isEnabled) { m_isFetchAPIEnabled = isEnabled; }
186 bool fetchAPIEnabled() const { return m_isFetchAPIEnabled; }
188 #if ENABLE(STREAMS_API)
189 void setReadableByteStreamAPIEnabled(bool isEnabled) { m_isReadableByteStreamAPIEnabled = isEnabled; }
190 bool readableByteStreamAPIEnabled() const { return m_isReadableByteStreamAPIEnabled; }
191 void setWritableStreamAPIEnabled(bool isEnabled) { m_isWritableStreamAPIEnabled = isEnabled; }
192 bool writableStreamAPIEnabled() const { return m_isWritableStreamAPIEnabled; }
195 #if ENABLE(DOWNLOAD_ATTRIBUTE)
196 void setDownloadAttributeEnabled(bool isEnabled) { m_isDownloadAttributeEnabled = isEnabled; }
197 bool downloadAttributeEnabled() const { return m_isDownloadAttributeEnabled; }
200 void setCSSGridLayoutEnabled(bool isEnabled) { m_cssGridLayoutEnabled = isEnabled; }
201 bool isCSSGridLayoutEnabled() const { return m_cssGridLayoutEnabled; }
203 #if ENABLE(INTERSECTION_OBSERVER)
204 void setIntersectionObserverEnabled(bool isEnabled) { m_intersectionObserverEnabled = isEnabled; }
205 bool intersectionObserverEnabled() const { return m_intersectionObserverEnabled; }
208 #if ENABLE(ENCRYPTED_MEDIA)
209 void setEncryptedMediaAPIEnabled(bool isEnabled) { m_encryptedMediaAPIEnabled = isEnabled; }
210 bool encryptedMediaAPIEnabled() const { return m_encryptedMediaAPIEnabled; }
213 #if ENABLE(LEGACY_ENCRYPTED_MEDIA)
214 void setLegacyEncryptedMediaAPIEnabled(bool isEnabled) { m_legacyEncryptedMediaAPIEnabled = isEnabled; }
215 bool legacyEncryptedMediaAPIEnabled() const { return m_legacyEncryptedMediaAPIEnabled; }
218 #if ENABLE(SERVICE_WORKER)
219 bool serviceWorkerEnabled() const { return m_serviceWorkerEnabled; }
220 void setServiceWorkerEnabled(bool isEnabled) { m_serviceWorkerEnabled = isEnabled; }
223 bool spectreGadgetsEnabled() const;
226 bool audioEnabled() const;
229 void setInspectorAdditionsEnabled(bool isEnabled) { m_inspectorAdditionsEnabled = isEnabled; }
230 bool inspectorAdditionsEnabled() const { return m_inspectorAdditionsEnabled; }
232 void setWebVREnabled(bool isEnabled) { m_webVREnabled = isEnabled; }
233 bool webVREnabled() const { return m_webVREnabled; }
235 void setAccessibilityObjectModelEnabled(bool isEnabled) { m_accessibilityObjectModelEnabled = isEnabled; }
236 bool accessibilityObjectModelEnabled() const { return m_accessibilityObjectModelEnabled; }
238 void setMediaCapabilitiesEnabled(bool isEnabled) { m_mediaCapabilitiesEnabled = isEnabled; }
239 bool mediaCapabilitiesEnabled() const { return m_mediaCapabilitiesEnabled; }
241 WEBCORE_EXPORT static RuntimeEnabledFeatures& sharedFeatures();
244 // Never instantiate.
245 RuntimeEnabledFeatures();
247 bool m_areModernMediaControlsEnabled { false };
248 bool m_isLinkPreloadEnabled { true };
249 bool m_isMediaPreloadingEnabled { false };
250 bool m_isResourceTimingEnabled { false };
251 bool m_isUserTimingEnabled { false };
252 bool m_isInteractiveFormValidationEnabled { false };
253 bool m_isWebAuthenticationEnabled { false };
254 bool m_isSecureContextAttributeEnabled { false };
256 bool m_isDisplayContentsEnabled { true };
257 bool m_isShadowDOMEnabled { true };
258 bool m_areCustomElementsEnabled { true };
259 bool m_isMenuItemElementEnabled { false };
260 bool m_isDirectoryUploadEnabled { false };
261 bool m_areDataTransferItemsEnabled { false };
262 bool m_inputEventsEnabled { true };
264 #if ENABLE(ATTACHMENT_ELEMENT)
265 bool m_isAttachmentElementEnabled { false };
268 #if ENABLE(INDEXED_DATABASE_IN_WORKERS)
269 bool m_isIndexedDBWorkersEnabled { true };
272 #if ENABLE(MEDIA_STREAM)
273 bool m_isMediaDevicesEnabled { false };
274 bool m_isMediaStreamEnabled { true };
275 bool m_isScreenCaptureEnabled { false };
279 bool m_isPeerConnectionEnabled { true };
280 bool m_webRTCLegacyAPIEnabled { true };
283 #if ENABLE(LEGACY_CSS_VENDOR_PREFIXES)
284 bool m_isLegacyCSSVendorPrefixesEnabled { false };
287 #if ENABLE(INPUT_TYPE_DATE)
288 bool m_isInputTypeDateEnabled { true };
291 #if ENABLE(INPUT_TYPE_DATETIME_INCOMPLETE)
292 bool m_isInputTypeDateTimeEnabled { false };
295 #if ENABLE(INPUT_TYPE_DATETIMELOCAL)
296 bool m_isInputTypeDateTimeLocalEnabled { true };
299 #if ENABLE(INPUT_TYPE_MONTH)
300 bool m_isInputTypeMonthEnabled { true };
303 #if ENABLE(INPUT_TYPE_TIME)
304 bool m_isInputTypeTimeEnabled { true };
307 #if ENABLE(INPUT_TYPE_WEEK)
308 bool m_isInputTypeWeekEnabled { true };
312 bool m_areGamepadsEnabled { false };
315 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
316 bool m_areAnimationTriggersEnabled { false };
319 #if ENABLE(STREAMS_API)
320 bool m_isReadableByteStreamAPIEnabled { false };
321 bool m_isWritableStreamAPIEnabled { false };
324 bool m_areWebAnimationsEnabled { false };
327 bool m_isWebGL2Enabled { false };
331 bool m_isWebGPUEnabled { false };
334 bool m_isImageBitmapOffscreenCanvasEnabled { true };
336 bool m_isCacheAPIEnabled { false };
337 bool m_isFetchAPIEnabled { true };
339 #if ENABLE(DOWNLOAD_ATTRIBUTE)
340 bool m_isDownloadAttributeEnabled { false };
343 bool m_cssGridLayoutEnabled { true };
345 #if ENABLE(ENCRYPTED_MEDIA)
346 bool m_encryptedMediaAPIEnabled { false };
349 #if ENABLE(LEGACY_ENCRYPTED_MEDIA)
350 bool m_legacyEncryptedMediaAPIEnabled { false };
353 #if ENABLE(INTERSECTION_OBSERVER)
354 bool m_intersectionObserverEnabled { false };
357 #if ENABLE(SERVICE_WORKER)
358 bool m_serviceWorkerEnabled { false };
361 bool m_inspectorAdditionsEnabled { false };
362 bool m_webVREnabled { false };
364 bool m_accessibilityObjectModelEnabled { false };
366 bool m_mediaCapabilitiesEnabled { false };
368 friend class WTF::NeverDestroyed<RuntimeEnabledFeatures>;
371 } // namespace WebCore