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