[Mac] Disable QTKit by default on future OS X.
[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 "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     invalidateFontCascadeCache();
68     if (page)
69         page->setNeedsRecalcStyleInAllFrames();
70 }
71
72 #if USE(AVFOUNDATION)
73 bool Settings::gAVFoundationEnabled = false;
74 #endif
75
76 #if PLATFORM(COCOA)
77 #if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED <= 101000
78 bool Settings::gQTKitEnabled = true;
79 #else
80 bool Settings::gQTKitEnabled = false;
81 #endif
82 #endif
83
84 bool Settings::gMockScrollbarsEnabled = false;
85 bool Settings::gUsesOverlayScrollbars = false;
86
87 #if PLATFORM(WIN)
88 bool Settings::gShouldUseHighResolutionTimers = true;
89 #endif
90     
91 bool Settings::gShouldRespectPriorityInCSSAttributeSetters = false;
92 bool Settings::gLowPowerVideoAudioBufferSizeEnabled = false;
93
94 #if PLATFORM(IOS)
95 bool Settings::gNetworkDataUsageTrackingEnabled = false;
96 bool Settings::gAVKitEnabled = false;
97 bool Settings::gShouldOptOutOfNetworkStateObservation = false;
98 bool Settings::gManageAudioSession = false;
99 #endif
100
101 // NOTEs
102 //  1) EditingMacBehavior comprises Tiger, Leopard, SnowLeopard and iOS builds, as well as QtWebKit when built on Mac;
103 //  2) EditingWindowsBehavior comprises Win32 build;
104 //  3) EditingUnixBehavior comprises all unix-based systems, but Darwin/MacOS (and then abusing the terminology);
105 // 99) MacEditingBehavior is used as a fallback.
106 static EditingBehaviorType editingBehaviorTypeForPlatform()
107 {
108     return
109 #if PLATFORM(IOS)
110     EditingIOSBehavior
111 #elif OS(DARWIN)
112     EditingMacBehavior
113 #elif OS(WINDOWS)
114     EditingWindowsBehavior
115 #elif OS(UNIX)
116     EditingUnixBehavior
117 #else
118     // Fallback
119     EditingMacBehavior
120 #endif
121     ;
122 }
123
124 #if PLATFORM(IOS)
125 static const bool defaultFixedPositionCreatesStackingContext = true;
126 static const bool defaultFixedBackgroundsPaintRelativeToDocument = true;
127 static const bool defaultAcceleratedCompositingForFixedPositionEnabled = true;
128 static const bool defaultMediaPlaybackAllowsInline = false;
129 static const bool defaultMediaPlaybackRequiresUserGesture = true;
130 static const bool defaultShouldRespectImageOrientation = true;
131 static const bool defaultImageSubsamplingEnabled = true;
132 static const bool defaultScrollingTreeIncludesFrames = true;
133 #else
134 static const bool defaultFixedPositionCreatesStackingContext = false;
135 static const bool defaultFixedBackgroundsPaintRelativeToDocument = false;
136 static const bool defaultAcceleratedCompositingForFixedPositionEnabled = false;
137 static const bool defaultMediaPlaybackAllowsInline = true;
138 static const bool defaultMediaPlaybackRequiresUserGesture = false;
139 static const bool defaultShouldRespectImageOrientation = false;
140 static const bool defaultImageSubsamplingEnabled = false;
141 static const bool defaultScrollingTreeIncludesFrames = false;
142 #endif
143
144 static const bool defaultAllowsAlternateFullscreen = true;
145
146 static const double defaultIncrementalRenderingSuppressionTimeoutInSeconds = 5;
147 #if USE(UNIFIED_TEXT_CHECKING)
148 static const bool defaultUnifiedTextCheckerEnabled = true;
149 #else
150 static const bool defaultUnifiedTextCheckerEnabled = false;
151 #endif
152 static const bool defaultSmartInsertDeleteEnabled = true;
153 static const bool defaultSelectTrailingWhitespaceEnabled = false;
154
155 // This amount of time must have elapsed before we will even consider scheduling a layout without a delay.
156 // FIXME: For faster machines this value can really be lowered to 200. 250 is adequate, but a little high
157 // for dual G5s. :)
158 static const auto layoutScheduleThreshold = std::chrono::milliseconds(250);
159
160 Settings::Settings(Page* page)
161     : m_page(0)
162     , m_mediaTypeOverride("screen")
163     , m_fontGenericFamilies(std::make_unique<FontGenericFamilies>())
164     , m_storageBlockingPolicy(SecurityOrigin::AllowAllStorage)
165     , m_layoutInterval(layoutScheduleThreshold)
166     , m_minimumDOMTimerInterval(DOMTimer::defaultMinimumInterval())
167     , m_domTimerAlignmentInterval(DOMTimer::defaultAlignmentInterval())
168 #if ENABLE(TEXT_AUTOSIZING)
169     , m_textAutosizingFontScaleFactor(1)
170 #if HACK_FORCE_TEXT_AUTOSIZING_ON_DESKTOP
171     , m_textAutosizingWindowSizeOverride(320, 480)
172     , m_textAutosizingEnabled(true)
173 #else
174     , m_textAutosizingEnabled(false)
175 #endif
176 #endif
177     SETTINGS_INITIALIZER_LIST
178     , m_isJavaEnabled(false)
179     , m_isJavaEnabledForLocalFiles(true)
180     , m_loadsImagesAutomatically(false)
181     , m_areImagesEnabled(true)
182     , m_arePluginsEnabled(false)
183     , m_isScriptEnabled(false)
184     , m_needsAdobeFrameReloadingQuirk(false)
185     , m_usesPageCache(false)
186     , m_fontRenderingMode(0)
187     , m_antialiasedFontDilationEnabled(true)
188     , m_showTiledScrollingIndicator(false)
189     , m_backgroundShouldExtendBeyondPage(false)
190     , m_dnsPrefetchingEnabled(false)
191 #if ENABLE(TOUCH_EVENTS)
192     , m_touchEventEmulationEnabled(false)
193 #endif
194     , m_scrollingPerformanceLoggingEnabled(false)
195     , m_timeWithoutMouseMovementBeforeHidingControls(3)
196     , m_setImageLoadingSettingsTimer(*this, &Settings::imageLoadingSettingsTimerFired)
197 #if ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING)
198     , m_hiddenPageDOMTimerThrottlingEnabled(false)
199 #endif
200     , m_hiddenPageCSSAnimationSuspensionEnabled(false)
201     , m_fontFallbackPrefersPictographs(false)
202 {
203     // A Frame may not have been created yet, so we initialize the AtomicString
204     // hash before trying to use it.
205     AtomicString::init();
206     initializeDefaultFontFamilies();
207     m_page = page; // Page is not yet fully initialized when constructing Settings, so keeping m_page null over initializeDefaultFontFamilies() call.
208 }
209
210 Settings::~Settings()
211 {
212 }
213
214 PassRefPtr<Settings> Settings::create(Page* page)
215 {
216     return adoptRef(new Settings(page));
217 }
218
219 SETTINGS_SETTER_BODIES
220
221 #if !PLATFORM(COCOA)
222 void Settings::initializeDefaultFontFamilies()
223 {
224     // Other platforms can set up fonts from a client, but on Mac, we want it in WebCore to share code between WebKit1 and WebKit2.
225 }
226 #endif
227
228 const AtomicString& Settings::standardFontFamily(UScriptCode script) const
229 {
230     return m_fontGenericFamilies->standardFontFamily(script);
231 }
232
233 void Settings::setStandardFontFamily(const AtomicString& family, UScriptCode script)
234 {
235     bool changes = m_fontGenericFamilies->setStandardFontFamily(family, script);
236     if (changes)
237         invalidateAfterGenericFamilyChange(m_page);
238 }
239
240 const AtomicString& Settings::fixedFontFamily(UScriptCode script) const
241 {
242     return m_fontGenericFamilies->fixedFontFamily(script);
243 }
244
245 void Settings::setFixedFontFamily(const AtomicString& family, UScriptCode script)
246 {
247     bool changes = m_fontGenericFamilies->setFixedFontFamily(family, script);
248     if (changes)
249         invalidateAfterGenericFamilyChange(m_page);
250 }
251
252 const AtomicString& Settings::serifFontFamily(UScriptCode script) const
253 {
254     return m_fontGenericFamilies->serifFontFamily(script);
255 }
256
257 void Settings::setSerifFontFamily(const AtomicString& family, UScriptCode script)
258 {
259     bool changes = m_fontGenericFamilies->setSerifFontFamily(family, script);
260     if (changes)
261         invalidateAfterGenericFamilyChange(m_page);
262 }
263
264 const AtomicString& Settings::sansSerifFontFamily(UScriptCode script) const
265 {
266     return m_fontGenericFamilies->sansSerifFontFamily(script);
267 }
268
269 void Settings::setSansSerifFontFamily(const AtomicString& family, UScriptCode script)
270 {
271     bool changes = m_fontGenericFamilies->setSansSerifFontFamily(family, script);
272     if (changes)
273         invalidateAfterGenericFamilyChange(m_page);
274 }
275
276 const AtomicString& Settings::cursiveFontFamily(UScriptCode script) const
277 {
278     return m_fontGenericFamilies->cursiveFontFamily(script);
279 }
280
281 void Settings::setCursiveFontFamily(const AtomicString& family, UScriptCode script)
282 {
283     bool changes = m_fontGenericFamilies->setCursiveFontFamily(family, script);
284     if (changes)
285         invalidateAfterGenericFamilyChange(m_page);
286 }
287
288 const AtomicString& Settings::fantasyFontFamily(UScriptCode script) const
289 {
290     return m_fontGenericFamilies->fantasyFontFamily(script);
291 }
292
293 void Settings::setFantasyFontFamily(const AtomicString& family, UScriptCode script)
294 {
295     bool changes = m_fontGenericFamilies->setFantasyFontFamily(family, script);
296     if (changes)
297         invalidateAfterGenericFamilyChange(m_page);
298 }
299
300 const AtomicString& Settings::pictographFontFamily(UScriptCode script) const
301 {
302     return m_fontGenericFamilies->pictographFontFamily(script);
303 }
304
305 void Settings::setPictographFontFamily(const AtomicString& family, UScriptCode script)
306 {
307     bool changes = m_fontGenericFamilies->setPictographFontFamily(family, script);
308     if (changes)
309         invalidateAfterGenericFamilyChange(m_page);
310 }
311
312 #if ENABLE(TEXT_AUTOSIZING)
313 void Settings::setTextAutosizingEnabled(bool textAutosizingEnabled)
314 {
315     if (m_textAutosizingEnabled == textAutosizingEnabled)
316         return;
317
318     m_textAutosizingEnabled = textAutosizingEnabled;
319     if (m_page)
320         m_page->setNeedsRecalcStyleInAllFrames();
321 }
322
323 void Settings::setTextAutosizingWindowSizeOverride(const IntSize& textAutosizingWindowSizeOverride)
324 {
325     if (m_textAutosizingWindowSizeOverride == textAutosizingWindowSizeOverride)
326         return;
327
328     m_textAutosizingWindowSizeOverride = textAutosizingWindowSizeOverride;
329     if (m_page)
330         m_page->setNeedsRecalcStyleInAllFrames();
331 }
332
333 void Settings::setTextAutosizingFontScaleFactor(float fontScaleFactor)
334 {
335     m_textAutosizingFontScaleFactor = fontScaleFactor;
336
337     if (!m_page)
338         return;
339
340     // FIXME: I wonder if this needs to traverse frames like in WebViewImpl::resize, or whether there is only one document per Settings instance?
341     for (Frame* frame = m_page->mainFrame(); frame; frame = frame->tree().traverseNext())
342         frame->document()->textAutosizer()->recalculateMultipliers();
343
344     m_page->setNeedsRecalcStyleInAllFrames();
345 }
346
347 #endif
348
349 void Settings::setAntialiasedFontDilationEnabled(bool enabled)
350 {
351     // FIXME: It's wrong for a setting to toggle a global, but this code is temporary.
352     FontCascade::setAntialiasedFontDilationEnabled(enabled);
353 }
354
355 void Settings::setMediaTypeOverride(const String& mediaTypeOverride)
356 {
357     if (m_mediaTypeOverride == mediaTypeOverride)
358         return;
359
360     m_mediaTypeOverride = mediaTypeOverride;
361
362     if (!m_page)
363         return;
364
365     FrameView* view = m_page->mainFrame().view();
366     ASSERT(view);
367
368     view->setMediaType(mediaTypeOverride);
369     m_page->setNeedsRecalcStyleInAllFrames();
370 }
371
372 void Settings::setLoadsImagesAutomatically(bool loadsImagesAutomatically)
373 {
374     m_loadsImagesAutomatically = loadsImagesAutomatically;
375     
376     // Changing this setting to true might immediately start new loads for images that had previously had loading disabled.
377     // If this happens while a WebView is being dealloc'ed, and we don't know the WebView is being dealloc'ed, these new loads
378     // can cause crashes downstream when the WebView memory has actually been free'd.
379     // One example where this can happen is in Mac apps that subclass WebView then do work in their overridden dealloc methods.
380     // Starting these loads synchronously is not important.  By putting it on a 0-delay, properly closing the Page cancels them
381     // before they have a chance to really start.
382     // See http://webkit.org/b/60572 for more discussion.
383     m_setImageLoadingSettingsTimer.startOneShot(0);
384 }
385
386 void Settings::imageLoadingSettingsTimerFired()
387 {
388     setImageLoadingSettings(m_page);
389 }
390
391 void Settings::setScriptEnabled(bool isScriptEnabled)
392 {
393     if (m_isScriptEnabled == isScriptEnabled)
394         return;
395
396     m_isScriptEnabled = isScriptEnabled;
397
398     if (!m_page)
399         return;
400
401 #if PLATFORM(IOS)
402     m_page->setNeedsRecalcStyleInAllFrames();
403 #endif
404     InspectorInstrumentation::scriptsEnabled(*m_page, m_isScriptEnabled);
405 }
406
407 void Settings::setJavaEnabled(bool isJavaEnabled)
408 {
409     m_isJavaEnabled = isJavaEnabled;
410 }
411
412 void Settings::setJavaEnabledForLocalFiles(bool isJavaEnabledForLocalFiles)
413 {
414     m_isJavaEnabledForLocalFiles = isJavaEnabledForLocalFiles;
415 }
416
417 void Settings::setImagesEnabled(bool areImagesEnabled)
418 {
419     m_areImagesEnabled = areImagesEnabled;
420
421     // See comment in setLoadsImagesAutomatically.
422     m_setImageLoadingSettingsTimer.startOneShot(0);
423 }
424
425 void Settings::setPluginsEnabled(bool arePluginsEnabled)
426 {
427     if (m_arePluginsEnabled == arePluginsEnabled)
428         return;
429
430     m_arePluginsEnabled = arePluginsEnabled;
431     Page::refreshPlugins(false);
432 }
433
434 void Settings::setUserStyleSheetLocation(const URL& userStyleSheetLocation)
435 {
436     if (m_userStyleSheetLocation == userStyleSheetLocation)
437         return;
438
439     m_userStyleSheetLocation = userStyleSheetLocation;
440
441     if (m_page)
442         m_page->userStyleSheetLocationChanged();
443 }
444
445 // FIXME: This quirk is needed because of Radar 4674537 and 5211271. We need to phase it out once Adobe
446 // can fix the bug from their end.
447 void Settings::setNeedsAdobeFrameReloadingQuirk(bool shouldNotReloadIFramesForUnchangedSRC)
448 {
449     m_needsAdobeFrameReloadingQuirk = shouldNotReloadIFramesForUnchangedSRC;
450 }
451
452 void Settings::setMinimumDOMTimerInterval(double interval)
453 {
454     double oldTimerInterval = m_minimumDOMTimerInterval;
455     m_minimumDOMTimerInterval = interval;
456
457     if (!m_page)
458         return;
459
460     for (Frame* frame = &m_page->mainFrame(); frame; frame = frame->tree().traverseNext()) {
461         if (frame->document())
462             frame->document()->adjustMinimumTimerInterval(oldTimerInterval);
463     }
464 }
465
466 void Settings::setDOMTimerAlignmentInterval(double alignmentInterval)
467 {
468     m_domTimerAlignmentInterval = alignmentInterval;
469 }
470
471 void Settings::setLayoutInterval(std::chrono::milliseconds layoutInterval)
472 {
473     // FIXME: It seems weird that this function may disregard the specified layout interval.
474     // We should either expose layoutScheduleThreshold or better communicate this invariant.
475     m_layoutInterval = std::max(layoutInterval, layoutScheduleThreshold);
476 }
477
478 void Settings::setUsesPageCache(bool usesPageCache)
479 {
480     if (m_usesPageCache == usesPageCache)
481         return;
482         
483     m_usesPageCache = usesPageCache;
484
485     if (!m_page)
486         return;
487
488     if (!m_usesPageCache)
489         PageCache::singleton().pruneToSizeNow(0, PruningReason::None);
490 }
491
492 void Settings::setFontRenderingMode(FontRenderingMode mode)
493 {
494     if (fontRenderingMode() == mode)
495         return;
496     m_fontRenderingMode = mode;
497     if (m_page)
498         m_page->setNeedsRecalcStyleInAllFrames();
499 }
500
501 FontRenderingMode Settings::fontRenderingMode() const
502 {
503     return static_cast<FontRenderingMode>(m_fontRenderingMode);
504 }
505
506 void Settings::setDNSPrefetchingEnabled(bool dnsPrefetchingEnabled)
507 {
508     if (m_dnsPrefetchingEnabled == dnsPrefetchingEnabled)
509         return;
510
511     m_dnsPrefetchingEnabled = dnsPrefetchingEnabled;
512     if (m_page)
513         m_page->dnsPrefetchingStateChanged();
514 }
515
516 void Settings::setShowTiledScrollingIndicator(bool enabled)
517 {
518     if (m_showTiledScrollingIndicator == enabled)
519         return;
520         
521     m_showTiledScrollingIndicator = enabled;
522 }
523
524 #if PLATFORM(WIN)
525 void Settings::setShouldUseHighResolutionTimers(bool shouldUseHighResolutionTimers)
526 {
527     gShouldUseHighResolutionTimers = shouldUseHighResolutionTimers;
528 }
529 #endif
530
531 void Settings::setStorageBlockingPolicy(SecurityOrigin::StorageBlockingPolicy enabled)
532 {
533     if (m_storageBlockingPolicy == enabled)
534         return;
535
536     m_storageBlockingPolicy = enabled;
537     if (m_page)
538         m_page->storageBlockingStateChanged();
539 }
540
541 void Settings::setBackgroundShouldExtendBeyondPage(bool shouldExtend)
542 {
543     if (m_backgroundShouldExtendBeyondPage == shouldExtend)
544         return;
545
546     m_backgroundShouldExtendBeyondPage = shouldExtend;
547
548     if (m_page)
549         m_page->mainFrame().view()->updateExtendBackgroundIfNecessary();
550 }
551
552 #if USE(AVFOUNDATION)
553 void Settings::setAVFoundationEnabled(bool enabled)
554 {
555     if (gAVFoundationEnabled == enabled)
556         return;
557
558     gAVFoundationEnabled = enabled;
559     HTMLMediaElement::resetMediaEngines();
560 }
561 #endif
562
563 #if PLATFORM(COCOA)
564 void Settings::setQTKitEnabled(bool enabled)
565 {
566     if (gQTKitEnabled == enabled)
567         return;
568
569     gQTKitEnabled = enabled;
570     HTMLMediaElement::resetMediaEngines();
571 }
572 #endif
573
574 void Settings::setScrollingPerformanceLoggingEnabled(bool enabled)
575 {
576     m_scrollingPerformanceLoggingEnabled = enabled;
577
578     if (m_page && m_page->mainFrame().view())
579         m_page->mainFrame().view()->setScrollingPerformanceLoggingEnabled(enabled);
580 }
581
582 void Settings::setMockScrollbarsEnabled(bool flag)
583 {
584     gMockScrollbarsEnabled = flag;
585     // FIXME: This should update scroll bars in existing pages.
586 }
587
588 bool Settings::mockScrollbarsEnabled()
589 {
590     return gMockScrollbarsEnabled;
591 }
592
593 void Settings::setUsesOverlayScrollbars(bool flag)
594 {
595     gUsesOverlayScrollbars = flag;
596     // FIXME: This should update scroll bars in existing pages.
597 }
598
599 bool Settings::usesOverlayScrollbars()
600 {
601     return gUsesOverlayScrollbars;
602 }
603
604 void Settings::setShouldRespectPriorityInCSSAttributeSetters(bool flag)
605 {
606     gShouldRespectPriorityInCSSAttributeSetters = flag;
607 }
608
609 bool Settings::shouldRespectPriorityInCSSAttributeSetters()
610 {
611     return gShouldRespectPriorityInCSSAttributeSetters;
612 }
613
614 #if ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING)
615 void Settings::setHiddenPageDOMTimerThrottlingEnabled(bool flag)
616 {
617     if (m_hiddenPageDOMTimerThrottlingEnabled == flag)
618         return;
619     m_hiddenPageDOMTimerThrottlingEnabled = flag;
620     if (m_page)
621         m_page->hiddenPageDOMTimerThrottlingStateChanged();
622 }
623 #endif
624
625 void Settings::setHiddenPageCSSAnimationSuspensionEnabled(bool flag)
626 {
627     if (m_hiddenPageCSSAnimationSuspensionEnabled == flag)
628         return;
629     m_hiddenPageCSSAnimationSuspensionEnabled = flag;
630     if (m_page)
631         m_page->hiddenPageCSSAnimationSuspensionStateChanged();
632 }
633
634 void Settings::setFontFallbackPrefersPictographs(bool preferPictographs)
635 {
636     if (m_fontFallbackPrefersPictographs == preferPictographs)
637         return;
638
639     m_fontFallbackPrefersPictographs = preferPictographs;
640     if (m_page)
641         m_page->setNeedsRecalcStyleInAllFrames();
642 }
643
644 void Settings::setLowPowerVideoAudioBufferSizeEnabled(bool flag)
645 {
646     gLowPowerVideoAudioBufferSizeEnabled = flag;
647 }
648
649 #if PLATFORM(IOS)
650 void Settings::setAudioSessionCategoryOverride(unsigned sessionCategory)
651 {
652     AudioSession::sharedSession().setCategoryOverride(static_cast<AudioSession::CategoryType>(sessionCategory));
653 }
654
655 unsigned Settings::audioSessionCategoryOverride()
656 {
657     return AudioSession::sharedSession().categoryOverride();
658 }
659
660 void Settings::setNetworkDataUsageTrackingEnabled(bool trackingEnabled)
661 {
662     gNetworkDataUsageTrackingEnabled = trackingEnabled;
663 }
664
665 bool Settings::networkDataUsageTrackingEnabled()
666 {
667     return gNetworkDataUsageTrackingEnabled;
668 }
669
670 static String& sharedNetworkInterfaceNameGlobal()
671 {
672     static NeverDestroyed<String> networkInterfaceName;
673     return networkInterfaceName;
674 }
675
676 void Settings::setNetworkInterfaceName(const String& networkInterfaceName)
677 {
678     sharedNetworkInterfaceNameGlobal() = networkInterfaceName;
679 }
680
681 const String& Settings::networkInterfaceName()
682 {
683     return sharedNetworkInterfaceNameGlobal();
684 }
685 #endif
686
687 } // namespace WebCore