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