Adding a runtime flag specific to MediaDevices
[WebKit-https.git] / Source / WebCore / page / RuntimeEnabledFeatures.h
1 /*
2  * Copyright (C) 2009 Google Inc. All rights reserved.
3  * Copyright (C) 2013-2017 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 #pragma once
33
34 #include "PlatformExportMacros.h"
35 #include <wtf/NeverDestroyed.h>
36
37 namespace WebCore {
38
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.
42
43 class RuntimeEnabledFeatures {
44     WTF_MAKE_NONCOPYABLE(RuntimeEnabledFeatures);
45 public:
46     void setDOMIteratorEnabled(bool isEnabled) { m_isDOMIteratorEnabled = isEnabled; }
47     bool domIteratorEnabled() const { return m_isDOMIteratorEnabled; }
48
49     void setGeolocationEnabled(bool isEnabled) { m_isGeolocationEnabled = isEnabled; }
50     bool geolocationEnabled() const { return m_isGeolocationEnabled; }
51
52     void setLinkPreloadEnabled(bool isEnabled) { m_isLinkPreloadEnabled = isEnabled; }
53     bool linkPreloadEnabled() const { return m_isLinkPreloadEnabled; }
54
55     void setResourceTimingEnabled(bool isEnabled) { m_isResourceTimingEnabled = isEnabled; }
56     bool resourceTimingEnabled() const { return m_isResourceTimingEnabled; }
57
58     void setUserTimingEnabled(bool isEnabled) { m_isUserTimingEnabled = isEnabled; }
59     bool userTimingEnabled() const { return m_isUserTimingEnabled; }
60
61     bool performanceTimelineEnabled() const { return resourceTimingEnabled() || userTimingEnabled(); }
62
63     void setShadowDOMEnabled(bool isEnabled) { m_isShadowDOMEnabled = isEnabled; }
64     bool shadowDOMEnabled() const { return m_isShadowDOMEnabled; }
65
66     void setInputEventsEnabled(bool isEnabled) { m_inputEventsEnabled = isEnabled; }
67     bool inputEventsEnabled() const { return m_inputEventsEnabled; }
68
69     void setInteractiveFormValidationEnabled(bool isEnabled) { m_isInteractiveFormValidationEnabled = isEnabled; }
70     bool interactiveFormValidationEnabled() const { return m_isInteractiveFormValidationEnabled; }
71
72     void setCustomElementsEnabled(bool areEnabled) { m_areCustomElementsEnabled = areEnabled; }
73     bool customElementsEnabled() const { return m_areCustomElementsEnabled; }
74
75     void setModernMediaControlsEnabled(bool areEnabled) { m_areModernMediaControlsEnabled = areEnabled; }
76     bool modernMediaControlsEnabled() const { return m_areModernMediaControlsEnabled; }
77
78     void setCredentialManagementEnabled(bool isEnabled) { m_isCredentialManagementEnabled = isEnabled; }
79     bool credentialManagementEnabled() const { return m_isCredentialManagementEnabled; }
80
81 #if ENABLE(INDEXED_DATABASE_IN_WORKERS)
82     void setIndexedDBWorkersEnabled(bool isEnabled) { m_isIndexedDBWorkersEnabled = isEnabled; }
83     bool indexedDBWorkersEnabled() const { return m_isIndexedDBWorkersEnabled; }
84 #endif
85
86 #if ENABLE(FONT_LOAD_EVENTS)
87     void setFontLoadEventsEnabled(bool isEnabled) { m_isFontLoadEventsEnabled = isEnabled; }
88     bool fontLoadEventsEnabled() const { return m_isFontLoadEventsEnabled; }
89 #endif
90
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; }
96 #endif
97
98 #if ENABLE(WEB_RTC)
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; }
103 #endif
104
105 #if ENABLE(LEGACY_CSS_VENDOR_PREFIXES)
106     void setLegacyCSSVendorPrefixesEnabled(bool isEnabled) { m_isLegacyCSSVendorPrefixesEnabled = isEnabled; }
107     bool legacyCSSVendorPrefixesEnabled() const { return m_isLegacyCSSVendorPrefixesEnabled; }
108 #endif
109
110 #if ENABLE(INPUT_TYPE_DATE)
111     bool inputTypeDateEnabled() const { return m_isInputTypeDateEnabled; }
112     void setInputTypeDateEnabled(bool isEnabled) { m_isInputTypeDateEnabled = isEnabled; }
113 #endif
114
115 #if ENABLE(INPUT_TYPE_DATETIME_INCOMPLETE)
116     bool inputTypeDateTimeEnabled() const { return m_isInputTypeDateTimeEnabled; }
117     void setInputTypeDateTimeEnabled(bool isEnabled) { m_isInputTypeDateTimeEnabled = isEnabled; }
118 #endif
119
120 #if ENABLE(INPUT_TYPE_DATETIMELOCAL)
121     bool inputTypeDateTimeLocalEnabled() const { return m_isInputTypeDateTimeLocalEnabled; }
122     void setInputTypeDateTimeLocalEnabled(bool isEnabled) { m_isInputTypeDateTimeLocalEnabled = isEnabled; }
123 #endif
124
125 #if ENABLE(INPUT_TYPE_MONTH)
126     bool inputTypeMonthEnabled() const { return m_isInputTypeMonthEnabled; }
127     void setInputTypeMonthEnabled(bool isEnabled) { m_isInputTypeMonthEnabled = isEnabled; }
128 #endif
129
130 #if ENABLE(INPUT_TYPE_TIME)
131     bool inputTypeTimeEnabled() const { return m_isInputTypeTimeEnabled; }
132     void setInputTypeTimeEnabled(bool isEnabled) { m_isInputTypeTimeEnabled = isEnabled; }
133 #endif
134
135 #if ENABLE(INPUT_TYPE_WEEK)
136     bool inputTypeWeekEnabled() const { return m_isInputTypeWeekEnabled; }
137     void setInputTypeWeekEnabled(bool isEnabled) { m_isInputTypeWeekEnabled = isEnabled; }
138 #endif
139
140 #if ENABLE(GAMEPAD)
141     void setGamepadsEnabled(bool areEnabled) { m_areGamepadsEnabled = areEnabled; }
142     bool gamepadsEnabled() const { return m_areGamepadsEnabled; }
143 #endif
144
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; }
149 #endif
150
151 #if ENABLE(WEB_ANIMATIONS)
152     void setWebAnimationsEnabled(bool areEnabled) { m_areWebAnimationsEnabled = areEnabled; }
153     bool webAnimationsEnabled() const { return m_areWebAnimationsEnabled; }
154 #endif
155
156 #if ENABLE(WEBGL2)
157     void setWebGL2Enabled(bool isEnabled) { m_isWebGL2Enabled = isEnabled; }
158     bool webGL2Enabled() const { return m_isWebGL2Enabled; }
159 #endif
160
161 #if ENABLE(WEBGPU)
162     void setWebGPUEnabled(bool isEnabled) { m_isWebGPUEnabled = isEnabled; }
163     bool webGPUEnabled() const { return m_isWebGPUEnabled; }
164 #endif
165
166 #if ENABLE(FETCH_API)
167     void setFetchAPIEnabled(bool isEnabled) { m_isFetchAPIEnabled = isEnabled; }
168     bool fetchAPIEnabled() const { return m_isFetchAPIEnabled; }
169 #endif
170     
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; }
176 #endif
177     
178 #if ENABLE(DOWNLOAD_ATTRIBUTE)
179     void setDownloadAttributeEnabled(bool isEnabled) { m_isDownloadAttributeEnabled = isEnabled; }
180     bool downloadAttributeEnabled() const { return m_isDownloadAttributeEnabled; }
181 #endif
182
183     void setCSSGridLayoutEnabled(bool isEnabled) { m_cssGridLayoutEnabled = isEnabled; }
184     bool isCSSGridLayoutEnabled() const { return m_cssGridLayoutEnabled; }
185
186 #if ENABLE(INTERSECTION_OBSERVER)
187     void setIntersectionObserverEnabled(bool isEnabled) { m_intersectionObserverEnabled = isEnabled; }
188     bool intersectionObserverEnabled() const { return m_intersectionObserverEnabled; }
189 #endif
190
191 #if ENABLE(ENCRYPTED_MEDIA)
192     void setEncryptedMediaAPIEnabled(bool isEnabled) { m_encryptedMediaAPIEnabled = isEnabled; }
193     bool encryptedMediaAPIEnabled() const { return m_encryptedMediaAPIEnabled; }
194 #endif
195
196 #if ENABLE(SUBTLE_CRYPTO)
197     void setSubtleCryptoEnabled(bool isEnabled) { m_isSubtleCryptoEnabled = isEnabled; }
198     bool subtleCryptoEnabled() const { return m_isSubtleCryptoEnabled; }
199 #endif
200
201 #if ENABLE(VIDEO)
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;
210 #endif
211
212 #if ENABLE(WEB_SOCKETS)
213     bool webSocketEnabled() const;
214 #endif
215
216     WEBCORE_EXPORT static RuntimeEnabledFeatures& sharedFeatures();
217
218 private:
219     // Never instantiate.
220     RuntimeEnabledFeatures();
221
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 };
228
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 };
234
235 #if ENABLE(INDEXED_DATABASE_IN_WORKERS)
236     bool m_isIndexedDBWorkersEnabled { true };
237 #endif
238
239 #if ENABLE(MEDIA_STREAM)
240     bool m_isMediaDevicesEnabled { false };
241     bool m_isMediaStreamEnabled { true };
242 #endif
243
244 #if ENABLE(WEB_RTC)
245     bool m_isPeerConnectionEnabled { true };
246     bool m_webRTCLegacyAPIEnabled { true };
247 #endif
248
249 #if ENABLE(LEGACY_CSS_VENDOR_PREFIXES)
250     bool m_isLegacyCSSVendorPrefixesEnabled { false };
251 #endif
252
253 #if ENABLE(INPUT_TYPE_DATE)
254     bool m_isInputTypeDateEnabled { true };
255 #endif
256
257 #if ENABLE(INPUT_TYPE_DATETIME_INCOMPLETE)
258     bool m_isInputTypeDateTimeEnabled { false };
259 #endif
260
261 #if ENABLE(INPUT_TYPE_DATETIMELOCAL)
262     bool m_isInputTypeDateTimeLocalEnabled { true };
263 #endif
264
265 #if ENABLE(INPUT_TYPE_MONTH)
266     bool m_isInputTypeMonthEnabled { true };
267 #endif
268
269 #if ENABLE(INPUT_TYPE_TIME)
270     bool m_isInputTypeTimeEnabled { true };
271 #endif
272
273 #if ENABLE(INPUT_TYPE_WEEK)
274     bool m_isInputTypeWeekEnabled { true };
275 #endif
276
277 #if ENABLE(FONT_LOAD_EVENTS)
278     bool m_isFontLoadEventsEnabled { true };
279 #endif
280
281 #if ENABLE(GAMEPAD)
282     bool m_areGamepadsEnabled { false };
283 #endif
284
285 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
286     bool m_areAnimationTriggersEnabled { false };
287 #endif
288
289 #if ENABLE(STREAMS_API)
290     bool m_isReadableByteStreamAPIEnabled { false };
291     bool m_isWritableStreamAPIEnabled { false };
292 #endif
293
294 #if ENABLE(WEB_ANIMATIONS)
295     bool m_areWebAnimationsEnabled { false };
296 #endif
297
298 #if ENABLE(WEBGL2)
299     bool m_isWebGL2Enabled { false };
300 #endif
301
302 #if ENABLE(WEBGPU)
303     bool m_isWebGPUEnabled { false };
304 #endif
305
306 #if ENABLE(FETCH_API)
307     bool m_isFetchAPIEnabled { true };
308 #endif
309
310 #if ENABLE(DOWNLOAD_ATTRIBUTE)
311     bool m_isDownloadAttributeEnabled { false };
312 #endif
313
314     bool m_cssGridLayoutEnabled { true };
315
316 #if ENABLE(ENCRYPTED_MEDIA)
317     bool m_encryptedMediaAPIEnabled { false };
318 #endif
319
320 #if ENABLE(INTERSECTION_OBSERVER)
321     bool m_intersectionObserverEnabled { false };
322 #endif
323
324 #if ENABLE(SUBTLE_CRYPTO)
325     bool m_isSubtleCryptoEnabled { true };
326 #endif
327
328     friend class WTF::NeverDestroyed<RuntimeEnabledFeatures>;
329 };
330
331 } // namespace WebCore