e7995d8366c95e6f4dabf0bc1c7fc94548eac653
[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::StandardFont, QLatin1String("Arial"));
176     d->fontFamilies.insert(QWebSettings::FixedFont, QLatin1String("Courier"));
177     d->fontFamilies.insert(QWebSettings::SerifFont, QLatin1String("Times New Roman"));
178     d->fontFamilies.insert(QWebSettings::SansSerifFont, QLatin1String("Arial"));
179
180     d->attributes.insert(QWebSettings::AutoLoadImages, true);
181     d->attributes.insert(QWebSettings::JavascriptEnabled, true);
182     d->attributes.insert(QWebSettings::LinksIncludedInFocusChain, true);
183 }
184
185 /*!
186     \internal
187 */
188 QWebSettings::QWebSettings(WebCore::Settings *settings)
189     : d(new QWebSettingsPrivate(settings))
190 {
191     d->settings = settings;
192     d->apply();
193     allSettings()->append(d);
194 }
195
196 /*!
197     \internal
198 */
199 QWebSettings::~QWebSettings()
200 {
201     if (d->settings)
202         allSettings()->removeAll(d);
203
204     delete d;
205 }
206
207 /*!
208     Sets the font size for \a type to \a size.
209 */
210 void QWebSettings::setFontSize(FontSize type, int size)
211 {
212     d->fontSizes.insert(type, size);
213     d->apply();
214 }
215
216 /*!
217     Returns the default font size for \a type.
218 */
219 int QWebSettings::fontSize(FontSize type) const
220 {
221     int defaultValue = 0;
222     if (d->settings) {
223         QWebSettingsPrivate *global = QWebSettings::defaultSettings()->d;
224         defaultValue = global->fontSizes.value(type);
225     }
226     return d->fontSizes.value(type, defaultValue);
227 }
228
229 /*!
230     Resets the font size for \a type to the size specified in the default settings object.
231
232     This function has not effect on the default QWebSettings instance.
233 */
234 void QWebSettings::resetFontSize(FontSize type)
235 {
236     if (d->settings) {
237         d->fontSizes.remove(type);
238         d->apply();
239     }
240 }
241
242 /*!
243     Specifies the location of a user stylesheet to load with every web page.
244
245     The location can be a URL as well as a path on the local filesystem.
246
247     \sa userStyleSheetLocation
248 */
249 void QWebSettings::setUserStyleSheetLocation(const QUrl &location)
250 {
251     d->userStyleSheetLocation = location;
252     d->apply();
253 }
254
255 /*!
256     Returns the location of the user stylesheet.
257
258     \sa setUserStyleSheetLocation
259 */
260 QUrl QWebSettings::userStyleSheetLocation() const
261 {
262     return d->userStyleSheetLocation;
263 }
264
265 /*!
266     Enables or disables the icon database. The icon database is used to store favicons
267     associated with web sites.
268
269     If \a enabled is true then \a location must be specified and point to an existing directory
270     where the icons are stored.
271 */
272 void QWebSettings::setIconDatabaseEnabled(bool enabled, const QString &location)
273 {
274     WebCore::iconDatabase()->setEnabled(enabled);
275     if (enabled) {
276         QFileInfo info(location);
277         if (info.isDir() && info.isWritable())
278             WebCore::iconDatabase()->open(location);
279     } else {
280         WebCore::iconDatabase()->close();
281     }
282 }
283
284 /*!
285     Returns whether the icon database is enabled or not.
286
287     \sa setIconDatabaseEnabled
288 */
289 bool QWebSettings::iconDatabaseEnabled()
290 {
291     return WebCore::iconDatabase()->isEnabled() && WebCore::iconDatabase()->isOpen();
292 }
293
294 /*!
295     Sets \a graphic to be drawn when QtWebKit needs to drawn an image of the given \a type.
296 */
297 void QWebSettings::setWebGraphic(WebGraphic type, const QPixmap &graphic)
298 {
299     WebGraphicHash *h = graphics();
300     if (graphic.isNull())
301         h->remove(type);
302     else
303         h->insert(type, graphic);
304 }
305
306 /*!
307     Returns a previously set pixmap that is used to draw replacement graphics of the specified \a type.
308 */
309 QPixmap QWebSettings::webGraphic(WebGraphic type)
310 {
311     return graphics()->value(type);
312 }
313
314 /*!
315     Sets the default font family to \a family for the specified \a type of font.
316 */
317 void QWebSettings::setFontFamily(FontType type, const QString &family)
318 {
319     d->fontFamilies.insert(type, family);
320     d->apply();
321 }
322
323 /*!
324     Returns the default font family to \a family for the specified \a type of font.
325 */
326 QString QWebSettings::fontFamily(FontType type) const
327 {
328     QString defaultValue;
329     if (d->settings) {
330         QWebSettingsPrivate *global = QWebSettings::defaultSettings()->d;
331         defaultValue = global->fontFamilies.value(type);
332     }
333     return d->fontFamilies.value(type, defaultValue);
334 }
335
336 /*!
337     Resets the font family for specified \a type of fonts in a web page to the default.
338
339     This function has not effect on the default QWebSettings instance.
340 */
341 void QWebSettings::resetFontFamily(FontType type)
342 {
343     if (d->settings) {
344         d->fontFamilies.remove(type);
345         d->apply();
346     }
347 }
348
349 /*!
350     Enables or disables the specified \a attr feature depending on the value of \a on.
351 */
352 void QWebSettings::setAttribute(WebAttribute attr, bool on)
353 {
354     d->attributes.insert(attr, on);
355     d->apply();
356 }
357
358 /*!
359     Returns true if \a attr is enabled; false otherwise.
360 */
361 bool QWebSettings::testAttribute(WebAttribute attr) const
362 {
363     bool defaultValue = false;
364     if (d->settings) {
365         QWebSettingsPrivate *global = QWebSettings::defaultSettings()->d;
366         defaultValue = global->attributes.value(attr);
367     }
368     return d->attributes.value(attr, defaultValue);
369 }
370
371 /*!
372     Clears the setting of \a attr. The global default for \a attr will be used instead.
373
374     This function has not effect on the default QWebSettings instance.
375 */
376 void QWebSettings::clearAttribute(WebAttribute attr)
377 {
378     if (d->settings) {
379         d->attributes.remove(attr);
380         d->apply();
381     }
382 }
383