• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2     Copyright (C) 2009 Jakub Wieczorek <faw217@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 <QtTest/QtTest>
21 
22 #include <qdir.h>
23 #include <qwebframe.h>
24 #include <qwebpage.h>
25 #include <qwebplugindatabase.h>
26 #include <qwebsettings.h>
27 #include <qvariant.h>
28 
29 class tst_QWebPluginDatabase : public QObject
30 {
31     Q_OBJECT
32 
33 private slots:
34     void installedPlugins();
35     void searchPaths();
36     void null_data();
37     void null();
38     void pluginForMimeType();
39     void enabled();
40     void operatorequal_data();
41     void operatorequal();
42     void preferredPlugin();
43 };
44 
45 typedef QWebPluginInfo::MimeType MimeType;
46 
installedPlugins()47 void tst_QWebPluginDatabase::installedPlugins()
48 {
49     QWebPage page;
50     page.settings()->setAttribute(QWebSettings::PluginsEnabled, true);
51     QWebFrame* frame = page.mainFrame();
52 
53     QVariantMap jsPluginsMap = frame->evaluateJavaScript("window.navigator.plugins").toMap();
54     QList<QWebPluginInfo> plugins = QWebSettings::pluginDatabase()->plugins();
55     QCOMPARE(plugins, QWebSettings::pluginDatabase()->plugins());
56 
57     int length = jsPluginsMap["length"].toInt();
58     QCOMPARE(length, plugins.count());
59 
60     for (int i = 0; i < length; ++i) {
61         QWebPluginInfo plugin = plugins.at(i);
62 
63         QVariantMap jsPlugin = frame->evaluateJavaScript(QString("window.navigator.plugins[%1]").arg(i)).toMap();
64         QString name = jsPlugin["name"].toString();
65         QString description = jsPlugin["description"].toString();
66         QString fileName = jsPlugin["filename"].toString();
67 
68         QCOMPARE(plugin.name(), name);
69         QCOMPARE(plugin.description(), description);
70         QCOMPARE(QFileInfo(plugin.path()).fileName(), fileName);
71 
72         QList<MimeType> mimeTypes;
73         int mimeTypesCount = jsPlugin["length"].toInt();
74 
75         for (int j = 0; j < mimeTypesCount; ++j) {
76             QVariantMap jsMimeType = frame->evaluateJavaScript(QString("window.navigator.plugins[%1][%2]").arg(i).arg(j)).toMap();
77 
78             MimeType mimeType;
79             mimeType.name = jsMimeType["type"].toString();
80             mimeType.description = jsMimeType["description"].toString();
81             mimeType.fileExtensions = jsMimeType["suffixes"].toString().split(',', QString::SkipEmptyParts);
82 
83             mimeTypes.append(mimeType);
84             QVERIFY(plugin.supportsMimeType(mimeType.name));
85         }
86 
87         QCOMPARE(plugin.mimeTypes(), mimeTypes);
88 
89         QVERIFY(!plugin.isNull());
90         QVERIFY(plugin.isEnabled());
91     }
92 }
93 
searchPaths()94 void tst_QWebPluginDatabase::searchPaths()
95 {
96     QWebPluginDatabase* database = QWebSettings::pluginDatabase();
97     QList<QWebPluginInfo> plugins = database->plugins();
98     QStringList directories = database->searchPaths();
99     QCOMPARE(QWebPluginDatabase::defaultSearchPaths(), directories);
100 
101     database->setSearchPaths(directories);
102     QCOMPARE(QWebPluginDatabase::defaultSearchPaths(), directories);
103     QCOMPARE(database->searchPaths(), directories);
104     QCOMPARE(database->plugins(), plugins);
105     database->refresh();
106     QCOMPARE(database->plugins(), plugins);
107 
108     database->setSearchPaths(QStringList());
109     QCOMPARE(QWebPluginDatabase::defaultSearchPaths(), directories);
110     QCOMPARE(database->searchPaths(), QStringList());
111     QCOMPARE(database->plugins().count(), 0);
112 
113     database->setSearchPaths(directories);
114     QCOMPARE(database->searchPaths(), directories);
115     database->addSearchPath(QDir::tempPath());
116     QCOMPARE(database->searchPaths().count(), directories.count() + 1);
117     QVERIFY(database->searchPaths().contains(QDir::tempPath()));
118     directories.append(QDir::tempPath());
119     QCOMPARE(database->searchPaths(), directories);
120 
121     // As an empty set of search paths has been set, the database has been rebuilt
122     // from scratch after bringing the old path set back.
123     // Because the QWebPlugins no longer point to the same PluginPackages,
124     // the list is also no longer equal to the older one, even though it contains
125     // the same information.
126     QCOMPARE(database->plugins().count(), plugins.count());
127     plugins = database->plugins();
128     QCOMPARE(database->plugins(), plugins);
129 
130     for (int i = (directories.count() - 1); i >= 0; --i) {
131         QDir directory(directories.at(i));
132         if (!directory.exists() || !directory.count())
133             directories.removeAt(i);
134     }
135 
136     database->setSearchPaths(directories);
137     QCOMPARE(database->plugins(), plugins);
138     database->refresh();
139     QCOMPARE(database->plugins(), plugins);
140 
141     database->setSearchPaths(QWebPluginDatabase::defaultSearchPaths());
142     directories = QWebPluginDatabase::defaultSearchPaths();
143     QCOMPARE(QWebPluginDatabase::defaultSearchPaths(), directories);
144     QCOMPARE(database->searchPaths(), directories);
145     QCOMPARE(database->plugins(), plugins);
146 }
147 
Q_DECLARE_METATYPE(QWebPluginInfo)148 Q_DECLARE_METATYPE(QWebPluginInfo)
149 void tst_QWebPluginDatabase::null_data()
150 {
151     QTest::addColumn<QWebPluginInfo>("plugin");
152     QTest::addColumn<bool>("null");
153 
154     QTest::newRow("null") << QWebPluginInfo() << true;
155     QTest::newRow("foo") << QWebSettings::pluginDatabase()->pluginForMimeType("foobarbaz") << true;
156 
157     QList<QWebPluginInfo> plugins = QWebSettings::pluginDatabase()->plugins();
158     for (int i = 0; i < plugins.count(); ++i)
159         QTest::newRow(QString::number(i).toUtf8().constData()) << plugins.at(i) << false;
160 }
161 
null()162 void tst_QWebPluginDatabase::null()
163 {
164     QFETCH(QWebPluginInfo, plugin);
165     QFETCH(bool, null);
166 
167     QCOMPARE(plugin.isNull(), null);
168 }
169 
pluginForMimeType()170 void tst_QWebPluginDatabase::pluginForMimeType()
171 {
172     QMultiMap<QString, QWebPluginInfo> pluginsMap;
173     QWebPluginDatabase* database = QWebSettings::pluginDatabase();
174     QList<QWebPluginInfo> plugins = database->plugins();
175 
176     for (int i = 0; i < plugins.count(); ++i) {
177         QWebPluginInfo plugin = plugins.at(i);
178 
179         QList<MimeType> mimeTypes = plugin.mimeTypes();
180         for (int j = 0; j < mimeTypes.count(); ++j) {
181             QString mimeType = mimeTypes.at(j).name;
182             pluginsMap.insert(mimeType, plugin);
183             QVERIFY(plugin.supportsMimeType(mimeType));
184         }
185     }
186 
187     for (int i = 0; i < plugins.count(); ++i) {
188         QWebPluginInfo plugin = plugins.at(i);
189 
190         QList<MimeType> mimeTypes = plugin.mimeTypes();
191         for (int j = 0; j < mimeTypes.count(); ++j) {
192             QString mimeType = mimeTypes.at(j).name;
193 
194             QVERIFY(pluginsMap.count(mimeType) > 0);
195             if (pluginsMap.count(mimeType) > 1)
196                 continue;
197 
198             QWebPluginInfo pluginForMimeType = database->pluginForMimeType(mimeType);
199             QCOMPARE(pluginForMimeType, plugin);
200             database->setSearchPaths(database->searchPaths());
201             QCOMPARE(pluginForMimeType, plugin);
202             QCOMPARE(pluginForMimeType, database->pluginForMimeType(mimeType.toUpper()));
203             QCOMPARE(pluginForMimeType, database->pluginForMimeType(mimeType.toLower()));
204             QVERIFY(plugin.supportsMimeType(mimeType));
205             QVERIFY(!pluginForMimeType.isNull());
206             QVERIFY(!plugin.isNull());
207         }
208     }
209 }
210 
enabled()211 void tst_QWebPluginDatabase::enabled()
212 {
213     QMultiMap<QString, QWebPluginInfo> pluginsMap;
214     QWebPluginDatabase* database = QWebSettings::pluginDatabase();
215     QList<QWebPluginInfo> plugins = database->plugins();
216 
217     for (int i = 0; i < plugins.count(); ++i) {
218         QWebPluginInfo plugin = plugins.at(i);
219 
220         QList<MimeType> mimeTypes = plugin.mimeTypes();
221         for (int j = 0; j < mimeTypes.count(); ++j) {
222             QString mimeType = mimeTypes.at(j).name;
223             pluginsMap.insert(mimeType, plugin);
224             QVERIFY(plugin.supportsMimeType(mimeType));
225         }
226     }
227 
228     QMultiMap<QString, QWebPluginInfo>::iterator it = pluginsMap.begin();
229     while (it != pluginsMap.end()) {
230         QString mimeType = it.key();
231         QWebPluginInfo plugin = it.value();
232         QWebPluginInfo pluginForMimeType = database->pluginForMimeType(mimeType);
233 
234         QVERIFY(pluginsMap.count(mimeType) > 0);
235 
236         if (pluginsMap.count(mimeType) == 1) {
237             QCOMPARE(plugin, pluginForMimeType);
238 
239             QVERIFY(plugin.isEnabled());
240             QVERIFY(pluginForMimeType.isEnabled());
241             plugin.setEnabled(false);
242             QVERIFY(!plugin.isEnabled());
243             QVERIFY(!pluginForMimeType.isEnabled());
244         } else {
245             QVERIFY(plugin.isEnabled());
246             QVERIFY(pluginForMimeType.isEnabled());
247             plugin.setEnabled(false);
248             QVERIFY(!plugin.isEnabled());
249         }
250 
251         QVERIFY(!plugin.isNull());
252         QVERIFY(!pluginForMimeType.isNull());
253 
254         QWebPluginInfo pluginForMimeType2 = database->pluginForMimeType(mimeType);
255         if (pluginsMap.count(mimeType) == 1) {
256             QVERIFY(pluginForMimeType2 != plugin);
257             QVERIFY(pluginForMimeType2.isNull());
258         } else {
259             QVERIFY(pluginForMimeType2 != plugin);
260             QVERIFY(!pluginForMimeType2.isNull());
261         }
262 
263         plugin.setEnabled(true);
264 
265         ++it;
266     }
267 }
268 
operatorequal_data()269 void tst_QWebPluginDatabase::operatorequal_data()
270 {
271     QTest::addColumn<QWebPluginInfo>("first");
272     QTest::addColumn<QWebPluginInfo>("second");
273     QTest::addColumn<bool>("equal");
274 
275     QWebPluginDatabase* database = QWebSettings::pluginDatabase();
276     QTest::newRow("null") << QWebPluginInfo() << QWebPluginInfo() << true;
277     QTest::newRow("application/x-shockwave-flash") << database->pluginForMimeType("application/x-shockwave-flash")
278                                                    << database->pluginForMimeType("application/x-shockwave-flash") << true;
279     QTest::newRow("foo/bar-baz") << database->pluginForMimeType("foo/bar-baz")
280                                  << database->pluginForMimeType("foo/bar-baz") << true;
281 
282     QList<QWebPluginInfo> plugins = database->plugins();
283     for (int i = 0; i < (plugins.count() - 1); ++i) {
284         QWebPluginInfo first = plugins.at(i);
285         QWebPluginInfo second = plugins.at(i + 1);
286 
287         QTest::newRow(QString("%1==%2").arg(first.name(), second.name()).toUtf8().constData())
288                                     << first << second << false;
289     }
290 }
291 
operatorequal()292 void tst_QWebPluginDatabase::operatorequal()
293 {
294     QFETCH(QWebPluginInfo, first);
295     QFETCH(QWebPluginInfo, second);
296     QFETCH(bool, equal);
297 
298     QCOMPARE(first == second, equal);
299 }
300 
preferredPlugin()301 void tst_QWebPluginDatabase::preferredPlugin()
302 {
303     QMultiMap<QString, QWebPluginInfo> pluginsMap;
304     QWebPluginDatabase* database = QWebSettings::pluginDatabase();
305     QList<QWebPluginInfo> plugins = database->plugins();
306 
307     for (int i = 0; i < plugins.count(); ++i) {
308         QWebPluginInfo plugin = plugins.at(i);
309 
310         QList<MimeType> mimeTypes = plugin.mimeTypes();
311         for (int j = 0; j < mimeTypes.count(); ++j) {
312             QString mimeType = mimeTypes.at(j).name;
313             pluginsMap.insert(mimeType, plugin);
314         }
315     }
316 
317     QMultiMap<QString, QWebPluginInfo>::iterator it = pluginsMap.begin();
318     while (it != pluginsMap.end()) {
319         QString mimeType = it.key();
320 
321         if (pluginsMap.count(mimeType) > 1) {
322             QList<QWebPluginInfo> pluginsForMimeType = pluginsMap.values(mimeType);
323             QWebPluginInfo plugin = database->pluginForMimeType(mimeType);
324             QVERIFY(plugin.supportsMimeType(mimeType));
325 
326             pluginsForMimeType.removeAll(plugin);
327             for (int i = 0; i < pluginsForMimeType.count(); ++i) {
328                 QWebPluginInfo anotherPlugin = pluginsForMimeType.at(i);
329                 QVERIFY(plugin.supportsMimeType(mimeType));
330                 QVERIFY(plugin != anotherPlugin);
331 
332                 QCOMPARE(database->pluginForMimeType(mimeType), plugin);
333                 database->setPreferredPluginForMimeType(mimeType, anotherPlugin);
334                 QCOMPARE(database->pluginForMimeType(mimeType), anotherPlugin);
335 
336                 anotherPlugin.setEnabled(false);
337                 QCOMPARE(database->pluginForMimeType(mimeType), plugin);
338 
339                 anotherPlugin.setEnabled(true);
340                 QCOMPARE(database->pluginForMimeType(mimeType), anotherPlugin);
341                 database->setSearchPaths(database->searchPaths());
342                 QCOMPARE(database->pluginForMimeType(mimeType), anotherPlugin);
343 
344                 database->setPreferredPluginForMimeType(mimeType, QWebPluginInfo());
345                 QCOMPARE(database->pluginForMimeType(mimeType), plugin);
346             }
347         } else {
348             QWebPluginInfo plugin = database->pluginForMimeType(mimeType);
349             QCOMPARE(pluginsMap.value(mimeType), plugin);
350 
351             database->setPreferredPluginForMimeType(mimeType, plugin);
352             QCOMPARE(database->pluginForMimeType(mimeType), plugin);
353 
354             plugin.setEnabled(false);
355             QCOMPARE(database->pluginForMimeType(mimeType), QWebPluginInfo());
356             plugin.setEnabled(true);
357 
358             database->setPreferredPluginForMimeType(mimeType, QWebPluginInfo());
359             QCOMPARE(database->pluginForMimeType(mimeType), plugin);
360         }
361 
362         ++it;
363     }
364 
365     if (pluginsMap.keys().count() >= 2) {
366         QStringList mimeTypes = pluginsMap.uniqueKeys();
367 
368         QString mimeType1 = mimeTypes.at(0);
369         QString mimeType2 = mimeTypes.at(1);
370         QWebPluginInfo plugin1 = database->pluginForMimeType(mimeType1);
371         QWebPluginInfo plugin2 = database->pluginForMimeType(mimeType2);
372 
373         int i = 2;
374         while (plugin2.supportsMimeType(mimeType1)
375                && !mimeType2.isEmpty()
376                && i < mimeTypes.count()) {
377             mimeType2 = mimeTypes.at(i);
378             plugin2 = database->pluginForMimeType(mimeType2);
379             ++i;
380         }
381 
382         plugin1 = database->pluginForMimeType(mimeType1);
383         QVERIFY(plugin1.supportsMimeType(mimeType1));
384         QVERIFY(!plugin1.isNull());
385         plugin2 = database->pluginForMimeType(mimeType2);
386         QVERIFY(plugin2.supportsMimeType(mimeType2));
387         QVERIFY(!plugin2.isNull());
388 
389         database->setPreferredPluginForMimeType(mimeType2, plugin1);
390         QVERIFY(!plugin1.supportsMimeType(mimeType2));
391         QCOMPARE(database->pluginForMimeType(mimeType2), plugin2);
392 
393         database->setPreferredPluginForMimeType(mimeType1, plugin1);
394         QVERIFY(!plugin2.supportsMimeType(mimeType1));
395         QCOMPARE(database->pluginForMimeType(mimeType2), plugin2);
396     }
397 }
398 
399 QTEST_MAIN(tst_QWebPluginDatabase)
400 
401 #include "tst_qwebplugindatabase.moc"
402