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