Remove the Timer parameters from timer callbacks
[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 "Font.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 "StorageMap.h"
47 #include "TextAutosizer.h"
48 #include <limits>
49 #include <wtf/NeverDestroyed.h>
50 #include <wtf/StdLibExtras.h>
51
52 namespace WebCore {
53
54 static void setImageLoadingSettings(Page* page)
55 {
56     if (!page)
57         return;
58
59     for (Frame* frame = &page->mainFrame(); frame; frame = frame->tree().traverseNext()) {
60         frame->document()->cachedResourceLoader()->setImagesEnabled(page->settings().areImagesEnabled());
61         frame->document()->cachedResourceLoader()->setAutoLoadImages(page->settings().loadsImagesAutomatically());
62     }
63 }
64
65 static void invalidateAfterGenericFamilyChange(Page* page)
66 {
67     invalidateFontGlyphsCache();
68     if (page)
69         page->setNeedsRecalcStyleInAllFrames();
70 }
71
72 double Settings::gDefaultMinDOMTimerInterval = 0.010; // 10 milliseconds
73 double Settings::gDefaultDOMTimerAlignmentInterval = 0;
74 double Settings::gHiddenPageDOMTimerAlignmentInterval = 1.0;
75
76 #if USE(SAFARI_THEME)
77 bool Settings::gShouldPaintNativeControls = true;
78 #endif
79
80 #if USE(AVFOUNDATION)
81 bool Settings::gAVFoundationEnabled = false;
82 #endif
83
84 #if PLATFORM(COCOA)
85 bool Settings::gQTKitEnabled = true;
86 #endif
87
88 bool Settings::gMockScrollbarsEnabled = false;
89 bool Settings::gUsesOverlayScrollbars = false;
90
91 #if PLATFORM(WIN)
92 bool Settings::gShouldUseHighResolutionTimers = true;
93 #endif
94     
95 bool Settings::gShouldRespectPriorityInCSSAttributeSetters = false;
96 bool Settings::gLowPowerVideoAudioBufferSizeEnabled = false;
97
98 #if PLATFORM(IOS)
99 bool Settings::gNetworkDataUsageTrackingEnabled = false;
100 bool Settings::gAVKitEnabled = false;
101 bool Settings::gShouldOptOutOfNetworkStateObservation = false;
102 bool Settings::gManageAudioSession = false;
103 #endif
104
105 // NOTEs
106 //  1) EditingMacBehavior comprises Tiger, Leopard, SnowLeopard and iOS builds, as well as QtWebKit when built on Mac;
107 //  2) EditingWindowsBehavior comprises Win32 build;
108 //  3) EditingUnixBehavior comprises all unix-based systems, but Darwin/MacOS (and then abusing the terminology);
109 // 99) MacEditingBehavior is used as a fallback.
110 static EditingBehaviorType editingBehaviorTypeForPlatform()
111 {
112     return
113 #if PLATFORM(IOS)
114     EditingIOSBehavior
115 #elif OS(DARWIN)
116     EditingMacBehavior
117 #elif OS(WINDOWS)
118     EditingWindowsBehavior
119 #elif OS(UNIX)
120     EditingUnixBehavior
121 #else
122     // Fallback
123     EditingMacBehavior
124 #endif
125     ;
126 }
127
128 #if PLATFORM(IOS)
129 static const bool defaultFixedPositionCreatesStackingContext = true;
130 static const bool defaultFixedBackgroundsPaintRelativeToDocument = true;
131 static const bool defaultAcceleratedCompositingForFixedPositionEnabled = true;
132 static const bool defaultMediaPlaybackAllowsInline = false;
133 static const bool defaultMediaPlaybackRequiresUserGesture = true;
134 static const bool defaultShouldRespectImageOrientation = true;
135 static const bool defaultImageSubsamplingEnabled = true;
136 static const bool defaultScrollingTreeIncludesFrames = true;
137 #else
138 static const bool defaultFixedPositionCreatesStackingContext = false;
139 static const bool defaultFixedBackgroundsPaintRelativeToDocument = false;
140 static const bool defaultAcceleratedCompositingForFixedPositionEnabled = false;
141 static const bool defaultMediaPlaybackAllowsInline = true;
142 static const bool defaultMediaPlaybackRequiresUserGesture = false;
143 static const bool defaultShouldRespectImageOrientation = false;
144 static const bool defaultImageSubsamplingEnabled = false;
145 static const bool defaultScrollingTreeIncludesFrames = false;
146 #endif
147
148 static const bool defaultAllowsAlternateFullscreen = true;
149
150 static const double defaultIncrementalRenderingSuppressionTimeoutInSeconds = 5;
151 #if USE(UNIFIED_TEXT_CHECKING)
152 static const bool defaultUnifiedTextCheckerEnabled = true;
153 #else
154 static const bool defaultUnifiedTextCheckerEnabled = false;
155 #endif
156 static const bool defaultSmartInsertDeleteEnabled = true;
157 static const bool defaultSelectTrailingWhitespaceEnabled = false;
158
159 // This amount of time must have elapsed before we will even consider scheduling a layout without a delay.
160 // FIXME: For faster machines this value can really be lowered to 200. 250 is adequate, but a little high
161 // for dual G5s. :)
162 static const auto layoutScheduleThreshold = std::chrono::milliseconds(250);
163
164 Settings::Settings(Page* page)
165     : m_page(0)
166     , m_mediaTypeOverride("screen")
167     , m_fontGenericFamilies(std::make_unique<FontGenericFamilies>())
168     , m_storageBlockingPolicy(SecurityOrigin::AllowAllStorage)
169     , m_layoutInterval(layoutScheduleThreshold)
170 #if ENABLE(TEXT_AUTOSIZING)
171     , m_textAutosizingFontScaleFactor(1)
172 #if HACK_FORCE_TEXT_AUTOSIZING_ON_DESKTOP
173     , m_textAutosizingWindowSizeOverride(320, 480)
174     , m_textAutosizingEnabled(true)
175 #else
176     , m_textAutosizingEnabled(false)
177 #endif
178 #endif
179     SETTINGS_INITIALIZER_LIST
180     , m_screenFontSubstitutionEnabled(shouldEnableScreenFontSubstitutionByDefault())
181     , m_isJavaEnabled(false)
182     , m_isJavaEnabledForLocalFiles(true)
183     , m_loadsImagesAutomatically(false)
184     , m_areImagesEnabled(true)
185     , m_arePluginsEnabled(false)
186     , m_isScriptEnabled(false)
187     , m_needsAdobeFrameReloadingQuirk(false)
188     , m_usesPageCache(false)
189     , m_fontRenderingMode(0)
190     , m_showTiledScrollingIndicator(false)
191     , m_backgroundShouldExtendBeyondPage(false)
192     , m_dnsPrefetchingEnabled(false)
193 #if ENABLE(TOUCH_EVENTS)
194     , m_touchEventEmulationEnabled(false)
195 #endif
196     , m_scrollingPerformanceLoggingEnabled(false)
197     , m_timeWithoutMouseMovementBeforeHidingControls(3)
198     , m_setImageLoadingSettingsTimer(*this, &Settings::imageLoadingSettingsTimerFired)
199 #if ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING)
200     , m_hiddenPageDOMTimerThrottlingEnabled(false)
201 #endif
202     , m_hiddenPageCSSAnimationSuspensionEnabled(false)
203     , m_fontFallbackPrefersPictographs(false)
204 {
205     // A Frame may not have been created yet, so we initialize the AtomicString
206     // hash before trying to use it.
207     AtomicString::init();
208     initializeDefaultFontFamilies();
209     m_page = page; // Page is not yet fully initialized when constructing Settings, so keeping m_page null over initializeDefaultFontFamilies() call.
210 }
211
212 Settings::~Settings()
213 {
214 }
215
216 PassRefPtr<Settings> Settings::create(Page* page)
217 {
218     return adoptRef(new Settings(page));
219 }
220
221 SETTINGS_SETTER_BODIES
222
223 void Settings::setHiddenPageDOMTimerAlignmentInterval(double hiddenPageDOMTimerAlignmentinterval)
224 {
225     gHiddenPageDOMTimerAlignmentInterval = hiddenPageDOMTimerAlignmentinterval;
226 }
227
228 double Settings::hiddenPageDOMTimerAlignmentInterval()
229 {
230     return gHiddenPageDOMTimerAlignmentInterval;
231 }
232
233 #if !PLATFORM(COCOA)
234 bool Settings::shouldEnableScreenFontSubstitutionByDefault()
235 {
236     return true;
237 }
238 #endif
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 #if ENABLE(TEXT_AUTOSIZING)
332 void Settings::setTextAutosizingEnabled(bool textAutosizingEnabled)
333 {
334     if (m_textAutosizingEnabled == textAutosizingEnabled)
335         return;
336
337     m_textAutosizingEnabled = textAutosizingEnabled;
338     if (m_page)
339         m_page->setNeedsRecalcStyleInAllFrames();
340 }
341
342 void Settings::setTextAutosizingWindowSizeOverride(const IntSize& textAutosizingWindowSizeOverride)
343 {
344     if (m_textAutosizingWindowSizeOverride == textAutosizingWindowSizeOverride)
345         return;
346
347     m_textAutosizingWindowSizeOverride = textAutosizingWindowSizeOverride;
348     if (m_page)
349         m_page->setNeedsRecalcStyleInAllFrames();
350 }
351
352 void Settings::setTextAutosizingFontScaleFactor(float fontScaleFactor)
353 {
354     m_textAutosizingFontScaleFactor = fontScaleFactor;
355
356     if (!m_page)
357         return;
358
359     // FIXME: I wonder if this needs to traverse frames like in WebViewImpl::resize, or whether there is only one document per Settings instance?
360     for (Frame* frame = m_page->mainFrame(); frame; frame = frame->tree().traverseNext())
361         frame->document()->textAutosizer()->recalculateMultipliers();
362
363     m_page->setNeedsRecalcStyleInAllFrames();
364 }
365
366 #endif
367
368 void Settings::setMediaTypeOverride(const String& mediaTypeOverride)
369 {
370     if (m_mediaTypeOverride == mediaTypeOverride)
371         return;
372
373     m_mediaTypeOverride = mediaTypeOverride;
374
375     if (!m_page)
376         return;
377
378     FrameView* view = m_page->mainFrame().view();
379     ASSERT(view);
380
381     view->setMediaType(mediaTypeOverride);
382     m_page->setNeedsRecalcStyleInAllFrames();
383 }
384
385 void Settings::setLoadsImagesAutomatically(bool loadsImagesAutomatically)
386 {
387     m_loadsImagesAutomatically = loadsImagesAutomatically;
388     
389     // Changing this setting to true might immediately start new loads for images that had previously had loading disabled.
390     // If this happens while a WebView is being dealloc'ed, and we don't know the WebView is being dealloc'ed, these new loads
391     // can cause crashes downstream when the WebView memory has actually been free'd.
392     // One example where this can happen is in Mac apps that subclass WebView then do work in their overridden dealloc methods.
393     // Starting these loads synchronously is not important.  By putting it on a 0-delay, properly closing the Page cancels them
394     // before they have a chance to really start.
395     // See http://webkit.org/b/60572 for more discussion.
396     m_setImageLoadingSettingsTimer.startOneShot(0);
397 }
398
399 void Settings::imageLoadingSettingsTimerFired()
400 {
401     setImageLoadingSettings(m_page);
402 }
403
404 void Settings::setScriptEnabled(bool isScriptEnabled)
405 {
406     if (m_isScriptEnabled == isScriptEnabled)
407         return;
408
409     m_isScriptEnabled = isScriptEnabled;
410
411     if (!m_page)
412         return;
413
414 #if PLATFORM(IOS)
415     m_page->setNeedsRecalcStyleInAllFrames();
416 #endif
417     InspectorInstrumentation::scriptsEnabled(m_page, m_isScriptEnabled);
418 }
419
420 void Settings::setJavaEnabled(bool isJavaEnabled)
421 {
422     m_isJavaEnabled = isJavaEnabled;
423 }
424
425 void Settings::setJavaEnabledForLocalFiles(bool isJavaEnabledForLocalFiles)
426 {
427     m_isJavaEnabledForLocalFiles = isJavaEnabledForLocalFiles;
428 }
429
430 void Settings::setImagesEnabled(bool areImagesEnabled)
431 {
432     m_areImagesEnabled = areImagesEnabled;
433
434     // See comment in setLoadsImagesAutomatically.
435     m_setImageLoadingSettingsTimer.startOneShot(0);
436 }
437
438 void Settings::setPluginsEnabled(bool arePluginsEnabled)
439 {
440     if (m_arePluginsEnabled == arePluginsEnabled)
441         return;
442
443     m_arePluginsEnabled = arePluginsEnabled;
444     Page::refreshPlugins(false);
445 }
446
447 void Settings::setUserStyleSheetLocation(const URL& userStyleSheetLocation)
448 {
449     if (m_userStyleSheetLocation == userStyleSheetLocation)
450         return;
451
452     m_userStyleSheetLocation = userStyleSheetLocation;
453
454     if (m_page)
455         m_page->userStyleSheetLocationChanged();
456 }
457
458 // FIXME: This quirk is needed because of Radar 4674537 and 5211271. We need to phase it out once Adobe
459 // can fix the bug from their end.
460 void Settings::setNeedsAdobeFrameReloadingQuirk(bool shouldNotReloadIFramesForUnchangedSRC)
461 {
462     m_needsAdobeFrameReloadingQuirk = shouldNotReloadIFramesForUnchangedSRC;
463 }
464
465 void Settings::setDefaultMinDOMTimerInterval(double interval)
466 {
467     gDefaultMinDOMTimerInterval = interval;
468 }
469
470 double Settings::defaultMinDOMTimerInterval()
471 {
472     return gDefaultMinDOMTimerInterval;
473 }
474
475 void Settings::setMinDOMTimerInterval(double interval)
476 {
477     if (m_page)
478         m_page->setMinimumTimerInterval(interval);
479 }
480
481 double Settings::minDOMTimerInterval()
482 {
483     if (!m_page)
484         return 0;
485     return m_page->minimumTimerInterval();
486 }
487
488 void Settings::setDefaultDOMTimerAlignmentInterval(double interval)
489 {
490     gDefaultDOMTimerAlignmentInterval = interval;
491 }
492
493 double Settings::defaultDOMTimerAlignmentInterval()
494 {
495     return gDefaultDOMTimerAlignmentInterval;
496 }
497
498 double Settings::domTimerAlignmentInterval() const
499 {
500     if (!m_page)
501         return 0;
502     return m_page->timerAlignmentInterval();
503 }
504
505 void Settings::setLayoutInterval(std::chrono::milliseconds layoutInterval)
506 {
507     // FIXME: It seems weird that this function may disregard the specified layout interval.
508     // We should either expose layoutScheduleThreshold or better communicate this invariant.
509     m_layoutInterval = std::max(layoutInterval, layoutScheduleThreshold);
510 }
511
512 void Settings::setUsesPageCache(bool usesPageCache)
513 {
514     if (m_usesPageCache == usesPageCache)
515         return;
516         
517     m_usesPageCache = usesPageCache;
518
519     if (!m_page)
520         return;
521
522     if (!m_usesPageCache) {
523         int first = -m_page->backForward().backCount();
524         int last = m_page->backForward().forwardCount();
525         for (int i = first; i <= last; i++)
526             pageCache()->remove(m_page->backForward().itemAtIndex(i));
527     }
528 }
529
530 void Settings::setScreenFontSubstitutionEnabled(bool enabled)
531 {
532     if (m_screenFontSubstitutionEnabled == enabled)
533         return;
534     m_screenFontSubstitutionEnabled = enabled;
535
536     if (m_page)
537         m_page->setNeedsRecalcStyleInAllFrames();
538 }
539
540 void Settings::setFontRenderingMode(FontRenderingMode mode)
541 {
542     if (fontRenderingMode() == mode)
543         return;
544     m_fontRenderingMode = mode;
545     if (m_page)
546         m_page->setNeedsRecalcStyleInAllFrames();
547 }
548
549 FontRenderingMode Settings::fontRenderingMode() const
550 {
551     return static_cast<FontRenderingMode>(m_fontRenderingMode);
552 }
553
554 #if USE(SAFARI_THEME)
555 void Settings::setShouldPaintNativeControls(bool shouldPaintNativeControls)
556 {
557     gShouldPaintNativeControls = shouldPaintNativeControls;
558 }
559 #endif
560
561 void Settings::setDNSPrefetchingEnabled(bool dnsPrefetchingEnabled)
562 {
563     if (m_dnsPrefetchingEnabled == dnsPrefetchingEnabled)
564         return;
565
566     m_dnsPrefetchingEnabled = dnsPrefetchingEnabled;
567     if (m_page)
568         m_page->dnsPrefetchingStateChanged();
569 }
570
571 void Settings::setShowTiledScrollingIndicator(bool enabled)
572 {
573     if (m_showTiledScrollingIndicator == enabled)
574         return;
575         
576     m_showTiledScrollingIndicator = enabled;
577 }
578
579 #if PLATFORM(WIN)
580 void Settings::setShouldUseHighResolutionTimers(bool shouldUseHighResolutionTimers)
581 {
582     gShouldUseHighResolutionTimers = shouldUseHighResolutionTimers;
583 }
584 #endif
585
586 void Settings::setStorageBlockingPolicy(SecurityOrigin::StorageBlockingPolicy enabled)
587 {
588     if (m_storageBlockingPolicy == enabled)
589         return;
590
591     m_storageBlockingPolicy = enabled;
592     if (m_page)
593         m_page->storageBlockingStateChanged();
594 }
595
596 void Settings::setBackgroundShouldExtendBeyondPage(bool shouldExtend)
597 {
598     if (m_backgroundShouldExtendBeyondPage == shouldExtend)
599         return;
600
601     m_backgroundShouldExtendBeyondPage = shouldExtend;
602
603     if (m_page)
604         m_page->mainFrame().view()->updateExtendBackgroundIfNecessary();
605 }
606
607 #if USE(AVFOUNDATION)
608 void Settings::setAVFoundationEnabled(bool enabled)
609 {
610     if (gAVFoundationEnabled == enabled)
611         return;
612
613     gAVFoundationEnabled = enabled;
614     HTMLMediaElement::resetMediaEngines();
615 }
616 #endif
617
618 #if PLATFORM(COCOA)
619 void Settings::setQTKitEnabled(bool enabled)
620 {
621     if (gQTKitEnabled == enabled)
622         return;
623
624     gQTKitEnabled = enabled;
625     HTMLMediaElement::resetMediaEngines();
626 }
627 #endif
628
629 void Settings::setScrollingPerformanceLoggingEnabled(bool enabled)
630 {
631     m_scrollingPerformanceLoggingEnabled = enabled;
632
633     if (m_page && m_page->mainFrame().view())
634         m_page->mainFrame().view()->setScrollingPerformanceLoggingEnabled(enabled);
635 }
636
637 void Settings::setMockScrollbarsEnabled(bool flag)
638 {
639     gMockScrollbarsEnabled = flag;
640     // FIXME: This should update scroll bars in existing pages.
641 }
642
643 bool Settings::mockScrollbarsEnabled()
644 {
645     return gMockScrollbarsEnabled;
646 }
647
648 void Settings::setUsesOverlayScrollbars(bool flag)
649 {
650     gUsesOverlayScrollbars = flag;
651     // FIXME: This should update scroll bars in existing pages.
652 }
653
654 bool Settings::usesOverlayScrollbars()
655 {
656     return gUsesOverlayScrollbars;
657 }
658
659 void Settings::setShouldRespectPriorityInCSSAttributeSetters(bool flag)
660 {
661     gShouldRespectPriorityInCSSAttributeSetters = flag;
662 }
663
664 bool Settings::shouldRespectPriorityInCSSAttributeSetters()
665 {
666     return gShouldRespectPriorityInCSSAttributeSetters;
667 }
668
669 #if ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING)
670 void Settings::setHiddenPageDOMTimerThrottlingEnabled(bool flag)
671 {
672     if (m_hiddenPageDOMTimerThrottlingEnabled == flag)
673         return;
674     m_hiddenPageDOMTimerThrottlingEnabled = flag;
675     if (m_page)
676         m_page->hiddenPageDOMTimerThrottlingStateChanged();
677 }
678 #endif
679
680 void Settings::setHiddenPageCSSAnimationSuspensionEnabled(bool flag)
681 {
682     if (m_hiddenPageCSSAnimationSuspensionEnabled == flag)
683         return;
684     m_hiddenPageCSSAnimationSuspensionEnabled = flag;
685     if (m_page)
686         m_page->hiddenPageCSSAnimationSuspensionStateChanged();
687 }
688
689 void Settings::setFontFallbackPrefersPictographs(bool preferPictographs)
690 {
691     if (m_fontFallbackPrefersPictographs == preferPictographs)
692         return;
693
694     m_fontFallbackPrefersPictographs = preferPictographs;
695     if (m_page)
696         m_page->setNeedsRecalcStyleInAllFrames();
697 }
698
699 void Settings::setLowPowerVideoAudioBufferSizeEnabled(bool flag)
700 {
701     gLowPowerVideoAudioBufferSizeEnabled = flag;
702 }
703
704 #if PLATFORM(IOS)
705 void Settings::setAudioSessionCategoryOverride(unsigned sessionCategory)
706 {
707     AudioSession::sharedSession().setCategoryOverride(static_cast<AudioSession::CategoryType>(sessionCategory));
708 }
709
710 unsigned Settings::audioSessionCategoryOverride()
711 {
712     return AudioSession::sharedSession().categoryOverride();
713 }
714
715 void Settings::setNetworkDataUsageTrackingEnabled(bool trackingEnabled)
716 {
717     gNetworkDataUsageTrackingEnabled = trackingEnabled;
718 }
719
720 bool Settings::networkDataUsageTrackingEnabled()
721 {
722     return gNetworkDataUsageTrackingEnabled;
723 }
724
725 static String& sharedNetworkInterfaceNameGlobal()
726 {
727     static NeverDestroyed<String> networkInterfaceName;
728     return networkInterfaceName;
729 }
730
731 void Settings::setNetworkInterfaceName(const String& networkInterfaceName)
732 {
733     sharedNetworkInterfaceNameGlobal() = networkInterfaceName;
734 }
735
736 const String& Settings::networkInterfaceName()
737 {
738     return sharedNetworkInterfaceNameGlobal();
739 }
740 #endif
741
742 } // namespace WebCore