2015-11-03 Geoffrey Garen <ggaren@apple.com>
[WebKit-https.git] / Source / WebCore / page / Settings.h
1 /*
2  * Copyright (C) 2003, 2006, 2007, 2008, 2009, 2011, 2012, 2013 Apple Inc. All rights reserved.
3  *           (C) 2006 Graham Dennis (graham.dennis@gmail.com)
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
25  */
26
27 #ifndef Settings_h
28 #define Settings_h
29
30 #include "EditingBehaviorTypes.h"
31 #include "IntSize.h"
32 #include "URL.h"
33 #include "SecurityOrigin.h"
34 #include "SettingsMacros.h"
35 #include "TextFlags.h"
36 #include "Timer.h"
37 #include <chrono>
38 #include <runtime/RuntimeFlags.h>
39 #include <unicode/uscript.h>
40 #include <wtf/HashMap.h>
41 #include <wtf/RefCounted.h>
42 #include <wtf/text/AtomicString.h>
43 #include <wtf/text/AtomicStringHash.h>
44
45 namespace WebCore {
46
47 class FontGenericFamilies;
48 class Page;
49
50 enum EditableLinkBehavior {
51     EditableLinkDefaultBehavior,
52     EditableLinkAlwaysLive,
53     EditableLinkOnlyLiveWithShiftKey,
54     EditableLinkLiveWhenNotFocused,
55     EditableLinkNeverLive
56 };
57
58 enum TextDirectionSubmenuInclusionBehavior {
59     TextDirectionSubmenuNeverIncluded,
60     TextDirectionSubmenuAutomaticallyIncluded,
61     TextDirectionSubmenuAlwaysIncluded
62 };
63
64 enum DebugOverlayRegionFlags {
65     NonFastScrollableRegion = 1 << 0,
66     WheelEventHandlerRegion = 1 << 1,
67 };
68
69 typedef unsigned DebugOverlayRegions;
70
71 class Settings : public RefCounted<Settings> {
72     WTF_MAKE_NONCOPYABLE(Settings); WTF_MAKE_FAST_ALLOCATED;
73 public:
74     static Ref<Settings> create(Page*);
75     ~Settings();
76
77     void pageDestroyed() { m_page = nullptr; }
78
79     WEBCORE_EXPORT void setStandardFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
80     WEBCORE_EXPORT const AtomicString& standardFontFamily(UScriptCode = USCRIPT_COMMON) const;
81
82     WEBCORE_EXPORT void setFixedFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
83     WEBCORE_EXPORT const AtomicString& fixedFontFamily(UScriptCode = USCRIPT_COMMON) const;
84
85     WEBCORE_EXPORT void setSerifFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
86     WEBCORE_EXPORT const AtomicString& serifFontFamily(UScriptCode = USCRIPT_COMMON) const;
87
88     WEBCORE_EXPORT void setSansSerifFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
89     WEBCORE_EXPORT const AtomicString& sansSerifFontFamily(UScriptCode = USCRIPT_COMMON) const;
90
91     WEBCORE_EXPORT void setCursiveFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
92     WEBCORE_EXPORT const AtomicString& cursiveFontFamily(UScriptCode = USCRIPT_COMMON) const;
93
94     WEBCORE_EXPORT void setFantasyFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
95     WEBCORE_EXPORT const AtomicString& fantasyFontFamily(UScriptCode = USCRIPT_COMMON) const;
96
97     WEBCORE_EXPORT void setPictographFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
98     WEBCORE_EXPORT const AtomicString& pictographFontFamily(UScriptCode = USCRIPT_COMMON) const;
99
100 #if ENABLE(TEXT_AUTOSIZING)
101     void setTextAutosizingEnabled(bool);
102     bool textAutosizingEnabled() const { return m_textAutosizingEnabled; }
103
104     void setTextAutosizingFontScaleFactor(float);
105     float textAutosizingFontScaleFactor() const { return m_textAutosizingFontScaleFactor; }
106
107     // Only set by Layout Tests, and only used if textAutosizingEnabled() returns true.
108     void setTextAutosizingWindowSizeOverride(const IntSize&);
109     const IntSize& textAutosizingWindowSizeOverride() const { return m_textAutosizingWindowSizeOverride; }
110 #endif
111
112     WEBCORE_EXPORT void setAntialiasedFontDilationEnabled(bool);
113     bool antialiasedFontDilationEnabled() const { return m_antialiasedFontDilationEnabled; }
114
115     // Only set by Layout Tests.
116     WEBCORE_EXPORT void setMediaTypeOverride(const String&);
117     const String& mediaTypeOverride() const { return m_mediaTypeOverride; }
118
119     // Unlike areImagesEnabled, this only suppresses the network load of
120     // the image URL.  A cached image will still be rendered if requested.
121     WEBCORE_EXPORT void setLoadsImagesAutomatically(bool);
122     bool loadsImagesAutomatically() const { return m_loadsImagesAutomatically; }
123
124     // Clients that execute script should call ScriptController::canExecuteScripts()
125     // instead of this function. ScriptController::canExecuteScripts() checks the
126     // HTML sandbox, plug-in sandboxing, and other important details.
127     bool isScriptEnabled() const { return m_isScriptEnabled; }
128     WEBCORE_EXPORT void setScriptEnabled(bool);
129
130     SETTINGS_GETTERS_AND_SETTERS
131
132     WEBCORE_EXPORT void setJavaEnabled(bool);
133     bool isJavaEnabled() const { return m_isJavaEnabled; }
134
135     // This settings is only consulted if isJavaEnabled() returns true;
136     WEBCORE_EXPORT void setJavaEnabledForLocalFiles(bool);
137     bool isJavaEnabledForLocalFiles() const { return m_isJavaEnabledForLocalFiles; }
138
139     WEBCORE_EXPORT void setImagesEnabled(bool);
140     bool areImagesEnabled() const { return m_areImagesEnabled; }
141
142     WEBCORE_EXPORT void setPluginsEnabled(bool);
143     bool arePluginsEnabled() const { return m_arePluginsEnabled; }
144
145     // When this option is set, WebCore will avoid storing any record of browsing activity
146     // that may persist on disk or remain displayed when the option is reset.
147     // This option does not affect the storage of such information in RAM.
148     // The following functions respect this setting:
149     //  - HTML5/DOM Storage
150     //  - Icon Database
151     //  - Console Messages
152     //  - MemoryCache
153     //  - Application Cache
154     //  - Back/Forward Page History
155     //  - Page Search Results
156     //  - HTTP Cookies
157     //  - Plug-ins (that support NPNVprivateModeBool)
158     void setPrivateBrowsingEnabled(bool);
159
160     WEBCORE_EXPORT void setDNSPrefetchingEnabled(bool);
161     bool dnsPrefetchingEnabled() const { return m_dnsPrefetchingEnabled; }
162
163     WEBCORE_EXPORT void setUserStyleSheetLocation(const URL&);
164     const URL& userStyleSheetLocation() const { return m_userStyleSheetLocation; }
165
166     WEBCORE_EXPORT void setNeedsAdobeFrameReloadingQuirk(bool);
167     bool needsAcrobatFrameReloadingQuirk() const { return m_needsAdobeFrameReloadingQuirk; }
168
169     WEBCORE_EXPORT void setMinimumDOMTimerInterval(double); // Initialized to DOMTimer::defaultMinimumInterval().
170     double minimumDOMTimerInterval() const { return m_minimumDOMTimerInterval; }
171
172     void setDOMTimerAlignmentInterval(double);
173     double domTimerAlignmentInterval() const { return m_domTimerAlignmentInterval; }
174
175     WEBCORE_EXPORT void setLayoutInterval(std::chrono::milliseconds);
176     std::chrono::milliseconds layoutInterval() const { return m_layoutInterval; }
177
178 #if ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING)
179     bool hiddenPageDOMTimerThrottlingEnabled() const { return m_hiddenPageDOMTimerThrottlingEnabled; }
180     WEBCORE_EXPORT void setHiddenPageDOMTimerThrottlingEnabled(bool);
181 #endif
182
183     WEBCORE_EXPORT void setUsesPageCache(bool);
184     bool usesPageCache() const { return m_usesPageCache; }
185         
186     void setFontRenderingMode(FontRenderingMode mode);
187     FontRenderingMode fontRenderingMode() const;
188
189     WEBCORE_EXPORT void setShowTiledScrollingIndicator(bool);
190     bool showTiledScrollingIndicator() const { return m_showTiledScrollingIndicator; }
191
192 #if ENABLE(RESOURCE_USAGE_OVERLAY)
193     bool resourceUsageOverlayVisible() const { return m_resourceUsageOverlayVisible; }
194     WEBCORE_EXPORT void setResourceUsageOverlayVisible(bool);
195 #endif
196
197 #if PLATFORM(WIN)
198     static void setShouldUseHighResolutionTimers(bool);
199     static bool shouldUseHighResolutionTimers() { return gShouldUseHighResolutionTimers; }
200 #endif
201
202     static bool shouldRewriteConstAsVar() { return gShouldRewriteConstAsVar; }
203     static void setShouldRewriteConstAsVar(bool shouldRewriteConstAsVar) { gShouldRewriteConstAsVar = shouldRewriteConstAsVar; }
204
205     WEBCORE_EXPORT void setBackgroundShouldExtendBeyondPage(bool);
206     bool backgroundShouldExtendBeyondPage() const { return m_backgroundShouldExtendBeyondPage; }
207
208 #if USE(AVFOUNDATION)
209     WEBCORE_EXPORT static void setAVFoundationEnabled(bool flag);
210     static bool isAVFoundationEnabled() { return gAVFoundationEnabled; }
211 #endif
212
213 #if PLATFORM(COCOA)
214     WEBCORE_EXPORT static void setQTKitEnabled(bool flag);
215     static bool isQTKitEnabled() { return gQTKitEnabled; }
216 #else
217     static bool isQTKitEnabled() { return false; }
218 #endif
219
220     static const unsigned defaultMaximumHTMLParserDOMTreeDepth = 512;
221
222     WEBCORE_EXPORT static void setMockScrollbarsEnabled(bool flag);
223     WEBCORE_EXPORT static bool mockScrollbarsEnabled();
224
225     WEBCORE_EXPORT static void setUsesOverlayScrollbars(bool flag);
226     static bool usesOverlayScrollbars();
227
228 #if ENABLE(TOUCH_EVENTS)
229     void setTouchEventEmulationEnabled(bool enabled) { m_touchEventEmulationEnabled = enabled; }
230     bool isTouchEventEmulationEnabled() const { return m_touchEventEmulationEnabled; }
231 #endif
232
233     WEBCORE_EXPORT void setStorageBlockingPolicy(SecurityOrigin::StorageBlockingPolicy);
234     SecurityOrigin::StorageBlockingPolicy storageBlockingPolicy() const { return m_storageBlockingPolicy; }
235
236     WEBCORE_EXPORT void setScrollingPerformanceLoggingEnabled(bool);
237     bool scrollingPerformanceLoggingEnabled() { return m_scrollingPerformanceLoggingEnabled; }
238
239     WEBCORE_EXPORT static void setShouldRespectPriorityInCSSAttributeSetters(bool);
240     static bool shouldRespectPriorityInCSSAttributeSetters();
241
242     void setTimeWithoutMouseMovementBeforeHidingControls(double time) { m_timeWithoutMouseMovementBeforeHidingControls = time; }
243     double timeWithoutMouseMovementBeforeHidingControls() const { return m_timeWithoutMouseMovementBeforeHidingControls; }
244
245     bool hiddenPageCSSAnimationSuspensionEnabled() const { return m_hiddenPageCSSAnimationSuspensionEnabled; }
246     WEBCORE_EXPORT void setHiddenPageCSSAnimationSuspensionEnabled(bool);
247
248     WEBCORE_EXPORT void setFontFallbackPrefersPictographs(bool);
249     bool fontFallbackPrefersPictographs() const { return m_fontFallbackPrefersPictographs; }
250
251     static bool lowPowerVideoAudioBufferSizeEnabled() { return gLowPowerVideoAudioBufferSizeEnabled; }
252     WEBCORE_EXPORT static void setLowPowerVideoAudioBufferSizeEnabled(bool);
253
254 #if PLATFORM(IOS)
255     WEBCORE_EXPORT static void setAudioSessionCategoryOverride(unsigned);
256     static unsigned audioSessionCategoryOverride();
257
258     WEBCORE_EXPORT static void setNetworkDataUsageTrackingEnabled(bool);
259     static bool networkDataUsageTrackingEnabled();
260
261     WEBCORE_EXPORT static void setNetworkInterfaceName(const String&);
262     static const String& networkInterfaceName();
263
264 #if HAVE(AVKIT)
265     static void setAVKitEnabled(bool flag) { gAVKitEnabled = flag; }
266 #endif
267     static bool avKitEnabled() { return gAVKitEnabled; }
268
269     static void setShouldOptOutOfNetworkStateObservation(bool flag) { gShouldOptOutOfNetworkStateObservation = flag; }
270     static bool shouldOptOutOfNetworkStateObservation() { return gShouldOptOutOfNetworkStateObservation; }
271
272     static void setShouldManageAudioSessionCategory(bool flag) { gManageAudioSession = flag; }
273     static bool shouldManageAudioSessionCategory() { return gManageAudioSession; }
274 #endif
275
276 #if ENABLE(ENCRYPTED_MEDIA_V2)
277     void setMediaKeysStorageDirectory(const String& directory) { m_mediaKeysStorageDirectory = directory; }
278     const String& mediaKeysStorageDirectory() const { return m_mediaKeysStorageDirectory; }
279 #endif
280     
281 #if ENABLE(MEDIA_STREAM)
282     void setMediaDeviceIdentifierStorageDirectory(const String& directory) { m_mediaDeviceIdentifierStorageDirectory = directory; }
283     const String& mediaDeviceIdentifierStorageDirectory() const { return m_mediaDeviceIdentifierStorageDirectory; }
284 #endif
285
286     WEBCORE_EXPORT void setForcePendingWebGLPolicy(bool);
287     bool isForcePendingWebGLPolicy() const { return m_forcePendingWebGLPolicy; }
288     
289 #if PLATFORM(IOS)
290     WEBCORE_EXPORT static float defaultMinimumZoomFontSize();
291 #endif
292
293 private:
294     explicit Settings(Page*);
295
296     void initializeDefaultFontFamilies();
297
298     Page* m_page;
299
300     String m_mediaTypeOverride;
301     URL m_userStyleSheetLocation;
302     const std::unique_ptr<FontGenericFamilies> m_fontGenericFamilies;
303     SecurityOrigin::StorageBlockingPolicy m_storageBlockingPolicy;
304     std::chrono::milliseconds m_layoutInterval;
305     double m_minimumDOMTimerInterval;
306     double m_domTimerAlignmentInterval;
307
308 #if ENABLE(TEXT_AUTOSIZING)
309     float m_textAutosizingFontScaleFactor;
310     IntSize m_textAutosizingWindowSizeOverride;
311     bool m_textAutosizingEnabled : 1;
312 #endif
313
314     SETTINGS_MEMBER_VARIABLES
315
316     bool m_isJavaEnabled : 1;
317     bool m_isJavaEnabledForLocalFiles : 1;
318     bool m_loadsImagesAutomatically : 1;
319     bool m_areImagesEnabled : 1;
320     bool m_arePluginsEnabled : 1;
321     bool m_isScriptEnabled : 1;
322     bool m_needsAdobeFrameReloadingQuirk : 1;
323     bool m_usesPageCache : 1;
324     unsigned m_fontRenderingMode : 1;
325     bool m_antialiasedFontDilationEnabled : 1;
326     bool m_showTiledScrollingIndicator : 1;
327     bool m_backgroundShouldExtendBeyondPage : 1;
328     bool m_dnsPrefetchingEnabled : 1;
329
330 #if ENABLE(TOUCH_EVENTS)
331     bool m_touchEventEmulationEnabled : 1;
332 #endif
333     bool m_scrollingPerformanceLoggingEnabled : 1;
334
335     double m_timeWithoutMouseMovementBeforeHidingControls;
336
337     Timer m_setImageLoadingSettingsTimer;
338     void imageLoadingSettingsTimerFired();
339
340 #if ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING)
341     bool m_hiddenPageDOMTimerThrottlingEnabled : 1;
342 #endif
343     bool m_hiddenPageCSSAnimationSuspensionEnabled : 1;
344     bool m_fontFallbackPrefersPictographs : 1;
345
346     bool m_forcePendingWebGLPolicy : 1;
347
348 #if ENABLE(RESOURCE_USAGE_OVERLAY)
349     bool m_resourceUsageOverlayVisible { false };
350 #endif
351
352 #if USE(AVFOUNDATION)
353     WEBCORE_EXPORT static bool gAVFoundationEnabled;
354 #endif
355
356 #if PLATFORM(COCOA)
357     WEBCORE_EXPORT static bool gQTKitEnabled;
358 #endif
359         
360     static bool gMockScrollbarsEnabled;
361     static bool gUsesOverlayScrollbars;
362
363 #if PLATFORM(WIN)
364     static bool gShouldUseHighResolutionTimers;
365 #endif
366     WEBCORE_EXPORT static bool gShouldRewriteConstAsVar;
367     static bool gShouldRespectPriorityInCSSAttributeSetters;
368 #if PLATFORM(IOS)
369     static bool gNetworkDataUsageTrackingEnabled;
370     WEBCORE_EXPORT static bool gAVKitEnabled;
371     WEBCORE_EXPORT static bool gShouldOptOutOfNetworkStateObservation;
372     WEBCORE_EXPORT static bool gManageAudioSession;
373 #endif
374
375 #if ENABLE(ENCRYPTED_MEDIA_V2)
376     String m_mediaKeysStorageDirectory;
377 #endif
378     
379 #if ENABLE(MEDIA_STREAM)
380     String m_mediaDeviceIdentifierStorageDirectory;
381 #endif
382
383     static bool gLowPowerVideoAudioBufferSizeEnabled;
384 };
385
386 } // namespace WebCore
387
388 #endif