Lars Knoll <lars@trolltech.com>
[WebKit-https.git] / WebKit / qt / Api / qwebsettings.cpp
1 /*
2     Copyright (C) 2007 Trolltech ASA
3
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Library General Public
6     License as published by the Free Software Foundation; either
7     version 2 of the License, or (at your option) any later version.
8
9     This library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12     Library General Public License for more details.
13
14     You should have received a copy of the GNU Library General Public License
15     along with this library; see the file COPYING.LIB.  If not, write to
16     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17     Boston, MA 02110-1301, USA.
18
19     This class provides all functionality needed for loading images, style sheets and html
20     pages from the web. It has a memory cache for these objects.
21 */
22
23 #include "config.h"
24 #include "qwebsettings.h"
25
26 #include "qwebpage.h"
27 #include "qwebpage_p.h"
28
29 #include "Page.h"
30 #include "Settings.h"
31 #include "KURL.h"
32 #include "PlatformString.h"
33 #include "IconDatabase.h"
34
35 #include <QHash>
36 #include <QSharedData>
37 #include <QUrl>
38 #include <QFileInfo>
39
40 class QWebSettingsPrivate
41 {
42 public:
43     QWebSettingsPrivate(WebCore::Settings *wcSettings = 0)
44         : settings(wcSettings)
45     {
46     }
47
48     QHash<int, QString> fontFamilies;
49     QHash<int, int> fontSizes;
50     QHash<int, bool> attributes;
51     QUrl userStyleSheetLocation;
52
53     void apply();
54     WebCore::Settings *settings;
55 };
56
57 typedef QHash<int, QPixmap> WebGraphicHash;
58 Q_GLOBAL_STATIC(WebGraphicHash, graphics)
59
60 Q_GLOBAL_STATIC(QList<QWebSettingsPrivate *>, allSettings);
61
62 void QWebSettingsPrivate::apply()
63 {
64     if (settings) {
65         QWebSettingsPrivate *global = QWebSettings::defaultSettings()->d;
66
67         QString family = fontFamilies.value(QWebSettings::StandardFont,
68                                             global->fontFamilies.value(QWebSettings::StandardFont));
69         settings->setStandardFontFamily(family);
70
71         family = fontFamilies.value(QWebSettings::FixedFont,
72                                     global->fontFamilies.value(QWebSettings::FixedFont));
73         settings->setFixedFontFamily(family);
74
75         family = fontFamilies.value(QWebSettings::SerifFont,
76                                     global->fontFamilies.value(QWebSettings::SerifFont));
77         settings->setSerifFontFamily(family);
78
79         family = fontFamilies.value(QWebSettings::SansSerifFont,
80                                     global->fontFamilies.value(QWebSettings::SansSerifFont));
81         settings->setSansSerifFontFamily(family);
82
83         family = fontFamilies.value(QWebSettings::CursiveFont,
84                                     global->fontFamilies.value(QWebSettings::CursiveFont));
85         settings->setCursiveFontFamily(family);
86
87         family = fontFamilies.value(QWebSettings::FantasyFont,
88                                     global->fontFamilies.value(QWebSettings::FantasyFont));
89         settings->setFantasyFontFamily(family);
90
91         int size = fontSizes.value(QWebSettings::MinimumFontSize,
92                                    global->fontSizes.value(QWebSettings::MinimumFontSize));
93         settings->setMinimumFontSize(size);
94
95         size = fontSizes.value(QWebSettings::MinimumLogicalFontSize,
96                                    global->fontSizes.value(QWebSettings::MinimumLogicalFontSize));
97         settings->setMinimumLogicalFontSize(size);
98
99         size = fontSizes.value(QWebSettings::DefaultFontSize,
100                                    global->fontSizes.value(QWebSettings::DefaultFontSize));
101         settings->setDefaultFontSize(size);
102
103         size = fontSizes.value(QWebSettings::DefaultFixedFontSize,
104                                    global->fontSizes.value(QWebSettings::DefaultFixedFontSize));
105         settings->setDefaultFixedFontSize(size);
106
107         bool value = attributes.value(QWebSettings::AutoLoadImages,
108                                       global->attributes.value(QWebSettings::AutoLoadImages));
109         settings->setLoadsImagesAutomatically(value);
110
111         value = attributes.value(QWebSettings::JavascriptEnabled,
112                                       global->attributes.value(QWebSettings::JavascriptEnabled));
113         settings->setJavaScriptEnabled(value);
114
115         value = attributes.value(QWebSettings::JavascriptCanOpenWindows,
116                                       global->attributes.value(QWebSettings::JavascriptCanOpenWindows));
117         settings->setJavaScriptCanOpenWindowsAutomatically(value);
118
119         value = attributes.value(QWebSettings::JavaEnabled,
120                                       global->attributes.value(QWebSettings::JavaEnabled));
121         settings->setJavaEnabled(value);
122
123         value = attributes.value(QWebSettings::PluginsEnabled,
124                                       global->attributes.value(QWebSettings::PluginsEnabled));
125         settings->setPluginsEnabled(value);
126
127         value = attributes.value(QWebSettings::PrivateBrowsingEnabled,
128                                       global->attributes.value(QWebSettings::PrivateBrowsingEnabled));
129         settings->setPrivateBrowsingEnabled(value);
130
131         value = attributes.value(QWebSettings::JavascriptCanAccessClipboard,
132                                       global->attributes.value(QWebSettings::JavascriptCanAccessClipboard));
133         settings->setDOMPasteAllowed(value);
134
135         value = attributes.value(QWebSettings::DeveloperExtrasEnabled,
136                                       global->attributes.value(QWebSettings::DeveloperExtrasEnabled));
137         settings->setDeveloperExtrasEnabled(value);
138
139         QUrl location = !userStyleSheetLocation.isEmpty() ? userStyleSheetLocation : global->userStyleSheetLocation;
140         settings->setUserStyleSheetLocation(WebCore::KURL(location));
141     } else {
142         QList<QWebSettingsPrivate *> settings = *::allSettings();
143         for (int i = 0; i < settings.count(); ++i)
144             settings[i]->apply();
145     }
146 }
147
148 /*!
149     Returns the global default settings object.
150
151     Any setting changed on the default object is automatically applied to all
152     QWebPage instances where the particular setting is not overriden already.
153 */
154 QWebSettings *QWebSettings::defaultSettings()
155 {
156     static QWebSettings *global = 0;
157     if (!global)
158         global = new QWebSettings;
159     return global;
160 }
161
162 /*!
163     \internal
164 */
165 QWebSettings::QWebSettings()
166     : d(new QWebSettingsPrivate)
167 {
168     // Initialize our global defaults
169     // changing any of those will likely break the LayoutTests
170     d->fontSizes.insert(QWebSettings::MinimumFontSize, 5);
171     d->fontSizes.insert(QWebSettings::MinimumLogicalFontSize, 5);
172     d->fontSizes.insert(QWebSettings::DefaultFontSize, 14);
173     d->fontSizes.insert(QWebSettings::DefaultFixedFontSize, 14);
174     d->fontFamilies.insert(QWebSettings::StandardFont, QLatin1String("Arial"));
175     d->fontFamilies.insert(QWebSettings::FixedFont, QLatin1String("Courier New"));
176     d->fontFamilies.insert(QWebSettings::SerifFont, QLatin1String("Times New Roman"));
177     d->fontFamilies.insert(QWebSettings::SansSerifFont, QLatin1String("Arial"));
178     d->fontFamilies.insert(QWebSettings::CursiveFont, QLatin1String("Arial"));
179     d->fontFamilies.insert(QWebSettings::FantasyFont, QLatin1String("Arial"));
180
181     d->attributes.insert(QWebSettings::AutoLoadImages, true);
182     d->attributes.insert(QWebSettings::JavascriptEnabled, true);
183     d->attributes.insert(QWebSettings::LinksIncludedInFocusChain, true);
184 }
185
186 /*!
187     \internal
188 */
189 QWebSettings::QWebSettings(WebCore::Settings *settings)
190     : d(new QWebSettingsPrivate(settings))
191 {
192     d->settings = settings;
193     d->apply();
194     allSettings()->append(d);
195 }
196
197 /*!
198     \internal
199 */
200 QWebSettings::~QWebSettings()
201 {
202     if (d->settings)
203         allSettings()->removeAll(d);
204
205     delete d;
206 }
207
208 /*!
209     Sets the font size for \a type to \a size.
210 */
211 void QWebSettings::setFontSize(FontSize type, int size)
212 {
213     d->fontSizes.insert(type, size);
214     d->apply();
215 }
216
217 /*!
218     Returns the default font size for \a type.
219 */
220 int QWebSettings::fontSize(FontSize type) const
221 {
222     int defaultValue = 0;
223     if (d->settings) {
224         QWebSettingsPrivate *global = QWebSettings::defaultSettings()->d;
225         defaultValue = global->fontSizes.value(type);
226     }
227     return d->fontSizes.value(type, defaultValue);
228 }
229
230 /*!
231     Resets the font size for \a type to the size specified in the default settings object.
232
233     This function has not effect on the default QWebSettings instance.
234 */
235 void QWebSettings::resetFontSize(FontSize type)
236 {
237     if (d->settings) {
238         d->fontSizes.remove(type);
239         d->apply();
240     }
241 }
242
243 /*!
244     Specifies the location of a user stylesheet to load with every web page.
245
246     The location can be a URL as well as a path on the local filesystem.
247
248     \sa userStyleSheetLocation
249 */
250 void QWebSettings::setUserStyleSheetLocation(const QUrl &location)
251 {
252     d->userStyleSheetLocation = location;
253     d->apply();
254 }
255
256 /*!
257     Returns the location of the user stylesheet.
258
259     \sa setUserStyleSheetLocation
260 */
261 QUrl QWebSettings::userStyleSheetLocation() const
262 {
263     return d->userStyleSheetLocation;
264 }
265
266 /*!
267     Enables or disables the icon database. The icon database is used to store favicons
268     associated with web sites.
269
270     If \a enabled is true then \a location must be specified and point to an existing directory
271     where the icons are stored.
272 */
273 void QWebSettings::setIconDatabaseEnabled(bool enabled, const QString &location)
274 {
275     WebCore::iconDatabase()->setEnabled(enabled);
276     if (enabled) {
277         QFileInfo info(location);
278         if (info.isDir() && info.isWritable())
279             WebCore::iconDatabase()->open(location);
280     } else {
281         WebCore::iconDatabase()->close();
282     }
283 }
284
285 /*!
286     Returns whether the icon database is enabled or not.
287
288     \sa setIconDatabaseEnabled
289 */
290 bool QWebSettings::iconDatabaseEnabled()
291 {
292     return WebCore::iconDatabase()->isEnabled() && WebCore::iconDatabase()->isOpen();
293 }
294
295 /*!
296     Sets \a graphic to be drawn when QtWebKit needs to drawn an image of the given \a type.
297 */
298 void QWebSettings::setWebGraphic(WebGraphic type, const QPixmap &graphic)
299 {
300     WebGraphicHash *h = graphics();
301     if (graphic.isNull())
302         h->remove(type);
303     else
304         h->insert(type, graphic);
305 }
306
307 /*!
308     Returns a previously set pixmap that is used to draw replacement graphics of the specified \a type.
309 */
310 QPixmap QWebSettings::webGraphic(WebGraphic type)
311 {
312     return graphics()->value(type);
313 }
314
315 /*!
316     Sets the default font family to \a family for the specified \a type of font.
317 */
318 void QWebSettings::setFontFamily(FontType type, const QString &family)
319 {
320     d->fontFamilies.insert(type, family);
321     d->apply();
322 }
323
324 /*!
325     Returns the default font family to \a family for the specified \a type of font.
326 */
327 QString QWebSettings::fontFamily(FontType type) const
328 {
329     QString defaultValue;
330     if (d->settings) {
331         QWebSettingsPrivate *global = QWebSettings::defaultSettings()->d;
332         defaultValue = global->fontFamilies.value(type);
333     }
334     return d->fontFamilies.value(type, defaultValue);
335 }
336
337 /*!
338     Resets the font family for specified \a type of fonts in a web page to the default.
339
340     This function has not effect on the default QWebSettings instance.
341 */
342 void QWebSettings::resetFontFamily(FontType type)
343 {
344     if (d->settings) {
345         d->fontFamilies.remove(type);
346         d->apply();
347     }
348 }
349
350 /*!
351     Enables or disables the specified \a attr feature depending on the value of \a on.
352 */
353 void QWebSettings::setAttribute(WebAttribute attr, bool on)
354 {
355     d->attributes.insert(attr, on);
356     d->apply();
357 }
358
359 /*!
360     Returns true if \a attr is enabled; false otherwise.
361 */
362 bool QWebSettings::testAttribute(WebAttribute attr) const
363 {
364     bool defaultValue = false;
365     if (d->settings) {
366         QWebSettingsPrivate *global = QWebSettings::defaultSettings()->d;
367         defaultValue = global->attributes.value(attr);
368     }
369     return d->attributes.value(attr, defaultValue);
370 }
371
372 /*!
373     Clears the setting of \a attr. The global default for \a attr will be used instead.
374
375     This function has not effect on the default QWebSettings instance.
376 */
377 void QWebSettings::clearAttribute(WebAttribute attr)
378 {
379     if (d->settings) {
380         d->attributes.remove(attr);
381         d->apply();
382     }
383 }
384