• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2     Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
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 
20 #include "config.h"
21 #include "qwebsettings.h"
22 
23 #include "qwebpage.h"
24 #include "qwebpage_p.h"
25 #include "qwebplugindatabase_p.h"
26 
27 #include "AbstractDatabase.h"
28 #include "MemoryCache.h"
29 #include "CrossOriginPreflightResultCache.h"
30 #include "FontCache.h"
31 #if ENABLE(ICONDATABASE)
32 #include "IconDatabaseClientQt.h"
33 #endif
34 #include "Page.h"
35 #include "PageCache.h"
36 #include "Settings.h"
37 #include "KURL.h"
38 #include "PlatformString.h"
39 #include "IconDatabase.h"
40 #include "PluginDatabase.h"
41 #include "Image.h"
42 #include "IntSize.h"
43 #include "ApplicationCacheStorage.h"
44 #include "DatabaseTracker.h"
45 #include "FileSystem.h"
46 
47 #include <QApplication>
48 #include <QDesktopServices>
49 #include <QDir>
50 #include <QHash>
51 #include <QSharedData>
52 #include <QUrl>
53 #include <QFileInfo>
54 #include <QStyle>
55 
56 #include "NetworkStateNotifier.h"
57 
qt_networkAccessAllowed(bool isAllowed)58 void QWEBKIT_EXPORT qt_networkAccessAllowed(bool isAllowed)
59 {
60 #if ENABLE(QT_BEARER)
61     WebCore::networkStateNotifier().setNetworkAccessAllowed(isAllowed);
62 #endif
63 }
64 
65 class QWebSettingsPrivate {
66 public:
QWebSettingsPrivate(WebCore::Settings * wcSettings=0)67     QWebSettingsPrivate(WebCore::Settings* wcSettings = 0)
68         : settings(wcSettings)
69     {
70     }
71 
72     QHash<int, QString> fontFamilies;
73     QHash<int, int> fontSizes;
74     QHash<int, bool> attributes;
75     QUrl userStyleSheetLocation;
76     QString defaultTextEncoding;
77     QString localStoragePath;
78     QString offlineWebApplicationCachePath;
79     qint64 offlineStorageDefaultQuota;
80 
81     void apply();
82     WebCore::Settings* settings;
83 };
84 
85 typedef QHash<int, QPixmap> WebGraphicHash;
Q_GLOBAL_STATIC(WebGraphicHash,_graphics)86 Q_GLOBAL_STATIC(WebGraphicHash, _graphics)
87 
88 static void earlyClearGraphics()
89 {
90     _graphics()->clear();
91 }
92 
graphics()93 static WebGraphicHash* graphics()
94 {
95     WebGraphicHash* hash = _graphics();
96 
97     if (hash->isEmpty()) {
98 
99         // prevent ~QPixmap running after ~QApplication (leaks native pixmaps)
100         qAddPostRoutine(earlyClearGraphics);
101 
102         hash->insert(QWebSettings::MissingImageGraphic, QPixmap(QLatin1String(":webkit/resources/missingImage.png")));
103         hash->insert(QWebSettings::MissingPluginGraphic, QPixmap(QLatin1String(":webkit/resources/nullPlugin.png")));
104         hash->insert(QWebSettings::DefaultFrameIconGraphic, QPixmap(QLatin1String(":webkit/resources/urlIcon.png")));
105         hash->insert(QWebSettings::TextAreaSizeGripCornerGraphic, QPixmap(QLatin1String(":webkit/resources/textAreaResizeCorner.png")));
106         hash->insert(QWebSettings::DeleteButtonGraphic, QPixmap(QLatin1String(":webkit/resources/deleteButton.png")));
107         hash->insert(QWebSettings::InputSpeechButtonGraphic, QPixmap(QLatin1String(":webkit/resources/inputSpeech.png")));
108         hash->insert(QWebSettings::SearchCancelButtonGraphic, QApplication::style()->standardPixmap(QStyle::SP_DialogCloseButton));
109         hash->insert(QWebSettings::SearchCancelButtonPressedGraphic, QApplication::style()->standardPixmap(QStyle::SP_DialogCloseButton));
110     }
111 
112     return hash;
113 }
114 
115 Q_GLOBAL_STATIC(QList<QWebSettingsPrivate*>, allSettings);
116 
apply()117 void QWebSettingsPrivate::apply()
118 {
119     if (settings) {
120         settings->setTextAreasAreResizable(true);
121 
122         QWebSettingsPrivate* global = QWebSettings::globalSettings()->d;
123 
124         QString family = fontFamilies.value(QWebSettings::StandardFont,
125                                             global->fontFamilies.value(QWebSettings::StandardFont));
126         settings->setStandardFontFamily(family);
127 
128         family = fontFamilies.value(QWebSettings::FixedFont,
129                                     global->fontFamilies.value(QWebSettings::FixedFont));
130         settings->setFixedFontFamily(family);
131 
132         family = fontFamilies.value(QWebSettings::SerifFont,
133                                     global->fontFamilies.value(QWebSettings::SerifFont));
134         settings->setSerifFontFamily(family);
135 
136         family = fontFamilies.value(QWebSettings::SansSerifFont,
137                                     global->fontFamilies.value(QWebSettings::SansSerifFont));
138         settings->setSansSerifFontFamily(family);
139 
140         family = fontFamilies.value(QWebSettings::CursiveFont,
141                                     global->fontFamilies.value(QWebSettings::CursiveFont));
142         settings->setCursiveFontFamily(family);
143 
144         family = fontFamilies.value(QWebSettings::FantasyFont,
145                                     global->fontFamilies.value(QWebSettings::FantasyFont));
146         settings->setFantasyFontFamily(family);
147 
148         int size = fontSizes.value(QWebSettings::MinimumFontSize,
149                                    global->fontSizes.value(QWebSettings::MinimumFontSize));
150         settings->setMinimumFontSize(size);
151 
152         size = fontSizes.value(QWebSettings::MinimumLogicalFontSize,
153                                    global->fontSizes.value(QWebSettings::MinimumLogicalFontSize));
154         settings->setMinimumLogicalFontSize(size);
155 
156         size = fontSizes.value(QWebSettings::DefaultFontSize,
157                                    global->fontSizes.value(QWebSettings::DefaultFontSize));
158         settings->setDefaultFontSize(size);
159 
160         size = fontSizes.value(QWebSettings::DefaultFixedFontSize,
161                                    global->fontSizes.value(QWebSettings::DefaultFixedFontSize));
162         settings->setDefaultFixedFontSize(size);
163 
164         bool value = attributes.value(QWebSettings::AutoLoadImages,
165                                       global->attributes.value(QWebSettings::AutoLoadImages));
166         settings->setLoadsImagesAutomatically(value);
167 
168         value = attributes.value(QWebSettings::JavascriptEnabled,
169                                       global->attributes.value(QWebSettings::JavascriptEnabled));
170         settings->setJavaScriptEnabled(value);
171 #if USE(ACCELERATED_COMPOSITING)
172         value = attributes.value(QWebSettings::AcceleratedCompositingEnabled,
173                                       global->attributes.value(QWebSettings::AcceleratedCompositingEnabled));
174 
175         settings->setAcceleratedCompositingEnabled(value);
176 #endif
177 #if ENABLE(WEBGL)
178         value = attributes.value(QWebSettings::WebGLEnabled,
179                                  global->attributes.value(QWebSettings::WebGLEnabled));
180 
181         settings->setWebGLEnabled(value);
182 #endif
183 
184         value = attributes.value(QWebSettings::HyperlinkAuditingEnabled,
185                                  global->attributes.value(QWebSettings::HyperlinkAuditingEnabled));
186 
187         settings->setHyperlinkAuditingEnabled(value);
188 
189         value = attributes.value(QWebSettings::JavascriptCanOpenWindows,
190                                       global->attributes.value(QWebSettings::JavascriptCanOpenWindows));
191         settings->setJavaScriptCanOpenWindowsAutomatically(value);
192 
193         value = attributes.value(QWebSettings::JavascriptCanCloseWindows,
194                                       global->attributes.value(QWebSettings::JavascriptCanCloseWindows));
195         settings->setAllowScriptsToCloseWindows(value);
196 
197         value = attributes.value(QWebSettings::JavaEnabled,
198                                       global->attributes.value(QWebSettings::JavaEnabled));
199         settings->setJavaEnabled(value);
200 
201         value = attributes.value(QWebSettings::PluginsEnabled,
202                                       global->attributes.value(QWebSettings::PluginsEnabled));
203         settings->setPluginsEnabled(value);
204 
205         value = attributes.value(QWebSettings::PrivateBrowsingEnabled,
206                                       global->attributes.value(QWebSettings::PrivateBrowsingEnabled));
207         settings->setPrivateBrowsingEnabled(value);
208 
209         value = attributes.value(QWebSettings::SpatialNavigationEnabled,
210                                       global->attributes.value(QWebSettings::SpatialNavigationEnabled));
211         settings->setSpatialNavigationEnabled(value);
212 
213         value = attributes.value(QWebSettings::JavascriptCanAccessClipboard,
214                                       global->attributes.value(QWebSettings::JavascriptCanAccessClipboard));
215         settings->setDOMPasteAllowed(value);
216         settings->setJavaScriptCanAccessClipboard(value);
217 
218         value = attributes.value(QWebSettings::DeveloperExtrasEnabled,
219                                       global->attributes.value(QWebSettings::DeveloperExtrasEnabled));
220         settings->setDeveloperExtrasEnabled(value);
221 
222         value = attributes.value(QWebSettings::FrameFlatteningEnabled,
223                                       global->attributes.value(QWebSettings::FrameFlatteningEnabled));
224         settings->setFrameFlatteningEnabled(value);
225 
226         QUrl location = !userStyleSheetLocation.isEmpty() ? userStyleSheetLocation : global->userStyleSheetLocation;
227         settings->setUserStyleSheetLocation(WebCore::KURL(location));
228 
229         QString encoding = !defaultTextEncoding.isEmpty() ? defaultTextEncoding: global->defaultTextEncoding;
230         settings->setDefaultTextEncodingName(encoding);
231 
232         QString storagePath = !localStoragePath.isEmpty() ? localStoragePath : global->localStoragePath;
233         settings->setLocalStorageDatabasePath(storagePath);
234 
235         value = attributes.value(QWebSettings::PrintElementBackgrounds,
236                                       global->attributes.value(QWebSettings::PrintElementBackgrounds));
237         settings->setShouldPrintBackgrounds(value);
238 
239 #if ENABLE(DATABASE)
240         value = attributes.value(QWebSettings::OfflineStorageDatabaseEnabled,
241                                       global->attributes.value(QWebSettings::OfflineStorageDatabaseEnabled));
242         WebCore::AbstractDatabase::setIsAvailable(value);
243 #endif
244 
245         value = attributes.value(QWebSettings::OfflineWebApplicationCacheEnabled,
246                                       global->attributes.value(QWebSettings::OfflineWebApplicationCacheEnabled));
247         settings->setOfflineWebApplicationCacheEnabled(value);
248 
249         value = attributes.value(QWebSettings::LocalStorageEnabled,
250                                       global->attributes.value(QWebSettings::LocalStorageEnabled));
251         settings->setLocalStorageEnabled(value);
252 
253         value = attributes.value(QWebSettings::LocalContentCanAccessRemoteUrls,
254                                       global->attributes.value(QWebSettings::LocalContentCanAccessRemoteUrls));
255         settings->setAllowUniversalAccessFromFileURLs(value);
256 
257         value = attributes.value(QWebSettings::LocalContentCanAccessFileUrls,
258                                       global->attributes.value(QWebSettings::LocalContentCanAccessFileUrls));
259         settings->setAllowFileAccessFromFileURLs(value);
260 
261         value = attributes.value(QWebSettings::XSSAuditingEnabled,
262                                       global->attributes.value(QWebSettings::XSSAuditingEnabled));
263         settings->setXSSAuditorEnabled(value);
264 
265 #if ENABLE(TILED_BACKING_STORE)
266         value = attributes.value(QWebSettings::TiledBackingStoreEnabled,
267                                       global->attributes.value(QWebSettings::TiledBackingStoreEnabled));
268         settings->setTiledBackingStoreEnabled(value);
269 #endif
270 
271         value = attributes.value(QWebSettings::SiteSpecificQuirksEnabled,
272                                       global->attributes.value(QWebSettings::SiteSpecificQuirksEnabled));
273         settings->setNeedsSiteSpecificQuirks(value);
274 
275         settings->setUsesPageCache(WebCore::pageCache()->capacity());
276     } else {
277         QList<QWebSettingsPrivate*> settings = *::allSettings();
278         for (int i = 0; i < settings.count(); ++i)
279             settings[i]->apply();
280     }
281 }
282 
283 /*!
284     Returns the global settings object.
285 
286     Any setting changed on the default object is automatically applied to all
287     QWebPage instances where the particular setting is not overriden already.
288 */
globalSettings()289 QWebSettings* QWebSettings::globalSettings()
290 {
291     static QWebSettings* global = 0;
292     if (!global)
293         global = new QWebSettings;
294     return global;
295 }
296 
297 /*!
298     \class QWebSettings
299     \since 4.4
300     \brief The QWebSettings class provides an object to store the settings used
301     by QWebPage and QWebFrame.
302 
303     \inmodule QtWebKit
304 
305     Each QWebPage object has its own QWebSettings object, which configures the
306     settings for that page. If a setting is not configured, then it is looked
307     up in the global settings object, which can be accessed using
308     globalSettings().
309 
310     QWebSettings allows configuration of browser properties, such as font sizes and
311     families, the location of a custom style sheet, and generic attributes like
312     JavaScript and plugins. Individual attributes are set using the setAttribute()
313     function. The \l{QWebSettings::WebAttribute}{WebAttribute} enum further describes
314     each attribute.
315 
316     QWebSettings also configures global properties such as the web page memory
317     cache, icon database, local database storage and offline
318     applications storage.
319 
320     \section1 Enabling Plugins
321 
322     Support for browser plugins can enabled by setting the
323     \l{QWebSettings::PluginsEnabled}{PluginsEnabled} attribute. For many applications,
324     this attribute is enabled for all pages by setting it on the
325     \l{globalSettings()}{global settings object}. QtWebKit will always ignore this setting
326     when processing Qt plugins. The decision to allow a Qt plugin is made by the client
327     in its reimplementation of QWebPage::createPlugin().
328 
329     \section1 Web Application Support
330 
331     WebKit provides support for features specified in \l{HTML 5} that improve the
332     performance and capabilities of Web applications. These include client-side
333     (offline) storage and the use of a Web application cache.
334 
335     Client-side (offline) storage is an improvement over the use of cookies to
336     store persistent data in Web applications. Applications can configure and
337     enable the use of an offline storage database by calling the
338     setOfflineStoragePath() with an appropriate file path, and can limit the quota
339     for each application by calling setOfflineStorageDefaultQuota().
340 
341     \sa QWebPage::settings(), QWebView::settings(), {Web Browser}
342 */
343 
344 /*!
345     \enum QWebSettings::FontFamily
346 
347     This enum describes the generic font families defined by CSS 2.
348     For more information see the
349     \l{http://www.w3.org/TR/REC-CSS2/fonts.html#generic-font-families}{CSS standard}.
350 
351     \value StandardFont
352     \value FixedFont
353     \value SerifFont
354     \value SansSerifFont
355     \value CursiveFont
356     \value FantasyFont
357 */
358 
359 /*!
360     \enum QWebSettings::FontSize
361 
362     This enum describes the font sizes configurable through QWebSettings.
363 
364     \value MinimumFontSize The hard minimum font size.
365     \value MinimumLogicalFontSize The minimum logical font size that is applied
366         when zooming out with QWebFrame::setTextSizeMultiplier().
367     \value DefaultFontSize The default font size for regular text.
368     \value DefaultFixedFontSize The default font size for fixed-pitch text.
369 */
370 
371 /*!
372     \enum QWebSettings::WebGraphic
373 
374     This enums describes the standard graphical elements used in webpages.
375 
376     \value MissingImageGraphic The replacement graphic shown when an image could not be loaded.
377     \value MissingPluginGraphic The replacement graphic shown when a plugin could not be loaded.
378     \value DefaultFrameIconGraphic The default icon for QWebFrame::icon().
379     \value TextAreaSizeGripCornerGraphic The graphic shown for the size grip of text areas.
380     \value DeleteButtonGraphic The graphic shown for the WebKit-Editing-Delete-Button in Deletion UI.
381     \value InputSpeechButtonGraphic The graphic shown in input fields that support speech recognition.
382     \value SearchCancelButtonGraphic The graphic shown for clearing the text in a search field.
383     \value SearchCancelButtonPressedGraphic The graphic shown when SearchCancelButtonGraphic is pressed.
384 */
385 
386 /*!
387     \enum QWebSettings::WebAttribute
388 
389     This enum describes various attributes that are configurable through QWebSettings.
390 
391     \value AutoLoadImages Specifies whether images are automatically loaded in
392         web pages. This is enabled by default.
393     \value DnsPrefetchEnabled Specifies whether QtWebkit will try to pre-fetch DNS entries to
394         speed up browsing. This only works as a global attribute. Only for Qt 4.6 and later. This is disabled by default.
395     \value JavascriptEnabled Enables or disables the running of JavaScript
396         programs. This is enabled by default
397     \value JavaEnabled Enables or disables Java applets.
398         Currently Java applets are not supported.
399     \value PluginsEnabled Enables or disables plugins in Web pages (e.g. using NPAPI). Qt plugins
400         with a mimetype such as "application/x-qt-plugin" are not affected by this setting. This is disabled by default.
401     \value PrivateBrowsingEnabled Private browsing prevents WebKit from
402         recording visited pages in the history and storing web page icons. This is disabled by default.
403     \value JavascriptCanOpenWindows Specifies whether JavaScript programs
404         can open new windows. This is disabled by default.
405     \value JavascriptCanCloseWindows Specifies whether JavaScript programs
406         can close windows. This is disabled by default.
407     \value JavascriptCanAccessClipboard Specifies whether JavaScript programs
408         can read or write to the clipboard. This is disabled by default.
409     \value DeveloperExtrasEnabled Enables extra tools for Web developers.
410         Currently this enables the "Inspect" element in the context menu as
411         well as the use of QWebInspector which controls the web inspector
412         for web site debugging. This is disabled by default.
413     \value SpatialNavigationEnabled Enables or disables the Spatial Navigation
414         feature, which consists in the ability to navigate between focusable
415         elements in a Web page, such as hyperlinks and form controls, by using
416         Left, Right, Up and Down arrow keys. For example, if a user presses the
417         Right key, heuristics determine whether there is an element he might be
418         trying to reach towards the right and which element he probably wants.
419         This is disabled by default.
420     \value LinksIncludedInFocusChain Specifies whether hyperlinks should be
421         included in the keyboard focus chain. This is enabled by default.
422     \value ZoomTextOnly Specifies whether the zoom factor on a frame applies
423         only to the text or to all content. This is disabled by default.
424     \value PrintElementBackgrounds Specifies whether the background color and images
425         are also drawn when the page is printed. This is enabled by default.
426     \value OfflineStorageDatabaseEnabled Specifies whether support for the HTML 5
427         offline storage feature is enabled or not. This is disabled by default.
428     \value OfflineWebApplicationCacheEnabled Specifies whether support for the HTML 5
429         web application cache feature is enabled or not. This is disabled by default.
430     \value LocalStorageEnabled Specifies whether support for the HTML 5
431         local storage feature is enabled or not. This is disabled by default.
432     \value LocalStorageDatabaseEnabled \e{This enum value is deprecated.} Use
433         QWebSettings::LocalStorageEnabled instead.
434     \value LocalContentCanAccessRemoteUrls Specifies whether locally loaded documents are
435         allowed to access remote urls. This is disabled by default. For more information
436         about security origins and local vs. remote content see QWebSecurityOrigin.
437     \value LocalContentCanAccessFileUrls Specifies whether locally loaded documents are
438         allowed to access other local urls. This is enabled by default. For more information
439         about security origins and local vs. remote content see QWebSecurityOrigin.
440     \value XSSAuditingEnabled Specifies whether load requests should be monitored for cross-site
441         scripting attempts. Suspicious scripts will be blocked and reported in the inspector's
442         JavaScript console. Enabling this feature might have an impact on performance
443         and it is disabled by default.
444     \value AcceleratedCompositingEnabled This feature, when used in conjunction with
445         QGraphicsWebView, accelerates animations of web content. CSS animations of the transform and
446         opacity properties will be rendered by composing the cached content of the animated elements.
447         This is enabled by default.
448     \value TiledBackingStoreEnabled This setting enables the tiled backing store feature
449         for a QGraphicsWebView. With the tiled backing store enabled, the web page contents in and around
450         the current visible area is speculatively cached to bitmap tiles. The tiles are automatically kept
451         in sync with the web page as it changes. Enabling tiling can significantly speed up painting heavy
452         operations like scrolling. Enabling the feature increases memory consumption. It does not work well
453         with contents using CSS fixed positioning (see also \l{QGraphicsWebView::}{resizesToContents} property).
454         \l{QGraphicsWebView::}{tiledBackingStoreFrozen} property allows application to temporarily
455         freeze the contents of the backing store. This is disabled by default.
456     \value FrameFlatteningEnabled With this setting each subframe is expanded to its contents.
457         On touch devices, it is desired to not have any scrollable sub parts of the page
458         as it results in a confusing user experience, with scrolling sometimes scrolling sub parts
459         and at other times scrolling the page itself. For this reason iframes and framesets are
460         barely usable on touch devices. This will flatten all the frames to become one scrollable page.
461         This is disabled by default.
462     \value SiteSpecificQuirksEnabled This setting enables WebKit's workaround for broken sites. It is
463         enabled by default.
464 */
465 
466 /*!
467     \internal
468 */
QWebSettings()469 QWebSettings::QWebSettings()
470     : d(new QWebSettingsPrivate)
471 {
472     // Initialize our global defaults
473     d->fontSizes.insert(QWebSettings::MinimumFontSize, 0);
474     d->fontSizes.insert(QWebSettings::MinimumLogicalFontSize, 0);
475     d->fontSizes.insert(QWebSettings::DefaultFontSize, 16);
476     d->fontSizes.insert(QWebSettings::DefaultFixedFontSize, 13);
477 
478     QFont defaultFont;
479     defaultFont.setStyleHint(QFont::Serif);
480     d->fontFamilies.insert(QWebSettings::StandardFont, defaultFont.defaultFamily());
481     d->fontFamilies.insert(QWebSettings::SerifFont, defaultFont.defaultFamily());
482 
483     defaultFont.setStyleHint(QFont::Fantasy);
484     d->fontFamilies.insert(QWebSettings::FantasyFont, defaultFont.defaultFamily());
485 
486     defaultFont.setStyleHint(QFont::Cursive);
487     d->fontFamilies.insert(QWebSettings::CursiveFont, defaultFont.defaultFamily());
488 
489     defaultFont.setStyleHint(QFont::SansSerif);
490     d->fontFamilies.insert(QWebSettings::SansSerifFont, defaultFont.defaultFamily());
491 
492     defaultFont.setStyleHint(QFont::Monospace);
493     d->fontFamilies.insert(QWebSettings::FixedFont, defaultFont.defaultFamily());
494 
495     d->attributes.insert(QWebSettings::AutoLoadImages, true);
496     d->attributes.insert(QWebSettings::DnsPrefetchEnabled, false);
497     d->attributes.insert(QWebSettings::JavascriptEnabled, true);
498     d->attributes.insert(QWebSettings::SpatialNavigationEnabled, false);
499     d->attributes.insert(QWebSettings::LinksIncludedInFocusChain, true);
500     d->attributes.insert(QWebSettings::ZoomTextOnly, false);
501     d->attributes.insert(QWebSettings::PrintElementBackgrounds, true);
502     d->attributes.insert(QWebSettings::OfflineStorageDatabaseEnabled, false);
503     d->attributes.insert(QWebSettings::OfflineWebApplicationCacheEnabled, false);
504     d->attributes.insert(QWebSettings::LocalStorageEnabled, false);
505     d->attributes.insert(QWebSettings::LocalContentCanAccessRemoteUrls, false);
506     d->attributes.insert(QWebSettings::LocalContentCanAccessFileUrls, true);
507     d->attributes.insert(QWebSettings::AcceleratedCompositingEnabled, true);
508     d->attributes.insert(QWebSettings::WebGLEnabled, false);
509     d->attributes.insert(QWebSettings::HyperlinkAuditingEnabled, false);
510     d->attributes.insert(QWebSettings::TiledBackingStoreEnabled, false);
511     d->attributes.insert(QWebSettings::FrameFlatteningEnabled, false);
512     d->attributes.insert(QWebSettings::SiteSpecificQuirksEnabled, true);
513     d->offlineStorageDefaultQuota = 5 * 1024 * 1024;
514     d->defaultTextEncoding = QLatin1String("iso-8859-1");
515 }
516 
517 /*!
518     \internal
519 */
QWebSettings(WebCore::Settings * settings)520 QWebSettings::QWebSettings(WebCore::Settings* settings)
521     : d(new QWebSettingsPrivate(settings))
522 {
523     d->settings = settings;
524     d->apply();
525     allSettings()->append(d);
526 }
527 
528 /*!
529     \internal
530 */
~QWebSettings()531 QWebSettings::~QWebSettings()
532 {
533     if (d->settings)
534         allSettings()->removeAll(d);
535 
536     delete d;
537 }
538 
539 /*!
540     Sets the font size for \a type to \a size.
541 */
setFontSize(FontSize type,int size)542 void QWebSettings::setFontSize(FontSize type, int size)
543 {
544     d->fontSizes.insert(type, size);
545     d->apply();
546 }
547 
548 /*!
549     Returns the default font size for \a type.
550 */
fontSize(FontSize type) const551 int QWebSettings::fontSize(FontSize type) const
552 {
553     int defaultValue = 0;
554     if (d->settings) {
555         QWebSettingsPrivate* global = QWebSettings::globalSettings()->d;
556         defaultValue = global->fontSizes.value(type);
557     }
558     return d->fontSizes.value(type, defaultValue);
559 }
560 
561 /*!
562     Resets the font size for \a type to the size specified in the global
563     settings object.
564 
565     This function has no effect on the global QWebSettings instance.
566 */
resetFontSize(FontSize type)567 void QWebSettings::resetFontSize(FontSize type)
568 {
569     if (d->settings) {
570         d->fontSizes.remove(type);
571         d->apply();
572     }
573 }
574 
575 /*!
576     Specifies the location of a user stylesheet to load with every web page.
577 
578     The \a location must be either a path on the local filesystem, or a data URL
579     with UTF-8 and Base64 encoded data, such as:
580 
581     "data:text/css;charset=utf-8;base64,cCB7IGJhY2tncm91bmQtY29sb3I6IHJlZCB9Ow=="
582 
583     \note If the base64 data is not valid, the style will not be applied.
584 
585     \sa userStyleSheetUrl()
586 */
setUserStyleSheetUrl(const QUrl & location)587 void QWebSettings::setUserStyleSheetUrl(const QUrl& location)
588 {
589     d->userStyleSheetLocation = location;
590     d->apply();
591 }
592 
593 /*!
594     Returns the location of the user stylesheet.
595 
596     \sa setUserStyleSheetUrl()
597 */
userStyleSheetUrl() const598 QUrl QWebSettings::userStyleSheetUrl() const
599 {
600     return d->userStyleSheetLocation;
601 }
602 
603 /*!
604     \since 4.6
605     Specifies the default text encoding system.
606 
607     The \a encoding, must be a string describing an encoding such as "utf-8",
608     "iso-8859-1", etc. If left empty a default value will be used. For a more
609     extensive list of encoding names see \l{QTextCodec}
610 
611     \sa defaultTextEncoding()
612 */
setDefaultTextEncoding(const QString & encoding)613 void QWebSettings::setDefaultTextEncoding(const QString& encoding)
614 {
615     d->defaultTextEncoding = encoding;
616     d->apply();
617 }
618 
619 /*!
620     \since 4.6
621     Returns the default text encoding.
622 
623     \sa setDefaultTextEncoding()
624 */
defaultTextEncoding() const625 QString QWebSettings::defaultTextEncoding() const
626 {
627     return d->defaultTextEncoding;
628 }
629 
630 /*!
631     Sets the path of the icon database to \a path. The icon database is used
632     to store "favicons" associated with web sites.
633 
634     \a path must point to an existing directory.
635 
636     Setting an empty path disables the icon database.
637 
638     \sa iconDatabasePath(), clearIconDatabase()
639 */
setIconDatabasePath(const QString & path)640 void QWebSettings::setIconDatabasePath(const QString& path)
641 {
642 #if ENABLE(ICONDATABASE)
643     // Make sure that IconDatabaseClientQt is instantiated.
644     WebCore::IconDatabaseClientQt::instance();
645 #endif
646 
647     WebCore::IconDatabase::delayDatabaseCleanup();
648 
649     if (!path.isEmpty()) {
650         WebCore::iconDatabase().setEnabled(true);
651         QFileInfo info(path);
652         if (info.isDir() && info.isWritable())
653             WebCore::iconDatabase().open(path, WebCore::IconDatabase::defaultDatabaseFilename());
654     } else {
655         WebCore::iconDatabase().setEnabled(false);
656         WebCore::iconDatabase().close();
657     }
658 }
659 
660 /*!
661     Returns the path of the icon database or an empty string if the icon
662     database is disabled.
663 
664     \sa setIconDatabasePath(), clearIconDatabase()
665 */
iconDatabasePath()666 QString QWebSettings::iconDatabasePath()
667 {
668     if (WebCore::iconDatabase().isEnabled() && WebCore::iconDatabase().isOpen())
669         return WebCore::iconDatabase().databasePath();
670     else
671         return QString();
672 }
673 
674 /*!
675     Clears the icon database.
676 */
clearIconDatabase()677 void QWebSettings::clearIconDatabase()
678 {
679     if (WebCore::iconDatabase().isEnabled() && WebCore::iconDatabase().isOpen())
680         WebCore::iconDatabase().removeAllIcons();
681 }
682 
683 /*!
684     Returns the web site's icon for \a url.
685 
686     If the web site does not specify an icon \bold OR if the icon is not in the
687     database, a null QIcon is returned.
688 
689     \note The returned icon's size is arbitrary.
690 
691     \sa setIconDatabasePath()
692 */
iconForUrl(const QUrl & url)693 QIcon QWebSettings::iconForUrl(const QUrl& url)
694 {
695     WebCore::Image* image = WebCore::iconDatabase().synchronousIconForPageURL(WebCore::KURL(url).string(),
696                                 WebCore::IntSize(16, 16));
697     if (!image)
698         return QPixmap();
699 
700     QPixmap* icon = image->nativeImageForCurrentFrame();
701     if (!icon)
702         return QPixmap();
703 
704     return* icon;
705 }
706 
707 /*
708     Returns the plugin database object.
709 
710 QWebPluginDatabase *QWebSettings::pluginDatabase()
711 {
712     static QWebPluginDatabase* database = 0;
713     if (!database)
714         database = new QWebPluginDatabase();
715     return database;
716 }
717 */
718 
719 /*!
720     Sets \a graphic to be drawn when QtWebKit needs to draw an image of the
721     given \a type.
722 
723     For example, when an image cannot be loaded, the pixmap specified by
724     \l{QWebSettings::WebGraphic}{MissingImageGraphic} is drawn instead.
725 
726     \sa webGraphic()
727 */
setWebGraphic(WebGraphic type,const QPixmap & graphic)728 void QWebSettings::setWebGraphic(WebGraphic type, const QPixmap& graphic)
729 {
730     WebGraphicHash* h = graphics();
731     if (graphic.isNull())
732         h->remove(type);
733     else
734         h->insert(type, graphic);
735 }
736 
737 /*!
738     Returns a previously set pixmap used to draw replacement graphics of the
739     specified \a type.
740 
741     \sa setWebGraphic()
742 */
webGraphic(WebGraphic type)743 QPixmap QWebSettings::webGraphic(WebGraphic type)
744 {
745     return graphics()->value(type);
746 }
747 
748 /*!
749     Frees up as much memory as possible by cleaning all memory caches such
750     as page, object and font cache.
751 
752     \since 4.6
753  */
clearMemoryCaches()754 void QWebSettings::clearMemoryCaches()
755 {
756     // Turn the cache on and off.  Disabling the object cache will remove all
757     // resources from the cache.  They may still live on if they are referenced
758     // by some Web page though.
759     if (!WebCore::memoryCache()->disabled()) {
760         WebCore::memoryCache()->setDisabled(true);
761         WebCore::memoryCache()->setDisabled(false);
762     }
763 
764     int pageCapacity = WebCore::pageCache()->capacity();
765     // Setting size to 0, makes all pages be released.
766     WebCore::pageCache()->setCapacity(0);
767     WebCore::pageCache()->releaseAutoreleasedPagesNow();
768     WebCore::pageCache()->setCapacity(pageCapacity);
769 
770     // Invalidating the font cache and freeing all inactive font data.
771     WebCore::fontCache()->invalidate();
772 
773     // Empty the Cross-Origin Preflight cache
774     WebCore::CrossOriginPreflightResultCache::shared().empty();
775 }
776 
777 /*!
778     Sets the maximum number of pages to hold in the memory page cache to \a pages.
779 
780     The Page Cache allows for a nicer user experience when navigating forth or back
781     to pages in the forward/back history, by pausing and resuming up to \a pages.
782 
783     For more information about the feature, please refer to:
784 
785     http://webkit.org/blog/427/webkit-page-cache-i-the-basics/
786 */
setMaximumPagesInCache(int pages)787 void QWebSettings::setMaximumPagesInCache(int pages)
788 {
789     QWebSettingsPrivate* global = QWebSettings::globalSettings()->d;
790     WebCore::pageCache()->setCapacity(qMax(0, pages));
791     global->apply();
792 }
793 
794 /*!
795     Returns the maximum number of web pages that are kept in the memory cache.
796 */
maximumPagesInCache()797 int QWebSettings::maximumPagesInCache()
798 {
799     return WebCore::pageCache()->capacity();
800 }
801 
802 /*!
803    Specifies the capacities for the memory cache for dead objects such as
804    stylesheets or scripts.
805 
806    The \a cacheMinDeadCapacity specifies the \e minimum number of bytes that
807    dead objects should consume when the cache is under pressure.
808 
809    \a cacheMaxDead is the \e maximum number of bytes that dead objects should
810    consume when the cache is \bold not under pressure.
811 
812    \a totalCapacity specifies the \e maximum number of bytes that the cache
813    should consume \bold overall.
814 
815    The cache is enabled by default. Calling setObjectCacheCapacities(0, 0, 0)
816    will disable the cache. Calling it with one non-zero enables it again.
817 */
setObjectCacheCapacities(int cacheMinDeadCapacity,int cacheMaxDead,int totalCapacity)818 void QWebSettings::setObjectCacheCapacities(int cacheMinDeadCapacity, int cacheMaxDead, int totalCapacity)
819 {
820     bool disableCache = !cacheMinDeadCapacity && !cacheMaxDead && !totalCapacity;
821     WebCore::memoryCache()->setDisabled(disableCache);
822 
823     WebCore::memoryCache()->setCapacities(qMax(0, cacheMinDeadCapacity),
824                                     qMax(0, cacheMaxDead),
825                                     qMax(0, totalCapacity));
826 }
827 
828 /*!
829     Sets the actual font family to \a family for the specified generic family,
830     \a which.
831 */
setFontFamily(FontFamily which,const QString & family)832 void QWebSettings::setFontFamily(FontFamily which, const QString& family)
833 {
834     d->fontFamilies.insert(which, family);
835     d->apply();
836 }
837 
838 /*!
839     Returns the actual font family for the specified generic font family,
840     \a which.
841 */
fontFamily(FontFamily which) const842 QString QWebSettings::fontFamily(FontFamily which) const
843 {
844     QString defaultValue;
845     if (d->settings) {
846         QWebSettingsPrivate* global = QWebSettings::globalSettings()->d;
847         defaultValue = global->fontFamilies.value(which);
848     }
849     return d->fontFamilies.value(which, defaultValue);
850 }
851 
852 /*!
853     Resets the actual font family specified by \a which to the one set
854     in the global QWebSettings instance.
855 
856     This function has no effect on the global QWebSettings instance.
857 */
resetFontFamily(FontFamily which)858 void QWebSettings::resetFontFamily(FontFamily which)
859 {
860     if (d->settings) {
861         d->fontFamilies.remove(which);
862         d->apply();
863     }
864 }
865 
866 /*!
867     \fn void QWebSettings::setAttribute(WebAttribute attribute, bool on)
868 
869     Enables or disables the specified \a attribute feature depending on the
870     value of \a on.
871 */
setAttribute(WebAttribute attr,bool on)872 void QWebSettings::setAttribute(WebAttribute attr, bool on)
873 {
874     d->attributes.insert(attr, on);
875     d->apply();
876 }
877 
878 /*!
879     \fn bool QWebSettings::testAttribute(WebAttribute attribute) const
880 
881     Returns true if \a attribute is enabled; otherwise returns false.
882 */
testAttribute(WebAttribute attr) const883 bool QWebSettings::testAttribute(WebAttribute attr) const
884 {
885     bool defaultValue = false;
886     if (d->settings) {
887         QWebSettingsPrivate* global = QWebSettings::globalSettings()->d;
888         defaultValue = global->attributes.value(attr);
889     }
890     return d->attributes.value(attr, defaultValue);
891 }
892 
893 /*!
894     \fn void QWebSettings::resetAttribute(WebAttribute attribute)
895 
896     Resets the setting of \a attribute to the value specified in the
897     global QWebSettings instance.
898 
899     This function has no effect on the global QWebSettings instance.
900 
901     \sa globalSettings()
902 */
resetAttribute(WebAttribute attr)903 void QWebSettings::resetAttribute(WebAttribute attr)
904 {
905     if (d->settings) {
906         d->attributes.remove(attr);
907         d->apply();
908     }
909 }
910 
911 /*!
912     \since 4.5
913 
914     Sets \a path as the save location for HTML5 client-side database storage data.
915 
916     \a path must point to an existing directory.
917 
918     Setting an empty path disables the feature.
919 
920     Support for client-side databases can enabled by setting the
921     \l{QWebSettings::OfflineStorageDatabaseEnabled}{OfflineStorageDatabaseEnabled} attribute.
922 
923     \sa offlineStoragePath()
924 */
setOfflineStoragePath(const QString & path)925 void QWebSettings::setOfflineStoragePath(const QString& path)
926 {
927 #if ENABLE(DATABASE)
928     WebCore::DatabaseTracker::tracker().setDatabaseDirectoryPath(path);
929 #endif
930 }
931 
932 /*!
933     \since 4.5
934 
935     Returns the path of the HTML5 client-side database storage or an empty string if the
936     feature is disabled.
937 
938     \sa setOfflineStoragePath()
939 */
offlineStoragePath()940 QString QWebSettings::offlineStoragePath()
941 {
942 #if ENABLE(DATABASE)
943     return WebCore::DatabaseTracker::tracker().databaseDirectoryPath();
944 #else
945     return QString();
946 #endif
947 }
948 
949 /*!
950     \since 4.5
951 
952     Sets the value of the default quota for new offline storage databases
953     to \a maximumSize.
954 */
setOfflineStorageDefaultQuota(qint64 maximumSize)955 void QWebSettings::setOfflineStorageDefaultQuota(qint64 maximumSize)
956 {
957     QWebSettings::globalSettings()->d->offlineStorageDefaultQuota = maximumSize;
958 }
959 
960 /*!
961     \since 4.5
962 
963     Returns the value of the default quota for new offline storage databases.
964 */
offlineStorageDefaultQuota()965 qint64 QWebSettings::offlineStorageDefaultQuota()
966 {
967     return QWebSettings::globalSettings()->d->offlineStorageDefaultQuota;
968 }
969 
970 /*!
971     \since 4.6
972 
973     Sets the path for HTML5 offline web application cache storage to \a path.
974 
975     An application cache acts like an HTTP cache in some sense. For documents
976     that use the application cache via JavaScript, the loader engine will
977     first ask the application cache for the contents, before hitting the
978     network.
979 
980     The feature is described in details at:
981     http://dev.w3.org/html5/spec/Overview.html#appcache
982 
983     \a path must point to an existing directory.
984 
985     Setting an empty path disables the feature.
986 
987     Support for offline web application cache storage can enabled by setting the
988     \l{QWebSettings::OfflineWebApplicationCacheEnabled}{OfflineWebApplicationCacheEnabled} attribute.
989 
990     \sa offlineWebApplicationCachePath()
991 */
setOfflineWebApplicationCachePath(const QString & path)992 void QWebSettings::setOfflineWebApplicationCachePath(const QString& path)
993 {
994 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
995     WebCore::cacheStorage().setCacheDirectory(path);
996 #endif
997 }
998 
999 /*!
1000     \since 4.6
1001 
1002     Returns the path of the HTML5 offline web application cache storage
1003     or an empty string if the feature is disabled.
1004 
1005     \sa setOfflineWebApplicationCachePath()
1006 */
offlineWebApplicationCachePath()1007 QString QWebSettings::offlineWebApplicationCachePath()
1008 {
1009 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
1010     return WebCore::cacheStorage().cacheDirectory();
1011 #else
1012     return QString();
1013 #endif
1014 }
1015 
1016 /*!
1017     \since 4.6
1018 
1019     Sets the value of the quota for the offline web application cache
1020     to \a maximumSize.
1021 */
setOfflineWebApplicationCacheQuota(qint64 maximumSize)1022 void QWebSettings::setOfflineWebApplicationCacheQuota(qint64 maximumSize)
1023 {
1024 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
1025     WebCore::cacheStorage().empty();
1026     WebCore::cacheStorage().vacuumDatabaseFile();
1027     WebCore::cacheStorage().setMaximumSize(maximumSize);
1028 #endif
1029 }
1030 
1031 /*!
1032     \since 4.6
1033 
1034     Returns the value of the quota for the offline web application cache.
1035 */
offlineWebApplicationCacheQuota()1036 qint64 QWebSettings::offlineWebApplicationCacheQuota()
1037 {
1038 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
1039     return WebCore::cacheStorage().maximumSize();
1040 #else
1041     return 0;
1042 #endif
1043 }
1044 
1045 /*!
1046     \since 4.6
1047 
1048     Sets the path for HTML5 local storage to \a path.
1049 
1050     For more information on HTML5 local storage see the
1051     \l{http://www.w3.org/TR/webstorage/#the-localstorage-attribute}{Web Storage standard}.
1052 
1053     Support for local storage can enabled by setting the
1054     \l{QWebSettings::LocalStorageEnabled}{LocalStorageEnabled} attribute.
1055 
1056     \sa localStoragePath()
1057 */
setLocalStoragePath(const QString & path)1058 void QWebSettings::setLocalStoragePath(const QString& path)
1059 {
1060     d->localStoragePath = path;
1061     d->apply();
1062 }
1063 
1064 /*!
1065     \since 4.6
1066 
1067     Returns the path for HTML5 local storage.
1068 
1069     \sa setLocalStoragePath()
1070 */
localStoragePath() const1071 QString QWebSettings::localStoragePath() const
1072 {
1073     return d->localStoragePath;
1074 }
1075 
1076 /*!
1077     \since 4.6
1078 
1079     Enables WebKit data persistence and sets the path to \a path.
1080     If \a path is empty, the user-specific data location specified by
1081     \l{QDesktopServices::DataLocation}{DataLocation} will be used instead.
1082 
1083     This method will simultaneously set and enable the iconDatabasePath(),
1084     localStoragePath(), offlineStoragePath() and offlineWebApplicationCachePath().
1085 
1086     \sa localStoragePath()
1087 */
enablePersistentStorage(const QString & path)1088 void QWebSettings::enablePersistentStorage(const QString& path)
1089 {
1090 #ifndef QT_NO_DESKTOPSERVICES
1091     QString storagePath;
1092 
1093     if (path.isEmpty()) {
1094 
1095         storagePath = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
1096         if (storagePath.isEmpty())
1097             storagePath = WebCore::pathByAppendingComponent(QDir::homePath(), QCoreApplication::applicationName());
1098     } else
1099         storagePath = path;
1100 
1101     WebCore::makeAllDirectories(storagePath);
1102 
1103     QWebSettings::setIconDatabasePath(storagePath);
1104     QWebSettings::setOfflineWebApplicationCachePath(storagePath);
1105     QWebSettings::setOfflineStoragePath(WebCore::pathByAppendingComponent(storagePath, "Databases"));
1106     QWebSettings::globalSettings()->setLocalStoragePath(WebCore::pathByAppendingComponent(storagePath, "LocalStorage"));
1107     QWebSettings::globalSettings()->setAttribute(QWebSettings::LocalStorageEnabled, true);
1108     QWebSettings::globalSettings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true);
1109     QWebSettings::globalSettings()->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, true);
1110 
1111 #if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
1112     // All applications can share the common QtWebkit cache file(s).
1113     // Path is not configurable and uses QDesktopServices::CacheLocation by default.
1114     QString cachePath = QDesktopServices::storageLocation(QDesktopServices::CacheLocation);
1115     WebCore::makeAllDirectories(cachePath);
1116 
1117     QFileInfo info(cachePath);
1118     if (info.isDir() && info.isWritable()) {
1119         WebCore::PluginDatabase::setPersistentMetadataCacheEnabled(true);
1120         WebCore::PluginDatabase::setPersistentMetadataCachePath(cachePath);
1121     }
1122 #endif
1123 #endif
1124 }
1125 
1126 /*!
1127     \fn QWebSettingsPrivate* QWebSettings::handle() const
1128     \internal
1129 */
1130