1 #include "../util.h"
2 #include <QAction>
3 #include <QColor>
4 #include <QDebug>
5 #include <QDeclarativeComponent>
6 #include <QDeclarativeEngine>
7 #include <QDeclarativeItem>
8 #include <QDeclarativeProperty>
9 #include <QDeclarativeView>
10 #include <QDir>
11 #include <QGraphicsWebView>
12 #include <QTest>
13 #include <QVariant>
14 #include <QWebFrame>
15 #include "qdeclarativewebview_p.h"
16
17 QT_BEGIN_NAMESPACE
18
19 class tst_QDeclarativeWebView : public QObject {
20 Q_OBJECT
21
22 public:
23 tst_QDeclarativeWebView();
24
25 private slots:
26 void cleanupTestCase();
27
28 void basicProperties();
29 void elementAreaAt();
30 void historyNav();
31 void javaScript();
32 void loadError();
33 void multipleWindows();
34 void newWindowComponent();
35 void newWindowParent();
36 void preferredWidthTest();
37 void preferredHeightTest();
38 void preferredWidthDefaultTest();
39 void preferredHeightDefaultTest();
40 void pressGrabTime();
41 void renderingEnabled();
42 void setHtml();
43 void settings();
44 #if QT_VERSION >= 0x040703
45 void backgroundColor();
46 #endif
47
48 private:
49 void checkNoErrors(const QDeclarativeComponent&);
tmpDir() const50 QString tmpDir() const
51 {
52 static QString tmpd = QDir::tempPath() + "/tst_qdeclarativewebview-"
53 + QDateTime::currentDateTime().toString(QLatin1String("yyyyMMddhhmmss"));
54 return tmpd;
55 }
56 };
57
tst_QDeclarativeWebView()58 tst_QDeclarativeWebView::tst_QDeclarativeWebView()
59 {
60 Q_UNUSED(waitForSignal)
61 }
62
strippedHtml(QString html)63 static QString strippedHtml(QString html)
64 {
65 html.replace(QRegExp("\\s+"), "");
66 return html;
67 }
68
fileContents(const QString & filename)69 static QString fileContents(const QString& filename)
70 {
71 QFile file(filename);
72 file.open(QIODevice::ReadOnly);
73 return QString::fromUtf8(file.readAll());
74 }
75
removeRecursive(const QString & dirname)76 static void removeRecursive(const QString& dirname)
77 {
78 QDir dir(dirname);
79 QFileInfoList entries(dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot));
80 for (int i = 0; i < entries.count(); ++i)
81 if (entries[i].isDir())
82 removeRecursive(entries[i].filePath());
83 else
84 dir.remove(entries[i].fileName());
85 QDir().rmdir(dirname);
86 }
87
cleanupTestCase()88 void tst_QDeclarativeWebView::cleanupTestCase()
89 {
90 removeRecursive(tmpDir());
91 }
92
basicProperties()93 void tst_QDeclarativeWebView::basicProperties()
94 {
95 QDeclarativeEngine engine;
96 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/basic.qml"));
97 checkNoErrors(component);
98 QWebSettings::enablePersistentStorage(tmpDir());
99
100 QObject* wv = component.create();
101 QVERIFY(wv);
102 QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
103 QCOMPARE(wv->property("title").toString(), QLatin1String("Basic"));
104 QTRY_COMPARE(qvariant_cast<QPixmap>(wv->property("icon")).width(), 48);
105 QEXPECT_FAIL("", "'icon' property isn't working", Continue);
106 QCOMPARE(qvariant_cast<QPixmap>(wv->property("icon")), QPixmap("qrc:///resources/basic.png"));
107 QCOMPARE(wv->property("statusText").toString(), QLatin1String("status here"));
108 QCOMPARE(strippedHtml(fileContents(":/resources/basic.html")), strippedHtml(wv->property("html").toString()));
109 QEXPECT_FAIL("", "TODO: get preferred width from QGraphicsWebView result", Continue);
110 QCOMPARE(wv->property("preferredWidth").toInt(), 0);
111 QEXPECT_FAIL("", "TODO: get preferred height from QGraphicsWebView result", Continue);
112 QCOMPARE(wv->property("preferredHeight").toInt(), 0);
113 QCOMPARE(wv->property("url").toUrl(), QUrl("qrc:///resources/basic.html"));
114 QCOMPARE(wv->property("status").toInt(), int(QDeclarativeWebView::Ready));
115
116 QAction* reloadAction = wv->property("reload").value<QAction*>();
117 QVERIFY(reloadAction);
118 QVERIFY(reloadAction->isEnabled());
119 QAction* backAction = wv->property("back").value<QAction*>();
120 QVERIFY(backAction);
121 QVERIFY(!backAction->isEnabled());
122 QAction* forwardAction = wv->property("forward").value<QAction*>();
123 QVERIFY(forwardAction);
124 QVERIFY(!forwardAction->isEnabled());
125 QAction* stopAction = wv->property("stop").value<QAction*>();
126 QVERIFY(stopAction);
127 QVERIFY(!stopAction->isEnabled());
128
129 wv->setProperty("pixelCacheSize", 0); // mainly testing that it doesn't crash or anything!
130 QCOMPARE(wv->property("pixelCacheSize").toInt(), 0);
131 reloadAction->trigger();
132 QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
133 }
134
elementAreaAt()135 void tst_QDeclarativeWebView::elementAreaAt()
136 {
137 QSKIP("This test should be changed to test 'heuristicZoom' instead.", SkipAll);
138 QDeclarativeEngine engine;
139 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/elements.qml"));
140 checkNoErrors(component);
141 QDeclarativeWebView* wv = qobject_cast<QDeclarativeWebView*>(component.create());
142 QVERIFY(wv);
143 QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
144
145 // Areas from elements.html.
146 // const QRect areaA(1, 1, 75, 54);
147 // const QRect areaB(78, 3, 110, 50);
148 // const QRect wholeView(0, 0, 310, 100);
149 // const QRect areaBC(76, 1, 223, 54);
150
151 // QCOMPARE(wv->elementAreaAt(40, 30, 100, 100), areaA);
152 // QCOMPARE(wv->elementAreaAt(130, 30, 200, 100), areaB);
153 // QCOMPARE(wv->elementAreaAt(40, 30, 400, 400), wholeView);
154 // QCOMPARE(wv->elementAreaAt(130, 30, 280, 280), areaBC);
155 // QCOMPARE(wv->elementAreaAt(130, 30, 400, 400), wholeView);
156 }
157
historyNav()158 void tst_QDeclarativeWebView::historyNav()
159 {
160 QDeclarativeEngine engine;
161 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/basic.qml"));
162 checkNoErrors(component);
163 QWebSettings::enablePersistentStorage(tmpDir());
164
165 QObject* wv = component.create();
166 QVERIFY(wv);
167
168 QAction* reloadAction = wv->property("reload").value<QAction*>();
169 QVERIFY(reloadAction);
170 QAction* backAction = wv->property("back").value<QAction*>();
171 QVERIFY(backAction);
172 QAction* forwardAction = wv->property("forward").value<QAction*>();
173 QVERIFY(forwardAction);
174 QAction* stopAction = wv->property("stop").value<QAction*>();
175 QVERIFY(stopAction);
176
177 for (int i = 1; i <= 2; ++i) {
178 QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
179 QCOMPARE(wv->property("title").toString(), QLatin1String("Basic"));
180 QTRY_COMPARE(qvariant_cast<QPixmap>(wv->property("icon")).width(), 48);
181 QEXPECT_FAIL("", "'icon' property isn't working", Continue);
182 QCOMPARE(qvariant_cast<QPixmap>(wv->property("icon")), QPixmap("qrc:///data/basic.png"));
183 QCOMPARE(wv->property("statusText").toString(), QLatin1String("status here"));
184 QCOMPARE(strippedHtml(fileContents(":/resources/basic.html")), strippedHtml(wv->property("html").toString()));
185 QEXPECT_FAIL("", "TODO: get preferred width from QGraphicsWebView result", Continue);
186 QCOMPARE(wv->property("preferredWidth").toDouble(), 0.0);
187 QCOMPARE(wv->property("url").toUrl(), QUrl("qrc:///resources/basic.html"));
188 QCOMPARE(wv->property("status").toInt(), int(QDeclarativeWebView::Ready));
189 QVERIFY(reloadAction->isEnabled());
190 QVERIFY(!backAction->isEnabled());
191 QVERIFY(!forwardAction->isEnabled());
192 QVERIFY(!stopAction->isEnabled());
193 reloadAction->trigger();
194 }
195
196 wv->setProperty("url", QUrl("qrc:///resources/forward.html"));
197 QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
198 QCOMPARE(wv->property("title").toString(), QLatin1String("Forward"));
199 QTRY_COMPARE(qvariant_cast<QPixmap>(wv->property("icon")).width(), 32);
200 QEXPECT_FAIL("", "'icon' property isn't working", Continue);
201 QCOMPARE(qvariant_cast<QPixmap>(wv->property("icon")), QPixmap("qrc:///resources/forward.png"));
202 QCOMPARE(strippedHtml(fileContents(":/resources/forward.html")), strippedHtml(wv->property("html").toString()));
203 QCOMPARE(wv->property("url").toUrl(), QUrl("qrc:///resources/forward.html"));
204 QCOMPARE(wv->property("status").toInt(), int(QDeclarativeWebView::Ready));
205 QCOMPARE(wv->property("statusText").toString(), QString());
206
207 QVERIFY(reloadAction->isEnabled());
208 QVERIFY(backAction->isEnabled());
209 QVERIFY(!forwardAction->isEnabled());
210 QVERIFY(!stopAction->isEnabled());
211
212 backAction->trigger();
213
214 QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
215 QCOMPARE(wv->property("title").toString(), QLatin1String("Basic"));
216 QCOMPARE(strippedHtml(fileContents(":/resources/basic.html")), strippedHtml(wv->property("html").toString()));
217 QCOMPARE(wv->property("url").toUrl(), QUrl("qrc:///resources/basic.html"));
218 QCOMPARE(wv->property("status").toInt(), int(QDeclarativeWebView::Ready));
219
220 QVERIFY(reloadAction->isEnabled());
221 QVERIFY(!backAction->isEnabled());
222 QVERIFY(forwardAction->isEnabled());
223 QVERIFY(!stopAction->isEnabled());
224 }
225
callEvaluateJavaScript(QObject * object,const QString & snippet)226 static inline QVariant callEvaluateJavaScript(QObject *object, const QString& snippet)
227 {
228 QVariant result;
229 QMetaObject::invokeMethod(object, "evaluateJavaScript", Q_RETURN_ARG(QVariant, result), Q_ARG(QString, snippet));
230 return result;
231 }
232
javaScript()233 void tst_QDeclarativeWebView::javaScript()
234 {
235 QDeclarativeEngine engine;
236 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/javaScript.qml"));
237 checkNoErrors(component);
238 QObject* wv = component.create();
239 QVERIFY(wv);
240 QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
241
242 QCOMPARE(callEvaluateJavaScript(wv, "123").toInt(), 123);
243 QCOMPARE(callEvaluateJavaScript(wv, "window.status").toString(), QLatin1String("status here"));
244 QCOMPARE(callEvaluateJavaScript(wv, "window.myjsname.qmlprop").toString(), QLatin1String("qmlvalue"));
245 }
246
loadError()247 void tst_QDeclarativeWebView::loadError()
248 {
249 QDeclarativeEngine engine;
250 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/loadError.qml"));
251 checkNoErrors(component);
252 QWebSettings::enablePersistentStorage(tmpDir());
253
254 QObject* wv = component.create();
255 QVERIFY(wv);
256 QAction* reloadAction = wv->property("reload").value<QAction*>();
257 QVERIFY(reloadAction);
258
259 for (int i = 1; i <= 2; ++i) {
260 QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
261 QCOMPARE(wv->property("title").toString(), QString());
262 QCOMPARE(wv->property("statusText").toString(), QString()); // HTML 'status bar' text, not error message
263 QCOMPARE(wv->property("url").toUrl(), QUrl("qrc:///resources/does-not-exist.html")); // Unlike QWebPage, which loses url
264 QCOMPARE(wv->property("status").toInt(), int(QDeclarativeWebView::Error));
265 reloadAction->trigger();
266 }
267 }
268
multipleWindows()269 void tst_QDeclarativeWebView::multipleWindows()
270 {
271 QSKIP("Rework this test to not depend on QDeclarativeGrid", SkipAll);
272 QDeclarativeEngine engine;
273 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/newwindows.qml"));
274 checkNoErrors(component);
275
276 // QDeclarativeGrid *grid = qobject_cast<QDeclarativeGrid*>(component.create());
277 // QVERIFY(grid != 0);
278 // QTRY_COMPARE(grid->children().count(), 2+4); // Component, Loader (with 1 WebView), 4 new-window WebViews
279 // QDeclarativeItem* popup = qobject_cast<QDeclarativeItem*>(grid->children().at(2)); // first popup after Component and Loader.
280 // QVERIFY(popup != 0);
281 // QTRY_COMPARE(popup->x(), 150.0);
282 }
283
newWindowComponent()284 void tst_QDeclarativeWebView::newWindowComponent()
285 {
286 QDeclarativeEngine engine;
287 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/propertychanges.qml"));
288 checkNoErrors(component);
289 QDeclarativeItem* rootItem = qobject_cast<QDeclarativeItem*>(component.create());
290 QVERIFY(rootItem);
291 QObject* wv = rootItem->findChild<QObject*>("webView");
292 QVERIFY(wv);
293 QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
294
295 QDeclarativeComponent substituteComponent(&engine);
296 substituteComponent.setData("import QtQuick 1.0; WebView { objectName: 'newWebView'; url: 'basic.html'; }", QUrl::fromLocalFile(""));
297 QSignalSpy newWindowComponentSpy(wv, SIGNAL(newWindowComponentChanged()));
298
299 wv->setProperty("newWindowComponent", QVariant::fromValue(&substituteComponent));
300 QCOMPARE(wv->property("newWindowComponent"), QVariant::fromValue(&substituteComponent));
301 QCOMPARE(newWindowComponentSpy.count(), 1);
302
303 wv->setProperty("newWindowComponent", QVariant::fromValue(&substituteComponent));
304 QCOMPARE(newWindowComponentSpy.count(), 1);
305
306 wv->setProperty("newWindowComponent", QVariant::fromValue((QDeclarativeComponent*)0));
307 QCOMPARE(newWindowComponentSpy.count(), 2);
308 }
309
newWindowParent()310 void tst_QDeclarativeWebView::newWindowParent()
311 {
312 QDeclarativeEngine engine;
313 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/propertychanges.qml"));
314 checkNoErrors(component);
315 QDeclarativeItem* rootItem = qobject_cast<QDeclarativeItem*>(component.create());
316 QVERIFY(rootItem);
317 QObject* wv = rootItem->findChild<QObject*>("webView");
318 QVERIFY(wv);
319 QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
320
321 QDeclarativeItem* oldWindowParent = rootItem->findChild<QDeclarativeItem*>("oldWindowParent");
322 QCOMPARE(qvariant_cast<QDeclarativeItem*>(wv->property("newWindowParent")), oldWindowParent);
323 QSignalSpy newWindowParentSpy(wv, SIGNAL(newWindowParentChanged()));
324
325 QDeclarativeItem* newWindowParent = rootItem->findChild<QDeclarativeItem*>("newWindowParent");
326 wv->setProperty("newWindowParent", QVariant::fromValue(newWindowParent));
327 QVERIFY(newWindowParent);
328 QVERIFY(oldWindowParent);
329 QCOMPARE(oldWindowParent->childItems().count(), 0);
330 QCOMPARE(wv->property("newWindowParent"), QVariant::fromValue(newWindowParent));
331 QCOMPARE(newWindowParentSpy.count(), 1);
332
333 wv->setProperty("newWindowParent", QVariant::fromValue(newWindowParent));
334 QCOMPARE(newWindowParentSpy.count(), 1);
335
336 wv->setProperty("newWindowParent", QVariant::fromValue((QDeclarativeItem*)0));
337 QCOMPARE(newWindowParentSpy.count(), 2);
338 }
339
preferredWidthTest()340 void tst_QDeclarativeWebView::preferredWidthTest()
341 {
342 QDeclarativeEngine engine;
343 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/webviewtest.qml"));
344 checkNoErrors(component);
345 QObject* wv = component.create();
346 QVERIFY(wv);
347 wv->setProperty("testUrl", QUrl("qrc:///resources/sample.html"));
348 QCOMPARE(wv->property("prefWidth").toInt(), 600);
349 }
350
preferredHeightTest()351 void tst_QDeclarativeWebView::preferredHeightTest()
352 {
353 QDeclarativeEngine engine;
354 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/webviewtest.qml"));
355 checkNoErrors(component);
356 QObject* wv = component.create();
357 QVERIFY(wv);
358 wv->setProperty("testUrl", QUrl("qrc:///resources/sample.html"));
359 QCOMPARE(wv->property("prefHeight").toInt(), 500);
360 }
361
preferredWidthDefaultTest()362 void tst_QDeclarativeWebView::preferredWidthDefaultTest()
363 {
364 QGraphicsWebView view;
365 view.load(QUrl("qrc:///resources/sample.html"));
366
367 QDeclarativeEngine engine;
368 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/webviewtestdefault.qml"));
369 checkNoErrors(component);
370 QObject* wv = component.create();
371 QVERIFY(wv);
372 wv->setProperty("testUrl", QUrl("qrc:///resources/sample.html"));
373 QCOMPARE(wv->property("prefWidth").toDouble(), view.preferredWidth());
374 }
375
preferredHeightDefaultTest()376 void tst_QDeclarativeWebView::preferredHeightDefaultTest()
377 {
378 QGraphicsWebView view;
379 view.load(QUrl("qrc:///resources/sample.html"));
380
381 QDeclarativeEngine engine;
382 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/webviewtestdefault.qml"));
383 checkNoErrors(component);
384 QObject* wv = component.create();
385 QVERIFY(wv);
386 wv->setProperty("testUrl", QUrl("qrc:///resources/sample.html"));
387 QCOMPARE(wv->property("prefHeight").toDouble(), view.preferredHeight());
388 }
389
pressGrabTime()390 void tst_QDeclarativeWebView::pressGrabTime()
391 {
392 QDeclarativeEngine engine;
393 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/propertychanges.qml"));
394 checkNoErrors(component);
395 QDeclarativeItem* rootItem = qobject_cast<QDeclarativeItem*>(component.create());
396 QVERIFY(rootItem);
397 QObject* wv = rootItem->findChild<QObject*>("webView");
398 QVERIFY(wv);
399 QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
400 QCOMPARE(wv->property("pressGrabTime").toInt(), 200);
401 QSignalSpy pressGrabTimeSpy(wv, SIGNAL(pressGrabTimeChanged()));
402
403 wv->setProperty("pressGrabTime", 100);
404 QCOMPARE(wv->property("pressGrabTime").toInt(), 100);
405 QCOMPARE(pressGrabTimeSpy.count(), 1);
406
407 wv->setProperty("pressGrabTime", 100);
408 QCOMPARE(pressGrabTimeSpy.count(), 1);
409
410 wv->setProperty("pressGrabTime", 0);
411 QCOMPARE(pressGrabTimeSpy.count(), 2);
412 }
413
renderingEnabled()414 void tst_QDeclarativeWebView::renderingEnabled()
415 {
416 QDeclarativeEngine engine;
417 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/propertychanges.qml"));
418 checkNoErrors(component);
419 QDeclarativeItem* rootItem = qobject_cast<QDeclarativeItem*>(component.create());
420 QVERIFY(rootItem);
421 QObject* wv = rootItem->findChild<QObject*>("webView");
422 QVERIFY(wv);
423 QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
424
425 QVERIFY(wv->property("renderingEnabled").toBool());
426 QSignalSpy renderingEnabledSpy(wv, SIGNAL(renderingEnabledChanged()));
427
428 wv->setProperty("renderingEnabled", false);
429 QVERIFY(!wv->property("renderingEnabled").toBool());
430 QCOMPARE(renderingEnabledSpy.count(), 1);
431
432 wv->setProperty("renderingEnabled", false);
433 QCOMPARE(renderingEnabledSpy.count(), 1);
434
435 wv->setProperty("renderingEnabled", true);
436 QCOMPARE(renderingEnabledSpy.count(), 2);
437 }
438
setHtml()439 void tst_QDeclarativeWebView::setHtml()
440 {
441 QDeclarativeEngine engine;
442 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/sethtml.qml"));
443 checkNoErrors(component);
444 QObject* wv = component.create();
445 QVERIFY(wv);
446 QCOMPARE(wv->property("html").toString(), QLatin1String("<html><head></head><body><p>This is a <b>string</b> set on the WebView</p></body></html>"));
447
448 QSignalSpy spy(wv, SIGNAL(htmlChanged()));
449 wv->setProperty("html", QLatin1String("<html><head><title>Basic</title></head><body><p>text</p></body></html>"));
450 QCOMPARE(spy.count(), 1);
451 }
452
settings()453 void tst_QDeclarativeWebView::settings()
454 {
455 QDeclarativeEngine engine;
456 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/basic.qml"));
457 checkNoErrors(component);
458 QObject* wv = component.create();
459 QVERIFY(wv);
460 QTRY_COMPARE(wv->property("progress").toDouble(), 1.0);
461
462 QObject* s = QDeclarativeProperty(wv, "settings").object();
463 QVERIFY(s);
464
465 QStringList settingsList;
466 settingsList << QString::fromAscii("autoLoadImages")
467 << QString::fromAscii("developerExtrasEnabled")
468 << QString::fromAscii("javaEnabled")
469 << QString::fromAscii("javascriptCanAccessClipboard")
470 << QString::fromAscii("javascriptCanOpenWindows")
471 << QString::fromAscii("javascriptEnabled")
472 << QString::fromAscii("linksIncludedInFocusChain")
473 << QString::fromAscii("localContentCanAccessRemoteUrls")
474 << QString::fromAscii("localStorageDatabaseEnabled")
475 << QString::fromAscii("offlineStorageDatabaseEnabled")
476 << QString::fromAscii("offlineWebApplicationCacheEnabled")
477 << QString::fromAscii("pluginsEnabled")
478 << QString::fromAscii("printElementBackgrounds")
479 << QString::fromAscii("privateBrowsingEnabled")
480 << QString::fromAscii("zoomTextOnly");
481
482 // Merely tests that setting gets stored (in QWebSettings), behavioural tests are in WebKit.
483 for (int b = 0; b <= 1; b++) {
484 bool value = !!b;
485 foreach (const QString& name, settingsList)
486 s->setProperty(name.toAscii().data(), value);
487 for (int i = 0; i < 2; i++) {
488 foreach (const QString& name, settingsList)
489 QCOMPARE(s->property(name.toAscii().data()).toBool(), value);
490 }
491 }
492 }
493
494 #if QT_VERSION >= 0x040703
backgroundColor()495 void tst_QDeclarativeWebView::backgroundColor()
496 {
497 // We test here the rendering of the background.
498 QDeclarativeEngine engine;
499 QDeclarativeComponent component(&engine, QUrl("qrc:///resources/webviewbackgroundcolor.qml"));
500 checkNoErrors(component);
501 QObject* wv = component.create();
502 QVERIFY(wv);
503 QCOMPARE(wv->property("backgroundColor").value<QColor>(), QColor(Qt::red));
504 QDeclarativeView view;
505 view.setSource(QUrl("qrc:///resources/webviewbackgroundcolor.qml"));
506 view.show();
507 QTest::qWaitForWindowShown(&view);
508 QPixmap result(view.width(), view.height());
509 QPainter painter(&result);
510 view.render(&painter);
511 QPixmap reference(view.width(), view.height());
512 reference.fill(Qt::red);
513 QCOMPARE(reference, result);
514
515 // We test the emission of the backgroundColorChanged signal.
516 QSignalSpy spyColorChanged(wv, SIGNAL(backgroundColorChanged()));
517 wv->setProperty("backgroundColor", Qt::red);
518 QCOMPARE(spyColorChanged.count(), 0);
519 wv->setProperty("backgroundColor", Qt::green);
520 QCOMPARE(spyColorChanged.count(), 1);
521 }
522 #endif
523
checkNoErrors(const QDeclarativeComponent & component)524 void tst_QDeclarativeWebView::checkNoErrors(const QDeclarativeComponent& component)
525 {
526 // Wait until the component is ready
527 QTRY_VERIFY(component.isReady() || component.isError());
528 if (component.isError()) {
529 QList<QDeclarativeError> errors = component.errors();
530 for (int ii = 0; ii < errors.count(); ++ii) {
531 const QDeclarativeError &error = errors.at(ii);
532 QByteArray errorStr = QByteArray::number(error.line()) + ":" +
533 QByteArray::number(error.column()) + ":" +
534 error.description().toUtf8();
535 qWarning() << errorStr;
536 }
537 }
538 QVERIFY(!component.isError());
539 }
540
541 QTEST_MAIN(tst_QDeclarativeWebView)
542 #include "tst_qdeclarativewebview.moc"
543
544 QT_END_NAMESPACE
545