[iOS] Video occasionally mixes with other system audio instead of interrupting
[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 "MainFrame.h"
43 #include "Page.h"
44 #include "PageCache.h"
45 #include "RuntimeApplicationChecks.h"
46 #include "StorageMap.h"
47 #include <limits>
48 #include <wtf/NeverDestroyed.h>
49 #include <wtf/StdLibExtras.h>
50
51 #if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
52 #include "RealtimeMediaSourceCenterMac.h"
53 #endif
54
55 #if ENABLE(MEDIA_STREAM)
56 #include "MockRealtimeMediaSourceCenter.h"
57 #endif
58
59 namespace WebCore {
60
61 static void setImageLoadingSettings(Page* page)
62 {
63     if (!page)
64         return;
65
66     for (Frame* frame = &page->mainFrame(); frame; frame = frame->tree().traverseNext()) {
67         if (!frame->document())
68             continue;
69         frame->document()->cachedResourceLoader().setImagesEnabled(page->settings().areImagesEnabled());
70         frame->document()->cachedResourceLoader().setAutoLoadImages(page->settings().loadsImagesAutomatically());
71     }
72 }
73
74 static void invalidateAfterGenericFamilyChange(Page* page)
75 {
76     invalidateFontCascadeCache();
77     if (page)
78         page->setNeedsRecalcStyleInAllFrames();
79 }
80
81 #if USE(AVFOUNDATION)
82 bool Settings::gAVFoundationEnabled = true;
83 bool Settings::gAVFoundationNSURLSessionEnabled = true;
84 #endif
85
86 #if PLATFORM(COCOA)
87 bool Settings::gQTKitEnabled = false;
88 #endif
89
90 #if USE(GSTREAMER)
91 bool Settings::gGStreamerEnabled = true;
92 #endif
93
94 bool Settings::gMockScrollbarsEnabled = false;
95 bool Settings::gUsesOverlayScrollbars = false;
96 bool Settings::gMockScrollAnimatorEnabled = false;
97
98 #if ENABLE(MEDIA_STREAM)
99 bool Settings::gMockCaptureDevicesEnabled = false;
100 bool Settings::gMediaCaptureRequiresSecureConnection = true;
101 #endif
102
103 #if PLATFORM(WIN)
104 bool Settings::gShouldUseHighResolutionTimers = true;
105 #endif
106     
107 bool Settings::gShouldRespectPriorityInCSSAttributeSetters = false;
108 bool Settings::gLowPowerVideoAudioBufferSizeEnabled = false;
109 bool Settings::gResourceLoadStatisticsEnabledEnabled = false;
110 bool Settings::gAllowsAnySSLCertificate = false;
111
112 #if PLATFORM(IOS)
113 bool Settings::gNetworkDataUsageTrackingEnabled = false;
114 bool Settings::gAVKitEnabled = false;
115 bool Settings::gShouldOptOutOfNetworkStateObservation = false;
116 #endif
117 bool Settings::gManageAudioSession = false;
118
119 // NOTEs
120 //  1) EditingMacBehavior comprises Tiger, Leopard, SnowLeopard and iOS builds, as well as QtWebKit when built on Mac;
121 //  2) EditingWindowsBehavior comprises Win32 build;
122 //  3) EditingUnixBehavior comprises all unix-based systems, but Darwin/MacOS (and then abusing the terminology);
123 // 99) MacEditingBehavior is used as a fallback.
124 static EditingBehaviorType editingBehaviorTypeForPlatform()
125 {
126     return
127 #if PLATFORM(IOS)
128     EditingIOSBehavior
129 #elif OS(DARWIN)
130     EditingMacBehavior
131 #elif OS(WINDOWS)
132     EditingWindowsBehavior
133 #elif OS(UNIX)
134     EditingUnixBehavior
135 #else
136     // Fallback
137     EditingMacBehavior
138 #endif
139     ;
140 }
141
142 #if PLATFORM(COCOA)
143 static const bool defaultYouTubeFlashPluginReplacementEnabled = true;
144 #else
145 static const bool defaultYouTubeFlashPluginReplacementEnabled = false;
146 #endif
147
148 #if PLATFORM(IOS)
149 static const bool defaultFixedBackgroundsPaintRelativeToDocument = true;
150 static const bool defaultAcceleratedCompositingForFixedPositionEnabled = true;
151 static const bool defaultAllowsInlineMediaPlayback = false;
152 static const bool defaultInlineMediaPlaybackRequiresPlaysInlineAttribute = true;
153 static const bool defaultVideoPlaybackRequiresUserGesture = true;
154 static const bool defaultAudioPlaybackRequiresUserGesture = true;
155 static const bool defaultMediaDataLoadsAutomatically = false;
156 static const bool defaultShouldRespectImageOrientation = true;
157 static const bool defaultImageSubsamplingEnabled = true;
158 static const bool defaultScrollingTreeIncludesFrames = true;
159 static const bool defaultMediaControlsScaleWithPageZoom = true;
160 static const bool defaultQuickTimePluginReplacementEnabled = true;
161 #else
162 static const bool defaultFixedBackgroundsPaintRelativeToDocument = false;
163 static const bool defaultAcceleratedCompositingForFixedPositionEnabled = false;
164 static const bool defaultAllowsInlineMediaPlayback = true;
165 static const bool defaultInlineMediaPlaybackRequiresPlaysInlineAttribute = false;
166 static const bool defaultVideoPlaybackRequiresUserGesture = false;
167 static const bool defaultAudioPlaybackRequiresUserGesture = false;
168 static const bool defaultMediaDataLoadsAutomatically = true;
169 static const bool defaultShouldRespectImageOrientation = false;
170 static const bool defaultImageSubsamplingEnabled = false;
171 static const bool defaultScrollingTreeIncludesFrames = false;
172 static const bool defaultMediaControlsScaleWithPageZoom = true;
173 static const bool defaultQuickTimePluginReplacementEnabled = false;
174 #endif
175
176 static const bool defaultRequiresUserGestureToLoadVideo = true;
177
178 static const bool defaultAllowsPictureInPictureMediaPlayback = true;
179
180 static const double defaultIncrementalRenderingSuppressionTimeoutInSeconds = 5;
181 #if USE(UNIFIED_TEXT_CHECKING)
182 static const bool defaultUnifiedTextCheckerEnabled = true;
183 #else
184 static const bool defaultUnifiedTextCheckerEnabled = false;
185 #endif
186 static const bool defaultSmartInsertDeleteEnabled = true;
187 static const bool defaultSelectTrailingWhitespaceEnabled = false;
188
189 // This amount of time must have elapsed before we will even consider scheduling a layout without a delay.
190 // FIXME: For faster machines this value can really be lowered to 200. 250 is adequate, but a little high
191 // for dual G5s. :)
192 static const Seconds layoutScheduleThreshold = 250_ms;
193
194 Settings::Settings(Page* page)
195     : m_page(nullptr)
196     , m_mediaTypeOverride("screen")
197     , m_fontGenericFamilies(std::make_unique<FontGenericFamilies>())
198     , m_storageBlockingPolicy(SecurityOrigin::AllowAllStorage)
199     , m_layoutInterval(layoutScheduleThreshold)
200     , m_minimumDOMTimerInterval(DOMTimer::defaultMinimumInterval())
201     SETTINGS_INITIALIZER_LIST
202     , m_isJavaEnabled(false)
203     , m_isJavaEnabledForLocalFiles(true)
204     , m_loadsImagesAutomatically(false)
205     , m_areImagesEnabled(true)
206     , m_preferMIMETypeForImages(false)
207     , m_arePluginsEnabled(false)
208     , m_isScriptEnabled(false)
209     , m_needsAdobeFrameReloadingQuirk(false)
210     , m_usesPageCache(false)
211     , m_fontRenderingMode(0)
212     , m_showTiledScrollingIndicator(false)
213     , m_backgroundShouldExtendBeyondPage(false)
214     , m_dnsPrefetchingEnabled(false)
215 #if ENABLE(TOUCH_EVENTS)
216     , m_touchEventEmulationEnabled(false)
217 #endif
218     , m_scrollingPerformanceLoggingEnabled(false)
219     , m_timeWithoutMouseMovementBeforeHidingControls(3_s)
220     , m_setImageLoadingSettingsTimer(*this, &Settings::imageLoadingSettingsTimerFired)
221     , m_hiddenPageDOMTimerThrottlingEnabled(false)
222     , m_hiddenPageCSSAnimationSuspensionEnabled(false)
223     , m_fontFallbackPrefersPictographs(false)
224     , m_webFontsAlwaysFallBack(false)
225     , m_forcePendingWebGLPolicy(false)
226 {
227     // A Frame may not have been created yet, so we initialize the AtomicString
228     // hash before trying to use it.
229     AtomicString::init();
230     initializeDefaultFontFamilies();
231     m_page = page; // Page is not yet fully initialized when constructing Settings, so keeping m_page null over initializeDefaultFontFamilies() call.
232 }
233
234 Settings::~Settings()
235 {
236 }
237
238 Ref<Settings> Settings::create(Page* page)
239 {
240     return adoptRef(*new Settings(page));
241 }
242
243 SETTINGS_SETTER_BODIES
244
245 #if !PLATFORM(COCOA)
246 void Settings::initializeDefaultFontFamilies()
247 {
248     // Other platforms can set up fonts from a client, but on Mac, we want it in WebCore to share code between WebKit1 and WebKit2.
249 }
250 #endif
251
252 const AtomicString& Settings::standardFontFamily(UScriptCode script) const
253 {
254     return m_fontGenericFamilies->standardFontFamily(script);
255 }
256
257 void Settings::setStandardFontFamily(const AtomicString& family, UScriptCode script)
258 {
259     bool changes = m_fontGenericFamilies->setStandardFontFamily(family, script);
260     if (changes)
261         invalidateAfterGenericFamilyChange(m_page);
262 }
263
264 const AtomicString& Settings::fixedFontFamily(UScriptCode script) const
265 {
266     return m_fontGenericFamilies->fixedFontFamily(script);
267 }
268
269 void Settings::setFixedFontFamily(const AtomicString& family, UScriptCode script)
270 {
271     bool changes = m_fontGenericFamilies->setFixedFontFamily(family, script);
272     if (changes)
273         invalidateAfterGenericFamilyChange(m_page);
274 }
275
276 const AtomicString& Settings::serifFontFamily(UScriptCode script) const
277 {
278     return m_fontGenericFamilies->serifFontFamily(script);
279 }
280
281 void Settings::setSerifFontFamily(const AtomicString& family, UScriptCode script)
282 {
283     bool changes = m_fontGenericFamilies->setSerifFontFamily(family, script);
284     if (changes)
285         invalidateAfterGenericFamilyChange(m_page);
286 }
287
288 const AtomicString& Settings::sansSerifFontFamily(UScriptCode script) const
289 {
290     return m_fontGenericFamilies->sansSerifFontFamily(script);
291 }
292
293 void Settings::setSansSerifFontFamily(const AtomicString& family, UScriptCode script)
294 {
295     bool changes = m_fontGenericFamilies->setSansSerifFontFamily(family, script);
296     if (changes)
297         invalidateAfterGenericFamilyChange(m_page);
298 }
299
300 const AtomicString& Settings::cursiveFontFamily(UScriptCode script) const
301 {
302     return m_fontGenericFamilies->cursiveFontFamily(script);
303 }
304
305 void Settings::setCursiveFontFamily(const AtomicString& family, UScriptCode script)
306 {
307     bool changes = m_fontGenericFamilies->setCursiveFontFamily(family, script);
308     if (changes)
309         invalidateAfterGenericFamilyChange(m_page);
310 }
311
312 const AtomicString& Settings::fantasyFontFamily(UScriptCode script) const
313 {
314     return m_fontGenericFamilies->fantasyFontFamily(script);
315 }
316
317 void Settings::setFantasyFontFamily(const AtomicString& family, UScriptCode script)
318 {
319     bool changes = m_fontGenericFamilies->setFantasyFontFamily(family, script);
320     if (changes)
321         invalidateAfterGenericFamilyChange(m_page);
322 }
323
324 const AtomicString& Settings::pictographFontFamily(UScriptCode script) const
325 {
326     return m_fontGenericFamilies->pictographFontFamily(script);
327 }
328
329 void Settings::setPictographFontFamily(const AtomicString& family, UScriptCode script)
330 {
331     bool changes = m_fontGenericFamilies->setPictographFontFamily(family, script);
332     if (changes)
333         invalidateAfterGenericFamilyChange(m_page);
334 }
335
336 float Settings::defaultMinimumZoomFontSize()
337 {
338     return 15;
339 }
340
341 #if !PLATFORM(IOS)
342 bool Settings::defaultTextAutosizingEnabled()
343 {
344     return false;
345 }
346 #endif
347
348 void Settings::setMediaTypeOverride(const String& mediaTypeOverride)
349 {
350     if (m_mediaTypeOverride == mediaTypeOverride)
351         return;
352
353     m_mediaTypeOverride = mediaTypeOverride;
354
355     if (!m_page)
356         return;
357
358     FrameView* view = m_page->mainFrame().view();
359     ASSERT(view);
360
361     view->setMediaType(mediaTypeOverride);
362     m_page->setNeedsRecalcStyleInAllFrames();
363 }
364
365 void Settings::setLoadsImagesAutomatically(bool loadsImagesAutomatically)
366 {
367     m_loadsImagesAutomatically = loadsImagesAutomatically;
368     
369     // Changing this setting to true might immediately start new loads for images that had previously had loading disabled.
370     // If this happens while a WebView is being dealloc'ed, and we don't know the WebView is being dealloc'ed, these new loads
371     // can cause crashes downstream when the WebView memory has actually been free'd.
372     // One example where this can happen is in Mac apps that subclass WebView then do work in their overridden dealloc methods.
373     // Starting these loads synchronously is not important.  By putting it on a 0-delay, properly closing the Page cancels them
374     // before they have a chance to really start.
375     // See http://webkit.org/b/60572 for more discussion.
376     m_setImageLoadingSettingsTimer.startOneShot(0_s);
377 }
378
379 void Settings::imageLoadingSettingsTimerFired()
380 {
381     setImageLoadingSettings(m_page);
382 }
383
384 void Settings::setScriptEnabled(bool isScriptEnabled)
385 {
386     if (m_isScriptEnabled == isScriptEnabled)
387         return;
388
389     m_isScriptEnabled = isScriptEnabled;
390
391     if (!m_page)
392         return;
393
394 #if PLATFORM(IOS)
395     m_page->setNeedsRecalcStyleInAllFrames();
396 #endif
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_s);
415 }
416
417 void Settings::setPreferMIMETypeForImages(bool preferMIMETypeForImages)
418 {
419     m_preferMIMETypeForImages = preferMIMETypeForImages;
420 }
421
422 void Settings::setForcePendingWebGLPolicy(bool forced)
423 {
424     m_forcePendingWebGLPolicy = forced;
425 }
426
427 void Settings::setPluginsEnabled(bool arePluginsEnabled)
428 {
429     if (m_arePluginsEnabled == arePluginsEnabled)
430         return;
431
432     m_arePluginsEnabled = arePluginsEnabled;
433     Page::refreshPlugins(false);
434 }
435
436 void Settings::setUserStyleSheetLocation(const URL& userStyleSheetLocation)
437 {
438     if (m_userStyleSheetLocation == userStyleSheetLocation)
439         return;
440
441     m_userStyleSheetLocation = userStyleSheetLocation;
442
443     if (m_page)
444         m_page->userStyleSheetLocationChanged();
445 }
446
447 // FIXME: This quirk is needed because of Radar 4674537 and 5211271. We need to phase it out once Adobe
448 // can fix the bug from their end.
449 void Settings::setNeedsAdobeFrameReloadingQuirk(bool shouldNotReloadIFramesForUnchangedSRC)
450 {
451     m_needsAdobeFrameReloadingQuirk = shouldNotReloadIFramesForUnchangedSRC;
452 }
453
454 void Settings::setMinimumDOMTimerInterval(Seconds interval)
455 {
456     auto oldTimerInterval = std::exchange(m_minimumDOMTimerInterval, interval);
457
458     if (!m_page)
459         return;
460
461     for (Frame* frame = &m_page->mainFrame(); frame; frame = frame->tree().traverseNext()) {
462         if (frame->document())
463             frame->document()->adjustMinimumDOMTimerInterval(oldTimerInterval);
464     }
465 }
466
467 void Settings::setLayoutInterval(Seconds layoutInterval)
468 {
469     // FIXME: It seems weird that this function may disregard the specified layout interval.
470     // We should either expose layoutScheduleThreshold or better communicate this invariant.
471     m_layoutInterval = std::max(layoutInterval, layoutScheduleThreshold);
472 }
473
474 void Settings::setUsesPageCache(bool usesPageCache)
475 {
476     if (m_usesPageCache == usesPageCache)
477         return;
478         
479     m_usesPageCache = usesPageCache;
480
481     if (!m_page)
482         return;
483
484     if (!m_usesPageCache)
485         PageCache::singleton().pruneToSizeNow(0, PruningReason::None);
486 }
487
488 void Settings::setFontRenderingMode(FontRenderingMode mode)
489 {
490     if (fontRenderingMode() == mode)
491         return;
492     m_fontRenderingMode = static_cast<int>(mode);
493     if (m_page)
494         m_page->setNeedsRecalcStyleInAllFrames();
495 }
496
497 FontRenderingMode Settings::fontRenderingMode() const
498 {
499     return static_cast<FontRenderingMode>(m_fontRenderingMode);
500 }
501
502 void Settings::setDNSPrefetchingEnabled(bool dnsPrefetchingEnabled)
503 {
504     if (m_dnsPrefetchingEnabled == dnsPrefetchingEnabled)
505         return;
506
507     m_dnsPrefetchingEnabled = dnsPrefetchingEnabled;
508     if (m_page)
509         m_page->dnsPrefetchingStateChanged();
510 }
511
512 void Settings::setShowTiledScrollingIndicator(bool enabled)
513 {
514     if (m_showTiledScrollingIndicator == enabled)
515         return;
516         
517     m_showTiledScrollingIndicator = enabled;
518 }
519
520 #if ENABLE(RESOURCE_USAGE)
521 void Settings::setResourceUsageOverlayVisible(bool visible)
522 {
523     if (m_resourceUsageOverlayVisible == visible)
524         return;
525
526     m_resourceUsageOverlayVisible = visible;
527     if (m_page)
528         m_page->setResourceUsageOverlayVisible(visible);
529 }
530 #endif
531
532 #if PLATFORM(WIN)
533 void Settings::setShouldUseHighResolutionTimers(bool shouldUseHighResolutionTimers)
534 {
535     gShouldUseHighResolutionTimers = shouldUseHighResolutionTimers;
536 }
537 #endif
538
539 void Settings::setStorageBlockingPolicy(SecurityOrigin::StorageBlockingPolicy enabled)
540 {
541     if (m_storageBlockingPolicy == enabled)
542         return;
543
544     m_storageBlockingPolicy = enabled;
545     if (m_page)
546         m_page->storageBlockingStateChanged();
547 }
548
549 void Settings::setBackgroundShouldExtendBeyondPage(bool shouldExtend)
550 {
551     if (m_backgroundShouldExtendBeyondPage == shouldExtend)
552         return;
553
554     m_backgroundShouldExtendBeyondPage = shouldExtend;
555
556     if (m_page)
557         m_page->mainFrame().view()->updateExtendBackgroundIfNecessary();
558 }
559
560 #if USE(AVFOUNDATION)
561 void Settings::setAVFoundationEnabled(bool enabled)
562 {
563     if (gAVFoundationEnabled == enabled)
564         return;
565
566     gAVFoundationEnabled = enabled;
567     HTMLMediaElement::resetMediaEngines();
568 }
569
570 void Settings::setAVFoundationNSURLSessionEnabled(bool enabled)
571 {
572     if (gAVFoundationNSURLSessionEnabled == enabled)
573         return;
574
575     gAVFoundationNSURLSessionEnabled = enabled;
576 }
577 #endif
578
579 #if PLATFORM(COCOA)
580 void Settings::setQTKitEnabled(bool enabled)
581 {
582     if (gQTKitEnabled == enabled)
583         return;
584
585     gQTKitEnabled = enabled;
586     HTMLMediaElement::resetMediaEngines();
587 }
588 #endif
589
590 #if USE(GSTREAMER)
591 void Settings::setGStreamerEnabled(bool enabled)
592 {
593     if (gGStreamerEnabled == enabled)
594         return;
595
596     gGStreamerEnabled = enabled;
597     HTMLMediaElement::resetMediaEngines();
598 }
599 #endif
600
601 #if ENABLE(MEDIA_STREAM)
602 bool Settings::mockCaptureDevicesEnabled()
603 {
604     return gMockCaptureDevicesEnabled;
605 }
606
607 void Settings::setMockCaptureDevicesEnabled(bool enabled)
608 {
609     gMockCaptureDevicesEnabled = enabled;
610     MockRealtimeMediaSourceCenter::setMockRealtimeMediaSourceCenterEnabled(enabled);
611 }
612
613 bool Settings::mediaCaptureRequiresSecureConnection() const
614 {
615     return gMediaCaptureRequiresSecureConnection;
616 }
617
618 void Settings::setMediaCaptureRequiresSecureConnection(bool mediaCaptureRequiresSecureConnection)
619 {
620     gMediaCaptureRequiresSecureConnection = mediaCaptureRequiresSecureConnection;
621 }
622 #endif
623
624 void Settings::setScrollingPerformanceLoggingEnabled(bool enabled)
625 {
626     m_scrollingPerformanceLoggingEnabled = enabled;
627
628     if (m_page && m_page->mainFrame().view())
629         m_page->mainFrame().view()->setScrollingPerformanceLoggingEnabled(enabled);
630 }
631
632 // It's very important that this setting doesn't change in the middle of a document's lifetime.
633 // The Mac port uses this flag when registering and deregistering platform-dependent scrollbar
634 // objects. Therefore, if this changes at an unexpected time, deregistration may not happen
635 // correctly, which may cause the platform to follow dangling pointers.
636 void Settings::setMockScrollbarsEnabled(bool flag)
637 {
638     gMockScrollbarsEnabled = flag;
639     // FIXME: This should update scroll bars in existing pages.
640 }
641
642 bool Settings::mockScrollbarsEnabled()
643 {
644     return gMockScrollbarsEnabled;
645 }
646
647 void Settings::setUsesOverlayScrollbars(bool flag)
648 {
649     gUsesOverlayScrollbars = flag;
650     // FIXME: This should update scroll bars in existing pages.
651 }
652
653 bool Settings::usesOverlayScrollbars()
654 {
655     return gUsesOverlayScrollbars;
656 }
657
658 void Settings::setUsesMockScrollAnimator(bool flag)
659 {
660     gMockScrollAnimatorEnabled = flag;
661 }
662
663 bool Settings::usesMockScrollAnimator()
664 {
665     return gMockScrollAnimatorEnabled;
666 }
667
668 void Settings::setShouldRespectPriorityInCSSAttributeSetters(bool flag)
669 {
670     gShouldRespectPriorityInCSSAttributeSetters = flag;
671 }
672
673 bool Settings::shouldRespectPriorityInCSSAttributeSetters()
674 {
675     return gShouldRespectPriorityInCSSAttributeSetters;
676 }
677
678 void Settings::setHiddenPageDOMTimerThrottlingEnabled(bool flag)
679 {
680     if (m_hiddenPageDOMTimerThrottlingEnabled == flag)
681         return;
682     m_hiddenPageDOMTimerThrottlingEnabled = flag;
683     if (m_page)
684         m_page->hiddenPageDOMTimerThrottlingStateChanged();
685 }
686
687 void Settings::setHiddenPageDOMTimerThrottlingAutoIncreases(bool flag)
688 {
689     if (m_hiddenPageDOMTimerThrottlingAutoIncreases == flag)
690         return;
691     m_hiddenPageDOMTimerThrottlingAutoIncreases = flag;
692     if (m_page)
693         m_page->hiddenPageDOMTimerThrottlingStateChanged();
694 }
695
696 void Settings::setHiddenPageCSSAnimationSuspensionEnabled(bool flag)
697 {
698     if (m_hiddenPageCSSAnimationSuspensionEnabled == flag)
699         return;
700     m_hiddenPageCSSAnimationSuspensionEnabled = flag;
701     if (m_page)
702         m_page->hiddenPageCSSAnimationSuspensionStateChanged();
703 }
704
705 void Settings::setFontFallbackPrefersPictographs(bool preferPictographs)
706 {
707     if (m_fontFallbackPrefersPictographs == preferPictographs)
708         return;
709
710     m_fontFallbackPrefersPictographs = preferPictographs;
711     if (m_page)
712         m_page->setNeedsRecalcStyleInAllFrames();
713 }
714
715 void Settings::setWebFontsAlwaysFallBack(bool enable)
716 {
717     if (m_webFontsAlwaysFallBack == enable)
718         return;
719
720     m_webFontsAlwaysFallBack = enable;
721 }
722
723 void Settings::setLowPowerVideoAudioBufferSizeEnabled(bool flag)
724 {
725     gLowPowerVideoAudioBufferSizeEnabled = flag;
726 }
727
728 void Settings::setResourceLoadStatisticsEnabled(bool flag)
729 {
730     gResourceLoadStatisticsEnabledEnabled = flag;
731 }
732
733 #if PLATFORM(IOS)
734 void Settings::setAudioSessionCategoryOverride(unsigned sessionCategory)
735 {
736     AudioSession::sharedSession().setCategoryOverride(static_cast<AudioSession::CategoryType>(sessionCategory));
737 }
738
739 unsigned Settings::audioSessionCategoryOverride()
740 {
741     return AudioSession::sharedSession().categoryOverride();
742 }
743
744 void Settings::setNetworkDataUsageTrackingEnabled(bool trackingEnabled)
745 {
746     gNetworkDataUsageTrackingEnabled = trackingEnabled;
747 }
748
749 bool Settings::networkDataUsageTrackingEnabled()
750 {
751     return gNetworkDataUsageTrackingEnabled;
752 }
753
754 static String& sharedNetworkInterfaceNameGlobal()
755 {
756     static NeverDestroyed<String> networkInterfaceName;
757     return networkInterfaceName;
758 }
759
760 void Settings::setNetworkInterfaceName(const String& networkInterfaceName)
761 {
762     sharedNetworkInterfaceNameGlobal() = networkInterfaceName;
763 }
764
765 const String& Settings::networkInterfaceName()
766 {
767     return sharedNetworkInterfaceNameGlobal();
768 }
769 #endif
770
771 bool Settings::globalConstRedeclarationShouldThrow()
772 {
773 #if PLATFORM(MAC)
774     return !MacApplication::isIBooks();
775 #elif PLATFORM(IOS)
776     return !IOSApplication::isIBooks();
777 #else
778     return true;
779 #endif
780 }
781
782 void Settings::setAllowsAnySSLCertificate(bool allowAnySSLCertificate)
783 {
784     gAllowsAnySSLCertificate = allowAnySSLCertificate;
785 }
786
787 bool Settings::allowsAnySSLCertificate()
788 {
789     return gAllowsAnySSLCertificate;
790 }
791
792 #if !PLATFORM(COCOA)
793 const String& Settings::defaultMediaContentTypesRequiringHardwareSupport()
794 {
795     return emptyString();
796 }
797 #endif
798
799 void Settings::setMediaContentTypesRequiringHardwareSupport(const String& contentTypes)
800 {
801     m_mediaContentTypesRequiringHardwareSupport = contentTypes.split(":").map(ContentType::create);
802 }
803
804 void Settings::setMediaContentTypesRequiringHardwareSupport(const Vector<ContentType>& contentTypes)
805 {
806     m_mediaContentTypesRequiringHardwareSupport = contentTypes;
807 }
808
809
810 } // namespace WebCore