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