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