Implement font-display loading behaviors
[WebKit-https.git] / Source / WebCore / page / Settings.h
1 /*
2  * Copyright (C) 2003-2016 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 #pragma once
28
29 #include "ClipboardAccessPolicy.h"
30 #include "ContentType.h"
31 #include "EditingBehaviorTypes.h"
32 #include "IntSize.h"
33 #include "SecurityOrigin.h"
34 #include "SettingsMacros.h"
35 #include "TextFlags.h"
36 #include "Timer.h"
37 #include "URL.h"
38 #include "WritingMode.h"
39 #include <runtime/RuntimeFlags.h>
40 #include <unicode/uscript.h>
41 #include <wtf/HashMap.h>
42 #include <wtf/RefCounted.h>
43 #include <wtf/text/AtomicString.h>
44 #include <wtf/text/AtomicStringHash.h>
45
46 #if ENABLE(DATA_DETECTION)
47 #include "DataDetection.h"
48 #endif
49
50 namespace WebCore {
51
52 class FontGenericFamilies;
53 class Page;
54
55 enum EditableLinkBehavior {
56     EditableLinkDefaultBehavior,
57     EditableLinkAlwaysLive,
58     EditableLinkOnlyLiveWithShiftKey,
59     EditableLinkLiveWhenNotFocused,
60     EditableLinkNeverLive
61 };
62
63 enum TextDirectionSubmenuInclusionBehavior {
64     TextDirectionSubmenuNeverIncluded,
65     TextDirectionSubmenuAutomaticallyIncluded,
66     TextDirectionSubmenuAlwaysIncluded
67 };
68
69 enum DebugOverlayRegionFlags {
70     NonFastScrollableRegion = 1 << 0,
71     WheelEventHandlerRegion = 1 << 1,
72 };
73
74 enum class UserInterfaceDirectionPolicy {
75     Content,
76     System
77 };
78
79 enum PDFImageCachingPolicy {
80     PDFImageCachingEnabled,
81     PDFImageCachingBelowMemoryLimit,
82     PDFImageCachingDisabled,
83     PDFImageCachingClipBoundsOnly,
84 #if PLATFORM(IOS)
85     PDFImageCachingDefault = PDFImageCachingBelowMemoryLimit
86 #else
87     PDFImageCachingDefault = PDFImageCachingEnabled
88 #endif
89 };
90
91 enum FrameFlattening {
92     FrameFlatteningDisabled,
93     FrameFlatteningEnabledForNonFullScreenIFrames,
94     FrameFlatteningFullyEnabled
95 };
96
97 typedef unsigned DebugOverlayRegions;
98
99 class Settings : public RefCounted<Settings> {
100     WTF_MAKE_NONCOPYABLE(Settings); WTF_MAKE_FAST_ALLOCATED;
101 public:
102     static Ref<Settings> create(Page*);
103     ~Settings();
104
105     void pageDestroyed() { m_page = nullptr; }
106
107     enum class FontLoadTimingOverride { None, Block, Swap, Failure };
108
109     enum class ForcedAccessibilityValue { System, On, Off };
110     static const Settings::ForcedAccessibilityValue defaultForcedColorsAreInvertedAccessibilityValue = ForcedAccessibilityValue::System;
111     static const Settings::ForcedAccessibilityValue defaultForcedDisplayIsMonochromeAccessibilityValue = ForcedAccessibilityValue::System;
112     static const Settings::ForcedAccessibilityValue defaultForcedPrefersReducedMotionAccessibilityValue = ForcedAccessibilityValue::System;
113
114     WEBCORE_EXPORT void setStandardFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
115     WEBCORE_EXPORT const AtomicString& standardFontFamily(UScriptCode = USCRIPT_COMMON) const;
116
117     WEBCORE_EXPORT void setFixedFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
118     WEBCORE_EXPORT const AtomicString& fixedFontFamily(UScriptCode = USCRIPT_COMMON) const;
119
120     WEBCORE_EXPORT void setSerifFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
121     WEBCORE_EXPORT const AtomicString& serifFontFamily(UScriptCode = USCRIPT_COMMON) const;
122
123     WEBCORE_EXPORT void setSansSerifFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
124     WEBCORE_EXPORT const AtomicString& sansSerifFontFamily(UScriptCode = USCRIPT_COMMON) const;
125
126     WEBCORE_EXPORT void setCursiveFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
127     WEBCORE_EXPORT const AtomicString& cursiveFontFamily(UScriptCode = USCRIPT_COMMON) const;
128
129     WEBCORE_EXPORT void setFantasyFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
130     WEBCORE_EXPORT const AtomicString& fantasyFontFamily(UScriptCode = USCRIPT_COMMON) const;
131
132     WEBCORE_EXPORT void setPictographFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
133     WEBCORE_EXPORT const AtomicString& pictographFontFamily(UScriptCode = USCRIPT_COMMON) const;
134
135     WEBCORE_EXPORT static bool defaultTextAutosizingEnabled();
136     WEBCORE_EXPORT static float defaultMinimumZoomFontSize();
137
138     // Only set by Layout Tests.
139     WEBCORE_EXPORT void setMediaTypeOverride(const String&);
140     const String& mediaTypeOverride() const { return m_mediaTypeOverride; }
141
142     // Unlike areImagesEnabled, this only suppresses the network load of
143     // the image URL.  A cached image will still be rendered if requested.
144     WEBCORE_EXPORT void setLoadsImagesAutomatically(bool);
145     bool loadsImagesAutomatically() const { return m_loadsImagesAutomatically; }
146
147     // Clients that execute script should call ScriptController::canExecuteScripts()
148     // instead of this function. ScriptController::canExecuteScripts() checks the
149     // HTML sandbox, plug-in sandboxing, and other important details.
150     bool isScriptEnabled() const { return m_isScriptEnabled; }
151     WEBCORE_EXPORT void setScriptEnabled(bool);
152
153     SETTINGS_GETTERS_AND_SETTERS
154
155     WEBCORE_EXPORT void setJavaEnabled(bool);
156     bool isJavaEnabled() const { return m_isJavaEnabled; }
157
158     // This settings is only consulted if isJavaEnabled() returns true;
159     WEBCORE_EXPORT void setJavaEnabledForLocalFiles(bool);
160     bool isJavaEnabledForLocalFiles() const { return m_isJavaEnabledForLocalFiles; }
161
162     WEBCORE_EXPORT void setImagesEnabled(bool);
163     bool areImagesEnabled() const { return m_areImagesEnabled; }
164
165     WEBCORE_EXPORT void setPreferMIMETypeForImages(bool);
166     bool preferMIMETypeForImages() const { return m_preferMIMETypeForImages; }
167
168     WEBCORE_EXPORT void setPluginsEnabled(bool);
169     bool arePluginsEnabled() const { return m_arePluginsEnabled; }
170
171     WEBCORE_EXPORT void setDNSPrefetchingEnabled(bool);
172     bool dnsPrefetchingEnabled() const { return m_dnsPrefetchingEnabled; }
173
174     WEBCORE_EXPORT void setUserStyleSheetLocation(const URL&);
175     const URL& userStyleSheetLocation() const { return m_userStyleSheetLocation; }
176
177     WEBCORE_EXPORT void setNeedsAdobeFrameReloadingQuirk(bool);
178     bool needsAcrobatFrameReloadingQuirk() const { return m_needsAdobeFrameReloadingQuirk; }
179
180     WEBCORE_EXPORT void setMinimumDOMTimerInterval(Seconds); // Initialized to DOMTimer::defaultMinimumInterval().
181     Seconds minimumDOMTimerInterval() const { return m_minimumDOMTimerInterval; }
182
183     WEBCORE_EXPORT void setLayoutInterval(Seconds);
184     Seconds layoutInterval() const { return m_layoutInterval; }
185
186     bool hiddenPageDOMTimerThrottlingEnabled() const { return m_hiddenPageDOMTimerThrottlingEnabled; }
187     WEBCORE_EXPORT void setHiddenPageDOMTimerThrottlingEnabled(bool);
188     bool hiddenPageDOMTimerThrottlingAutoIncreases() const { return m_hiddenPageDOMTimerThrottlingAutoIncreases; }
189     WEBCORE_EXPORT void setHiddenPageDOMTimerThrottlingAutoIncreases(bool);
190
191     WEBCORE_EXPORT void setUsesPageCache(bool);
192     bool usesPageCache() const { return m_usesPageCache; }
193         
194     void setFontRenderingMode(FontRenderingMode mode);
195     FontRenderingMode fontRenderingMode() const;
196
197     WEBCORE_EXPORT void setShowTiledScrollingIndicator(bool);
198     bool showTiledScrollingIndicator() const { return m_showTiledScrollingIndicator; }
199
200 #if ENABLE(RESOURCE_USAGE)
201     bool resourceUsageOverlayVisible() const { return m_resourceUsageOverlayVisible; }
202     WEBCORE_EXPORT void setResourceUsageOverlayVisible(bool);
203 #endif
204
205 #if PLATFORM(WIN)
206     static void setShouldUseHighResolutionTimers(bool);
207     static bool shouldUseHighResolutionTimers() { return gShouldUseHighResolutionTimers; }
208 #endif
209
210     static bool isPostLoadCPUUsageMeasurementEnabled();
211     static bool isPostBackgroundingCPUUsageMeasurementEnabled();
212     static bool isPerActivityStateCPUUsageMeasurementEnabled();
213
214     static bool isPostLoadMemoryUsageMeasurementEnabled();
215     static bool isPostBackgroundingMemoryUsageMeasurementEnabled();
216
217     static bool globalConstRedeclarationShouldThrow();
218
219     WEBCORE_EXPORT void setBackgroundShouldExtendBeyondPage(bool);
220     bool backgroundShouldExtendBeyondPage() const { return m_backgroundShouldExtendBeyondPage; }
221
222 #if USE(AVFOUNDATION)
223     WEBCORE_EXPORT static void setAVFoundationEnabled(bool flag);
224     static bool isAVFoundationEnabled() { return gAVFoundationEnabled; }
225     WEBCORE_EXPORT static void setAVFoundationNSURLSessionEnabled(bool flag);
226     static bool isAVFoundationNSURLSessionEnabled() { return gAVFoundationNSURLSessionEnabled; }
227 #endif
228
229 #if PLATFORM(COCOA)
230     WEBCORE_EXPORT static void setQTKitEnabled(bool flag);
231     static bool isQTKitEnabled() { return gQTKitEnabled; }
232 #else
233     static bool isQTKitEnabled() { return false; }
234 #endif
235
236 #if USE(GSTREAMER)
237     WEBCORE_EXPORT static void setGStreamerEnabled(bool flag);
238     static bool isGStreamerEnabled() { return gGStreamerEnabled; }
239 #endif
240
241     static const unsigned defaultMaximumHTMLParserDOMTreeDepth = 512;
242     static const unsigned defaultMaximumRenderTreeDepth = 512;
243
244     WEBCORE_EXPORT static void setMockScrollbarsEnabled(bool flag);
245     WEBCORE_EXPORT static bool mockScrollbarsEnabled();
246
247     WEBCORE_EXPORT static void setUsesOverlayScrollbars(bool flag);
248     static bool usesOverlayScrollbars();
249
250     WEBCORE_EXPORT static void setUsesMockScrollAnimator(bool);
251     static bool usesMockScrollAnimator();
252
253 #if ENABLE(TOUCH_EVENTS)
254     void setTouchEventEmulationEnabled(bool enabled) { m_touchEventEmulationEnabled = enabled; }
255     bool isTouchEventEmulationEnabled() const { return m_touchEventEmulationEnabled; }
256 #endif
257
258     WEBCORE_EXPORT void setStorageBlockingPolicy(SecurityOrigin::StorageBlockingPolicy);
259     SecurityOrigin::StorageBlockingPolicy storageBlockingPolicy() const { return m_storageBlockingPolicy; }
260
261     WEBCORE_EXPORT void setScrollingPerformanceLoggingEnabled(bool);
262     bool scrollingPerformanceLoggingEnabled() { return m_scrollingPerformanceLoggingEnabled; }
263
264     WEBCORE_EXPORT static void setShouldRespectPriorityInCSSAttributeSetters(bool);
265     static bool shouldRespectPriorityInCSSAttributeSetters();
266
267     void setTimeWithoutMouseMovementBeforeHidingControls(Seconds time) { m_timeWithoutMouseMovementBeforeHidingControls = time; }
268     Seconds timeWithoutMouseMovementBeforeHidingControls() const { return m_timeWithoutMouseMovementBeforeHidingControls; }
269
270     bool hiddenPageCSSAnimationSuspensionEnabled() const { return m_hiddenPageCSSAnimationSuspensionEnabled; }
271     WEBCORE_EXPORT void setHiddenPageCSSAnimationSuspensionEnabled(bool);
272
273     WEBCORE_EXPORT void setFontFallbackPrefersPictographs(bool);
274     bool fontFallbackPrefersPictographs() const { return m_fontFallbackPrefersPictographs; }
275
276     static bool lowPowerVideoAudioBufferSizeEnabled() { return gLowPowerVideoAudioBufferSizeEnabled; }
277     WEBCORE_EXPORT static void setLowPowerVideoAudioBufferSizeEnabled(bool);
278
279     static bool resourceLoadStatisticsEnabled() { return gResourceLoadStatisticsEnabledEnabled; }
280     WEBCORE_EXPORT static void setResourceLoadStatisticsEnabled(bool);
281
282 #if PLATFORM(IOS)
283     WEBCORE_EXPORT static void setAudioSessionCategoryOverride(unsigned);
284     static unsigned audioSessionCategoryOverride();
285
286     WEBCORE_EXPORT static void setNetworkDataUsageTrackingEnabled(bool);
287     static bool networkDataUsageTrackingEnabled();
288
289     WEBCORE_EXPORT static void setNetworkInterfaceName(const String&);
290     static const String& networkInterfaceName();
291
292 #if HAVE(AVKIT)
293     static void setAVKitEnabled(bool flag) { gAVKitEnabled = flag; }
294 #endif
295     static bool avKitEnabled() { return gAVKitEnabled; }
296
297     static void setShouldOptOutOfNetworkStateObservation(bool flag) { gShouldOptOutOfNetworkStateObservation = flag; }
298     static bool shouldOptOutOfNetworkStateObservation() { return gShouldOptOutOfNetworkStateObservation; }
299 #endif
300
301 #if USE(AUDIO_SESSION)
302     static void setShouldManageAudioSessionCategory(bool flag) { gManageAudioSession = flag; }
303     static bool shouldManageAudioSessionCategory() { return gManageAudioSession; }
304 #endif
305
306     static void setCustomPasteboardDataEnabled(bool enabled) { gCustomPasteboardDataEnabled = enabled; }
307     WEBCORE_EXPORT static bool customPasteboardDataEnabled();
308
309 #if ENABLE(LEGACY_ENCRYPTED_MEDIA)
310     void setMediaKeysStorageDirectory(const String& directory) { m_mediaKeysStorageDirectory = directory; }
311     const String& mediaKeysStorageDirectory() const { return m_mediaKeysStorageDirectory; }
312 #endif
313     
314 #if ENABLE(MEDIA_STREAM)
315     void setMediaDeviceIdentifierStorageDirectory(const String& directory) { m_mediaDeviceIdentifierStorageDirectory = directory; }
316     const String& mediaDeviceIdentifierStorageDirectory() const { return m_mediaDeviceIdentifierStorageDirectory; }
317
318     static bool mockCaptureDevicesEnabled();
319     WEBCORE_EXPORT static void setMockCaptureDevicesEnabled(bool);
320
321     bool mediaCaptureRequiresSecureConnection() const;
322     WEBCORE_EXPORT static void setMediaCaptureRequiresSecureConnection(bool);
323 #endif
324
325 #if ENABLE(APPLE_PAY)
326     bool applePayEnabled() const { return m_applePayEnabled; }
327     void setApplePayEnabled(bool applePayEnabled) { m_applePayEnabled = applePayEnabled; }
328
329     bool applePayCapabilityDisclosureAllowed() const { return m_applePayCapabilityDisclosureAllowed; }
330     void setApplePayCapabilityDisclosureAllowed(bool applePayCapabilityDisclosureAllowed) { m_applePayCapabilityDisclosureAllowed = applePayCapabilityDisclosureAllowed; }
331 #endif
332
333     WEBCORE_EXPORT void setForcePendingWebGLPolicy(bool);
334     bool isForcePendingWebGLPolicy() const { return m_forcePendingWebGLPolicy; }
335
336     WEBCORE_EXPORT static void setAllowsAnySSLCertificate(bool);
337     static bool allowsAnySSLCertificate();
338
339     WEBCORE_EXPORT static const String& defaultMediaContentTypesRequiringHardwareSupport();
340     WEBCORE_EXPORT void setMediaContentTypesRequiringHardwareSupport(const Vector<ContentType>&);
341     WEBCORE_EXPORT void setMediaContentTypesRequiringHardwareSupport(const String&);
342     const Vector<ContentType>& mediaContentTypesRequiringHardwareSupport() const { return m_mediaContentTypesRequiringHardwareSupport; }
343
344 private:
345     explicit Settings(Page*);
346
347     void initializeDefaultFontFamilies();
348
349     Page* m_page;
350
351     String m_mediaTypeOverride;
352     URL m_userStyleSheetLocation;
353     const std::unique_ptr<FontGenericFamilies> m_fontGenericFamilies;
354     SecurityOrigin::StorageBlockingPolicy m_storageBlockingPolicy;
355     Seconds m_layoutInterval;
356     Seconds m_minimumDOMTimerInterval;
357
358     SETTINGS_MEMBER_VARIABLES
359
360     bool m_isJavaEnabled : 1;
361     bool m_isJavaEnabledForLocalFiles : 1;
362     bool m_loadsImagesAutomatically : 1;
363     bool m_areImagesEnabled : 1;
364     bool m_preferMIMETypeForImages : 1;
365     bool m_arePluginsEnabled : 1;
366     bool m_isScriptEnabled : 1;
367     bool m_needsAdobeFrameReloadingQuirk : 1;
368     bool m_usesPageCache : 1;
369     unsigned m_fontRenderingMode : 1;
370     bool m_showTiledScrollingIndicator : 1;
371     bool m_backgroundShouldExtendBeyondPage : 1;
372     bool m_dnsPrefetchingEnabled : 1;
373
374 #if ENABLE(TOUCH_EVENTS)
375     bool m_touchEventEmulationEnabled : 1;
376 #endif
377     bool m_scrollingPerformanceLoggingEnabled : 1;
378
379     Seconds m_timeWithoutMouseMovementBeforeHidingControls;
380
381     Timer m_setImageLoadingSettingsTimer;
382     void imageLoadingSettingsTimerFired();
383
384     bool m_hiddenPageDOMTimerThrottlingEnabled : 1;
385     bool m_hiddenPageCSSAnimationSuspensionEnabled : 1;
386     bool m_fontFallbackPrefersPictographs : 1;
387
388     bool m_forcePendingWebGLPolicy : 1;
389
390 #if ENABLE(RESOURCE_USAGE)
391     bool m_resourceUsageOverlayVisible { false };
392 #endif
393
394     bool m_hiddenPageDOMTimerThrottlingAutoIncreases { false };
395
396 #if USE(AVFOUNDATION)
397     WEBCORE_EXPORT static bool gAVFoundationEnabled;
398     WEBCORE_EXPORT static bool gAVFoundationNSURLSessionEnabled;
399 #endif
400
401 #if PLATFORM(COCOA)
402     WEBCORE_EXPORT static bool gQTKitEnabled;
403 #endif
404
405 #if USE(GSTREAMER)
406     WEBCORE_EXPORT static bool gGStreamerEnabled;
407 #endif
408
409     static bool gMockScrollbarsEnabled;
410     static bool gUsesOverlayScrollbars;
411     static bool gMockScrollAnimatorEnabled;
412
413 #if PLATFORM(WIN)
414     static bool gShouldUseHighResolutionTimers;
415 #endif
416     static bool gShouldRespectPriorityInCSSAttributeSetters;
417 #if PLATFORM(IOS)
418     static bool gNetworkDataUsageTrackingEnabled;
419     WEBCORE_EXPORT static bool gAVKitEnabled;
420     WEBCORE_EXPORT static bool gShouldOptOutOfNetworkStateObservation;
421 #endif
422     WEBCORE_EXPORT static bool gManageAudioSession;
423     WEBCORE_EXPORT static bool gCustomPasteboardDataEnabled;
424
425 #if ENABLE(LEGACY_ENCRYPTED_MEDIA)
426     String m_mediaKeysStorageDirectory;
427 #endif
428     
429 #if ENABLE(MEDIA_STREAM)
430     String m_mediaDeviceIdentifierStorageDirectory;
431     static bool gMockCaptureDevicesEnabled;
432     static bool gMediaCaptureRequiresSecureConnection;
433 #endif
434
435 #if ENABLE(APPLE_PAY)
436     bool m_applePayEnabled { false };
437     bool m_applePayCapabilityDisclosureAllowed { true };
438 #endif
439
440     static bool gLowPowerVideoAudioBufferSizeEnabled;
441     static bool gResourceLoadStatisticsEnabledEnabled;
442     static bool gAllowsAnySSLCertificate;
443
444     Vector<ContentType> m_mediaContentTypesRequiringHardwareSupport;
445 };
446
447 inline bool Settings::isPostLoadCPUUsageMeasurementEnabled()
448 {
449 #if PLATFORM(COCOA)
450     return true;
451 #else
452     return false;
453 #endif
454 }
455
456 inline bool Settings::isPostBackgroundingCPUUsageMeasurementEnabled()
457 {
458 #if PLATFORM(MAC)
459     return true;
460 #else
461     return false;
462 #endif
463 }
464
465 inline bool Settings::isPerActivityStateCPUUsageMeasurementEnabled()
466 {
467 #if PLATFORM(MAC)
468     return true;
469 #else
470     return false;
471 #endif
472 }
473
474 inline bool Settings::isPostLoadMemoryUsageMeasurementEnabled()
475 {
476 #if PLATFORM(COCOA)
477     return true;
478 #else
479     return false;
480 #endif
481 }
482
483 inline bool Settings::isPostBackgroundingMemoryUsageMeasurementEnabled()
484 {
485 #if PLATFORM(MAC)
486     return true;
487 #else
488     return false;
489 #endif
490 }
491
492 } // namespace WebCore