1/*
2 * Copyright (C) 2009 Google Inc. All rights reserved.
3 * Copyright (C) 2013 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#ifndef RuntimeEnabledFeatures_h
33#define RuntimeEnabledFeatures_h
34
35#include "PlatformExportMacros.h"
36#include <wtf/NeverDestroyed.h>
37
38namespace 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
44class RuntimeEnabledFeatures {
45    WTF_MAKE_NONCOPYABLE(RuntimeEnabledFeatures);
46public:
47    void setLocalStorageEnabled(bool isEnabled) { m_isLocalStorageEnabled = isEnabled; }
48    bool localStorageEnabled() const { return m_isLocalStorageEnabled; }
49
50    void setSessionStorageEnabled(bool isEnabled) { m_isSessionStorageEnabled = isEnabled; }
51    bool sessionStorageEnabled() const { return m_isSessionStorageEnabled; }
52
53    void setWebkitNotificationsEnabled(bool isEnabled) { m_isWebkitNotificationsEnabled = isEnabled; }
54    bool webkitNotificationsEnabled() const { return m_isWebkitNotificationsEnabled; }
55
56    void setApplicationCacheEnabled(bool isEnabled) { m_isApplicationCacheEnabled = isEnabled; }
57    bool applicationCacheEnabled() const { return m_isApplicationCacheEnabled; }
58
59    void setDataTransferItemsEnabled(bool isEnabled) { m_isDataTransferItemsEnabled = isEnabled; }
60    bool dataTransferItemsEnabled() const { return m_isDataTransferItemsEnabled; }
61
62    void setGeolocationEnabled(bool isEnabled) { m_isGeolocationEnabled = isEnabled; }
63    bool geolocationEnabled() const { return m_isGeolocationEnabled; }
64
65    void setWebkitIndexedDBEnabled(bool isEnabled) { m_isIndexedDBEnabled = isEnabled; }
66    bool webkitIndexedDBEnabled() const { return m_isIndexedDBEnabled; }
67    bool indexedDBEnabled() const { return m_isIndexedDBEnabled; }
68
69#if ENABLE(CSS_EXCLUSIONS)
70    void setCSSExclusionsEnabled(bool isEnabled) { m_isCSSExclusionsEnabled = isEnabled; }
71    bool cssExclusionsEnabled() const { return m_isCSSExclusionsEnabled; }
72#else
73    void setCSSExclusionsEnabled(bool) { }
74    bool cssExclusionsEnabled() const { return false; }
75#endif
76
77#if ENABLE(CSS_SHAPES)
78    void setCSSShapesEnabled(bool isEnabled) { m_isCSSShapesEnabled = isEnabled; }
79    bool cssShapesEnabled() const { return m_isCSSShapesEnabled; }
80#else
81    void setCSSShapesEnabled(bool) { }
82    bool cssShapesEnabled() const { return false; }
83#endif
84
85#if ENABLE(CSS_REGIONS)
86    void setCSSRegionsEnabled(bool isEnabled) { m_isCSSRegionsEnabled = isEnabled; }
87    bool cssRegionsEnabled() const { return m_isCSSRegionsEnabled; }
88#else
89    void setCSSRegionsEnabled(bool) { }
90    bool cssRegionsEnabled() const { return false; }
91#endif
92
93    void setCSSCompositingEnabled(bool isEnabled) { m_isCSSCompositingEnabled = isEnabled; }
94    bool cssCompositingEnabled() const { return m_isCSSCompositingEnabled; }
95
96#if ENABLE(FONT_LOAD_EVENTS)
97    void setFontLoadEventsEnabled(bool isEnabled) { m_isFontLoadEventsEnabled = isEnabled; }
98    bool fontLoadEventsEnabled() const { return m_isFontLoadEventsEnabled; }
99#else
100    void setFontLoadEventsEnabled(bool) { }
101    bool fontLoadEventsEnabled() { return false; }
102#endif
103
104#if ENABLE(VIDEO)
105    bool audioEnabled() const;
106    bool htmlMediaElementEnabled() const;
107    bool htmlAudioElementEnabled() const;
108    bool htmlVideoElementEnabled() const;
109    bool htmlSourceElementEnabled() const;
110    bool mediaControllerEnabled() const;
111    bool mediaErrorEnabled() const;
112    bool timeRangesEnabled() const;
113#endif
114
115#if ENABLE(SHARED_WORKERS)
116    bool sharedWorkerEnabled() const;
117#endif
118
119#if ENABLE(WEB_SOCKETS)
120    bool webSocketEnabled() const;
121#endif
122
123#if ENABLE(TOUCH_EVENTS)
124    bool touchEnabled() const { return m_isTouchEnabled; }
125    void setTouchEnabled(bool isEnabled) { m_isTouchEnabled = isEnabled; }
126#endif
127
128    void setDeviceMotionEnabled(bool isEnabled) { m_isDeviceMotionEnabled = isEnabled; }
129    bool deviceMotionEnabled() const { return m_isDeviceMotionEnabled; }
130    bool deviceMotionEventEnabled() const { return m_isDeviceMotionEnabled; }
131    bool ondevicemotionEnabled() const { return m_isDeviceMotionEnabled; }
132
133    void setDeviceOrientationEnabled(bool isEnabled) { m_isDeviceOrientationEnabled = isEnabled; }
134    bool deviceOrientationEnabled() const { return m_isDeviceOrientationEnabled; }
135    bool deviceOrientationEventEnabled() const { return m_isDeviceOrientationEnabled; }
136    bool ondeviceorientationEnabled() const { return m_isDeviceOrientationEnabled; }
137
138    void setSpeechInputEnabled(bool isEnabled) { m_isSpeechInputEnabled = isEnabled; }
139    bool speechInputEnabled() const { return m_isSpeechInputEnabled; }
140    bool webkitSpeechEnabled() const { return m_isSpeechInputEnabled; }
141    bool webkitGrammarEnabled() const { return m_isSpeechInputEnabled; }
142
143#if ENABLE(SCRIPTED_SPEECH)
144    void setScriptedSpeechEnabled(bool isEnabled) { m_isScriptedSpeechEnabled = isEnabled; }
145    bool scriptedSpeechEnabled() const { return m_isScriptedSpeechEnabled; }
146    bool webkitSpeechRecognitionEnabled() const { return m_isScriptedSpeechEnabled; }
147    bool webkitSpeechRecognitionErrorEnabled() const { return m_isScriptedSpeechEnabled; }
148    bool webkitSpeechRecognitionEventEnabled() const { return m_isScriptedSpeechEnabled; }
149    bool webkitSpeechGrammarEnabled() const { return m_isScriptedSpeechEnabled; }
150    bool webkitSpeechGrammarListEnabled() const { return m_isScriptedSpeechEnabled; }
151#endif
152
153#if ENABLE(JAVASCRIPT_I18N_API)
154    bool javaScriptI18NAPIEnabled() const;
155    void setJavaScriptI18NAPIEnabled(bool isEnabled) { m_isJavaScriptI18NAPIEnabled = isEnabled; }
156#endif
157
158#if ENABLE(MEDIA_STREAM)
159    bool mediaStreamEnabled() const { return m_isMediaStreamEnabled; }
160    void setMediaStreamEnabled(bool isEnabled) { m_isMediaStreamEnabled = isEnabled; }
161    bool webkitGetUserMediaEnabled() const { return m_isMediaStreamEnabled; }
162    bool webkitMediaStreamEnabled() const { return m_isMediaStreamEnabled; }
163
164    bool peerConnectionEnabled() const { return m_isMediaStreamEnabled && m_isPeerConnectionEnabled; }
165    void setPeerConnectionEnabled(bool isEnabled) { m_isPeerConnectionEnabled = isEnabled; }
166    bool webkitRTCPeerConnectionEnabled() const { return peerConnectionEnabled(); }
167#endif
168
169#if ENABLE(LEGACY_CSS_VENDOR_PREFIXES)
170    void setLegacyCSSVendorPrefixesEnabled(bool isEnabled) { m_isLegacyCSSVendorPrefixesEnabled = isEnabled; }
171    bool legacyCSSVendorPrefixesEnabled() const { return m_isLegacyCSSVendorPrefixesEnabled; }
172#endif
173
174#if ENABLE(VIDEO_TRACK)
175    bool webkitVideoTrackEnabled() const { return m_isVideoTrackEnabled; }
176    void setWebkitVideoTrackEnabled(bool isEnabled) { m_isVideoTrackEnabled = isEnabled; }
177#endif
178
179#if ENABLE(INPUT_TYPE_DATE)
180    bool inputTypeDateEnabled() const { return m_isInputTypeDateEnabled; }
181    void setInputTypeDateEnabled(bool isEnabled) { m_isInputTypeDateEnabled = isEnabled; }
182#endif
183
184#if ENABLE(INPUT_TYPE_DATETIME_INCOMPLETE)
185    bool inputTypeDateTimeEnabled() const { return m_isInputTypeDateTimeEnabled; }
186    void setInputTypeDateTimeEnabled(bool isEnabled) { m_isInputTypeDateTimeEnabled = isEnabled; }
187#endif
188
189#if ENABLE(INPUT_TYPE_DATETIMELOCAL)
190    bool inputTypeDateTimeLocalEnabled() const { return m_isInputTypeDateTimeLocalEnabled; }
191    void setInputTypeDateTimeLocalEnabled(bool isEnabled) { m_isInputTypeDateTimeLocalEnabled = isEnabled; }
192#endif
193
194#if ENABLE(INPUT_TYPE_MONTH)
195    bool inputTypeMonthEnabled() const { return m_isInputTypeMonthEnabled; }
196    void setInputTypeMonthEnabled(bool isEnabled) { m_isInputTypeMonthEnabled = isEnabled; }
197#endif
198
199#if ENABLE(INPUT_TYPE_TIME)
200    bool inputTypeTimeEnabled() const { return m_isInputTypeTimeEnabled; }
201    void setInputTypeTimeEnabled(bool isEnabled) { m_isInputTypeTimeEnabled = isEnabled; }
202#endif
203
204#if ENABLE(INPUT_TYPE_WEEK)
205    bool inputTypeWeekEnabled() const { return m_isInputTypeWeekEnabled; }
206    void setInputTypeWeekEnabled(bool isEnabled) { m_isInputTypeWeekEnabled = isEnabled; }
207#endif
208
209#if ENABLE(CSP_NEXT)
210    bool experimentalContentSecurityPolicyFeaturesEnabled() const { return m_areExperimentalContentSecurityPolicyFeaturesEnabled; }
211    void setExperimentalContentSecurityPolicyFeaturesEnabled(bool isEnabled) { m_areExperimentalContentSecurityPolicyFeaturesEnabled = isEnabled; }
212#endif
213
214    bool langAttributeAwareFormControlUIEnabled() const { return m_isLangAttributeAwareFormControlUIEnabled; }
215    // The lang attribute support is incomplete and should only be turned on for tests.
216    void setLangAttributeAwareFormControlUIEnabled(bool isEnabled) { m_isLangAttributeAwareFormControlUIEnabled = isEnabled; }
217
218    void setPluginReplacementEnabled(bool isEnabled) { m_isPluginReplacementEnabled = isEnabled; }
219    bool pluginReplacementEnabled() const { return m_isPluginReplacementEnabled; }
220
221#if ENABLE(GAMEPAD)
222    void setGamepadsEnabled(bool areEnabled) { m_areGamepadsEnabled = areEnabled; }
223    bool gamepadsEnabled() const { return m_areGamepadsEnabled; }
224#endif
225
226    static RuntimeEnabledFeatures& sharedFeatures();
227
228private:
229    // Never instantiate.
230    RuntimeEnabledFeatures();
231
232    bool m_isLocalStorageEnabled;
233    bool m_isSessionStorageEnabled;
234    bool m_isWebkitNotificationsEnabled;
235    bool m_isApplicationCacheEnabled;
236    bool m_isDataTransferItemsEnabled;
237    bool m_isGeolocationEnabled;
238    bool m_isIndexedDBEnabled;
239    bool m_isTouchEnabled;
240    bool m_isDeviceMotionEnabled;
241    bool m_isDeviceOrientationEnabled;
242    bool m_isSpeechInputEnabled;
243    bool m_isCSSExclusionsEnabled;
244    bool m_isCSSShapesEnabled;
245    bool m_isCSSRegionsEnabled;
246    bool m_isCSSCompositingEnabled;
247    bool m_isLangAttributeAwareFormControlUIEnabled;
248    bool m_isPluginReplacementEnabled;
249
250#if ENABLE(SCRIPTED_SPEECH)
251    bool m_isScriptedSpeechEnabled;
252#endif
253
254#if ENABLE(JAVASCRIPT_I18N_API)
255    bool m_isJavaScriptI18NAPIEnabled;
256#endif
257
258#if ENABLE(MEDIA_STREAM)
259    bool m_isMediaStreamEnabled;
260    bool m_isPeerConnectionEnabled;
261#endif
262
263#if ENABLE(LEGACY_CSS_VENDOR_PREFIXES)
264    bool m_isLegacyCSSVendorPrefixesEnabled;
265#endif
266
267#if ENABLE(VIDEO_TRACK)
268    bool m_isVideoTrackEnabled;
269#endif
270
271#if ENABLE(INPUT_TYPE_DATE)
272    bool m_isInputTypeDateEnabled;
273#endif
274
275#if ENABLE(INPUT_TYPE_DATETIME_INCOMPLETE)
276    bool m_isInputTypeDateTimeEnabled;
277#endif
278
279#if ENABLE(INPUT_TYPE_DATETIMELOCAL)
280    bool m_isInputTypeDateTimeLocalEnabled;
281#endif
282
283#if ENABLE(INPUT_TYPE_MONTH)
284    bool m_isInputTypeMonthEnabled;
285#endif
286
287#if ENABLE(INPUT_TYPE_TIME)
288    bool m_isInputTypeTimeEnabled;
289#endif
290
291#if ENABLE(INPUT_TYPE_WEEK)
292    bool m_isInputTypeWeekEnabled;
293#endif
294
295#if ENABLE(CSP_NEXT)
296    bool m_areExperimentalContentSecurityPolicyFeaturesEnabled;
297#endif
298
299#if ENABLE(FONT_LOAD_EVENTS)
300    bool m_isFontLoadEventsEnabled;
301#endif
302
303#if ENABLE(GAMEPAD)
304    bool m_areGamepadsEnabled;
305#endif
306
307    friend class WTF::NeverDestroyed<RuntimeEnabledFeatures>;
308};
309
310} // namespace WebCore
311
312#endif // RuntimeEnabledFeatures_h
313