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