93d572c19cc929e5f6f80ebbdd0a19e0799ea7f5
[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/Forward.h>
36 #include <wtf/Noncopyable.h>
37
38 namespace 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
44 class RuntimeEnabledFeatures {
45     WTF_MAKE_NONCOPYABLE(RuntimeEnabledFeatures);
46 public:
47     void setDisplayContentsEnabled(bool isEnabled) { m_isDisplayContentsEnabled = isEnabled; }
48     bool displayContentsEnabled() const { return m_isDisplayContentsEnabled; }
49
50     void setLinkPreloadEnabled(bool isEnabled) { m_isLinkPreloadEnabled = isEnabled; }
51     bool linkPreloadEnabled() const { return m_isLinkPreloadEnabled; }
52
53     void setMediaPreloadingEnabled(bool isEnabled) { m_isMediaPreloadingEnabled = isEnabled; }
54     bool mediaPreloadingEnabled() const { return m_isMediaPreloadingEnabled; }
55
56     void setResourceTimingEnabled(bool isEnabled) { m_isResourceTimingEnabled = isEnabled; }
57     bool resourceTimingEnabled() const { return m_isResourceTimingEnabled; }
58
59     void setUserTimingEnabled(bool isEnabled) { m_isUserTimingEnabled = isEnabled; }
60     bool userTimingEnabled() const { return m_isUserTimingEnabled; }
61
62     bool performanceTimelineEnabled() const { return resourceTimingEnabled() || userTimingEnabled(); }
63
64     void setShadowDOMEnabled(bool isEnabled) { m_isShadowDOMEnabled = isEnabled; }
65     bool shadowDOMEnabled() const { return m_isShadowDOMEnabled; }
66
67     void setInputEventsEnabled(bool isEnabled) { m_inputEventsEnabled = isEnabled; }
68     bool inputEventsEnabled() const { return m_inputEventsEnabled; }
69
70     void setInteractiveFormValidationEnabled(bool isEnabled) { m_isInteractiveFormValidationEnabled = isEnabled; }
71     bool interactiveFormValidationEnabled() const { return m_isInteractiveFormValidationEnabled; }
72
73     void setCustomElementsEnabled(bool areEnabled) { m_areCustomElementsEnabled = areEnabled; }
74     bool customElementsEnabled() const { return m_areCustomElementsEnabled; }
75
76     void setMenuItemElementEnabled(bool isEnabled) { m_isMenuItemElementEnabled = isEnabled; }
77     bool menuItemElementEnabled() const { return m_isMenuItemElementEnabled; }
78     
79     void setDirectoryUploadEnabled(bool isEnabled) { m_isDirectoryUploadEnabled = isEnabled; }
80     bool directoryUploadEnabled() const { return m_isDirectoryUploadEnabled; }
81
82     void setDataTransferItemsEnabled(bool areEnabled) { m_areDataTransferItemsEnabled = areEnabled; }
83     bool dataTransferItemsEnabled() const { return m_areDataTransferItemsEnabled; }
84
85     void setCustomPasteboardDataEnabled(bool isEnabled) { m_isCustomPasteboardDataEnabled = isEnabled; }
86     bool customPasteboardDataEnabled() const { return m_isCustomPasteboardDataEnabled; }
87
88 #if ENABLE(ATTACHMENT_ELEMENT)
89     void setAttachmentElementEnabled(bool areEnabled) { m_isAttachmentElementEnabled = areEnabled; }
90     bool attachmentElementEnabled() const { return m_isAttachmentElementEnabled; }
91 #endif
92
93     void setModernMediaControlsEnabled(bool areEnabled) { m_areModernMediaControlsEnabled = areEnabled; }
94     bool modernMediaControlsEnabled() const { return m_areModernMediaControlsEnabled; }
95
96     void setWebAuthenticationEnabled(bool isEnabled) { m_isWebAuthenticationEnabled = isEnabled; }
97     bool webAuthenticationEnabled() const { return m_isWebAuthenticationEnabled; }
98
99     void setIsSecureContextAttributeEnabled(bool isEnabled) { m_isSecureContextAttributeEnabled = isEnabled; }
100     bool isSecureContextAttributeEnabled() const { return m_isSecureContextAttributeEnabled; }
101
102 #if ENABLE(INDEXED_DATABASE_IN_WORKERS)
103     void setIndexedDBWorkersEnabled(bool isEnabled) { m_isIndexedDBWorkersEnabled = isEnabled; }
104     bool indexedDBWorkersEnabled() const { return m_isIndexedDBWorkersEnabled; }
105 #endif
106
107 #if ENABLE(MEDIA_STREAM)
108     bool mediaDevicesEnabled() const { return m_isMediaDevicesEnabled; }
109     void setMediaDevicesEnabled(bool isEnabled) { m_isMediaDevicesEnabled = isEnabled; }
110     bool mediaStreamEnabled() const { return m_isMediaStreamEnabled; }
111     void setMediaStreamEnabled(bool isEnabled) { m_isMediaStreamEnabled = isEnabled; }
112     bool screenCaptureEnabled() const { return m_isScreenCaptureEnabled; }
113     void setScreenCaptureEnabled(bool isEnabled) { m_isScreenCaptureEnabled = isEnabled; }
114 #endif
115
116 #if ENABLE(WEB_RTC)
117     bool peerConnectionEnabled() const { return m_isPeerConnectionEnabled; }
118     void setPeerConnectionEnabled(bool isEnabled) { m_isPeerConnectionEnabled = isEnabled; }
119     bool webRTCLegacyAPIEnabled() const { return m_webRTCLegacyAPIEnabled; }
120     void setWebRTCLegacyAPIEnabled(bool isEnabled) { m_webRTCLegacyAPIEnabled = isEnabled; }
121 #endif
122
123 #if ENABLE(LEGACY_CSS_VENDOR_PREFIXES)
124     void setLegacyCSSVendorPrefixesEnabled(bool isEnabled) { m_isLegacyCSSVendorPrefixesEnabled = isEnabled; }
125     bool legacyCSSVendorPrefixesEnabled() const { return m_isLegacyCSSVendorPrefixesEnabled; }
126 #endif
127
128 #if ENABLE(INPUT_TYPE_DATE)
129     bool inputTypeDateEnabled() const { return m_isInputTypeDateEnabled; }
130     void setInputTypeDateEnabled(bool isEnabled) { m_isInputTypeDateEnabled = isEnabled; }
131 #endif
132
133 #if ENABLE(INPUT_TYPE_DATETIME_INCOMPLETE)
134     bool inputTypeDateTimeEnabled() const { return m_isInputTypeDateTimeEnabled; }
135     void setInputTypeDateTimeEnabled(bool isEnabled) { m_isInputTypeDateTimeEnabled = isEnabled; }
136 #endif
137
138 #if ENABLE(INPUT_TYPE_DATETIMELOCAL)
139     bool inputTypeDateTimeLocalEnabled() const { return m_isInputTypeDateTimeLocalEnabled; }
140     void setInputTypeDateTimeLocalEnabled(bool isEnabled) { m_isInputTypeDateTimeLocalEnabled = isEnabled; }
141 #endif
142
143 #if ENABLE(INPUT_TYPE_MONTH)
144     bool inputTypeMonthEnabled() const { return m_isInputTypeMonthEnabled; }
145     void setInputTypeMonthEnabled(bool isEnabled) { m_isInputTypeMonthEnabled = isEnabled; }
146 #endif
147
148 #if ENABLE(INPUT_TYPE_TIME)
149     bool inputTypeTimeEnabled() const { return m_isInputTypeTimeEnabled; }
150     void setInputTypeTimeEnabled(bool isEnabled) { m_isInputTypeTimeEnabled = isEnabled; }
151 #endif
152
153 #if ENABLE(INPUT_TYPE_WEEK)
154     bool inputTypeWeekEnabled() const { return m_isInputTypeWeekEnabled; }
155     void setInputTypeWeekEnabled(bool isEnabled) { m_isInputTypeWeekEnabled = isEnabled; }
156 #endif
157
158 #if ENABLE(GAMEPAD)
159     void setGamepadsEnabled(bool areEnabled) { m_areGamepadsEnabled = areEnabled; }
160     bool gamepadsEnabled() const { return m_areGamepadsEnabled; }
161 #endif
162
163 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
164     // FIXME: This is not used.
165     void setAnimationTriggersEnabled(bool areEnabled) { m_areAnimationTriggersEnabled = areEnabled; }
166     bool animationTriggersEnabled() const { return m_areAnimationTriggersEnabled; }
167 #endif
168
169     void setWebAnimationsEnabled(bool areEnabled) { m_areWebAnimationsEnabled = areEnabled; }
170     bool webAnimationsEnabled() const { return m_areWebAnimationsEnabled; }
171
172 #if ENABLE(WEBGL2)
173     void setWebGL2Enabled(bool isEnabled) { m_isWebGL2Enabled = isEnabled; }
174     bool webGL2Enabled() const { return m_isWebGL2Enabled; }
175 #endif
176
177 #if ENABLE(WEBGPU)
178     void setWebGPUEnabled(bool isEnabled) { m_isWebGPUEnabled = isEnabled; }
179     bool webGPUEnabled() const { return m_isWebGPUEnabled; }
180 #endif
181
182     void setImageBitmapOffscreenCanvasEnabled(bool isEnabled) { m_isImageBitmapOffscreenCanvasEnabled = isEnabled; }
183     bool imageBitmapOffscreenCanvasEnabled() const { return m_isImageBitmapOffscreenCanvasEnabled; }
184
185     void setCacheAPIEnabled(bool isEnabled) { m_isCacheAPIEnabled = isEnabled; }
186     bool cacheAPIEnabled() const { return m_isCacheAPIEnabled; }
187
188     void setFetchAPIEnabled(bool isEnabled) { m_isFetchAPIEnabled = isEnabled; }
189     bool fetchAPIEnabled() const { return m_isFetchAPIEnabled; }
190     
191 #if ENABLE(STREAMS_API)
192     void setReadableByteStreamAPIEnabled(bool isEnabled) { m_isReadableByteStreamAPIEnabled = isEnabled; }
193     bool readableByteStreamAPIEnabled() const { return m_isReadableByteStreamAPIEnabled; }
194     void setWritableStreamAPIEnabled(bool isEnabled) { m_isWritableStreamAPIEnabled = isEnabled; }
195     bool writableStreamAPIEnabled() const { return m_isWritableStreamAPIEnabled; }
196 #endif
197     
198 #if ENABLE(DOWNLOAD_ATTRIBUTE)
199     void setDownloadAttributeEnabled(bool isEnabled) { m_isDownloadAttributeEnabled = isEnabled; }
200     bool downloadAttributeEnabled() const { return m_isDownloadAttributeEnabled; }
201 #endif
202
203     void setCSSGridLayoutEnabled(bool isEnabled) { m_cssGridLayoutEnabled = isEnabled; }
204     bool isCSSGridLayoutEnabled() const { return m_cssGridLayoutEnabled; }
205
206 #if ENABLE(INTERSECTION_OBSERVER)
207     void setIntersectionObserverEnabled(bool isEnabled) { m_intersectionObserverEnabled = isEnabled; }
208     bool intersectionObserverEnabled() const { return m_intersectionObserverEnabled; }
209 #endif
210
211 #if ENABLE(ENCRYPTED_MEDIA)
212     void setEncryptedMediaAPIEnabled(bool isEnabled) { m_encryptedMediaAPIEnabled = isEnabled; }
213     bool encryptedMediaAPIEnabled() const { return m_encryptedMediaAPIEnabled; }
214 #endif
215
216 #if ENABLE(LEGACY_ENCRYPTED_MEDIA)
217     void setLegacyEncryptedMediaAPIEnabled(bool isEnabled) { m_legacyEncryptedMediaAPIEnabled = isEnabled; }
218     bool legacyEncryptedMediaAPIEnabled() const { return m_legacyEncryptedMediaAPIEnabled; }
219 #endif
220
221 #if ENABLE(SERVICE_WORKER)
222     bool serviceWorkerEnabled() const { return m_serviceWorkerEnabled; }
223     void setServiceWorkerEnabled(bool isEnabled) { m_serviceWorkerEnabled = isEnabled; }
224 #endif
225
226     bool fetchAPIKeepAliveEnabled() const { return m_fetchAPIKeepAliveEnabled; }
227     void setFetchAPIKeepAliveEnabled(bool isEnabled) { m_fetchAPIKeepAliveEnabled = isEnabled; }
228
229     bool spectreGadgetsEnabled() const;
230
231 #if ENABLE(VIDEO)
232     bool audioEnabled() const;
233 #endif
234
235     void setInspectorAdditionsEnabled(bool isEnabled) { m_inspectorAdditionsEnabled = isEnabled; }
236     bool inspectorAdditionsEnabled() const { return m_inspectorAdditionsEnabled; }
237
238     void setWebVREnabled(bool isEnabled) { m_webVREnabled = isEnabled; }
239     bool webVREnabled() const { return m_webVREnabled; }
240
241     void setAccessibilityObjectModelEnabled(bool isEnabled) { m_accessibilityObjectModelEnabled = isEnabled; }
242     bool accessibilityObjectModelEnabled() const { return m_accessibilityObjectModelEnabled; }
243
244     void setMediaCapabilitiesEnabled(bool isEnabled) { m_mediaCapabilitiesEnabled = isEnabled; }
245     bool mediaCapabilitiesEnabled() const { return m_mediaCapabilitiesEnabled; }
246
247     WEBCORE_EXPORT static RuntimeEnabledFeatures& sharedFeatures();
248
249 private:
250     // Never instantiate.
251     RuntimeEnabledFeatures();
252
253     bool m_areModernMediaControlsEnabled { false };
254     bool m_isLinkPreloadEnabled { true };
255     bool m_isMediaPreloadingEnabled { false };
256     bool m_isResourceTimingEnabled { false };
257     bool m_isUserTimingEnabled { false };
258     bool m_isInteractiveFormValidationEnabled { false };
259     bool m_isWebAuthenticationEnabled { false };
260     bool m_isSecureContextAttributeEnabled { false };
261
262     bool m_isDisplayContentsEnabled { true };
263     bool m_isShadowDOMEnabled { true };
264     bool m_areCustomElementsEnabled { true };
265     bool m_isMenuItemElementEnabled { false };
266     bool m_isDirectoryUploadEnabled { false };
267     bool m_areDataTransferItemsEnabled { false };
268     bool m_isCustomPasteboardDataEnabled { false };
269     bool m_inputEventsEnabled { true };
270
271 #if ENABLE(ATTACHMENT_ELEMENT)
272     bool m_isAttachmentElementEnabled { false };
273 #endif
274
275 #if ENABLE(INDEXED_DATABASE_IN_WORKERS)
276     bool m_isIndexedDBWorkersEnabled { true };
277 #endif
278
279 #if ENABLE(MEDIA_STREAM)
280     bool m_isMediaDevicesEnabled { false };
281     bool m_isMediaStreamEnabled { true };
282     bool m_isScreenCaptureEnabled { false };
283 #endif
284
285 #if ENABLE(WEB_RTC)
286     bool m_isPeerConnectionEnabled { true };
287     bool m_webRTCLegacyAPIEnabled { false };
288 #endif
289
290 #if ENABLE(LEGACY_CSS_VENDOR_PREFIXES)
291     bool m_isLegacyCSSVendorPrefixesEnabled { false };
292 #endif
293
294 #if ENABLE(INPUT_TYPE_DATE)
295     bool m_isInputTypeDateEnabled { true };
296 #endif
297
298 #if ENABLE(INPUT_TYPE_DATETIME_INCOMPLETE)
299     bool m_isInputTypeDateTimeEnabled { false };
300 #endif
301
302 #if ENABLE(INPUT_TYPE_DATETIMELOCAL)
303     bool m_isInputTypeDateTimeLocalEnabled { true };
304 #endif
305
306 #if ENABLE(INPUT_TYPE_MONTH)
307     bool m_isInputTypeMonthEnabled { true };
308 #endif
309
310 #if ENABLE(INPUT_TYPE_TIME)
311     bool m_isInputTypeTimeEnabled { true };
312 #endif
313
314 #if ENABLE(INPUT_TYPE_WEEK)
315     bool m_isInputTypeWeekEnabled { true };
316 #endif
317
318 #if ENABLE(GAMEPAD)
319     bool m_areGamepadsEnabled { false };
320 #endif
321
322 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
323     bool m_areAnimationTriggersEnabled { false };
324 #endif
325
326 #if ENABLE(STREAMS_API)
327     bool m_isReadableByteStreamAPIEnabled { false };
328     bool m_isWritableStreamAPIEnabled { false };
329 #endif
330
331     bool m_areWebAnimationsEnabled { false };
332
333 #if ENABLE(WEBGL2)
334     bool m_isWebGL2Enabled { false };
335 #endif
336
337 #if ENABLE(WEBGPU)
338     bool m_isWebGPUEnabled { false };
339 #endif
340
341     bool m_isImageBitmapOffscreenCanvasEnabled { true };
342
343     bool m_isCacheAPIEnabled { false };
344     bool m_isFetchAPIEnabled { true };
345
346 #if ENABLE(DOWNLOAD_ATTRIBUTE)
347     bool m_isDownloadAttributeEnabled { false };
348 #endif
349
350     bool m_cssGridLayoutEnabled { true };
351
352 #if ENABLE(ENCRYPTED_MEDIA)
353     bool m_encryptedMediaAPIEnabled { false };
354 #endif
355
356 #if ENABLE(LEGACY_ENCRYPTED_MEDIA)
357     bool m_legacyEncryptedMediaAPIEnabled { false };
358 #endif
359
360 #if ENABLE(INTERSECTION_OBSERVER)
361     bool m_intersectionObserverEnabled { false };
362 #endif
363
364 #if ENABLE(SERVICE_WORKER)
365     bool m_serviceWorkerEnabled { false };
366 #endif
367     bool m_fetchAPIKeepAliveEnabled { false };
368
369     bool m_inspectorAdditionsEnabled { false };
370     bool m_webVREnabled { false };
371
372     bool m_accessibilityObjectModelEnabled { false };
373
374     bool m_mediaCapabilitiesEnabled { false };
375
376     friend class WTF::NeverDestroyed<RuntimeEnabledFeatures>;
377 };
378
379 } // namespace WebCore