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