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