Home | History | Annotate | Download | only in Api
      1 /*
      2     Copyright (C) 2009 Jakub Wieczorek <faw217 (at) gmail.com>
      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 "qwebplugindatabase_p.h"
     22 
     23 #include "PluginDatabase.h"
     24 #include "PluginPackage.h"
     25 
     26 using namespace WebCore;
     27 
     28 /*!
     29     \internal
     30     \typedef QWebPluginInfo::MimeType
     31     \since 4.6
     32     \brief Represents a single MIME type supported by a plugin.
     33 */
     34 
     35 /*!
     36     \class QWebPluginInfo
     37     \internal
     38     \since 4.6
     39     \brief The QWebPluginInfo class represents a single Netscape plugin.
     40 
     41     A QWebPluginInfo object represents a Netscape plugin picked up by WebKit
     42     and included in the plugin database. This class contains information about
     43     the plugin, such as its name(), description(), a list of MIME types that it
     44     supports (can be accessed with mimeTypes()) and the path of the plugin
     45     file.
     46 
     47     Plugins can be enabled and disabled with setEnabled(). If a plugin is
     48     disabled, it will not be used by WebKit to handle supported MIME types. To
     49     check if a plugin is enabled or not, use enabled().
     50 
     51     \sa QWebPluginDatabase
     52 */
     53 
     54 /*!
     55     Constructs a null QWebPluginInfo.
     56 */
     57 QWebPluginInfo::QWebPluginInfo()
     58     : m_package(0)
     59 {
     60 }
     61 
     62 QWebPluginInfo::QWebPluginInfo(PluginPackage* package)
     63     : m_package(package)
     64 {
     65     if (m_package)
     66         m_package->ref();
     67 }
     68 
     69 /*!
     70     Contructs a copy of \a other.
     71 */
     72 QWebPluginInfo::QWebPluginInfo(const QWebPluginInfo& other)
     73     : m_package(other.m_package)
     74 {
     75     if (m_package)
     76         m_package->ref();
     77 }
     78 
     79 /*!
     80     Destroys the plugin info.
     81 */
     82 QWebPluginInfo::~QWebPluginInfo()
     83 {
     84     if (m_package)
     85         m_package->deref();
     86 }
     87 
     88 /*!
     89     Returns the name of the plugin.
     90 
     91     \sa description()
     92 */
     93 QString QWebPluginInfo::name() const
     94 {
     95     if (!m_package)
     96         return QString();
     97     return m_package->name();
     98 }
     99 
    100 /*!
    101     Returns the description of the plugin.
    102 
    103     \sa name()
    104 */
    105 QString QWebPluginInfo::description() const
    106 {
    107     if (!m_package)
    108         return QString();
    109     return m_package->description();
    110 }
    111 
    112 /*!
    113     Returns a list of MIME types supported by the plugin.
    114 
    115     \sa supportsMimeType()
    116 */
    117 QList<QWebPluginInfo::MimeType> QWebPluginInfo::mimeTypes() const
    118 {
    119     if (m_package && m_mimeTypes.isEmpty()) {
    120         const MIMEToDescriptionsMap& mimeToDescriptions = m_package->mimeToDescriptions();
    121         MIMEToDescriptionsMap::const_iterator end = mimeToDescriptions.end();
    122 
    123         for (MIMEToDescriptionsMap::const_iterator it = mimeToDescriptions.begin(); it != end; ++it) {
    124             MimeType mimeType;
    125             mimeType.name = it->first;
    126             mimeType.description = it->second;
    127 
    128             QStringList fileExtensions;
    129             Vector<String> extensions = m_package->mimeToExtensions().get(mimeType.name);
    130 
    131             for (unsigned i = 0; i < extensions.size(); ++i)
    132                 fileExtensions.append(extensions[i]);
    133 
    134             mimeType.fileExtensions = fileExtensions;
    135             m_mimeTypes.append(mimeType);
    136         }
    137     }
    138 
    139     return m_mimeTypes;
    140 }
    141 
    142 /*!
    143     Returns true if the plugin supports a specific \a mimeType; otherwise
    144     returns false.
    145 
    146     \sa mimeTypes()
    147 */
    148 bool QWebPluginInfo::supportsMimeType(const QString& mimeType) const
    149 {
    150     if (!m_package)
    151         return false;
    152     return m_package->mimeToDescriptions().contains(mimeType);
    153 }
    154 
    155 /*!
    156     Returns an absolute path to the plugin file.
    157 */
    158 QString QWebPluginInfo::path() const
    159 {
    160     if (!m_package)
    161         return QString();
    162     return m_package->path();
    163 }
    164 
    165 /*!
    166     Returns true if the plugin is a null plugin; otherwise returns false.
    167 */
    168 bool QWebPluginInfo::isNull() const
    169 {
    170     return !m_package;
    171 }
    172 
    173 /*!
    174     Enables or disables the plugin, depending on the \a enabled parameter.
    175 
    176     Disabled plugins will not be picked up by WebKit when looking for a plugin
    177     supporting a particular MIME type.
    178 
    179     \sa isEnabled()
    180 */
    181 void QWebPluginInfo::setEnabled(bool enabled)
    182 {
    183     if (!m_package)
    184         return;
    185     m_package->setEnabled(enabled);
    186 }
    187 
    188 /*!
    189     Returns true if the plugin is enabled; otherwise returns false.
    190 
    191     \sa setEnabled()
    192 */
    193 bool QWebPluginInfo::isEnabled() const
    194 {
    195     if (!m_package)
    196         return false;
    197     return m_package->isEnabled();
    198 }
    199 
    200 /*!
    201     Returns true if this plugin info is the same as the \a other plugin info.
    202 */
    203 bool QWebPluginInfo::operator==(const QWebPluginInfo& other) const
    204 {
    205     return m_package == other.m_package;
    206 }
    207 
    208 /*!
    209     Returns true if this plugin info is different from the \a other plugin info.
    210 */
    211 bool QWebPluginInfo::operator!=(const QWebPluginInfo& other) const
    212 {
    213     return m_package != other.m_package;
    214 }
    215 
    216 /*!
    217     Assigns the \a other plugin info to this plugin info, and returns a reference
    218     to this plugin info.
    219 */
    220 QWebPluginInfo &QWebPluginInfo::operator=(const QWebPluginInfo& other)
    221 {
    222     if (this == &other)
    223         return *this;
    224 
    225     if (m_package)
    226         m_package->deref();
    227     m_package = other.m_package;
    228     if (m_package)
    229         m_package->ref();
    230     m_mimeTypes = other.m_mimeTypes;
    231 
    232     return *this;
    233 }
    234 
    235 /*!
    236     \class QWebPluginDatabase
    237     \internal
    238     \since 4.6
    239     \brief The QWebPluginDatabase class provides an interface for managing
    240     Netscape plugins used by WebKit in QWebPages.
    241 
    242     The QWebPluginDatabase class is a database of Netscape plugins that are used
    243     by WebKit. The plugins are picked up by WebKit by looking up a set of search paths.
    244     The default set can be accessed using defaultSearchPaths(). The search paths
    245     can be changed, see searchPaths() and setSearchPaths(). Additional search paths
    246     can also be added using addSearchPath().
    247 
    248     The plugins that have been detected are exposed by the plugins() method.
    249     The list contains QWebPlugin objects that hold both the metadata and the MIME
    250     types that are supported by particular plugins.
    251 
    252     WebKit specifies a plugin for a MIME type by looking for the first plugin that
    253     supports the specific MIME type. To get a plugin, that is used by WebKit to
    254     handle a specific MIME type, you can use the pluginForMimeType() function.
    255 
    256     To change the way of resolving MIME types ambiguity, you can explicitly set
    257     a preferred plugin for a specific MIME type, using setPreferredPluginForMimeType().
    258 
    259     \sa QWebPluginInfo, QWebSettings::pluginDatabase()
    260 */
    261 
    262 QWebPluginDatabase::QWebPluginDatabase(QObject* parent)
    263     : QObject(parent)
    264     , m_database(PluginDatabase::installedPlugins())
    265 {
    266 }
    267 
    268 QWebPluginDatabase::~QWebPluginDatabase()
    269 {
    270 }
    271 
    272 /*!
    273     Returns a list of plugins installed in the search paths.
    274 
    275     This list will contain disabled plugins, although they will not be used by
    276     WebKit.
    277 
    278     \sa pluginForMimeType()
    279 */
    280 QList<QWebPluginInfo> QWebPluginDatabase::plugins() const
    281 {
    282     QList<QWebPluginInfo> qwebplugins;
    283     const Vector<PluginPackage*>& plugins = m_database->plugins();
    284 
    285     for (unsigned int i = 0; i < plugins.size(); ++i) {
    286         PluginPackage* plugin = plugins[i];
    287 #if ENABLE(NETSCAPE_PLUGIN_METADATA_CACHE)
    288         if (!plugin->ensurePluginLoaded())
    289             continue;
    290 #endif
    291         qwebplugins.append(QWebPluginInfo(plugin));
    292     }
    293 
    294     return qwebplugins;
    295 }
    296 
    297 /*!
    298     Returns a default set of search paths.
    299 
    300     \sa searchPaths(), setSearchPaths()
    301 */
    302 QStringList QWebPluginDatabase::defaultSearchPaths()
    303 {
    304     QStringList paths;
    305 
    306     const Vector<String>& directories = PluginDatabase::defaultPluginDirectories();
    307     for (unsigned int i = 0; i < directories.size(); ++i)
    308         paths.append(directories[i]);
    309 
    310     return paths;
    311 }
    312 
    313 /*!
    314     Returns a list of search paths that are used by WebKit to look for plugins.
    315 
    316     \sa defaultSearchPaths(), setSearchPaths()
    317 */
    318 QStringList QWebPluginDatabase::searchPaths() const
    319 {
    320     QStringList paths;
    321 
    322     const Vector<String>& directories = m_database->pluginDirectories();
    323     for (unsigned int i = 0; i < directories.size(); ++i)
    324         paths.append(directories[i]);
    325 
    326     return paths;
    327 }
    328 
    329 /*!
    330     Changes the search paths to \a paths.
    331     The database is automatically refreshed.
    332 
    333     \sa searchPaths(), defaultSearchPaths()
    334 */
    335 void QWebPluginDatabase::setSearchPaths(const QStringList& paths)
    336 {
    337     Vector<String> directories;
    338 
    339     for (int i = 0; i < paths.count(); ++i)
    340         directories.append(paths.at(i));
    341 
    342     m_database->setPluginDirectories(directories);
    343     // PluginDatabase::setPluginDirectories() does not refresh the database.
    344     m_database->refresh();
    345 }
    346 
    347 /*!
    348     Adds an additional \a path to the current set.
    349     The database is automatically refreshed.
    350 
    351     \sa searchPaths(), setSearchPaths()
    352 */
    353 void QWebPluginDatabase::addSearchPath(const QString& path)
    354 {
    355     m_database->addExtraPluginDirectory(path);
    356     // PluginDatabase::addExtraPluginDirectory() does refresh the database.
    357 }
    358 
    359 /*!
    360     Refreshes the plugin database, adds new plugins that have been found and removes
    361     the ones that are no longer available in the search paths.
    362 
    363     You can call this function when the set of plugins installed in the search paths
    364     changes. You do not need to call this function when changing search paths,
    365     in that case WebKit automatically refreshes the database.
    366 */
    367 void QWebPluginDatabase::refresh()
    368 {
    369     m_database->refresh();
    370 }
    371 
    372 /*!
    373     Returns the plugin that is currently used by WebKit for a given \a mimeType.
    374 
    375     \sa setPreferredPluginForMimeType()
    376 */
    377 QWebPluginInfo QWebPluginDatabase::pluginForMimeType(const QString& mimeType)
    378 {
    379     return QWebPluginInfo(m_database->pluginForMIMEType(mimeType));
    380 }
    381 
    382 /*!
    383     Changes the preferred plugin for a given \a mimeType to \a plugin. The \a plugin
    384     has to support the given \a mimeType, otherwise the setting will have no effect.
    385 
    386     Calling the function with a null \a plugin resets the setting.
    387 
    388     \sa pluginForMimeType()
    389 */
    390 void QWebPluginDatabase::setPreferredPluginForMimeType(const QString& mimeType, const QWebPluginInfo& plugin)
    391 {
    392     m_database->setPreferredPluginForMIMEType(mimeType, plugin.m_package);
    393 }
    394