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