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