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