b993698fcb7483848d626d461366d1525e1521ef
[WebKit-https.git] / Source / WebCore / page / RuntimeEnabledFeatures.h
1 /*
2  * Copyright (C) 2009 Google Inc. All rights reserved.
3  * Copyright (C) 2013-2016 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 setLocalStorageEnabled(bool isEnabled) { m_isLocalStorageEnabled = isEnabled; }
47     bool localStorageEnabled() const { return m_isLocalStorageEnabled; }
48
49     void setSessionStorageEnabled(bool isEnabled) { m_isSessionStorageEnabled = isEnabled; }
50     bool sessionStorageEnabled() const { return m_isSessionStorageEnabled; }
51
52     void setWebkitNotificationsEnabled(bool isEnabled) { m_isWebkitNotificationsEnabled = isEnabled; }
53     bool webkitNotificationsEnabled() const { return m_isWebkitNotificationsEnabled; }
54
55     void setApplicationCacheEnabled(bool isEnabled) { m_isApplicationCacheEnabled = isEnabled; }
56     bool applicationCacheEnabled() const { return m_isApplicationCacheEnabled; }
57
58     void setDataTransferItemsEnabled(bool isEnabled) { m_isDataTransferItemsEnabled = isEnabled; }
59     bool dataTransferItemsEnabled() const { return m_isDataTransferItemsEnabled; }
60
61     void setDOMIteratorEnabled(bool isEnabled) { m_isDOMIteratorEnabled = isEnabled; }
62     bool domIteratorEnabled() const { return m_isDOMIteratorEnabled; }
63
64     void setGeolocationEnabled(bool isEnabled) { m_isGeolocationEnabled = isEnabled; }
65     bool geolocationEnabled() const { return m_isGeolocationEnabled; }
66
67 #if ENABLE(INDEXED_DATABASE)
68     void setWebkitIndexedDBEnabled(bool isEnabled) { m_isIndexedDBEnabled = isEnabled; }
69     bool webkitIndexedDBEnabled() const { return m_isIndexedDBEnabled; }
70     bool indexedDBEnabled() const { return m_isIndexedDBEnabled; }
71 #endif
72
73 #if ENABLE(INDEXED_DATABASE_IN_WORKERS)
74     void setIndexedDBWorkersEnabled(bool isEnabled) { m_isIndexedDBWorkersEnabled = isEnabled; }
75     bool indexedDBWorkersEnabled() const { return m_isIndexedDBWorkersEnabled; }
76 #endif
77
78 #if ENABLE(FONT_LOAD_EVENTS)
79     void setFontLoadEventsEnabled(bool isEnabled) { m_isFontLoadEventsEnabled = isEnabled; }
80     bool fontLoadEventsEnabled() const { return m_isFontLoadEventsEnabled; }
81 #else
82     void setFontLoadEventsEnabled(bool) { }
83     bool fontLoadEventsEnabled() { return false; }
84 #endif
85
86 #if ENABLE(VIDEO)
87     bool audioEnabled() const;
88     bool htmlMediaElementEnabled() const;
89     bool htmlAudioElementEnabled() const;
90     bool htmlVideoElementEnabled() const;
91     bool htmlSourceElementEnabled() const;
92     bool mediaControllerEnabled() const;
93     bool mediaErrorEnabled() const;
94     bool timeRangesEnabled() const;
95 #endif
96
97 #if ENABLE(WEB_SOCKETS)
98     bool webSocketEnabled() const;
99 #endif
100
101 #if ENABLE(TOUCH_EVENTS)
102     bool touchEnabled() const { return m_isTouchEnabled; }
103     void setTouchEnabled(bool isEnabled) { m_isTouchEnabled = isEnabled; }
104 #endif
105
106     void setDeviceMotionEnabled(bool isEnabled) { m_isDeviceMotionEnabled = isEnabled; }
107     bool deviceMotionEnabled() const { return m_isDeviceMotionEnabled; }
108     bool deviceMotionEventEnabled() const { return m_isDeviceMotionEnabled; }
109     bool ondevicemotionEnabled() const { return m_isDeviceMotionEnabled; }
110
111     void setDeviceOrientationEnabled(bool isEnabled) { m_isDeviceOrientationEnabled = isEnabled; }
112     bool deviceOrientationEnabled() const { return m_isDeviceOrientationEnabled; }
113     bool deviceOrientationEventEnabled() const { return m_isDeviceOrientationEnabled; }
114     bool ondeviceorientationEnabled() const { return m_isDeviceOrientationEnabled; }
115
116     void setLinkPreloadEnabled(bool isEnabled) { m_isLinkPreloadEnabled = isEnabled; }
117     bool linkPreloadEnabled() const { return m_isLinkPreloadEnabled; }
118
119 #if ENABLE(JAVASCRIPT_I18N_API)
120     bool javaScriptI18NAPIEnabled() const;
121     void setJavaScriptI18NAPIEnabled(bool isEnabled) { m_isJavaScriptI18NAPIEnabled = isEnabled; }
122 #endif
123
124 #if ENABLE(MEDIA_STREAM)
125     bool mediaStreamEnabled() const { return m_isMediaStreamEnabled; }
126     void setMediaStreamEnabled(bool isEnabled) { m_isMediaStreamEnabled = isEnabled; }
127     bool webkitGetUserMediaEnabled() const { return m_isMediaStreamEnabled; }
128     bool webkitMediaStreamEnabled() const { return m_isMediaStreamEnabled; }
129 #endif
130 #if ENABLE(WEB_RTC)
131     bool peerConnectionEnabled() const { return m_isMediaStreamEnabled && m_isPeerConnectionEnabled; }
132     void setPeerConnectionEnabled(bool isEnabled) { m_isPeerConnectionEnabled = isEnabled; }
133     bool webkitRTCPeerConnectionEnabled() const { return peerConnectionEnabled(); }
134 #endif
135
136 #if ENABLE(LEGACY_CSS_VENDOR_PREFIXES)
137     void setLegacyCSSVendorPrefixesEnabled(bool isEnabled) { m_isLegacyCSSVendorPrefixesEnabled = isEnabled; }
138     bool legacyCSSVendorPrefixesEnabled() const { return m_isLegacyCSSVendorPrefixesEnabled; }
139 #endif
140
141 #if ENABLE(INPUT_TYPE_DATE)
142     bool inputTypeDateEnabled() const { return m_isInputTypeDateEnabled; }
143     void setInputTypeDateEnabled(bool isEnabled) { m_isInputTypeDateEnabled = isEnabled; }
144 #endif
145
146 #if ENABLE(INPUT_TYPE_DATETIME_INCOMPLETE)
147     bool inputTypeDateTimeEnabled() const { return m_isInputTypeDateTimeEnabled; }
148     void setInputTypeDateTimeEnabled(bool isEnabled) { m_isInputTypeDateTimeEnabled = isEnabled; }
149 #endif
150
151 #if ENABLE(INPUT_TYPE_DATETIMELOCAL)
152     bool inputTypeDateTimeLocalEnabled() const { return m_isInputTypeDateTimeLocalEnabled; }
153     void setInputTypeDateTimeLocalEnabled(bool isEnabled) { m_isInputTypeDateTimeLocalEnabled = isEnabled; }
154 #endif
155
156 #if ENABLE(INPUT_TYPE_MONTH)
157     bool inputTypeMonthEnabled() const { return m_isInputTypeMonthEnabled; }
158     void setInputTypeMonthEnabled(bool isEnabled) { m_isInputTypeMonthEnabled = isEnabled; }
159 #endif
160
161 #if ENABLE(INPUT_TYPE_TIME)
162     bool inputTypeTimeEnabled() const { return m_isInputTypeTimeEnabled; }
163     void setInputTypeTimeEnabled(bool isEnabled) { m_isInputTypeTimeEnabled = isEnabled; }
164 #endif
165
166 #if ENABLE(INPUT_TYPE_WEEK)
167     bool inputTypeWeekEnabled() const { return m_isInputTypeWeekEnabled; }
168     void setInputTypeWeekEnabled(bool isEnabled) { m_isInputTypeWeekEnabled = isEnabled; }
169 #endif
170
171 #if ENABLE(CSP_NEXT)
172     bool experimentalContentSecurityPolicyFeaturesEnabled() const { return m_areExperimentalContentSecurityPolicyFeaturesEnabled; }
173     void setExperimentalContentSecurityPolicyFeaturesEnabled(bool isEnabled) { m_areExperimentalContentSecurityPolicyFeaturesEnabled = isEnabled; }
174 #endif
175
176     bool langAttributeAwareFormControlUIEnabled() const { return m_isLangAttributeAwareFormControlUIEnabled; }
177     // The lang attribute support is incomplete and should only be turned on for tests.
178     void setLangAttributeAwareFormControlUIEnabled(bool isEnabled) { m_isLangAttributeAwareFormControlUIEnabled = isEnabled; }
179
180     void setResourceTimingEnabled(bool isEnabled) { m_isResourceTimingEnabled = isEnabled; }
181     bool resourceTimingEnabled() const { return m_isResourceTimingEnabled; }
182
183 #if ENABLE(GAMEPAD)
184     void setGamepadsEnabled(bool areEnabled) { m_areGamepadsEnabled = areEnabled; }
185     bool gamepadsEnabled() const { return m_areGamepadsEnabled; }
186 #endif
187
188 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
189     void setAnimationTriggersEnabled(bool areEnabled) { m_areAnimationTriggersEnabled = areEnabled; }
190     bool animationTriggersEnabled() const { return m_areAnimationTriggersEnabled; }
191 #endif
192
193 #if ENABLE(WEB_ANIMATIONS)
194     void setWebAnimationsEnabled(bool areEnabled) { m_areWebAnimationsEnabled = areEnabled; }
195     bool webAnimationsEnabled() const { return m_areWebAnimationsEnabled; }
196 #endif
197
198     void setShadowDOMEnabled(bool isEnabled) { m_isShadowDOMEnabled = isEnabled; }
199     bool shadowDOMEnabled() const { return m_isShadowDOMEnabled; }
200
201     void setInputEventsEnabled(bool isEnabled) { m_inputEventsEnabled = isEnabled; }
202     bool inputEventsEnabled() const { return m_inputEventsEnabled; }
203
204     void setInteractiveFormValidationEnabled(bool isEnabled) { m_isInteractiveFormValidationEnabled = isEnabled; }
205     bool interactiveFormValidationEnabled() const { return m_isInteractiveFormValidationEnabled; }
206
207     void setCustomElementsEnabled(bool areEnabled) { m_areCustomElementsEnabled = areEnabled; }
208     bool customElementsEnabled() const { return m_areCustomElementsEnabled; }
209
210 #if ENABLE(WEBGL2)
211     void setWebGL2Enabled(bool isEnabled) { m_isWebGL2Enabled = isEnabled; }
212     bool webGL2Enabled() const { return m_isWebGL2Enabled; }
213 #endif
214
215 #if ENABLE(FETCH_API)
216     void setFetchAPIEnabled(bool isEnabled) { m_isFetchAPIEnabled = isEnabled; }
217     bool fetchAPIEnabled() const { return m_isFetchAPIEnabled; }
218 #endif
219
220 #if ENABLE(DOWNLOAD_ATTRIBUTE)
221     void setDownloadAttributeEnabled(bool isEnabled) { m_isDownloadAttributeEnabled = isEnabled; }
222     bool downloadAttributeEnabled() const { return m_isDownloadAttributeEnabled; }
223 #endif
224
225 #if ENABLE(CSS_GRID_LAYOUT)
226     void setCSSGridLayoutEnabled(bool isEnabled) { m_cssGridLayoutEnabled = isEnabled; }
227     bool isCSSGridLayoutEnabled() const { return m_cssGridLayoutEnabled; }
228 #endif
229
230 #if ENABLE(INTERSECTION_OBSERVER)
231     void setIntersectionObserverEnabled(bool isEnabled) { m_intersectionObserverEnabled = isEnabled; }
232     bool intersectionObserverEnabled() const { return m_intersectionObserverEnabled; }
233 #endif
234
235     void setModernMediaControlsEnabled(bool areEnabled) { m_areModernMediaControlsEnabled = areEnabled; }
236     bool modernMediaControlsEnabled() const { return m_areModernMediaControlsEnabled; }
237
238 #if ENABLE(ENCRYPTED_MEDIA)
239     void setEncryptedMediaAPIEnabled(bool isEnabled) { m_encryptedMediaAPIEnabled = isEnabled; }
240     bool encryptedMediaAPIEnabled() const { return m_encryptedMediaAPIEnabled; }
241 #endif
242
243 #if ENABLE(SUBTLE_CRYPTO)
244     void setSubtleCryptoEnabled(bool isEnabled) { m_isSubtleCryptoEnabled = isEnabled; }
245     bool subtleCryptoEnabled() const { return m_isSubtleCryptoEnabled; }
246 #endif
247
248     WEBCORE_EXPORT static RuntimeEnabledFeatures& sharedFeatures();
249
250     WEBCORE_EXPORT void reset();
251
252 private:
253     // Never instantiate.
254     RuntimeEnabledFeatures();
255
256     bool m_areModernMediaControlsEnabled { false };
257     bool m_isLocalStorageEnabled;
258     bool m_isSessionStorageEnabled;
259     bool m_isWebkitNotificationsEnabled;
260     bool m_isApplicationCacheEnabled;
261     bool m_isDataTransferItemsEnabled;
262     bool m_isDOMIteratorEnabled { true };
263     bool m_isGeolocationEnabled;
264     bool m_isTouchEnabled;
265     bool m_isDeviceMotionEnabled;
266     bool m_isDeviceOrientationEnabled;
267     bool m_isLinkPreloadEnabled;
268     bool m_isLangAttributeAwareFormControlUIEnabled;
269     bool m_isResourceTimingEnabled;
270
271 #if ENABLE(INDEXED_DATABASE)
272     bool m_isIndexedDBEnabled;
273 #endif
274
275 #if ENABLE(INDEXED_DATABASE_IN_WORKERS)
276     bool m_isIndexedDBWorkersEnabled;
277 #endif
278
279 #if ENABLE(JAVASCRIPT_I18N_API)
280     bool m_isJavaScriptI18NAPIEnabled;
281 #endif
282
283 #if ENABLE(MEDIA_STREAM)
284     bool m_isMediaStreamEnabled { true };
285 #endif
286 #if ENABLE(WEB_RTC)
287     bool m_isPeerConnectionEnabled;
288 #endif
289
290 #if ENABLE(LEGACY_CSS_VENDOR_PREFIXES)
291     bool m_isLegacyCSSVendorPrefixesEnabled;
292 #endif
293
294 #if ENABLE(INPUT_TYPE_DATE)
295     bool m_isInputTypeDateEnabled;
296 #endif
297
298 #if ENABLE(INPUT_TYPE_DATETIME_INCOMPLETE)
299     bool m_isInputTypeDateTimeEnabled;
300 #endif
301
302 #if ENABLE(INPUT_TYPE_DATETIMELOCAL)
303     bool m_isInputTypeDateTimeLocalEnabled;
304 #endif
305
306 #if ENABLE(INPUT_TYPE_MONTH)
307     bool m_isInputTypeMonthEnabled;
308 #endif
309
310 #if ENABLE(INPUT_TYPE_TIME)
311     bool m_isInputTypeTimeEnabled;
312 #endif
313
314 #if ENABLE(INPUT_TYPE_WEEK)
315     bool m_isInputTypeWeekEnabled;
316 #endif
317
318 #if ENABLE(CSP_NEXT)
319     bool m_areExperimentalContentSecurityPolicyFeaturesEnabled;
320 #endif
321
322 #if ENABLE(FONT_LOAD_EVENTS)
323     bool m_isFontLoadEventsEnabled;
324 #endif
325
326 #if ENABLE(GAMEPAD)
327     bool m_areGamepadsEnabled { false };
328 #endif
329
330 #if ENABLE(CSS_ANIMATIONS_LEVEL_2)
331     bool m_areAnimationTriggersEnabled;
332 #endif
333
334 #if ENABLE(WEB_ANIMATIONS)
335     bool m_areWebAnimationsEnabled { false };
336 #endif
337     
338     bool m_isShadowDOMEnabled;
339
340     bool m_inputEventsEnabled;
341
342     bool m_isInteractiveFormValidationEnabled { false };
343
344     bool m_areCustomElementsEnabled { true };
345
346 #if ENABLE(WEBGL2)
347     bool m_isWebGL2Enabled;
348 #endif
349
350 #if ENABLE(FETCH_API)
351     bool m_isFetchAPIEnabled { false };
352 #endif
353
354 #if ENABLE(DOWNLOAD_ATTRIBUTE)
355     bool m_isDownloadAttributeEnabled { false };
356 #endif
357
358 #if ENABLE(CSS_GRID_LAYOUT)
359     bool m_cssGridLayoutEnabled;
360 #endif
361
362 #if ENABLE(ENCRYPTED_MEDIA)
363     bool m_encryptedMediaAPIEnabled { false };
364 #endif
365
366 #if ENABLE(INTERSECTION_OBSERVER)
367     bool m_intersectionObserverEnabled { false };
368 #endif
369
370 #if ENABLE(SUBTLE_CRYPTO)
371     bool m_isSubtleCryptoEnabled;
372 #endif
373
374     friend class WTF::NeverDestroyed<RuntimeEnabledFeatures>;
375 };
376
377 } // namespace WebCore