5d82d25c74e85a7639f6333dd2b37bd2bf4c5fe7
[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 "FontRenderingMode.h"
32 #include "IntSize.h"
33 #include "URL.h"
34 #include "SecurityOrigin.h"
35 #include "SettingsMacros.h"
36 #include "Timer.h"
37 #include <chrono>
38 #include <unicode/uscript.h>
39 #include <wtf/HashMap.h>
40 #include <wtf/RefCounted.h>
41 #include <wtf/text/AtomicString.h>
42 #include <wtf/text/AtomicStringHash.h>
43
44 namespace WebCore {
45
46 class FontGenericFamilies;
47 class Page;
48
49 enum EditableLinkBehavior {
50     EditableLinkDefaultBehavior,
51     EditableLinkAlwaysLive,
52     EditableLinkOnlyLiveWithShiftKey,
53     EditableLinkLiveWhenNotFocused,
54     EditableLinkNeverLive
55 };
56
57 enum TextDirectionSubmenuInclusionBehavior {
58     TextDirectionSubmenuNeverIncluded,
59     TextDirectionSubmenuAutomaticallyIncluded,
60     TextDirectionSubmenuAlwaysIncluded
61 };
62
63 class Settings : public RefCounted<Settings> {
64     WTF_MAKE_NONCOPYABLE(Settings); WTF_MAKE_FAST_ALLOCATED;
65 public:
66     static PassRefPtr<Settings> create(Page*);
67     ~Settings();
68
69     void setStandardFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
70     const AtomicString& standardFontFamily(UScriptCode = USCRIPT_COMMON) const;
71
72     void setFixedFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
73     const AtomicString& fixedFontFamily(UScriptCode = USCRIPT_COMMON) const;
74
75     void setSerifFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
76     const AtomicString& serifFontFamily(UScriptCode = USCRIPT_COMMON) const;
77
78     void setSansSerifFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
79     const AtomicString& sansSerifFontFamily(UScriptCode = USCRIPT_COMMON) const;
80
81     void setCursiveFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
82     const AtomicString& cursiveFontFamily(UScriptCode = USCRIPT_COMMON) const;
83
84     void setFantasyFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
85     const AtomicString& fantasyFontFamily(UScriptCode = USCRIPT_COMMON) const;
86
87     void setPictographFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
88     const AtomicString& pictographFontFamily(UScriptCode = USCRIPT_COMMON) const;
89
90 #if ENABLE(TEXT_AUTOSIZING)
91     void setTextAutosizingEnabled(bool);
92     bool textAutosizingEnabled() const { return m_textAutosizingEnabled; }
93
94     void setTextAutosizingFontScaleFactor(float);
95     float textAutosizingFontScaleFactor() const { return m_textAutosizingFontScaleFactor; }
96
97     // Only set by Layout Tests, and only used if textAutosizingEnabled() returns true.
98     void setTextAutosizingWindowSizeOverride(const IntSize&);
99     const IntSize& textAutosizingWindowSizeOverride() const { return m_textAutosizingWindowSizeOverride; }
100 #endif
101
102     // Only set by Layout Tests.
103     void setMediaTypeOverride(const String&);
104     const String& mediaTypeOverride() const { return m_mediaTypeOverride; }
105
106     // Unlike areImagesEnabled, this only suppresses the network load of
107     // the image URL.  A cached image will still be rendered if requested.
108     void setLoadsImagesAutomatically(bool);
109     bool loadsImagesAutomatically() const { return m_loadsImagesAutomatically; }
110
111     // Clients that execute script should call ScriptController::canExecuteScripts()
112     // instead of this function. ScriptController::canExecuteScripts() checks the
113     // HTML sandbox, plug-in sandboxing, and other important details.
114     bool isScriptEnabled() const { return m_isScriptEnabled; }
115     void setScriptEnabled(bool);
116
117     SETTINGS_GETTERS_AND_SETTERS
118
119     void setScreenFontSubstitutionEnabled(bool);
120     bool screenFontSubstitutionEnabled() const { return m_screenFontSubstitutionEnabled; }
121
122     void setJavaEnabled(bool);
123     bool isJavaEnabled() const { return m_isJavaEnabled; }
124
125     // This settings is only consulted if isJavaEnabled() returns true;
126     void setJavaEnabledForLocalFiles(bool);
127     bool isJavaEnabledForLocalFiles() const { return m_isJavaEnabledForLocalFiles; }
128
129     void setImagesEnabled(bool);
130     bool areImagesEnabled() const { return m_areImagesEnabled; }
131
132     void setPluginsEnabled(bool);
133     bool arePluginsEnabled() const { return m_arePluginsEnabled; }
134
135     // When this option is set, WebCore will avoid storing any record of browsing activity
136     // that may persist on disk or remain displayed when the option is reset.
137     // This option does not affect the storage of such information in RAM.
138     // The following functions respect this setting:
139     //  - HTML5/DOM Storage
140     //  - Icon Database
141     //  - Console Messages
142     //  - MemoryCache
143     //  - Application Cache
144     //  - Back/Forward Page History
145     //  - Page Search Results
146     //  - HTTP Cookies
147     //  - Plug-ins (that support NPNVprivateModeBool)
148     void setPrivateBrowsingEnabled(bool);
149
150     void setDNSPrefetchingEnabled(bool);
151     bool dnsPrefetchingEnabled() const { return m_dnsPrefetchingEnabled; }
152
153     void setUserStyleSheetLocation(const URL&);
154     const URL& userStyleSheetLocation() const { return m_userStyleSheetLocation; }
155
156     void setNeedsAdobeFrameReloadingQuirk(bool);
157     bool needsAcrobatFrameReloadingQuirk() const { return m_needsAdobeFrameReloadingQuirk; }
158
159     static void setDefaultMinDOMTimerInterval(double); // Interval specified in seconds.
160     static double defaultMinDOMTimerInterval();
161         
162     static void setHiddenPageDOMTimerAlignmentInterval(double); // Interval specified in seconds.
163     static double hiddenPageDOMTimerAlignmentInterval();
164
165     void setMinDOMTimerInterval(double); // Per-page; initialized to default value.
166     double minDOMTimerInterval();
167
168     static void setDefaultDOMTimerAlignmentInterval(double);
169     static double defaultDOMTimerAlignmentInterval();
170
171     double domTimerAlignmentInterval() const;
172
173     void setLayoutInterval(std::chrono::milliseconds);
174     std::chrono::milliseconds layoutInterval() const { return m_layoutInterval; }
175
176 #if ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING)
177     bool hiddenPageDOMTimerThrottlingEnabled() const { return m_hiddenPageDOMTimerThrottlingEnabled; }
178     void setHiddenPageDOMTimerThrottlingEnabled(bool);
179 #endif
180
181     void setUsesPageCache(bool);
182     bool usesPageCache() const { return m_usesPageCache; }
183         
184     void setFontRenderingMode(FontRenderingMode mode);
185     FontRenderingMode fontRenderingMode() const;
186
187     void setShowTiledScrollingIndicator(bool);
188     bool showTiledScrollingIndicator() const { return m_showTiledScrollingIndicator; }
189
190 #if PLATFORM(WIN)
191     static void setShouldUseHighResolutionTimers(bool);
192     static bool shouldUseHighResolutionTimers() { return gShouldUseHighResolutionTimers; }
193 #endif
194
195     void setBackgroundShouldExtendBeyondPage(bool);
196     bool backgroundShouldExtendBeyondPage() const { return m_backgroundShouldExtendBeyondPage; }
197
198 #if USE(AVFOUNDATION)
199     static void setAVFoundationEnabled(bool flag);
200     static bool isAVFoundationEnabled() { return gAVFoundationEnabled; }
201 #endif
202
203 #if PLATFORM(COCOA)
204     static void setQTKitEnabled(bool flag);
205     static bool isQTKitEnabled() { return gQTKitEnabled; }
206 #endif
207
208     static const unsigned defaultMaximumHTMLParserDOMTreeDepth = 512;
209
210 #if USE(SAFARI_THEME)
211     // Windows debugging pref (global) for switching between the Aqua look and a native windows look.
212     static void setShouldPaintNativeControls(bool);
213     static bool shouldPaintNativeControls() { return gShouldPaintNativeControls; }
214 #endif
215
216     static void setMockScrollbarsEnabled(bool flag);
217     static bool mockScrollbarsEnabled();
218
219     static void setUsesOverlayScrollbars(bool flag);
220     static bool usesOverlayScrollbars();
221
222 #if ENABLE(TOUCH_EVENTS)
223     void setTouchEventEmulationEnabled(bool enabled) { m_touchEventEmulationEnabled = enabled; }
224     bool isTouchEventEmulationEnabled() const { return m_touchEventEmulationEnabled; }
225 #endif
226
227     void setStorageBlockingPolicy(SecurityOrigin::StorageBlockingPolicy);
228     SecurityOrigin::StorageBlockingPolicy storageBlockingPolicy() const { return m_storageBlockingPolicy; }
229
230     void setScrollingPerformanceLoggingEnabled(bool);
231     bool scrollingPerformanceLoggingEnabled() { return m_scrollingPerformanceLoggingEnabled; }
232
233     static void setShouldRespectPriorityInCSSAttributeSetters(bool);
234     static bool shouldRespectPriorityInCSSAttributeSetters();
235
236     void setTimeWithoutMouseMovementBeforeHidingControls(double time) { m_timeWithoutMouseMovementBeforeHidingControls = time; }
237     double timeWithoutMouseMovementBeforeHidingControls() const { return m_timeWithoutMouseMovementBeforeHidingControls; }
238
239 #if ENABLE(PAGE_VISIBILITY_API)
240     bool hiddenPageCSSAnimationSuspensionEnabled() const { return m_hiddenPageCSSAnimationSuspensionEnabled; }
241     void setHiddenPageCSSAnimationSuspensionEnabled(bool);
242 #endif
243
244     void setFontFallbackPrefersPictographs(bool);
245     bool fontFallbackPrefersPictographs() const { return m_fontFallbackPrefersPictographs; }
246
247     static bool lowPowerVideoAudioBufferSizeEnabled() { return gLowPowerVideoAudioBufferSizeEnabled; }
248     static void setLowPowerVideoAudioBufferSizeEnabled(bool);
249
250 #if PLATFORM(IOS)
251     static void setAudioSessionCategoryOverride(unsigned);
252     static unsigned audioSessionCategoryOverride();
253
254     static void setNetworkDataUsageTrackingEnabled(bool);
255     static bool networkDataUsageTrackingEnabled();
256
257     static void setNetworkInterfaceName(const String&);
258     static const String& networkInterfaceName();
259
260     static void setAVKitEnabled(bool flag) { gAVKitEnabled = flag; }
261     static bool avKitEnabled() { return gAVKitEnabled; }
262
263     static void setShouldOptOutOfNetworkStateObservation(bool flag) { gShouldOptOutOfNetworkStateObservation = flag; }
264     static bool shouldOptOutOfNetworkStateObservation() { return gShouldOptOutOfNetworkStateObservation; }
265
266     static void setShouldManageAudioSession(bool flag) { gManageAudioSession = flag; }
267     static bool shouldManageAudioSession() { return gManageAudioSession; }
268 #endif
269
270 private:
271     explicit Settings(Page*);
272
273     void initializeDefaultFontFamilies();
274     static bool shouldEnableScreenFontSubstitutionByDefault();
275
276     Page* m_page;
277
278     String m_mediaTypeOverride;
279     URL m_userStyleSheetLocation;
280     const std::unique_ptr<FontGenericFamilies> m_fontGenericFamilies;
281     SecurityOrigin::StorageBlockingPolicy m_storageBlockingPolicy;
282     std::chrono::milliseconds m_layoutInterval;
283 #if ENABLE(TEXT_AUTOSIZING)
284     float m_textAutosizingFontScaleFactor;
285     IntSize m_textAutosizingWindowSizeOverride;
286     bool m_textAutosizingEnabled : 1;
287 #endif
288
289     SETTINGS_MEMBER_VARIABLES
290
291     bool m_screenFontSubstitutionEnabled : 1;
292     bool m_isJavaEnabled : 1;
293     bool m_isJavaEnabledForLocalFiles : 1;
294     bool m_loadsImagesAutomatically : 1;
295     bool m_areImagesEnabled : 1;
296     bool m_arePluginsEnabled : 1;
297     bool m_isScriptEnabled : 1;
298     bool m_needsAdobeFrameReloadingQuirk : 1;
299     bool m_usesPageCache : 1;
300     unsigned m_fontRenderingMode : 1;
301     bool m_showTiledScrollingIndicator : 1;
302     bool m_backgroundShouldExtendBeyondPage : 1;
303     bool m_dnsPrefetchingEnabled : 1;
304
305 #if ENABLE(TOUCH_EVENTS)
306     bool m_touchEventEmulationEnabled : 1;
307 #endif
308     bool m_scrollingPerformanceLoggingEnabled : 1;
309
310     double m_timeWithoutMouseMovementBeforeHidingControls;
311
312     Timer<Settings> m_setImageLoadingSettingsTimer;
313     void imageLoadingSettingsTimerFired(Timer<Settings>*);
314
315 #if ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING)
316     bool m_hiddenPageDOMTimerThrottlingEnabled : 1;
317 #endif
318 #if ENABLE(PAGE_VISIBILITY_API)
319     bool m_hiddenPageCSSAnimationSuspensionEnabled : 1;
320 #endif
321     bool m_fontFallbackPrefersPictographs : 1;
322
323     static double gDefaultMinDOMTimerInterval;
324     static double gDefaultDOMTimerAlignmentInterval;
325
326 #if USE(AVFOUNDATION)
327     static bool gAVFoundationEnabled;
328 #endif
329
330 #if PLATFORM(COCOA)
331     static bool gQTKitEnabled;
332 #endif
333         
334     static bool gMockScrollbarsEnabled;
335     static bool gUsesOverlayScrollbars;
336
337 #if USE(SAFARI_THEME)
338     static bool gShouldPaintNativeControls;
339 #endif
340 #if PLATFORM(WIN)
341     static bool gShouldUseHighResolutionTimers;
342 #endif
343     static bool gShouldRespectPriorityInCSSAttributeSetters;
344 #if PLATFORM(IOS)
345     static bool gNetworkDataUsageTrackingEnabled;
346     static bool gAVKitEnabled;
347     static bool gShouldOptOutOfNetworkStateObservation;
348     static bool gManageAudioSession;
349 #endif
350
351     static double gHiddenPageDOMTimerAlignmentInterval;
352
353     static bool gLowPowerVideoAudioBufferSizeEnabled;
354 };
355
356 } // namespace WebCore
357
358 #endif