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