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