summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/qwebenginepage
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@theqtcompany.com>2015-08-31 12:13:50 +0200
committerJoerg Bornemann <joerg.bornemann@theqtcompany.com>2015-09-03 15:18:24 +0000
commitd85a349f4136554cfaa5349303270ad37b121941 (patch)
tree13160d9b6a51767bec97cd5b94a64c614414c1fb /tests/auto/widgets/qwebenginepage
parentf3c210b5017006ab10522078a55b4b8c70c442a1 (diff)
stabilize QWebEnginePage tests that use JS callbacks
Replace the QTest::qWait calls with a watcher object that can wait on JS callbacks. Change-Id: Iad5cfb73f31661103698fdb1c00e8a1e16f9981e Reviewed-by: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com>
Diffstat (limited to 'tests/auto/widgets/qwebenginepage')
-rw-r--r--tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp98
1 files changed, 87 insertions, 11 deletions
diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
index c77799387..4ed79e0c0 100644
--- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
+++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
@@ -3685,41 +3685,115 @@ void tst_QWebEnginePage::cssMediaTypePageSetting()
#endif
}
-class JavaScriptCallback
+class JavaScriptCallbackBase
+{
+public:
+ JavaScriptCallbackBase()
+ {
+ if (watcher)
+ QMetaObject::invokeMethod(watcher, "add");
+ }
+
+ void operator() (const QVariant &result)
+ {
+ check(result);
+ if (watcher)
+ QMetaObject::invokeMethod(watcher, "notify");
+ }
+
+protected:
+ virtual void check(const QVariant &result) = 0;
+
+private:
+ friend class JavaScriptCallbackWatcher;
+ static QPointer<QObject> watcher;
+};
+
+QPointer<QObject> JavaScriptCallbackBase::watcher = 0;
+
+class JavaScriptCallback : public JavaScriptCallbackBase
{
public:
JavaScriptCallback() { }
JavaScriptCallback(const QVariant& _expected) : expected(_expected) { }
- virtual void operator() (const QVariant& result) {
+
+ void check(const QVariant& result) Q_DECL_OVERRIDE
+ {
QVERIFY(result.isValid());
QCOMPARE(result, expected);
}
+
private:
QVariant expected;
};
-class JavaScriptCallbackNull
+class JavaScriptCallbackNull : public JavaScriptCallbackBase
{
public:
- virtual void operator() (const QVariant& result) {
+ void check(const QVariant& result) Q_DECL_OVERRIDE
+ {
QVERIFY(result.isNull());
// FIXME: Returned null values are currently invalid QVariants.
// QVERIFY(result.isValid());
}
};
-class JavaScriptCallbackUndefined
+class JavaScriptCallbackUndefined : public JavaScriptCallbackBase
{
public:
- virtual void operator() (const QVariant& result) {
+ void check(const QVariant& result) Q_DECL_OVERRIDE
+ {
QVERIFY(result.isNull());
QVERIFY(!result.isValid());
}
};
+class JavaScriptCallbackWatcher : public QObject
+{
+ Q_OBJECT
+public:
+ JavaScriptCallbackWatcher()
+ {
+ Q_ASSERT(!JavaScriptCallbackBase::watcher);
+ JavaScriptCallbackBase::watcher = this;
+ }
+
+ Q_INVOKABLE void add()
+ {
+ available++;
+ }
+
+ Q_INVOKABLE void notify()
+ {
+ called++;
+ if (called == available)
+ emit allCalled();
+ }
+
+ bool wait(int maxSeconds = 30)
+ {
+ if (called == available)
+ return true;
+
+ QTestEventLoop loop;
+ connect(this, SIGNAL(allCalled()), &loop, SLOT(exitLoop()));
+ loop.enterLoop(maxSeconds);
+ return !loop.timeout();
+ }
+
+signals:
+ void allCalled();
+
+private:
+ int available = 0;
+ int called = 0;
+};
+
+
void tst_QWebEnginePage::runJavaScript()
{
TestPage page;
+ JavaScriptCallbackWatcher watcher;
JavaScriptCallback callbackBool(QVariant(false));
page.runJavaScript("false", QWebEngineCallback<const QVariant&>(callbackBool));
@@ -3748,7 +3822,7 @@ void tst_QWebEnginePage::runJavaScript()
JavaScriptCallbackUndefined callbackUndefined;
page.runJavaScript("undefined", QWebEngineCallback<const QVariant&>(callbackUndefined));
- QTest::qWait(100);
+ QVERIFY(watcher.wait());
}
class FullScreenPage : public QWebEnginePage {
@@ -3771,6 +3845,7 @@ protected:
void tst_QWebEnginePage::fullScreenRequested()
{
+ JavaScriptCallbackWatcher watcher;
FullScreenPage* page = new FullScreenPage;
QWebEngineView* view = new QWebEngineView;
view->setPage(page);
@@ -3784,19 +3859,20 @@ void tst_QWebEnginePage::fullScreenRequested()
page->runJavaScript("document.webkitFullscreenEnabled", JavaScriptCallback(true));
page->runJavaScript("document.webkitIsFullScreen", JavaScriptCallback(false));
+ QVERIFY(watcher.wait());
// FullscreenRequest must be a user gesture
QTest::keyPress(qApp->focusWindow(), Qt::Key_Space);
QTest::qWait(100);
page->runJavaScript("document.webkitIsFullScreen", JavaScriptCallback(true));
- page->runJavaScript("document.webkitExitFullscreen()");
- QTest::qWait(100);
+ page->runJavaScript("document.webkitExitFullscreen()", JavaScriptCallbackUndefined());
+ QVERIFY(watcher.wait());
page->setIsFullScreen(false);
page->runJavaScript("document.webkitFullscreenEnabled", JavaScriptCallback(true));
QTest::keyPress(qApp->focusWindow(), Qt::Key_Space);
- QTest::qWait(100);
+ QVERIFY(watcher.wait());
page->runJavaScript("document.webkitIsFullScreen", JavaScriptCallback(false));
- QTest::qWait(100);
+ QVERIFY(watcher.wait());
delete view;
delete page;