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