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