Implement touch event emulation in the WebCore layer
[WebKit-https.git] / Source / WebCore / page / Settings.cpp
1 /*
2  * Copyright (C) 2006, 2007, 2008, 2009, 2011 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 "Frame.h"
36 #include "FrameTree.h"
37 #include "FrameView.h"
38 #include "HistoryItem.h"
39 #include "Page.h"
40 #include "PageCache.h"
41 #include "ResourceHandle.h"
42 #include "StorageMap.h"
43 #include <limits>
44
45 using namespace std;
46
47 namespace WebCore {
48
49 static void setLoadsImagesAutomaticallyInAllFrames(Page* page)
50 {
51     for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext())
52         frame->document()->cachedResourceLoader()->setAutoLoadImages(page->settings()->loadsImagesAutomatically());
53 }
54
55 static inline void setGenericFontFamilyMap(ScriptFontFamilyMap& fontMap, const AtomicString& family, UScriptCode script, Page* page)
56 {
57     ScriptFontFamilyMap::iterator it = fontMap.find(static_cast<int>(script));
58     if (it != fontMap.end() && it->second == family)
59         return;
60     fontMap.set(static_cast<int>(script), family);
61     page->setNeedsRecalcStyleInAllFrames();
62 }
63
64 static inline const AtomicString& getGenericFontFamilyForScript(const ScriptFontFamilyMap& fontMap, UScriptCode script)
65 {
66     ScriptFontFamilyMap::const_iterator it = fontMap.find(static_cast<int>(script));
67     if (it != fontMap.end())
68         return it->second;
69     if (script != USCRIPT_COMMON)
70         return getGenericFontFamilyForScript(fontMap, USCRIPT_COMMON);
71     return emptyAtom;
72 }
73
74 #if USE(SAFARI_THEME)
75 bool Settings::gShouldPaintNativeControls = true;
76 #endif
77
78 #if USE(AVFOUNDATION)
79 bool Settings::gAVFoundationEnabled(false);
80 #endif
81
82 bool Settings::gMockScrollbarsEnabled = false;
83
84 #if PLATFORM(WIN) || (OS(WINDOWS) && PLATFORM(WX))
85 bool Settings::gShouldUseHighResolutionTimers = true;
86 #endif
87
88 // NOTEs
89 //  1) EditingMacBehavior comprises Tiger, Leopard, SnowLeopard and iOS builds, as well QtWebKit and Chromium when built on Mac;
90 //  2) EditingWindowsBehavior comprises Win32 and WinCE builds, as well as QtWebKit and Chromium when built on Windows;
91 //  3) EditingUnixBehavior comprises all unix-based systems, but Darwin/MacOS (and then abusing the terminology);
92 // 99) MacEditingBehavior is used a fallback.
93 static EditingBehaviorType editingBehaviorTypeForPlatform()
94 {
95     return
96 #if OS(DARWIN)
97     EditingMacBehavior
98 #elif OS(WINDOWS)
99     EditingWindowsBehavior
100 #elif OS(UNIX)
101     EditingUnixBehavior
102 #else
103     // Fallback
104     EditingMacBehavior
105 #endif
106     ;
107 }
108
109 Settings::Settings(Page* page)
110     : m_page(page)
111     , m_editableLinkBehavior(EditableLinkDefaultBehavior)
112     , m_textDirectionSubmenuInclusionBehavior(TextDirectionSubmenuAutomaticallyIncluded)
113     , m_passwordEchoDurationInSeconds(1)
114     , m_minimumFontSize(0)
115     , m_minimumLogicalFontSize(0)
116     , m_defaultFontSize(0)
117     , m_defaultFixedFontSize(0)
118     , m_validationMessageTimerMagnification(50)
119     , m_minimumAccelerated2dCanvasSize(128 * 128)
120     , m_layoutFallbackWidth(980)
121     , m_deviceDPI(240)
122     , m_maximumDecodedImageSize(numeric_limits<size_t>::max())
123     , m_deviceWidth(480)
124     , m_deviceHeight(854)
125     , m_sessionStorageQuota(StorageMap::noQuota)
126     , m_editingBehaviorType(editingBehaviorTypeForPlatform())
127     , m_maximumHTMLParserDOMTreeDepth(defaultMaximumHTMLParserDOMTreeDepth)
128     , m_isSpatialNavigationEnabled(false)
129     , m_isJavaEnabled(false)
130     , m_loadsImagesAutomatically(false)
131     , m_loadsSiteIconsIgnoringImageLoadingSetting(false)
132     , m_privateBrowsingEnabled(false)
133     , m_caretBrowsingEnabled(false)
134     , m_areImagesEnabled(true)
135     , m_isMediaEnabled(true)
136     , m_arePluginsEnabled(false)
137     , m_localStorageEnabled(false)
138     , m_isScriptEnabled(false)
139     , m_isWebSecurityEnabled(true)
140     , m_allowUniversalAccessFromFileURLs(true)
141     , m_allowFileAccessFromFileURLs(true)
142     , m_javaScriptCanOpenWindowsAutomatically(false)
143     , m_javaScriptCanAccessClipboard(false)
144     , m_shouldPrintBackgrounds(false)
145     , m_textAreasAreResizable(false)
146 #if ENABLE(DASHBOARD_SUPPORT)
147     , m_usesDashboardBackwardCompatibilityMode(false)
148 #endif
149     , m_needsAdobeFrameReloadingQuirk(false)
150     , m_needsKeyboardEventDisambiguationQuirks(false)
151     , m_treatsAnyTextCSSLinkAsStylesheet(false)
152     , m_needsLeopardMailQuirks(false)
153     , m_isDOMPasteAllowed(false)
154     , m_shrinksStandaloneImagesToFit(true)
155     , m_usesPageCache(false)
156     , m_pageCacheSupportsPlugins(false)
157     , m_showsURLsInToolTips(false)
158     , m_showsToolTipOverTruncatedText(false)
159     , m_forceFTPDirectoryListings(false)
160     , m_developerExtrasEnabled(false)
161     , m_authorAndUserStylesEnabled(true)
162     , m_needsSiteSpecificQuirks(false)
163     , m_fontRenderingMode(0)
164     , m_frameFlatteningEnabled(false)
165     , m_webArchiveDebugModeEnabled(false)
166     , m_localFileContentSniffingEnabled(false)
167     , m_inApplicationChromeMode(false)
168     , m_offlineWebApplicationCacheEnabled(false)
169     , m_enforceCSSMIMETypeInNoQuirksMode(true)
170     , m_usesEncodingDetector(false)
171     , m_allowScriptsToCloseWindows(false)
172     , m_canvasUsesAcceleratedDrawing(false)
173     , m_acceleratedDrawingEnabled(false)
174     , m_acceleratedFiltersEnabled(false)
175     , m_isCSSCustomFilterEnabled(false)
176     // FIXME: This should really be disabled by default as it makes platforms that don't support the feature download files
177     // they can't use by. Leaving enabled for now to not change existing behavior.
178     , m_downloadableBinaryFontsEnabled(true)
179     , m_xssAuditorEnabled(false)
180     , m_acceleratedCompositingEnabled(true)
181     , m_acceleratedCompositingFor3DTransformsEnabled(true)
182     , m_acceleratedCompositingForVideoEnabled(true)
183     , m_acceleratedCompositingForPluginsEnabled(true)
184     , m_acceleratedCompositingForCanvasEnabled(true)
185     , m_acceleratedCompositingForAnimationEnabled(true)
186     , m_acceleratedCompositingForFixedPositionEnabled(false)
187     , m_acceleratedCompositingForScrollableFramesEnabled(false)
188     , m_showDebugBorders(false)
189     , m_showRepaintCounter(false)
190     , m_experimentalNotificationsEnabled(false)
191     , m_webGLEnabled(false)
192     , m_openGLMultisamplingEnabled(true)
193     , m_privilegedWebGLExtensionsEnabled(false)
194     , m_webAudioEnabled(false)
195     , m_acceleratedCanvas2dEnabled(false)
196     , m_deferredCanvas2dEnabled(false)
197     , m_loadDeferringEnabled(true)
198     , m_tiledBackingStoreEnabled(false)
199     , m_paginateDuringLayoutEnabled(false)
200     , m_dnsPrefetchingEnabled(false)
201 #if ENABLE(FULLSCREEN_API)
202     , m_fullScreenAPIEnabled(false)
203 #endif
204     , m_asynchronousSpellCheckingEnabled(false)
205 #if USE(UNIFIED_TEXT_CHECKING)
206     , m_unifiedTextCheckerEnabled(true)
207 #else
208     , m_unifiedTextCheckerEnabled(false)
209 #endif
210     , m_memoryInfoEnabled(false)
211     , m_interactiveFormValidation(false)
212     , m_usePreHTML5ParserQuirks(false)
213     , m_hyperlinkAuditingEnabled(false)
214     , m_crossOriginCheckInGetMatchedCSSRulesDisabled(false)
215     , m_forceCompositingMode(false)
216     , m_shouldInjectUserScriptsInInitialEmptyDocument(false)
217     , m_fixedElementsLayoutRelativeToFrame(false)
218     , m_allowDisplayOfInsecureContent(true)
219     , m_allowRunningOfInsecureContent(true)
220 #if ENABLE(SMOOTH_SCROLLING)
221     , m_scrollAnimatorEnabled(true)
222 #endif
223 #if ENABLE(WEB_SOCKETS)
224     , m_useHixie76WebSocketProtocol(true)
225 #endif
226     , m_mediaPlaybackRequiresUserGesture(false)
227     , m_mediaPlaybackAllowsInline(true)
228     , m_passwordEchoEnabled(false)
229     , m_suppressIncrementalRendering(false)
230     , m_backspaceKeyNavigationEnabled(true)
231     , m_visualWordMovementEnabled(false)
232 #if ENABLE(VIDEO_TRACK)
233     , m_shouldDisplaySubtitles(false)
234     , m_shouldDisplayCaptions(false)
235     , m_shouldDisplayTextDescriptions(false)
236 #endif
237     , m_perTileDrawingEnabled(false)
238     , m_partialSwapEnabled(false)
239 #if ENABLE(THREADED_SCROLLING)
240     , m_scrollingCoordinatorEnabled(false)
241 #endif
242     , m_notificationsEnabled(true)
243 #if ENABLE(TOUCH_EVENTS)
244     , m_touchEventEmulationEnabled(false)
245 #endif
246     , m_loadsImagesAutomaticallyTimer(this, &Settings::loadsImagesAutomaticallyTimerFired)
247 {
248     // A Frame may not have been created yet, so we initialize the AtomicString 
249     // hash before trying to use it.
250     AtomicString::init();
251 }
252
253 PassOwnPtr<Settings> Settings::create(Page* page)
254 {
255     return adoptPtr(new Settings(page));
256
257
258 const AtomicString& Settings::standardFontFamily(UScriptCode script) const
259 {
260     return getGenericFontFamilyForScript(m_standardFontFamilyMap, script);
261 }
262
263 void Settings::setStandardFontFamily(const AtomicString& family, UScriptCode script)
264 {
265     setGenericFontFamilyMap(m_standardFontFamilyMap, family, script, m_page);
266 }
267
268 const AtomicString& Settings::fixedFontFamily(UScriptCode script) const
269 {
270     return getGenericFontFamilyForScript(m_fixedFontFamilyMap, script);
271 }
272
273 void Settings::setFixedFontFamily(const AtomicString& family, UScriptCode script)
274 {
275     setGenericFontFamilyMap(m_fixedFontFamilyMap, family, script, m_page);
276 }
277
278 const AtomicString& Settings::serifFontFamily(UScriptCode script) const
279 {
280     return getGenericFontFamilyForScript(m_serifFontFamilyMap, script);
281 }
282
283 void Settings::setSerifFontFamily(const AtomicString& family, UScriptCode script)
284 {
285      setGenericFontFamilyMap(m_serifFontFamilyMap, family, script, m_page);
286 }
287
288 const AtomicString& Settings::sansSerifFontFamily(UScriptCode script) const
289 {
290     return getGenericFontFamilyForScript(m_sansSerifFontFamilyMap, script);
291 }
292
293 void Settings::setSansSerifFontFamily(const AtomicString& family, UScriptCode script)
294 {
295     setGenericFontFamilyMap(m_sansSerifFontFamilyMap, family, script, m_page);
296 }
297
298 const AtomicString& Settings::cursiveFontFamily(UScriptCode script) const
299 {
300     return getGenericFontFamilyForScript(m_cursiveFontFamilyMap, script);
301 }
302
303 void Settings::setCursiveFontFamily(const AtomicString& family, UScriptCode script)
304 {
305     setGenericFontFamilyMap(m_cursiveFontFamilyMap, family, script, m_page);
306 }
307
308 const AtomicString& Settings::fantasyFontFamily(UScriptCode script) const
309 {
310     return getGenericFontFamilyForScript(m_fantasyFontFamilyMap, script);
311 }
312
313 void Settings::setFantasyFontFamily(const AtomicString& family, UScriptCode script)
314 {
315     setGenericFontFamilyMap(m_fantasyFontFamilyMap, family, script, m_page);
316 }
317
318 const AtomicString& Settings::pictographFontFamily(UScriptCode script) const
319 {
320     return getGenericFontFamilyForScript(m_pictographFontFamilyMap, script);
321 }
322
323 void Settings::setPictographFontFamily(const AtomicString& family, UScriptCode script)
324 {
325     setGenericFontFamilyMap(m_pictographFontFamilyMap, family, script, m_page);
326 }
327
328 void Settings::setMinimumFontSize(int minimumFontSize)
329 {
330     if (m_minimumFontSize == minimumFontSize)
331         return;
332
333     m_minimumFontSize = minimumFontSize;
334     m_page->setNeedsRecalcStyleInAllFrames();
335 }
336
337 void Settings::setMinimumLogicalFontSize(int minimumLogicalFontSize)
338 {
339     if (m_minimumLogicalFontSize == minimumLogicalFontSize)
340         return;
341
342     m_minimumLogicalFontSize = minimumLogicalFontSize;
343     m_page->setNeedsRecalcStyleInAllFrames();
344 }
345
346 void Settings::setDefaultFontSize(int defaultFontSize)
347 {
348     if (m_defaultFontSize == defaultFontSize)
349         return;
350
351     m_defaultFontSize = defaultFontSize;
352     m_page->setNeedsRecalcStyleInAllFrames();
353 }
354
355 void Settings::setDefaultFixedFontSize(int defaultFontSize)
356 {
357     if (m_defaultFixedFontSize == defaultFontSize)
358         return;
359
360     m_defaultFixedFontSize = defaultFontSize;
361     m_page->setNeedsRecalcStyleInAllFrames();
362 }
363
364 void Settings::setLoadsImagesAutomatically(bool loadsImagesAutomatically)
365 {
366     m_loadsImagesAutomatically = loadsImagesAutomatically;
367     
368     // Changing this setting to true might immediately start new loads for images that had previously had loading disabled.
369     // If this happens while a WebView is being dealloc'ed, and we don't know the WebView is being dealloc'ed, these new loads
370     // can cause crashes downstream when the WebView memory has actually been free'd.
371     // One example where this can happen is in Mac apps that subclass WebView then do work in their overridden dealloc methods.
372     // Starting these loads synchronously is not important.  By putting it on a 0-delay, properly closing the Page cancels them
373     // before they have a chance to really start.
374     // See http://webkit.org/b/60572 for more discussion.
375     m_loadsImagesAutomaticallyTimer.startOneShot(0);
376 }
377
378 void Settings::loadsImagesAutomaticallyTimerFired(Timer<Settings>*)
379 {
380     setLoadsImagesAutomaticallyInAllFrames(m_page);
381 }
382
383 void Settings::setLoadsSiteIconsIgnoringImageLoadingSetting(bool loadsSiteIcons)
384 {
385     m_loadsSiteIconsIgnoringImageLoadingSetting = loadsSiteIcons;
386 }
387
388 void Settings::setScriptEnabled(bool isScriptEnabled)
389 {
390     m_isScriptEnabled = isScriptEnabled;
391 }
392
393 void Settings::setWebSecurityEnabled(bool isWebSecurityEnabled)
394 {
395     m_isWebSecurityEnabled = isWebSecurityEnabled;
396 }
397
398 void Settings::setAllowUniversalAccessFromFileURLs(bool allowUniversalAccessFromFileURLs)
399 {
400     m_allowUniversalAccessFromFileURLs = allowUniversalAccessFromFileURLs;
401 }
402
403 void Settings::setAllowFileAccessFromFileURLs(bool allowFileAccessFromFileURLs)
404 {
405     m_allowFileAccessFromFileURLs = allowFileAccessFromFileURLs;
406 }
407
408 void Settings::setSpatialNavigationEnabled(bool isSpatialNavigationEnabled)
409 {
410     m_isSpatialNavigationEnabled = isSpatialNavigationEnabled;
411 }
412
413 void Settings::setJavaEnabled(bool isJavaEnabled)
414 {
415     m_isJavaEnabled = isJavaEnabled;
416 }
417
418 void Settings::setImagesEnabled(bool areImagesEnabled)
419 {
420     m_areImagesEnabled = areImagesEnabled;
421 }
422
423 void Settings::setMediaEnabled(bool isMediaEnabled)
424 {
425     m_isMediaEnabled = isMediaEnabled;
426 }
427
428 void Settings::setPluginsEnabled(bool arePluginsEnabled)
429 {
430     m_arePluginsEnabled = arePluginsEnabled;
431 }
432
433 void Settings::setLocalStorageEnabled(bool localStorageEnabled)
434 {
435     m_localStorageEnabled = localStorageEnabled;
436 }
437
438 void Settings::setSessionStorageQuota(unsigned sessionStorageQuota)
439 {
440     m_sessionStorageQuota = sessionStorageQuota;
441 }
442
443 void Settings::setPrivateBrowsingEnabled(bool privateBrowsingEnabled)
444 {
445     // FIXME http://webkit.org/b/67870: The private browsing storage session and cookie private
446     // browsing mode (which is used if storage sessions are not available) are global settings, so
447     // it is misleading to have them as per-page settings.
448     // In addition, if they are treated as a per Page settings, the global values can get out of
449     // sync with the per Page value in the following situation:
450     // 1. The global values get set to true when setPrivateBrowsingEnabled(true) is called.
451     // 2. All Pages are closed, so all Settings objects go away.
452     // 3. A new Page is created, and a corresponding new Settings object is created - with
453     //    m_privateBrowsingEnabled starting out as false in the constructor.
454     // 4. The WebPage settings get applied to the new Page and setPrivateBrowsingEnabled(false)
455     //    is called, but an if (m_privateBrowsingEnabled == privateBrowsingEnabled) early return
456     //    prevents the global values from getting changed from true to false.
457 #if USE(CFURLSTORAGESESSIONS)
458     ResourceHandle::setPrivateBrowsingEnabled(privateBrowsingEnabled);
459 #endif
460     setCookieStoragePrivateBrowsingEnabled(privateBrowsingEnabled);
461
462     if (m_privateBrowsingEnabled == privateBrowsingEnabled)
463         return;
464
465     m_privateBrowsingEnabled = privateBrowsingEnabled;
466     m_page->privateBrowsingStateChanged();
467 }
468
469 void Settings::setJavaScriptCanOpenWindowsAutomatically(bool javaScriptCanOpenWindowsAutomatically)
470 {
471     m_javaScriptCanOpenWindowsAutomatically = javaScriptCanOpenWindowsAutomatically;
472 }
473
474 void Settings::setJavaScriptCanAccessClipboard(bool javaScriptCanAccessClipboard)
475 {
476     m_javaScriptCanAccessClipboard = javaScriptCanAccessClipboard;
477 }
478
479 void Settings::setDefaultTextEncodingName(const String& defaultTextEncodingName)
480 {
481     m_defaultTextEncodingName = defaultTextEncodingName;
482 }
483
484 void Settings::setUserStyleSheetLocation(const KURL& userStyleSheetLocation)
485 {
486     if (m_userStyleSheetLocation == userStyleSheetLocation)
487         return;
488
489     m_userStyleSheetLocation = userStyleSheetLocation;
490
491     m_page->userStyleSheetLocationChanged();
492 }
493
494 void Settings::setFixedElementsLayoutRelativeToFrame(bool fixedElementsLayoutRelativeToFrame)
495 {
496     m_fixedElementsLayoutRelativeToFrame = fixedElementsLayoutRelativeToFrame;
497 }
498
499 void Settings::setShouldPrintBackgrounds(bool shouldPrintBackgrounds)
500 {
501     m_shouldPrintBackgrounds = shouldPrintBackgrounds;
502 }
503
504 void Settings::setTextAreasAreResizable(bool textAreasAreResizable)
505 {
506     if (m_textAreasAreResizable == textAreasAreResizable)
507         return;
508
509     m_textAreasAreResizable = textAreasAreResizable;
510     m_page->setNeedsRecalcStyleInAllFrames();
511 }
512
513 void Settings::setEditableLinkBehavior(EditableLinkBehavior editableLinkBehavior)
514 {
515     m_editableLinkBehavior = editableLinkBehavior;
516 }
517
518 void Settings::setTextDirectionSubmenuInclusionBehavior(TextDirectionSubmenuInclusionBehavior behavior)
519 {
520     m_textDirectionSubmenuInclusionBehavior = behavior;
521 }
522
523 #if ENABLE(DASHBOARD_SUPPORT)
524 void Settings::setUsesDashboardBackwardCompatibilityMode(bool usesDashboardBackwardCompatibilityMode)
525 {
526     m_usesDashboardBackwardCompatibilityMode = usesDashboardBackwardCompatibilityMode;
527 }
528 #endif
529
530 // FIXME: This quirk is needed because of Radar 4674537 and 5211271. We need to phase it out once Adobe
531 // can fix the bug from their end.
532 void Settings::setNeedsAdobeFrameReloadingQuirk(bool shouldNotReloadIFramesForUnchangedSRC)
533 {
534     m_needsAdobeFrameReloadingQuirk = shouldNotReloadIFramesForUnchangedSRC;
535 }
536
537 // This is a quirk we are pro-actively applying to old applications. It changes keyboard event dispatching,
538 // making keyIdentifier available on keypress events, making charCode available on keydown/keyup events,
539 // and getting keypress dispatched in more cases.
540 void Settings::setNeedsKeyboardEventDisambiguationQuirks(bool needsQuirks)
541 {
542     m_needsKeyboardEventDisambiguationQuirks = needsQuirks;
543 }
544
545 void Settings::setTreatsAnyTextCSSLinkAsStylesheet(bool treatsAnyTextCSSLinkAsStylesheet)
546 {
547     m_treatsAnyTextCSSLinkAsStylesheet = treatsAnyTextCSSLinkAsStylesheet;
548 }
549
550 void Settings::setNeedsLeopardMailQuirks(bool needsQuirks)
551 {
552     m_needsLeopardMailQuirks = needsQuirks;
553 }
554
555 void Settings::setDOMPasteAllowed(bool DOMPasteAllowed)
556 {
557     m_isDOMPasteAllowed = DOMPasteAllowed;
558 }
559
560 void Settings::setDefaultMinDOMTimerInterval(double interval)
561 {
562     DOMTimer::setDefaultMinTimerInterval(interval);
563 }
564
565 double Settings::defaultMinDOMTimerInterval()
566 {
567     return DOMTimer::defaultMinTimerInterval();
568 }
569
570 void Settings::setMinDOMTimerInterval(double interval)
571 {
572     m_page->setMinimumTimerInterval(interval);
573 }
574
575 double Settings::minDOMTimerInterval()
576 {
577     return m_page->minimumTimerInterval();
578 }
579
580 void Settings::setUsesPageCache(bool usesPageCache)
581 {
582     if (m_usesPageCache == usesPageCache)
583         return;
584         
585     m_usesPageCache = usesPageCache;
586     if (!m_usesPageCache) {
587         int first = -m_page->backForward()->backCount();
588         int last = m_page->backForward()->forwardCount();
589         for (int i = first; i <= last; i++)
590             pageCache()->remove(m_page->backForward()->itemAtIndex(i));
591         pageCache()->releaseAutoreleasedPagesNow();
592     }
593 }
594
595 void Settings::setShrinksStandaloneImagesToFit(bool shrinksStandaloneImagesToFit)
596 {
597     m_shrinksStandaloneImagesToFit = shrinksStandaloneImagesToFit;
598 }
599
600 void Settings::setShowsURLsInToolTips(bool showsURLsInToolTips)
601 {
602     m_showsURLsInToolTips = showsURLsInToolTips;
603 }
604
605 void Settings::setShowsToolTipOverTruncatedText(bool showsToolTipForTruncatedText)
606 {
607     m_showsToolTipOverTruncatedText = showsToolTipForTruncatedText;
608 }
609
610 void Settings::setFTPDirectoryTemplatePath(const String& path)
611 {
612     m_ftpDirectoryTemplatePath = path;
613 }
614
615 void Settings::setForceFTPDirectoryListings(bool force)
616 {
617     m_forceFTPDirectoryListings = force;
618 }
619
620 void Settings::setDeveloperExtrasEnabled(bool developerExtrasEnabled)
621 {
622     m_developerExtrasEnabled = developerExtrasEnabled;
623 }
624
625 void Settings::setAuthorAndUserStylesEnabled(bool authorAndUserStylesEnabled)
626 {
627     if (m_authorAndUserStylesEnabled == authorAndUserStylesEnabled)
628         return;
629
630     m_authorAndUserStylesEnabled = authorAndUserStylesEnabled;
631     m_page->setNeedsRecalcStyleInAllFrames();
632 }
633
634 void Settings::setFontRenderingMode(FontRenderingMode mode)
635 {
636     if (fontRenderingMode() == mode)
637         return;
638     m_fontRenderingMode = mode;
639     m_page->setNeedsRecalcStyleInAllFrames();
640 }
641
642 FontRenderingMode Settings::fontRenderingMode() const
643 {
644     return static_cast<FontRenderingMode>(m_fontRenderingMode);
645 }
646
647 void Settings::setNeedsSiteSpecificQuirks(bool needsQuirks)
648 {
649     m_needsSiteSpecificQuirks = needsQuirks;
650 }
651
652 void Settings::setFrameFlatteningEnabled(bool frameFlatteningEnabled)
653 {
654     m_frameFlatteningEnabled = frameFlatteningEnabled;
655 }
656
657 #if ENABLE(WEB_ARCHIVE)
658 void Settings::setWebArchiveDebugModeEnabled(bool enabled)
659 {
660     m_webArchiveDebugModeEnabled = enabled;
661 }
662 #endif
663
664 void Settings::setLocalFileContentSniffingEnabled(bool enabled)
665 {
666     m_localFileContentSniffingEnabled = enabled;
667 }
668
669 void Settings::setLocalStorageDatabasePath(const String& path)
670 {
671     m_localStorageDatabasePath = path;
672 }
673
674 void Settings::setApplicationChromeMode(bool mode)
675 {
676     m_inApplicationChromeMode = mode;
677 }
678
679 void Settings::setOfflineWebApplicationCacheEnabled(bool enabled)
680 {
681     m_offlineWebApplicationCacheEnabled = enabled;
682 }
683
684 void Settings::setEnforceCSSMIMETypeInNoQuirksMode(bool enforceCSSMIMETypeInNoQuirksMode)
685 {
686     m_enforceCSSMIMETypeInNoQuirksMode = enforceCSSMIMETypeInNoQuirksMode;
687 }
688
689 #if USE(SAFARI_THEME)
690 void Settings::setShouldPaintNativeControls(bool shouldPaintNativeControls)
691 {
692     gShouldPaintNativeControls = shouldPaintNativeControls;
693 }
694 #endif
695
696 void Settings::setUsesEncodingDetector(bool usesEncodingDetector)
697 {
698     m_usesEncodingDetector = usesEncodingDetector;
699 }
700
701 void Settings::setDNSPrefetchingEnabled(bool dnsPrefetchingEnabled)
702 {
703     if (m_dnsPrefetchingEnabled == dnsPrefetchingEnabled)
704         return;
705
706     m_dnsPrefetchingEnabled = dnsPrefetchingEnabled;
707     m_page->dnsPrefetchingStateChanged();
708 }
709
710 void Settings::setAllowScriptsToCloseWindows(bool allowScriptsToCloseWindows)
711 {
712     m_allowScriptsToCloseWindows = allowScriptsToCloseWindows;
713 }
714
715 void Settings::setCaretBrowsingEnabled(bool caretBrowsingEnabled)
716 {
717     m_caretBrowsingEnabled = caretBrowsingEnabled;
718 }
719
720 void Settings::setDownloadableBinaryFontsEnabled(bool downloadableBinaryFontsEnabled)
721 {
722     m_downloadableBinaryFontsEnabled = downloadableBinaryFontsEnabled;
723 }
724
725 void Settings::setXSSAuditorEnabled(bool xssAuditorEnabled)
726 {
727     m_xssAuditorEnabled = xssAuditorEnabled;
728 }
729
730 void Settings::setAcceleratedCompositingEnabled(bool enabled)
731 {
732     if (m_acceleratedCompositingEnabled == enabled)
733         return;
734         
735     m_acceleratedCompositingEnabled = enabled;
736     m_page->setNeedsRecalcStyleInAllFrames();
737 }
738
739 void Settings::setCanvasUsesAcceleratedDrawing(bool enabled)
740 {
741     m_canvasUsesAcceleratedDrawing = enabled;
742 }
743
744 void Settings::setAcceleratedCompositingFor3DTransformsEnabled(bool enabled)
745 {
746     m_acceleratedCompositingFor3DTransformsEnabled = enabled;
747 }
748
749 void Settings::setAcceleratedCompositingForVideoEnabled(bool enabled)
750 {
751     m_acceleratedCompositingForVideoEnabled = enabled;
752 }
753
754 void Settings::setAcceleratedCompositingForPluginsEnabled(bool enabled)
755 {
756     m_acceleratedCompositingForPluginsEnabled = enabled;
757 }
758
759 void Settings::setAcceleratedCompositingForCanvasEnabled(bool enabled)
760 {
761     m_acceleratedCompositingForCanvasEnabled = enabled;
762 }
763
764 void Settings::setAcceleratedCompositingForAnimationEnabled(bool enabled)
765 {
766     m_acceleratedCompositingForAnimationEnabled = enabled;
767 }
768
769 void Settings::setShowDebugBorders(bool enabled)
770 {
771     if (m_showDebugBorders == enabled)
772         return;
773         
774     m_showDebugBorders = enabled;
775     m_page->setNeedsRecalcStyleInAllFrames();
776 }
777
778 void Settings::setShowRepaintCounter(bool enabled)
779 {
780     if (m_showRepaintCounter == enabled)
781         return;
782         
783     m_showRepaintCounter = enabled;
784     m_page->setNeedsRecalcStyleInAllFrames();
785 }
786
787 void Settings::setExperimentalNotificationsEnabled(bool enabled)
788 {
789     m_experimentalNotificationsEnabled = enabled;
790 }
791
792 #if PLATFORM(WIN) || (OS(WINDOWS) && PLATFORM(WX))
793 void Settings::setShouldUseHighResolutionTimers(bool shouldUseHighResolutionTimers)
794 {
795     gShouldUseHighResolutionTimers = shouldUseHighResolutionTimers;
796 }
797 #endif
798
799 void Settings::setWebAudioEnabled(bool enabled)
800 {
801     m_webAudioEnabled = enabled;
802 }
803
804 void Settings::setWebGLEnabled(bool enabled)
805 {
806     m_webGLEnabled = enabled;
807 }
808
809 void Settings::setOpenGLMultisamplingEnabled(bool enabled)
810 {
811     m_openGLMultisamplingEnabled = enabled;
812 }
813
814 void Settings::setPrivilegedWebGLExtensionsEnabled(bool enabled)
815 {
816     m_privilegedWebGLExtensionsEnabled = enabled;
817 }
818
819 void Settings::setAccelerated2dCanvasEnabled(bool enabled)
820 {
821     m_acceleratedCanvas2dEnabled = enabled;
822 }
823
824 void Settings::setDeferred2dCanvasEnabled(bool enabled)
825 {
826     m_deferredCanvas2dEnabled = enabled;
827 }
828
829 void Settings::setMinimumAccelerated2dCanvasSize(int numPixels)
830 {
831     m_minimumAccelerated2dCanvasSize = numPixels;
832 }
833
834 void Settings::setLoadDeferringEnabled(bool enabled)
835 {
836     m_loadDeferringEnabled = enabled;
837 }
838
839 void Settings::setTiledBackingStoreEnabled(bool enabled)
840 {
841     m_tiledBackingStoreEnabled = enabled;
842 #if USE(TILED_BACKING_STORE)
843     if (m_page->mainFrame())
844         m_page->mainFrame()->setTiledBackingStoreEnabled(enabled);
845 #endif
846 }
847
848 void Settings::setMockScrollbarsEnabled(bool flag)
849 {
850     gMockScrollbarsEnabled = flag;
851 }
852
853 bool Settings::mockScrollbarsEnabled()
854 {
855     return gMockScrollbarsEnabled;
856 }
857
858 } // namespace WebCore