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