96205fd7e4afb999b6a0af194cbf3a8d779b6039
[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 COMPUTER, 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 COMPUTER, 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 <wtf/HashMap.h>
38 #include <wtf/RefCounted.h>
39 #include <wtf/text/AtomicString.h>
40 #include <wtf/text/AtomicStringHash.h>
41 #include <wtf/unicode/Unicode.h>
42
43 namespace WebCore {
44
45 class FontGenericFamilies;
46 class Page;
47
48 enum EditableLinkBehavior {
49     EditableLinkDefaultBehavior,
50     EditableLinkAlwaysLive,
51     EditableLinkOnlyLiveWithShiftKey,
52     EditableLinkLiveWhenNotFocused,
53     EditableLinkNeverLive
54 };
55
56 enum TextDirectionSubmenuInclusionBehavior {
57     TextDirectionSubmenuNeverIncluded,
58     TextDirectionSubmenuAutomaticallyIncluded,
59     TextDirectionSubmenuAlwaysIncluded
60 };
61
62 class Settings : public RefCounted<Settings> {
63     WTF_MAKE_NONCOPYABLE(Settings); WTF_MAKE_FAST_ALLOCATED;
64 public:
65     static PassRefPtr<Settings> create(Page*);
66     ~Settings();
67
68     void setStandardFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
69     const AtomicString& standardFontFamily(UScriptCode = USCRIPT_COMMON) const;
70
71     void setFixedFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
72     const AtomicString& fixedFontFamily(UScriptCode = USCRIPT_COMMON) const;
73
74     void setSerifFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
75     const AtomicString& serifFontFamily(UScriptCode = USCRIPT_COMMON) const;
76
77     void setSansSerifFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
78     const AtomicString& sansSerifFontFamily(UScriptCode = USCRIPT_COMMON) const;
79
80     void setCursiveFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
81     const AtomicString& cursiveFontFamily(UScriptCode = USCRIPT_COMMON) const;
82
83     void setFantasyFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
84     const AtomicString& fantasyFontFamily(UScriptCode = USCRIPT_COMMON) const;
85
86     void setPictographFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
87     const AtomicString& pictographFontFamily(UScriptCode = USCRIPT_COMMON) const;
88
89 #if ENABLE(TEXT_AUTOSIZING)
90     void setTextAutosizingEnabled(bool);
91     bool textAutosizingEnabled() const { return m_textAutosizingEnabled; }
92
93     void setTextAutosizingFontScaleFactor(float);
94     float textAutosizingFontScaleFactor() const { return m_textAutosizingFontScaleFactor; }
95
96     // Only set by Layout Tests, and only used if textAutosizingEnabled() returns true.
97     void setTextAutosizingWindowSizeOverride(const IntSize&);
98     const IntSize& textAutosizingWindowSizeOverride() const { return m_textAutosizingWindowSizeOverride; }
99 #endif
100
101     // Only set by Layout Tests.
102     void setMediaTypeOverride(const String&);
103     const String& mediaTypeOverride() const { return m_mediaTypeOverride; }
104
105     // Unlike areImagesEnabled, this only suppresses the network load of
106     // the image URL.  A cached image will still be rendered if requested.
107     void setLoadsImagesAutomatically(bool);
108     bool loadsImagesAutomatically() const { return m_loadsImagesAutomatically; }
109
110     // Clients that execute script should call ScriptController::canExecuteScripts()
111     // instead of this function. ScriptController::canExecuteScripts() checks the
112     // HTML sandbox, plug-in sandboxing, and other important details.
113     bool isScriptEnabled() const { return m_isScriptEnabled; }
114     void setScriptEnabled(bool);
115
116     SETTINGS_GETTERS_AND_SETTERS
117
118     void setScreenFontSubstitutionEnabled(bool);
119     bool screenFontSubstitutionEnabled() const { return m_screenFontSubstitutionEnabled; }
120
121     void setJavaEnabled(bool);
122     bool isJavaEnabled() const { return m_isJavaEnabled; }
123
124     // This settings is only consulted if isJavaEnabled() returns true;
125     void setJavaEnabledForLocalFiles(bool);
126     bool isJavaEnabledForLocalFiles() const { return m_isJavaEnabledForLocalFiles; }
127
128     void setImagesEnabled(bool);
129     bool areImagesEnabled() const { return m_areImagesEnabled; }
130
131     void setPluginsEnabled(bool);
132     bool arePluginsEnabled() const { return m_arePluginsEnabled; }
133
134     // When this option is set, WebCore will avoid storing any record of browsing activity
135     // that may persist on disk or remain displayed when the option is reset.
136     // This option does not affect the storage of such information in RAM.
137     // The following functions respect this setting:
138     //  - HTML5/DOM Storage
139     //  - Icon Database
140     //  - Console Messages
141     //  - MemoryCache
142     //  - Application Cache
143     //  - Back/Forward Page History
144     //  - Page Search Results
145     //  - HTTP Cookies
146     //  - Plug-ins (that support NPNVprivateModeBool)
147     void setPrivateBrowsingEnabled(bool);
148     bool privateBrowsingEnabled() const { return m_privateBrowsingEnabled; }
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     void setDOMTimerAlignmentInterval(double);
172     double domTimerAlignmentInterval() const;
173
174     // FIXME: Change these methods to take/return an unsigned integer after we upstream the iOS port.
175     void setLayoutInterval(int);
176     int layoutInterval() const { return m_layoutInterval; }
177
178 #if ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING)
179     bool hiddenPageDOMTimerThrottlingEnabled() const { return m_hiddenPageDOMTimerThrottlingEnabled; }
180     void setHiddenPageDOMTimerThrottlingEnabled(bool);
181 #endif
182
183 #if PLATFORM(IOS)
184     // FIXME: This setting isn't specific to iOS.
185     void setMaxParseDuration(double maxParseDuration) { m_maxParseDuration = maxParseDuration; }
186     double maxParseDuration() const { return m_maxParseDuration; }
187
188     void setStandalone(bool);
189     bool standalone() const { return m_standalone; }
190
191     void setTelephoneNumberParsingEnabled(bool flag) { m_telephoneNumberParsingEnabled = flag; }
192     bool telephoneNumberParsingEnabled() const { return m_telephoneNumberParsingEnabled; }
193
194     void setMediaDataLoadsAutomatically(bool flag) { m_mediaDataLoadsAutomatically = flag; }
195     bool mediaDataLoadsAutomatically() const { return m_mediaDataLoadsAutomatically; }
196
197     void setShouldTransformsAffectOverflow(bool flag) { m_shouldTransformsAffectOverflow = flag; }
198     bool shouldTransformsAffectOverflow() const { return m_shouldTransformsAffectOverflow; }
199
200     void setShouldDispatchJavaScriptWindowOnErrorEvents(bool flag) { m_shouldDispatchJavaScriptWindowOnErrorEvents = flag; }
201     bool shouldDispatchJavaScriptWindowOnErrorEvents() const { return m_shouldDispatchJavaScriptWindowOnErrorEvents; }
202
203     void setAlwaysUseBaselineOfPrimaryFont(bool flag) { m_alwaysUseBaselineOfPrimaryFont = flag; }
204     bool alwaysUseBaselineOfPrimaryFont() const { return m_alwaysUseBaselineOfPrimaryFont; }
205
206     void setAlwaysUseAcceleratedOverflowScroll(bool flag) { m_alwaysUseAcceleratedOverflowScroll = flag; }
207     bool alwaysUseAcceleratedOverflowScroll() const { return m_alwaysUseAcceleratedOverflowScroll; }
208 #endif
209
210     void setUsesPageCache(bool);
211     bool usesPageCache() const { return m_usesPageCache; }
212         
213     void setFontRenderingMode(FontRenderingMode mode);
214     FontRenderingMode fontRenderingMode() const;
215
216     void setCSSCustomFilterEnabled(bool enabled) { m_isCSSCustomFilterEnabled = enabled; }
217     bool isCSSCustomFilterEnabled() const { return m_isCSSCustomFilterEnabled; }
218
219 #if ENABLE(CSS_STICKY_POSITION)
220     void setCSSStickyPositionEnabled(bool enabled) { m_cssStickyPositionEnabled = enabled; }
221     bool cssStickyPositionEnabled() const { return m_cssStickyPositionEnabled; }
222 #else
223     void setCSSStickyPositionEnabled(bool) { }
224     bool cssStickyPositionEnabled() const { return false; }
225 #endif
226
227     void setShowTiledScrollingIndicator(bool);
228     bool showTiledScrollingIndicator() const { return m_showTiledScrollingIndicator; }
229
230 #if PLATFORM(WIN)
231     static void setShouldUseHighResolutionTimers(bool);
232     static bool shouldUseHighResolutionTimers() { return gShouldUseHighResolutionTimers; }
233 #endif
234
235     void setTiledBackingStoreEnabled(bool);
236     bool tiledBackingStoreEnabled() const { return m_tiledBackingStoreEnabled; }
237
238 #if USE(AVFOUNDATION)
239     static void setAVFoundationEnabled(bool flag);
240     static bool isAVFoundationEnabled() { return gAVFoundationEnabled; }
241 #endif
242
243 #if PLATFORM(MAC)
244     static void setQTKitEnabled(bool flag);
245     static bool isQTKitEnabled() { return gQTKitEnabled; }
246 #endif
247
248     static const unsigned defaultMaximumHTMLParserDOMTreeDepth = 512;
249
250 #if USE(SAFARI_THEME)
251     // Windows debugging pref (global) for switching between the Aqua look and a native windows look.
252     static void setShouldPaintNativeControls(bool);
253     static bool shouldPaintNativeControls() { return gShouldPaintNativeControls; }
254 #endif
255
256     static void setMockScrollbarsEnabled(bool flag);
257     static bool mockScrollbarsEnabled();
258
259     static void setUsesOverlayScrollbars(bool flag);
260     static bool usesOverlayScrollbars();
261
262 #if ENABLE(TOUCH_EVENTS)
263     void setTouchEventEmulationEnabled(bool enabled) { m_touchEventEmulationEnabled = enabled; }
264     bool isTouchEventEmulationEnabled() const { return m_touchEventEmulationEnabled; }
265 #endif
266
267     void setStorageBlockingPolicy(SecurityOrigin::StorageBlockingPolicy);
268     SecurityOrigin::StorageBlockingPolicy storageBlockingPolicy() const { return m_storageBlockingPolicy; }
269
270     void setScrollingPerformanceLoggingEnabled(bool);
271     bool scrollingPerformanceLoggingEnabled() { return m_scrollingPerformanceLoggingEnabled; }
272         
273     void setAggressiveTileRetentionEnabled(bool);
274     bool aggressiveTileRetentionEnabled() { return m_aggressiveTileRetentionEnabled; }
275
276     static void setShouldRespectPriorityInCSSAttributeSetters(bool);
277     static bool shouldRespectPriorityInCSSAttributeSetters();
278
279     void setTimeWithoutMouseMovementBeforeHidingControls(double time) { m_timeWithoutMouseMovementBeforeHidingControls = time; }
280     double timeWithoutMouseMovementBeforeHidingControls() const { return m_timeWithoutMouseMovementBeforeHidingControls; }
281
282 #if ENABLE(PAGE_VISIBILITY_API)
283     bool hiddenPageCSSAnimationSuspensionEnabled() const { return m_hiddenPageCSSAnimationSuspensionEnabled; }
284     void setHiddenPageCSSAnimationSuspensionEnabled(bool);
285 #endif
286
287     void setFontFallbackPrefersPictographs(bool);
288     bool fontFallbackPrefersPictographs() const { return m_fontFallbackPrefersPictographs; }
289
290     static bool lowPowerVideoAudioBufferSizeEnabled() { return gLowPowerVideoAudioBufferSizeEnabled; }
291     static void setLowPowerVideoAudioBufferSizeEnabled(bool);
292
293 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
294     static void setVideoPluginProxyEnabled(bool flag);
295     static bool isVideoPluginProxyEnabled() { return gVideoPluginProxyEnabled; }
296 #endif
297
298 #if PLATFORM(IOS)
299     static void setAudioSessionCategoryOverride(unsigned);
300     static unsigned audioSessionCategoryOverride();
301
302     static void setNetworkDataUsageTrackingEnabled(bool);
303     static bool networkDataUsageTrackingEnabled();
304
305     static void setNetworkInterfaceName(const String&);
306     static const String& networkInterfaceName();
307 #endif
308
309 private:
310     explicit Settings(Page*);
311
312     void initializeDefaultFontFamilies();
313     static bool shouldEnableScreenFontSubstitutionByDefault();
314
315     Page* m_page;
316
317     String m_mediaTypeOverride;
318     URL m_userStyleSheetLocation;
319     const std::unique_ptr<FontGenericFamilies> m_fontGenericFamilies;
320     SecurityOrigin::StorageBlockingPolicy m_storageBlockingPolicy;
321     int m_layoutInterval;
322 #if PLATFORM(IOS)
323     double m_maxParseDuration;
324 #endif
325 #if ENABLE(TEXT_AUTOSIZING)
326     float m_textAutosizingFontScaleFactor;
327     IntSize m_textAutosizingWindowSizeOverride;
328     bool m_textAutosizingEnabled : 1;
329 #endif
330
331     SETTINGS_MEMBER_VARIABLES
332
333     bool m_screenFontSubstitutionEnabled : 1;
334     bool m_isJavaEnabled : 1;
335     bool m_isJavaEnabledForLocalFiles : 1;
336     bool m_loadsImagesAutomatically : 1;
337     bool m_privateBrowsingEnabled : 1;
338     bool m_areImagesEnabled : 1;
339     bool m_arePluginsEnabled : 1;
340     bool m_isScriptEnabled : 1;
341     bool m_needsAdobeFrameReloadingQuirk : 1;
342     bool m_usesPageCache : 1;
343     unsigned m_fontRenderingMode : 1;
344     bool m_isCSSCustomFilterEnabled : 1;
345 #if PLATFORM(IOS)
346     bool m_standalone : 1;
347     bool m_telephoneNumberParsingEnabled : 1;
348     bool m_mediaDataLoadsAutomatically : 1;
349     bool m_shouldTransformsAffectOverflow : 1;
350     bool m_shouldDispatchJavaScriptWindowOnErrorEvents : 1;
351     bool m_alwaysUseBaselineOfPrimaryFont : 1;
352     bool m_allowMultiElementImplicitFormSubmission : 1;
353     bool m_alwaysUseAcceleratedOverflowScroll : 1;
354 #endif
355 #if ENABLE(CSS_STICKY_POSITION)
356     bool m_cssStickyPositionEnabled : 1;
357 #endif
358     bool m_showTiledScrollingIndicator : 1;
359     bool m_tiledBackingStoreEnabled : 1;
360     bool m_dnsPrefetchingEnabled : 1;
361
362 #if ENABLE(TOUCH_EVENTS)
363     bool m_touchEventEmulationEnabled : 1;
364 #endif
365     bool m_scrollingPerformanceLoggingEnabled : 1;
366     bool m_aggressiveTileRetentionEnabled : 1;
367
368     double m_timeWithoutMouseMovementBeforeHidingControls;
369
370     Timer<Settings> m_setImageLoadingSettingsTimer;
371     void imageLoadingSettingsTimerFired(Timer<Settings>*);
372
373 #if ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING)
374     bool m_hiddenPageDOMTimerThrottlingEnabled : 1;
375 #endif
376 #if ENABLE(PAGE_VISIBILITY_API)
377     bool m_hiddenPageCSSAnimationSuspensionEnabled : 1;
378 #endif
379     bool m_fontFallbackPrefersPictographs : 1;
380
381     static double gDefaultMinDOMTimerInterval;
382     static double gDefaultDOMTimerAlignmentInterval;
383
384 #if USE(AVFOUNDATION)
385     static bool gAVFoundationEnabled;
386 #endif
387
388 #if PLATFORM(MAC)
389     static bool gQTKitEnabled;
390 #endif
391         
392     static bool gMockScrollbarsEnabled;
393     static bool gUsesOverlayScrollbars;
394
395 #if USE(SAFARI_THEME)
396     static bool gShouldPaintNativeControls;
397 #endif
398 #if PLATFORM(WIN)
399     static bool gShouldUseHighResolutionTimers;
400 #endif
401     static bool gShouldRespectPriorityInCSSAttributeSetters;
402 #if PLATFORM(IOS)
403     static bool gNetworkDataUsageTrackingEnabled;
404 #endif
405
406     static double gHiddenPageDOMTimerAlignmentInterval;
407
408     static bool gLowPowerVideoAudioBufferSizeEnabled;
409
410 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
411     static bool gVideoPluginProxyEnabled;
412 #endif
413 };
414
415 } // namespace WebCore
416
417 #endif