2009-03-26 Jungshik Shin <jshin@chromium.org>
[WebKit-https.git] / WebCore / page / Settings.cpp
1 /*
2  * Copyright (C) 2006, 2007, 2008 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 "Frame.h"
30 #include "FrameTree.h"
31 #include "HistoryItem.h"
32 #include "Page.h"
33 #include "PageCache.h"
34 #include <limits>
35
36 namespace WebCore {
37
38 static void setNeedsReapplyStylesInAllFrames(Page* page)
39 {
40     for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext())
41         frame->setNeedsReapplyStyles();
42 }
43
44 #if USE(SAFARI_THEME)
45 bool Settings::gShouldPaintNativeControls = false;
46 #endif
47
48 Settings::Settings(Page* page)
49     : m_page(page)
50     , m_editableLinkBehavior(EditableLinkDefaultBehavior)
51     , m_textDirectionSubmenuInclusionBehavior(TextDirectionSubmenuAutomaticallyIncluded)
52     , m_minimumFontSize(0)
53     , m_minimumLogicalFontSize(0)
54     , m_defaultFontSize(0)
55     , m_defaultFixedFontSize(0)
56     , m_isJavaEnabled(false)
57     , m_loadsImagesAutomatically(false)
58     , m_privateBrowsingEnabled(false)
59     , m_arePluginsEnabled(false)
60     , m_databasesEnabled(false)
61     , m_localStorageEnabled(false)
62     , m_isJavaScriptEnabled(false)
63     , m_isWebSecurityEnabled(true)
64     , m_allowUniversalAccessFromFileURLs(true)
65     , m_javaScriptCanOpenWindowsAutomatically(false)
66     , m_shouldPrintBackgrounds(false)
67     , m_textAreasAreResizable(false)
68 #if ENABLE(DASHBOARD_SUPPORT)
69     , m_usesDashboardBackwardCompatibilityMode(false)
70 #endif
71     , m_needsAdobeFrameReloadingQuirk(false)
72     , m_needsKeyboardEventDisambiguationQuirks(false)
73     , m_needsLeopardMailQuirks(false)
74     , m_needsTigerMailQuirks(false)
75     , m_isDOMPasteAllowed(false)
76     , m_shrinksStandaloneImagesToFit(true)
77     , m_usesPageCache(false)
78     , m_showsURLsInToolTips(false)
79     , m_forceFTPDirectoryListings(false)
80     , m_developerExtrasEnabled(false)
81     , m_authorAndUserStylesEnabled(true)
82     , m_needsSiteSpecificQuirks(false)
83     , m_fontRenderingMode(0)
84     , m_webArchiveDebugModeEnabled(false)
85     , m_inApplicationChromeMode(false)
86     , m_offlineWebApplicationCacheEnabled(false)
87     , m_shouldPaintCustomScrollbars(false)
88     , m_zoomsTextOnly(false)
89     , m_enforceCSSMIMETypeInStrictMode(true)
90     , m_usesEncodingDetector(false)
91     , m_maximumDecodedImageSize(std::numeric_limits<size_t>::max())
92     , m_allowScriptsToCloseWindows(false)
93 {
94     // A Frame may not have been created yet, so we initialize the AtomicString 
95     // hash before trying to use it.
96     AtomicString::init();
97 }
98
99 void Settings::setStandardFontFamily(const AtomicString& standardFontFamily)
100 {
101     if (standardFontFamily == m_standardFontFamily)
102         return;
103
104     m_standardFontFamily = standardFontFamily;
105     setNeedsReapplyStylesInAllFrames(m_page);
106 }
107
108 void Settings::setFixedFontFamily(const AtomicString& fixedFontFamily)
109 {
110     if (m_fixedFontFamily == fixedFontFamily)
111         return;
112         
113     m_fixedFontFamily = fixedFontFamily;
114     setNeedsReapplyStylesInAllFrames(m_page);
115 }
116
117 void Settings::setSerifFontFamily(const AtomicString& serifFontFamily)
118 {
119     if (m_serifFontFamily == serifFontFamily)
120         return;
121         
122     m_serifFontFamily = serifFontFamily;
123     setNeedsReapplyStylesInAllFrames(m_page);
124 }
125
126 void Settings::setSansSerifFontFamily(const AtomicString& sansSerifFontFamily)
127 {
128     if (m_sansSerifFontFamily == sansSerifFontFamily)
129         return;
130         
131     m_sansSerifFontFamily = sansSerifFontFamily; 
132     setNeedsReapplyStylesInAllFrames(m_page);
133 }
134
135 void Settings::setCursiveFontFamily(const AtomicString& cursiveFontFamily)
136 {
137     if (m_cursiveFontFamily == cursiveFontFamily)
138         return;
139         
140     m_cursiveFontFamily = cursiveFontFamily;
141     setNeedsReapplyStylesInAllFrames(m_page);
142 }
143
144 void Settings::setFantasyFontFamily(const AtomicString& fantasyFontFamily)
145 {
146     if (m_fantasyFontFamily == fantasyFontFamily)
147         return;
148         
149     m_fantasyFontFamily = fantasyFontFamily;
150     setNeedsReapplyStylesInAllFrames(m_page);
151 }
152
153 void Settings::setMinimumFontSize(int minimumFontSize)
154 {
155     if (m_minimumFontSize == minimumFontSize)
156         return;
157
158     m_minimumFontSize = minimumFontSize;
159     setNeedsReapplyStylesInAllFrames(m_page);
160 }
161
162 void Settings::setMinimumLogicalFontSize(int minimumLogicalFontSize)
163 {
164     if (m_minimumLogicalFontSize == minimumLogicalFontSize)
165         return;
166
167     m_minimumLogicalFontSize = minimumLogicalFontSize;
168     setNeedsReapplyStylesInAllFrames(m_page);
169 }
170
171 void Settings::setDefaultFontSize(int defaultFontSize)
172 {
173     if (m_defaultFontSize == defaultFontSize)
174         return;
175
176     m_defaultFontSize = defaultFontSize;
177     setNeedsReapplyStylesInAllFrames(m_page);
178 }
179
180 void Settings::setDefaultFixedFontSize(int defaultFontSize)
181 {
182     if (m_defaultFixedFontSize == defaultFontSize)
183         return;
184
185     m_defaultFixedFontSize = defaultFontSize;
186     setNeedsReapplyStylesInAllFrames(m_page);
187 }
188
189 void Settings::setLoadsImagesAutomatically(bool loadsImagesAutomatically)
190 {
191     m_loadsImagesAutomatically = loadsImagesAutomatically;
192 }
193
194 void Settings::setJavaScriptEnabled(bool isJavaScriptEnabled)
195 {
196     m_isJavaScriptEnabled = isJavaScriptEnabled;
197 }
198
199 void Settings::setWebSecurityEnabled(bool isWebSecurityEnabled)
200 {
201     m_isWebSecurityEnabled = isWebSecurityEnabled;
202 }
203
204 void Settings::setAllowUniversalAccessFromFileURLs(bool allowUniversalAccessFromFileURLs)
205 {
206     m_allowUniversalAccessFromFileURLs = allowUniversalAccessFromFileURLs;
207 }
208
209 void Settings::setJavaEnabled(bool isJavaEnabled)
210 {
211     m_isJavaEnabled = isJavaEnabled;
212 }
213
214 void Settings::setPluginsEnabled(bool arePluginsEnabled)
215 {
216     m_arePluginsEnabled = arePluginsEnabled;
217 }
218
219 void Settings::setDatabasesEnabled(bool databasesEnabled)
220 {
221     m_databasesEnabled = databasesEnabled;
222 }
223
224 void Settings::setLocalStorageEnabled(bool localStorageEnabled)
225 {
226     m_localStorageEnabled = localStorageEnabled;
227 }
228
229 void Settings::setPrivateBrowsingEnabled(bool privateBrowsingEnabled)
230 {
231     m_privateBrowsingEnabled = privateBrowsingEnabled;
232 }
233
234 void Settings::setJavaScriptCanOpenWindowsAutomatically(bool javaScriptCanOpenWindowsAutomatically)
235 {
236     m_javaScriptCanOpenWindowsAutomatically = javaScriptCanOpenWindowsAutomatically;
237 }
238
239 void Settings::setDefaultTextEncodingName(const String& defaultTextEncodingName)
240 {
241     m_defaultTextEncodingName = defaultTextEncodingName;
242 }
243
244 void Settings::setUserStyleSheetLocation(const KURL& userStyleSheetLocation)
245 {
246     if (m_userStyleSheetLocation == userStyleSheetLocation)
247         return;
248
249     m_userStyleSheetLocation = userStyleSheetLocation;
250
251     m_page->userStyleSheetLocationChanged();
252     setNeedsReapplyStylesInAllFrames(m_page);
253 }
254
255 void Settings::setShouldPrintBackgrounds(bool shouldPrintBackgrounds)
256 {
257     m_shouldPrintBackgrounds = shouldPrintBackgrounds;
258 }
259
260 void Settings::setTextAreasAreResizable(bool textAreasAreResizable)
261 {
262     if (m_textAreasAreResizable == textAreasAreResizable)
263         return;
264
265     m_textAreasAreResizable = textAreasAreResizable;
266     setNeedsReapplyStylesInAllFrames(m_page);
267 }
268
269 void Settings::setEditableLinkBehavior(EditableLinkBehavior editableLinkBehavior)
270 {
271     m_editableLinkBehavior = editableLinkBehavior;
272 }
273
274 void Settings::setTextDirectionSubmenuInclusionBehavior(TextDirectionSubmenuInclusionBehavior behavior)
275 {
276     m_textDirectionSubmenuInclusionBehavior = behavior;
277 }
278
279 #if ENABLE(DASHBOARD_SUPPORT)
280 void Settings::setUsesDashboardBackwardCompatibilityMode(bool usesDashboardBackwardCompatibilityMode)
281 {
282     m_usesDashboardBackwardCompatibilityMode = usesDashboardBackwardCompatibilityMode;
283 }
284 #endif
285
286 // FIXME: This quirk is needed because of Radar 4674537 and 5211271. We need to phase it out once Adobe
287 // can fix the bug from their end.
288 void Settings::setNeedsAdobeFrameReloadingQuirk(bool shouldNotReloadIFramesForUnchangedSRC)
289 {
290     m_needsAdobeFrameReloadingQuirk = shouldNotReloadIFramesForUnchangedSRC;
291 }
292
293 // This is a quirk we are pro-actively applying to old applications. It changes keyboard event dispatching,
294 // making keyIdentifier available on keypress events, making charCode available on keydown/keyup events,
295 // and getting keypress dispatched in more cases.
296 void Settings::setNeedsKeyboardEventDisambiguationQuirks(bool needsQuirks)
297 {
298     m_needsKeyboardEventDisambiguationQuirks = needsQuirks;
299 }
300
301 void Settings::setNeedsLeopardMailQuirks(bool needsQuirks)
302 {
303     m_needsLeopardMailQuirks = needsQuirks;
304 }
305
306 void Settings::setNeedsTigerMailQuirks(bool needsQuirks)
307 {
308     m_needsTigerMailQuirks = needsQuirks;
309 }
310     
311 void Settings::setDOMPasteAllowed(bool DOMPasteAllowed)
312 {
313     m_isDOMPasteAllowed = DOMPasteAllowed;
314 }
315
316 void Settings::setUsesPageCache(bool usesPageCache)
317 {
318     if (m_usesPageCache == usesPageCache)
319         return;
320         
321     m_usesPageCache = usesPageCache;
322     if (!m_usesPageCache) {
323         HistoryItemVector& historyItems = m_page->backForwardList()->entries();
324         for (unsigned i = 0; i < historyItems.size(); i++)
325             pageCache()->remove(historyItems[i].get());
326         pageCache()->releaseAutoreleasedPagesNow();
327     }
328 }
329
330 void Settings::setShrinksStandaloneImagesToFit(bool shrinksStandaloneImagesToFit)
331 {
332     m_shrinksStandaloneImagesToFit = shrinksStandaloneImagesToFit;
333 }
334
335 void Settings::setShowsURLsInToolTips(bool showsURLsInToolTips)
336 {
337     m_showsURLsInToolTips = showsURLsInToolTips;
338 }
339
340 void Settings::setFTPDirectoryTemplatePath(const String& path)
341 {
342     m_ftpDirectoryTemplatePath = path;
343 }
344
345 void Settings::setForceFTPDirectoryListings(bool force)
346 {
347     m_forceFTPDirectoryListings = force;
348 }
349
350 void Settings::setDeveloperExtrasEnabled(bool developerExtrasEnabled)
351 {
352     m_developerExtrasEnabled = developerExtrasEnabled;
353 }
354
355 void Settings::setAuthorAndUserStylesEnabled(bool authorAndUserStylesEnabled)
356 {
357     if (m_authorAndUserStylesEnabled == authorAndUserStylesEnabled)
358         return;
359
360     m_authorAndUserStylesEnabled = authorAndUserStylesEnabled;
361     setNeedsReapplyStylesInAllFrames(m_page);
362 }
363
364 void Settings::setFontRenderingMode(FontRenderingMode mode)
365 {
366     if (fontRenderingMode() == mode)
367         return;
368     m_fontRenderingMode = mode;
369     setNeedsReapplyStylesInAllFrames(m_page);
370 }
371
372 FontRenderingMode Settings::fontRenderingMode() const
373 {
374     return static_cast<FontRenderingMode>(m_fontRenderingMode);
375 }
376
377 void Settings::setNeedsSiteSpecificQuirks(bool needsQuirks)
378 {
379     m_needsSiteSpecificQuirks = needsQuirks;
380 }
381
382 void Settings::setWebArchiveDebugModeEnabled(bool enabled)
383 {
384     m_webArchiveDebugModeEnabled = enabled;
385 }
386
387 void Settings::setLocalStorageDatabasePath(const String& path)
388 {
389     m_localStorageDatabasePath = path;
390 }
391
392 void Settings::setApplicationChromeMode(bool mode)
393 {
394     m_inApplicationChromeMode = mode;
395 }
396
397 void Settings::setOfflineWebApplicationCacheEnabled(bool enabled)
398 {
399     m_offlineWebApplicationCacheEnabled = enabled;
400 }
401
402 void Settings::setShouldPaintCustomScrollbars(bool shouldPaintCustomScrollbars)
403 {
404     m_shouldPaintCustomScrollbars = shouldPaintCustomScrollbars;
405 }
406
407 void Settings::setZoomsTextOnly(bool zoomsTextOnly)
408 {
409     if (zoomsTextOnly == m_zoomsTextOnly)
410         return;
411     
412     m_zoomsTextOnly = zoomsTextOnly;
413     setNeedsReapplyStylesInAllFrames(m_page);
414 }
415
416 void Settings::setEnforceCSSMIMETypeInStrictMode(bool enforceCSSMIMETypeInStrictMode)
417 {
418     m_enforceCSSMIMETypeInStrictMode = enforceCSSMIMETypeInStrictMode;
419 }
420
421 #if USE(SAFARI_THEME)
422 void Settings::setShouldPaintNativeControls(bool shouldPaintNativeControls)
423 {
424     gShouldPaintNativeControls = shouldPaintNativeControls;
425 }
426 #endif
427
428 void Settings::setUsesEncodingDetector(bool usesEncodingDetector)
429 {
430     m_usesEncodingDetector = usesEncodingDetector;
431 }
432
433 void Settings::setAllowScriptsToCloseWindows(bool allowScriptsToCloseWindows)
434 {
435     m_allowScriptsToCloseWindows = allowScriptsToCloseWindows;
436 }
437
438 } // namespace WebCore