Migrate some layout timer-related code from std::chrono to Seconds and MonotonicTime
[WebKit-https.git] / Source / WebCore / page / Settings.cpp
1 /*
2  * Copyright (C) 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "Settings.h"
28
29 #include "AudioSession.h"
30 #include "BackForwardController.h"
31 #include "CachedResourceLoader.h"
32 #include "CookieStorage.h"
33 #include "DOMTimer.h"
34 #include "Database.h"
35 #include "Document.h"
36 #include "FontCascade.h"
37 #include "FontGenericFamilies.h"
38 #include "FrameTree.h"
39 #include "FrameView.h"
40 #include "HTMLMediaElement.h"
41 #include "HistoryItem.h"
42 #include "InspectorInstrumentation.h"
43 #include "MainFrame.h"
44 #include "Page.h"
45 #include "PageCache.h"
46 #include "RuntimeApplicationChecks.h"
47 #include "StorageMap.h"
48 #include <limits>
49 #include <wtf/NeverDestroyed.h>
50 #include <wtf/StdLibExtras.h>
51
52 #if ENABLE(MEDIA_STREAM)
53 #include "MockRealtimeMediaSourceCenter.h"
54 #endif
55
56 namespace WebCore {
57
58 static void setImageLoadingSettings(Page* page)
59 {
60     if (!page)
61         return;
62
63     for (Frame* frame = &page->mainFrame(); frame; frame = frame->tree().traverseNext()) {
64         if (!frame->document())
65             continue;
66         frame->document()->cachedResourceLoader().setImagesEnabled(page->settings().areImagesEnabled());
67         frame->document()->cachedResourceLoader().setAutoLoadImages(page->settings().loadsImagesAutomatically());
68     }
69 }
70
71 static void invalidateAfterGenericFamilyChange(Page* page)
72 {
73     invalidateFontCascadeCache();
74     if (page)
75         page->setNeedsRecalcStyleInAllFrames();
76 }
77
78 #if USE(AVFOUNDATION)
79 bool Settings::gAVFoundationEnabled = true;
80 bool Settings::gAVFoundationNSURLSessionEnabled = true;
81 #endif
82
83 #if PLATFORM(COCOA)
84 bool Settings::gQTKitEnabled = false;
85 #endif
86
87 bool Settings::gMockScrollbarsEnabled = false;
88 bool Settings::gUsesOverlayScrollbars = false;
89 bool Settings::gMockScrollAnimatorEnabled = false;
90
91 #if ENABLE(MEDIA_STREAM)
92 bool Settings::gMockCaptureDevicesEnabled = false;
93 bool Settings::gMediaCaptureRequiresSecureConnection = true;
94 #endif
95
96 #if PLATFORM(WIN)
97 bool Settings::gShouldUseHighResolutionTimers = true;
98 #endif
99     
100 bool Settings::gShouldRespectPriorityInCSSAttributeSetters = false;
101 bool Settings::gLowPowerVideoAudioBufferSizeEnabled = false;
102 bool Settings::gResourceLoadStatisticsEnabledEnabled = false;
103 bool Settings::gAllowsAnySSLCertificate = false;
104
105 #if PLATFORM(IOS)
106 bool Settings::gNetworkDataUsageTrackingEnabled = false;
107 bool Settings::gAVKitEnabled = false;
108 bool Settings::gShouldOptOutOfNetworkStateObservation = false;
109 bool Settings::gManageAudioSession = false;
110 #endif
111
112 // NOTEs
113 //  1) EditingMacBehavior comprises Tiger, Leopard, SnowLeopard and iOS builds, as well as QtWebKit when built on Mac;
114 //  2) EditingWindowsBehavior comprises Win32 build;
115 //  3) EditingUnixBehavior comprises all unix-based systems, but Darwin/MacOS (and then abusing the terminology);
116 // 99) MacEditingBehavior is used as a fallback.
117 static EditingBehaviorType editingBehaviorTypeForPlatform()
118 {
119     return
120 #if PLATFORM(IOS)
121     EditingIOSBehavior
122 #elif OS(DARWIN)
123     EditingMacBehavior
124 #elif OS(WINDOWS)
125     EditingWindowsBehavior
126 #elif OS(UNIX)
127     EditingUnixBehavior
128 #else
129     // Fallback
130     EditingMacBehavior
131 #endif
132     ;
133 }
134
135 #if PLATFORM(COCOA)
136 static const bool defaultYouTubeFlashPluginReplacementEnabled = true;
137 #else
138 static const bool defaultYouTubeFlashPluginReplacementEnabled = false;
139 #endif
140
141 #if PLATFORM(IOS)
142 static const bool defaultFixedPositionCreatesStackingContext = true;
143 static const bool defaultFixedBackgroundsPaintRelativeToDocument = true;
144 static const bool defaultAcceleratedCompositingForFixedPositionEnabled = true;
145 static const bool defaultAllowsInlineMediaPlayback = false;
146 static const bool defaultInlineMediaPlaybackRequiresPlaysInlineAttribute = true;
147 static const bool defaultVideoPlaybackRequiresUserGesture = true;
148 static const bool defaultAudioPlaybackRequiresUserGesture = true;
149 static const bool defaultMediaDataLoadsAutomatically = false;
150 static const bool defaultShouldRespectImageOrientation = true;
151 static const bool defaultImageSubsamplingEnabled = true;
152 static const bool defaultScrollingTreeIncludesFrames = true;
153 static const bool defaultMediaControlsScaleWithPageZoom = true;
154 static const bool defaultQuickTimePluginReplacementEnabled = true;
155 #else
156 static const bool defaultFixedPositionCreatesStackingContext = false;
157 static const bool defaultFixedBackgroundsPaintRelativeToDocument = false;
158 static const bool defaultAcceleratedCompositingForFixedPositionEnabled = false;
159 static const bool defaultAllowsInlineMediaPlayback = true;
160 static const bool defaultInlineMediaPlaybackRequiresPlaysInlineAttribute = false;
161 static const bool defaultVideoPlaybackRequiresUserGesture = false;
162 static const bool defaultAudioPlaybackRequiresUserGesture = false;
163 static const bool defaultMediaDataLoadsAutomatically = true;
164 static const bool defaultShouldRespectImageOrientation = false;
165 static const bool defaultImageSubsamplingEnabled = false;
166 static const bool defaultScrollingTreeIncludesFrames = false;
167 static const bool defaultMediaControlsScaleWithPageZoom = true;
168 static const bool defaultQuickTimePluginReplacementEnabled = false;
169 #endif
170
171 static const bool defaultRequiresUserGestureToLoadVideo = true;
172
173 static const bool defaultAllowsPictureInPictureMediaPlayback = true;
174
175 static const double defaultIncrementalRenderingSuppressionTimeoutInSeconds = 5;
176 #if USE(UNIFIED_TEXT_CHECKING)
177 static const bool defaultUnifiedTextCheckerEnabled = true;
178 #else
179 static const bool defaultUnifiedTextCheckerEnabled = false;
180 #endif
181 static const bool defaultSmartInsertDeleteEnabled = true;
182 static const bool defaultSelectTrailingWhitespaceEnabled = false;
183
184 // This amount of time must have elapsed before we will even consider scheduling a layout without a delay.
185 // FIXME: For faster machines this value can really be lowered to 200. 250 is adequate, but a little high
186 // for dual G5s. :)
187 static const Seconds layoutScheduleThreshold = 250_ms;
188
189 Settings::Settings(Page* page)
190     : m_page(nullptr)
191     , m_mediaTypeOverride("screen")
192     , m_fontGenericFamilies(std::make_unique<FontGenericFamilies>())
193     , m_storageBlockingPolicy(SecurityOrigin::AllowAllStorage)
194     , m_layoutInterval(layoutScheduleThreshold)
195     , m_minimumDOMTimerInterval(DOMTimer::defaultMinimumInterval())
196     SETTINGS_INITIALIZER_LIST
197     , m_isJavaEnabled(false)
198     , m_isJavaEnabledForLocalFiles(true)
199     , m_loadsImagesAutomatically(false)
200     , m_areImagesEnabled(true)
201     , m_preferMIMETypeForImages(false)
202     , m_arePluginsEnabled(false)
203     , m_isScriptEnabled(false)
204     , m_needsAdobeFrameReloadingQuirk(false)
205     , m_usesPageCache(false)
206     , m_fontRenderingMode(0)
207     , m_showTiledScrollingIndicator(false)
208     , m_backgroundShouldExtendBeyondPage(false)
209     , m_dnsPrefetchingEnabled(false)
210 #if ENABLE(TOUCH_EVENTS)
211     , m_touchEventEmulationEnabled(false)
212 #endif
213     , m_scrollingPerformanceLoggingEnabled(false)
214     , m_timeWithoutMouseMovementBeforeHidingControls(3)
215     , m_setImageLoadingSettingsTimer(*this, &Settings::imageLoadingSettingsTimerFired)
216     , m_hiddenPageDOMTimerThrottlingEnabled(false)
217     , m_hiddenPageCSSAnimationSuspensionEnabled(false)
218     , m_fontFallbackPrefersPictographs(false)
219     , m_webFontsAlwaysFallBack(false)
220     , m_forcePendingWebGLPolicy(false)
221 {
222     // A Frame may not have been created yet, so we initialize the AtomicString
223     // hash before trying to use it.
224     AtomicString::init();
225     initializeDefaultFontFamilies();
226     m_page = page; // Page is not yet fully initialized when constructing Settings, so keeping m_page null over initializeDefaultFontFamilies() call.
227 }
228
229 Settings::~Settings()
230 {
231 }
232
233 Ref<Settings> Settings::create(Page* page)
234 {
235     return adoptRef(*new Settings(page));
236 }
237
238 SETTINGS_SETTER_BODIES
239
240 #if !PLATFORM(COCOA)
241 void Settings::initializeDefaultFontFamilies()
242 {
243     // Other platforms can set up fonts from a client, but on Mac, we want it in WebCore to share code between WebKit1 and WebKit2.
244 }
245 #endif
246
247 const AtomicString& Settings::standardFontFamily(UScriptCode script) const
248 {
249     return m_fontGenericFamilies->standardFontFamily(script);
250 }
251
252 void Settings::setStandardFontFamily(const AtomicString& family, UScriptCode script)
253 {
254     bool changes = m_fontGenericFamilies->setStandardFontFamily(family, script);
255     if (changes)
256         invalidateAfterGenericFamilyChange(m_page);
257 }
258
259 const AtomicString& Settings::fixedFontFamily(UScriptCode script) const
260 {
261     return m_fontGenericFamilies->fixedFontFamily(script);
262 }
263
264 void Settings::setFixedFontFamily(const AtomicString& family, UScriptCode script)
265 {
266     bool changes = m_fontGenericFamilies->setFixedFontFamily(family, script);
267     if (changes)
268         invalidateAfterGenericFamilyChange(m_page);
269 }
270
271 const AtomicString& Settings::serifFontFamily(UScriptCode script) const
272 {
273     return m_fontGenericFamilies->serifFontFamily(script);
274 }
275
276 void Settings::setSerifFontFamily(const AtomicString& family, UScriptCode script)
277 {
278     bool changes = m_fontGenericFamilies->setSerifFontFamily(family, script);
279     if (changes)
280         invalidateAfterGenericFamilyChange(m_page);
281 }
282
283 const AtomicString& Settings::sansSerifFontFamily(UScriptCode script) const
284 {
285     return m_fontGenericFamilies->sansSerifFontFamily(script);
286 }
287
288 void Settings::setSansSerifFontFamily(const AtomicString& family, UScriptCode script)
289 {
290     bool changes = m_fontGenericFamilies->setSansSerifFontFamily(family, script);
291     if (changes)
292         invalidateAfterGenericFamilyChange(m_page);
293 }
294
295 const AtomicString& Settings::cursiveFontFamily(UScriptCode script) const
296 {
297     return m_fontGenericFamilies->cursiveFontFamily(script);
298 }
299
300 void Settings::setCursiveFontFamily(const AtomicString& family, UScriptCode script)
301 {
302     bool changes = m_fontGenericFamilies->setCursiveFontFamily(family, script);
303     if (changes)
304         invalidateAfterGenericFamilyChange(m_page);
305 }
306
307 const AtomicString& Settings::fantasyFontFamily(UScriptCode script) const
308 {
309     return m_fontGenericFamilies->fantasyFontFamily(script);
310 }
311
312 void Settings::setFantasyFontFamily(const AtomicString& family, UScriptCode script)
313 {
314     bool changes = m_fontGenericFamilies->setFantasyFontFamily(family, script);
315     if (changes)
316         invalidateAfterGenericFamilyChange(m_page);
317 }
318
319 const AtomicString& Settings::pictographFontFamily(UScriptCode script) const
320 {
321     return m_fontGenericFamilies->pictographFontFamily(script);
322 }
323
324 void Settings::setPictographFontFamily(const AtomicString& family, UScriptCode script)
325 {
326     bool changes = m_fontGenericFamilies->setPictographFontFamily(family, script);
327     if (changes)
328         invalidateAfterGenericFamilyChange(m_page);
329 }
330
331 float Settings::defaultMinimumZoomFontSize()
332 {
333     return 15;
334 }
335
336 #if !PLATFORM(IOS)
337 bool Settings::defaultTextAutosizingEnabled()
338 {
339     return false;
340 }
341 #endif
342
343 void Settings::setMediaTypeOverride(const String& mediaTypeOverride)
344 {
345     if (m_mediaTypeOverride == mediaTypeOverride)
346         return;
347
348     m_mediaTypeOverride = mediaTypeOverride;
349
350     if (!m_page)
351         return;
352
353     FrameView* view = m_page->mainFrame().view();
354     ASSERT(view);
355
356     view->setMediaType(mediaTypeOverride);
357     m_page->setNeedsRecalcStyleInAllFrames();
358 }
359
360 void Settings::setLoadsImagesAutomatically(bool loadsImagesAutomatically)
361 {
362     m_loadsImagesAutomatically = loadsImagesAutomatically;
363     
364     // Changing this setting to true might immediately start new loads for images that had previously had loading disabled.
365     // If this happens while a WebView is being dealloc'ed, and we don't know the WebView is being dealloc'ed, these new loads
366     // can cause crashes downstream when the WebView memory has actually been free'd.
367     // One example where this can happen is in Mac apps that subclass WebView then do work in their overridden dealloc methods.
368     // Starting these loads synchronously is not important.  By putting it on a 0-delay, properly closing the Page cancels them
369     // before they have a chance to really start.
370     // See http://webkit.org/b/60572 for more discussion.
371     m_setImageLoadingSettingsTimer.startOneShot(0);
372 }
373
374 void Settings::imageLoadingSettingsTimerFired()
375 {
376     setImageLoadingSettings(m_page);
377 }
378
379 void Settings::setScriptEnabled(bool isScriptEnabled)
380 {
381     if (m_isScriptEnabled == isScriptEnabled)
382         return;
383
384     m_isScriptEnabled = isScriptEnabled;
385
386     if (!m_page)
387         return;
388
389 #if PLATFORM(IOS)
390     m_page->setNeedsRecalcStyleInAllFrames();
391 #endif
392     InspectorInstrumentation::scriptsEnabled(*m_page, m_isScriptEnabled);
393 }
394
395 void Settings::setJavaEnabled(bool isJavaEnabled)
396 {
397     m_isJavaEnabled = isJavaEnabled;
398 }
399
400 void Settings::setJavaEnabledForLocalFiles(bool isJavaEnabledForLocalFiles)
401 {
402     m_isJavaEnabledForLocalFiles = isJavaEnabledForLocalFiles;
403 }
404
405 void Settings::setImagesEnabled(bool areImagesEnabled)
406 {
407     m_areImagesEnabled = areImagesEnabled;
408
409     // See comment in setLoadsImagesAutomatically.
410     m_setImageLoadingSettingsTimer.startOneShot(0);
411 }
412
413 void Settings::setPreferMIMETypeForImages(bool preferMIMETypeForImages)
414 {
415     m_preferMIMETypeForImages = preferMIMETypeForImages;
416 }
417
418 void Settings::setForcePendingWebGLPolicy(bool forced)
419 {
420     m_forcePendingWebGLPolicy = forced;
421 }
422
423 void Settings::setPluginsEnabled(bool arePluginsEnabled)
424 {
425     if (m_arePluginsEnabled == arePluginsEnabled)
426         return;
427
428     m_arePluginsEnabled = arePluginsEnabled;
429     Page::refreshPlugins(false);
430 }
431
432 void Settings::setUserStyleSheetLocation(const URL& userStyleSheetLocation)
433 {
434     if (m_userStyleSheetLocation == userStyleSheetLocation)
435         return;
436
437     m_userStyleSheetLocation = userStyleSheetLocation;
438
439     if (m_page)
440         m_page->userStyleSheetLocationChanged();
441 }
442
443 // FIXME: This quirk is needed because of Radar 4674537 and 5211271. We need to phase it out once Adobe
444 // can fix the bug from their end.
445 void Settings::setNeedsAdobeFrameReloadingQuirk(bool shouldNotReloadIFramesForUnchangedSRC)
446 {
447     m_needsAdobeFrameReloadingQuirk = shouldNotReloadIFramesForUnchangedSRC;
448 }
449
450 void Settings::setMinimumDOMTimerInterval(std::chrono::milliseconds interval)
451 {
452     auto oldTimerInterval = m_minimumDOMTimerInterval;
453     m_minimumDOMTimerInterval = interval;
454
455     if (!m_page)
456         return;
457
458     for (Frame* frame = &m_page->mainFrame(); frame; frame = frame->tree().traverseNext()) {
459         if (frame->document())
460             frame->document()->adjustMinimumTimerInterval(oldTimerInterval);
461     }
462 }
463
464 void Settings::setLayoutInterval(Seconds layoutInterval)
465 {
466     // FIXME: It seems weird that this function may disregard the specified layout interval.
467     // We should either expose layoutScheduleThreshold or better communicate this invariant.
468     m_layoutInterval = std::max(layoutInterval, layoutScheduleThreshold);
469 }
470
471 void Settings::setUsesPageCache(bool usesPageCache)
472 {
473     if (m_usesPageCache == usesPageCache)
474         return;
475         
476     m_usesPageCache = usesPageCache;
477
478     if (!m_page)
479         return;
480
481     if (!m_usesPageCache)
482         PageCache::singleton().pruneToSizeNow(0, PruningReason::None);
483 }
484
485 void Settings::setFontRenderingMode(FontRenderingMode mode)
486 {
487     if (fontRenderingMode() == mode)
488         return;
489     m_fontRenderingMode = static_cast<int>(mode);
490     if (m_page)
491         m_page->setNeedsRecalcStyleInAllFrames();
492 }
493
494 FontRenderingMode Settings::fontRenderingMode() const
495 {
496     return static_cast<FontRenderingMode>(m_fontRenderingMode);
497 }
498
499 void Settings::setDNSPrefetchingEnabled(bool dnsPrefetchingEnabled)
500 {
501     if (m_dnsPrefetchingEnabled == dnsPrefetchingEnabled)
502         return;
503
504     m_dnsPrefetchingEnabled = dnsPrefetchingEnabled;
505     if (m_page)
506         m_page->dnsPrefetchingStateChanged();
507 }
508
509 void Settings::setShowTiledScrollingIndicator(bool enabled)
510 {
511     if (m_showTiledScrollingIndicator == enabled)
512         return;
513         
514     m_showTiledScrollingIndicator = enabled;
515 }
516
517 #if ENABLE(RESOURCE_USAGE)
518 void Settings::setResourceUsageOverlayVisible(bool visible)
519 {
520     if (m_resourceUsageOverlayVisible == visible)
521         return;
522
523     m_resourceUsageOverlayVisible = visible;
524     if (m_page)
525         m_page->setResourceUsageOverlayVisible(visible);
526 }
527 #endif
528
529 #if PLATFORM(WIN)
530 void Settings::setShouldUseHighResolutionTimers(bool shouldUseHighResolutionTimers)
531 {
532     gShouldUseHighResolutionTimers = shouldUseHighResolutionTimers;
533 }
534 #endif
535
536 void Settings::setStorageBlockingPolicy(SecurityOrigin::StorageBlockingPolicy enabled)
537 {
538     if (m_storageBlockingPolicy == enabled)
539         return;
540
541     m_storageBlockingPolicy = enabled;
542     if (m_page)
543         m_page->storageBlockingStateChanged();
544 }
545
546 void Settings::setBackgroundShouldExtendBeyondPage(bool shouldExtend)
547 {
548     if (m_backgroundShouldExtendBeyondPage == shouldExtend)
549         return;
550
551     m_backgroundShouldExtendBeyondPage = shouldExtend;
552
553     if (m_page)
554         m_page->mainFrame().view()->updateExtendBackgroundIfNecessary();
555 }
556
557 #if USE(AVFOUNDATION)
558 void Settings::setAVFoundationEnabled(bool enabled)
559 {
560     if (gAVFoundationEnabled == enabled)
561         return;
562
563     gAVFoundationEnabled = enabled;
564     HTMLMediaElement::resetMediaEngines();
565 }
566
567 void Settings::setAVFoundationNSURLSessionEnabled(bool enabled)
568 {
569     if (gAVFoundationNSURLSessionEnabled == enabled)
570         return;
571
572     gAVFoundationNSURLSessionEnabled = enabled;
573 }
574 #endif
575
576 #if PLATFORM(COCOA)
577 void Settings::setQTKitEnabled(bool enabled)
578 {
579     if (gQTKitEnabled == enabled)
580         return;
581
582     gQTKitEnabled = enabled;
583     HTMLMediaElement::resetMediaEngines();
584 }
585 #endif
586
587 #if ENABLE(MEDIA_STREAM)
588 bool Settings::mockCaptureDevicesEnabled()
589 {
590     return gMockCaptureDevicesEnabled;
591 }
592
593 void Settings::setMockCaptureDevicesEnabled(bool enabled)
594 {
595     gMockCaptureDevicesEnabled = enabled;
596     MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled(enabled);
597 }
598
599 bool Settings::mediaCaptureRequiresSecureConnection() const
600 {
601     return gMediaCaptureRequiresSecureConnection;
602 }
603
604 void Settings::setMediaCaptureRequiresSecureConnection(bool mediaCaptureRequiresSecureConnection)
605 {
606     gMediaCaptureRequiresSecureConnection = mediaCaptureRequiresSecureConnection;
607 }
608 #endif
609
610 void Settings::setScrollingPerformanceLoggingEnabled(bool enabled)
611 {
612     m_scrollingPerformanceLoggingEnabled = enabled;
613
614     if (m_page && m_page->mainFrame().view())
615         m_page->mainFrame().view()->setScrollingPerformanceLoggingEnabled(enabled);
616 }
617
618 // It's very important that this setting doesn't change in the middle of a document's lifetime.
619 // The Mac port uses this flag when registering and deregistering platform-dependent scrollbar
620 // objects. Therefore, if this changes at an unexpected time, deregistration may not happen
621 // correctly, which may cause the platform to follow dangling pointers.
622 void Settings::setMockScrollbarsEnabled(bool flag)
623 {
624     gMockScrollbarsEnabled = flag;
625     // FIXME: This should update scroll bars in existing pages.
626 }
627
628 bool Settings::mockScrollbarsEnabled()
629 {
630     return gMockScrollbarsEnabled;
631 }
632
633 void Settings::setUsesOverlayScrollbars(bool flag)
634 {
635     gUsesOverlayScrollbars = flag;
636     // FIXME: This should update scroll bars in existing pages.
637 }
638
639 bool Settings::usesOverlayScrollbars()
640 {
641     return gUsesOverlayScrollbars;
642 }
643
644 void Settings::setUsesMockScrollAnimator(bool flag)
645 {
646     gMockScrollAnimatorEnabled = flag;
647 }
648
649 bool Settings::usesMockScrollAnimator()
650 {
651     return gMockScrollAnimatorEnabled;
652 }
653
654 void Settings::setShouldRespectPriorityInCSSAttributeSetters(bool flag)
655 {
656     gShouldRespectPriorityInCSSAttributeSetters = flag;
657 }
658
659 bool Settings::shouldRespectPriorityInCSSAttributeSetters()
660 {
661     return gShouldRespectPriorityInCSSAttributeSetters;
662 }
663
664 void Settings::setHiddenPageDOMTimerThrottlingEnabled(bool flag)
665 {
666     if (m_hiddenPageDOMTimerThrottlingEnabled == flag)
667         return;
668     m_hiddenPageDOMTimerThrottlingEnabled = flag;
669     if (m_page)
670         m_page->hiddenPageDOMTimerThrottlingStateChanged();
671 }
672
673 void Settings::setHiddenPageDOMTimerThrottlingAutoIncreases(bool flag)
674 {
675     if (m_hiddenPageDOMTimerThrottlingAutoIncreases == flag)
676         return;
677     m_hiddenPageDOMTimerThrottlingAutoIncreases = flag;
678     if (m_page)
679         m_page->hiddenPageDOMTimerThrottlingStateChanged();
680 }
681
682 void Settings::setHiddenPageCSSAnimationSuspensionEnabled(bool flag)
683 {
684     if (m_hiddenPageCSSAnimationSuspensionEnabled == flag)
685         return;
686     m_hiddenPageCSSAnimationSuspensionEnabled = flag;
687     if (m_page)
688         m_page->hiddenPageCSSAnimationSuspensionStateChanged();
689 }
690
691 void Settings::setFontFallbackPrefersPictographs(bool preferPictographs)
692 {
693     if (m_fontFallbackPrefersPictographs == preferPictographs)
694         return;
695
696     m_fontFallbackPrefersPictographs = preferPictographs;
697     if (m_page)
698         m_page->setNeedsRecalcStyleInAllFrames();
699 }
700
701 void Settings::setWebFontsAlwaysFallBack(bool enable)
702 {
703     if (m_webFontsAlwaysFallBack == enable)
704         return;
705
706     m_webFontsAlwaysFallBack = enable;
707 }
708
709 void Settings::setLowPowerVideoAudioBufferSizeEnabled(bool flag)
710 {
711     gLowPowerVideoAudioBufferSizeEnabled = flag;
712 }
713
714 void Settings::setResourceLoadStatisticsEnabled(bool flag)
715 {
716     gResourceLoadStatisticsEnabledEnabled = flag;
717 }
718
719 #if PLATFORM(IOS)
720 void Settings::setAudioSessionCategoryOverride(unsigned sessionCategory)
721 {
722     AudioSession::sharedSession().setCategoryOverride(static_cast<AudioSession::CategoryType>(sessionCategory));
723 }
724
725 unsigned Settings::audioSessionCategoryOverride()
726 {
727     return AudioSession::sharedSession().categoryOverride();
728 }
729
730 void Settings::setNetworkDataUsageTrackingEnabled(bool trackingEnabled)
731 {
732     gNetworkDataUsageTrackingEnabled = trackingEnabled;
733 }
734
735 bool Settings::networkDataUsageTrackingEnabled()
736 {
737     return gNetworkDataUsageTrackingEnabled;
738 }
739
740 static String& sharedNetworkInterfaceNameGlobal()
741 {
742     static NeverDestroyed<String> networkInterfaceName;
743     return networkInterfaceName;
744 }
745
746 void Settings::setNetworkInterfaceName(const String& networkInterfaceName)
747 {
748     sharedNetworkInterfaceNameGlobal() = networkInterfaceName;
749 }
750
751 const String& Settings::networkInterfaceName()
752 {
753     return sharedNetworkInterfaceNameGlobal();
754 }
755 #endif
756
757 bool Settings::globalConstRedeclarationShouldThrow()
758 {
759 #if PLATFORM(MAC)
760     return !MacApplication::isIBooks();
761 #elif PLATFORM(IOS)
762     return !IOSApplication::isIBooks();
763 #else
764     return true;
765 #endif
766 }
767
768 void Settings::setAllowsAnySSLCertificate(bool allowAnySSLCertificate)
769 {
770     gAllowsAnySSLCertificate = allowAnySSLCertificate;
771 }
772
773 bool Settings::allowsAnySSLCertificate()
774 {
775     return gAllowsAnySSLCertificate;
776 }
777
778 } // namespace WebCore