summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/quick/html/basic_page.html6
-rw-r--r--tests/auto/quick/html/basic_page2.html1
-rw-r--r--tests/auto/quick/html/direct-image-compositing.html66
-rw-r--r--tests/auto/quick/html/inputmethod.html11
-rw-r--r--tests/auto/quick/html/resources/simple_image.pngbin0 -> 10585 bytes
-rw-r--r--tests/auto/quick/html/scroll.html29
-rw-r--r--tests/auto/quick/qmltests/qmltests.pro2
-rw-r--r--tests/auto/quick/qquickwebengineview/qquickwebengineview.pro6
-rw-r--r--tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp422
-rw-r--r--tests/auto/quick/quick.pro1
-rw-r--r--tests/auto/quick/shared/testwindow.h59
-rw-r--r--tests/auto/quick/shared/util.h125
-rw-r--r--tests/auto/quick/tests.pri4
13 files changed, 729 insertions, 3 deletions
diff --git a/tests/auto/quick/html/basic_page.html b/tests/auto/quick/html/basic_page.html
new file mode 100644
index 000000000..53726e4a6
--- /dev/null
+++ b/tests/auto/quick/html/basic_page.html
@@ -0,0 +1,6 @@
+<html>
+<head>
+<title> Basic Page </title>
+</head>
+<h1>Basic page</h1>
+</html>
diff --git a/tests/auto/quick/html/basic_page2.html b/tests/auto/quick/html/basic_page2.html
new file mode 100644
index 000000000..f8cff2969
--- /dev/null
+++ b/tests/auto/quick/html/basic_page2.html
@@ -0,0 +1 @@
+<h1>Basic page 2</h1>
diff --git a/tests/auto/quick/html/direct-image-compositing.html b/tests/auto/quick/html/direct-image-compositing.html
new file mode 100644
index 000000000..53a4ca137
--- /dev/null
+++ b/tests/auto/quick/html/direct-image-compositing.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+
+<html lang="en">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <title>Testing direct image layer optimization</title>
+ <style type="text/css" media="screen">
+ img {
+ float: left;
+ width: 150px;
+ height: 150px;
+ }
+ img {
+ -webkit-transform: rotate3d(0, 0, 1, 0);
+ }
+ .test {
+ float: left;
+ height: 200px;
+ width: 260px;
+ }
+ </style>
+</head>
+<body>
+
+ <h1>Image optimization in layers</h1>
+
+ <p>
+ This test exercises direct compositing of images with hardware acceleration. The visual results
+ using ACCELERATED_COMPOSITING and regular TOT should be identical. Running this test manually with
+ the correct debug options will show which elements are directly composited. See
+ <a href="https://bugs.webkit.org/show_bug.cgi?id=23361">https://bugs.webkit.org/show_bug.cgi?id=23361</a>
+ </p>
+
+ <div class="test">
+ <img src="resources/simple_image.png">
+ Basic image - no style - can be directly composited
+ </div>
+
+ <div class="test">
+ <img src="resources/simple_image.png" style="border: 5px solid blue;">
+ 5px blue border - can NOT be directly composited
+ </div>
+
+ <div class="test">
+ <img src="resources/simple_image.png" style="margin: 5px 5px;">
+ margin - can NOT be directly composited
+ </div>
+
+ <div class="test">
+ <img src="resources/simple_image.png" style="background-color: grey;">
+ solid background - can be directly composited
+ </div>
+
+ <div class="test">
+ <img src="resources/simple_image.png" style="background: orange url(resources/simple_image.png) -50px -50px;">
+ background image - can NOT be directly composited
+ </div>
+
+ <div class="test">
+ <img src="resources/simple_image.png" style="-webkit-transform: rotate3d(0, 0, 1, 10deg);">
+ rotated but otherwise no style - can be directly composited
+ </div>
+
+</body>
+</html>
diff --git a/tests/auto/quick/html/inputmethod.html b/tests/auto/quick/html/inputmethod.html
new file mode 100644
index 000000000..dc9140f9d
--- /dev/null
+++ b/tests/auto/quick/html/inputmethod.html
@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>Basic Page For Input Method Testing</title>
+</head>
+<body>
+<h1>Basic page</h1>
+<input id="inputField" />
+<input id="emailInputField" type="email" />
+<div id="editableDiv" contenteditable></div>
+</body>
+</html>
diff --git a/tests/auto/quick/html/resources/simple_image.png b/tests/auto/quick/html/resources/simple_image.png
new file mode 100644
index 000000000..4685399ca
--- /dev/null
+++ b/tests/auto/quick/html/resources/simple_image.png
Binary files differ
diff --git a/tests/auto/quick/html/scroll.html b/tests/auto/quick/html/scroll.html
new file mode 100644
index 000000000..ce2193b6c
--- /dev/null
+++ b/tests/auto/quick/html/scroll.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<meta name="viewport" content="width=200, height=500, user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1"/>
+<script type="text/javascript">
+function pageScroll() {
+ window.scrollBy(0,50); // horizontal and vertical scroll increments
+}
+</script>
+<style>
+ body {
+ background-color: blue;
+ margin: 50 50 50 50;
+ }
+ div {
+ font-color: white;
+ background-color: green;
+ width: 300px;
+ height: 1000px;
+ }
+</style>
+
+<head>
+<title>Scroll test </title>
+</head>
+<body onload="pageScroll()">
+<div>
+</div>
+</body>
+</html>
diff --git a/tests/auto/quick/qmltests/qmltests.pro b/tests/auto/quick/qmltests/qmltests.pro
index b25878dc9..b40ef3b8c 100644
--- a/tests/auto/quick/qmltests/qmltests.pro
+++ b/tests/auto/quick/qmltests/qmltests.pro
@@ -4,8 +4,6 @@ QT += qmltest
IMPORTPATH += $$PWD/data
-INCLUDEPATH += $$PWD/../shared
-
OTHER_FILES += \
$$PWD/data/TestWebEngineView.qml \
$$PWD/data/favicon.html \
diff --git a/tests/auto/quick/qquickwebengineview/qquickwebengineview.pro b/tests/auto/quick/qquickwebengineview/qquickwebengineview.pro
new file mode 100644
index 000000000..826b47de7
--- /dev/null
+++ b/tests/auto/quick/qquickwebengineview/qquickwebengineview.pro
@@ -0,0 +1,6 @@
+include(../tests.pri)
+
+exists($${TARGET}.qrc):RESOURCES += $${TARGET}.qrc
+QT_PRIVATE += webengine-private
+
+HEADERS += ../shared/util.h
diff --git a/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp
new file mode 100644
index 000000000..228a3e034
--- /dev/null
+++ b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp
@@ -0,0 +1,422 @@
+/*
+ Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "testwindow.h"
+#include "util.h"
+
+#include <QScopedPointer>
+#include <QtQml/QQmlEngine>
+#include <QtTest/QtTest>
+#include <private/qquickwebengineview_p.h>
+
+class tst_QQuickWebEngineView : public QObject {
+ Q_OBJECT
+public:
+ tst_QQuickWebEngineView();
+
+private Q_SLOTS:
+ void init();
+ void cleanup();
+
+ void navigationStatusAtStartup();
+ void stopEnabledAfterLoadStarted();
+ void baseUrl();
+ void loadEmptyUrl();
+ void loadEmptyPageViewVisible();
+ void loadEmptyPageViewHidden();
+ void loadNonexistentFileUrl();
+ void backAndForward();
+ void reload();
+ void stop();
+ void loadProgress();
+
+ void show();
+ void showWebEngineView();
+ void removeFromCanvas();
+ void multipleWebEngineViewWindows();
+ void multipleWebEngineViews();
+ void titleUpdate();
+ void transparentWebEngineViews();
+
+ void inputMethod();
+ void inputMethodHints();
+ void basicRenderingSanity();
+
+private:
+ inline QQuickWebEngineView *newWebEngineView();
+ inline QQuickWebEngineView *webEngineView() const;
+ void runJavaScript(const QString &script);
+ QScopedPointer<TestWindow> m_window;
+ QScopedPointer<QQmlComponent> m_component;
+};
+
+tst_QQuickWebEngineView::tst_QQuickWebEngineView()
+{
+ QtWebEngine::initialize();
+
+ static QQmlEngine *engine = new QQmlEngine(this);
+ m_component.reset(new QQmlComponent(engine, this));
+ m_component->setData(QByteArrayLiteral("import QtQuick 2.0\n"
+ "import QtWebEngine 1.0\n"
+ "WebEngineView {}")
+ , QUrl());
+}
+
+QQuickWebEngineView *tst_QQuickWebEngineView::newWebEngineView()
+{
+ QObject *viewInstance = m_component->create();
+ QQuickWebEngineView *webEngineView = qobject_cast<QQuickWebEngineView*>(viewInstance);
+ return webEngineView;
+}
+
+void tst_QQuickWebEngineView::init()
+{
+ m_window.reset(new TestWindow(newWebEngineView()));
+}
+
+void tst_QQuickWebEngineView::cleanup()
+{
+ m_window.reset();
+}
+
+inline QQuickWebEngineView *tst_QQuickWebEngineView::webEngineView() const
+{
+ return static_cast<QQuickWebEngineView*>(m_window->webEngineView.data());
+}
+
+void tst_QQuickWebEngineView::runJavaScript(const QString &script)
+{
+ webEngineView()->runJavaScript(script);
+}
+
+void tst_QQuickWebEngineView::navigationStatusAtStartup()
+{
+ QCOMPARE(webEngineView()->canGoBack(), false);
+
+ QCOMPARE(webEngineView()->canGoForward(), false);
+
+ QCOMPARE(webEngineView()->isLoading(), false);
+}
+
+void tst_QQuickWebEngineView::stopEnabledAfterLoadStarted()
+{
+ QCOMPARE(webEngineView()->isLoading(), false);
+
+ LoadStartedCatcher catcher(webEngineView());
+ webEngineView()->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "/html/basic_page.html")));
+ waitForSignal(&catcher, SIGNAL(finished()));
+
+ QCOMPARE(webEngineView()->isLoading(), true);
+
+ QVERIFY(waitForLoadSucceeded(webEngineView()));
+}
+
+void tst_QQuickWebEngineView::baseUrl()
+{
+ // Test the url is in a well defined state when instanciating the view, but before loading anything.
+ QVERIFY(webEngineView()->url().isEmpty());
+}
+
+void tst_QQuickWebEngineView::loadEmptyUrl()
+{
+ webEngineView()->setUrl(QUrl());
+ webEngineView()->setUrl(QUrl(QLatin1String("")));
+}
+
+void tst_QQuickWebEngineView::loadEmptyPageViewVisible()
+{
+ m_window->show();
+ loadEmptyPageViewHidden();
+}
+
+void tst_QQuickWebEngineView::loadEmptyPageViewHidden()
+{
+ QSignalSpy loadSpy(webEngineView(), SIGNAL(loadingChanged(QQuickWebEngineLoadRequest*)));
+
+ webEngineView()->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/basic_page.html")));
+ QVERIFY(waitForLoadSucceeded(webEngineView()));
+
+ QCOMPARE(loadSpy.size(), 2);
+}
+
+void tst_QQuickWebEngineView::loadNonexistentFileUrl()
+{
+ QSignalSpy loadSpy(webEngineView(), SIGNAL(loadingChanged(QQuickWebEngineLoadRequest*)));
+
+ webEngineView()->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/file_that_does_not_exist.html")));
+ QVERIFY(waitForLoadFailed(webEngineView()));
+
+ QCOMPARE(loadSpy.size(), 2);
+}
+
+void tst_QQuickWebEngineView::backAndForward()
+{
+ webEngineView()->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/basic_page.html")));
+ QVERIFY(waitForLoadSucceeded(webEngineView()));
+
+ QCOMPARE(webEngineView()->url().path(), QLatin1String(TESTS_SOURCE_DIR "html/basic_page.html"));
+
+ webEngineView()->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/basic_page2.html")));
+ QVERIFY(waitForLoadSucceeded(webEngineView()));
+
+ QCOMPARE(webEngineView()->url().path(), QLatin1String(TESTS_SOURCE_DIR "html/basic_page2.html"));
+
+ webEngineView()->goBack();
+ QVERIFY(waitForLoadSucceeded(webEngineView()));
+
+ QCOMPARE(webEngineView()->url().path(), QLatin1String(TESTS_SOURCE_DIR "html/basic_page.html"));
+
+ webEngineView()->goForward();
+ QVERIFY(waitForLoadSucceeded(webEngineView()));
+
+ QCOMPARE(webEngineView()->url().path(), QLatin1String(TESTS_SOURCE_DIR "html/basic_page2.html"));
+}
+
+void tst_QQuickWebEngineView::reload()
+{
+ webEngineView()->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/basic_page.html")));
+ QVERIFY(waitForLoadSucceeded(webEngineView()));
+
+ QCOMPARE(webEngineView()->url().path(), QLatin1String(TESTS_SOURCE_DIR "html/basic_page.html"));
+
+ webEngineView()->reload();
+ QVERIFY(waitForLoadSucceeded(webEngineView()));
+
+ QCOMPARE(webEngineView()->url().path(), QLatin1String(TESTS_SOURCE_DIR "html/basic_page.html"));
+}
+
+void tst_QQuickWebEngineView::stop()
+{
+ webEngineView()->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/basic_page.html")));
+ QVERIFY(waitForLoadSucceeded(webEngineView()));
+
+ QCOMPARE(webEngineView()->url().path(), QLatin1String(TESTS_SOURCE_DIR "html/basic_page.html"));
+
+ webEngineView()->stop();
+}
+
+void tst_QQuickWebEngineView::loadProgress()
+{
+ QCOMPARE(webEngineView()->loadProgress(), 0);
+
+ webEngineView()->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/basic_page.html")));
+ QSignalSpy loadProgressChangedSpy(webEngineView(), SIGNAL(loadProgressChanged()));
+ QVERIFY(waitForLoadSucceeded(webEngineView()));
+
+ QVERIFY(loadProgressChangedSpy.count() >= 1);
+
+ QCOMPARE(webEngineView()->loadProgress(), 100);
+}
+
+void tst_QQuickWebEngineView::show()
+{
+ // This should not crash.
+ m_window->show();
+ QTest::qWait(200);
+ m_window->hide();
+}
+
+void tst_QQuickWebEngineView::showWebEngineView()
+{
+ webEngineView()->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/direct-image-compositing.html")));
+ QVERIFY(waitForLoadSucceeded(webEngineView()));
+ m_window->show();
+ // This should not crash.
+ webEngineView()->setVisible(true);
+ QTest::qWait(200);
+ webEngineView()->setVisible(false);
+ QTest::qWait(200);
+}
+
+void tst_QQuickWebEngineView::removeFromCanvas()
+{
+ showWebEngineView();
+
+ // This should not crash.
+ QQuickItem *parent = webEngineView()->parentItem();
+ QQuickItem noCanvasItem;
+ webEngineView()->setParentItem(&noCanvasItem);
+ QTest::qWait(200);
+ webEngineView()->setParentItem(parent);
+ webEngineView()->setVisible(true);
+ QTest::qWait(200);
+}
+
+void tst_QQuickWebEngineView::multipleWebEngineViewWindows()
+{
+ showWebEngineView();
+
+ // This should not crash.
+ QQuickWebEngineView *webEngineView1 = newWebEngineView();
+ QScopedPointer<TestWindow> window1(new TestWindow(webEngineView1));
+ QQuickWebEngineView *webEngineView2 = newWebEngineView();
+ QScopedPointer<TestWindow> window2(new TestWindow(webEngineView2));
+
+ webEngineView1->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/scroll.html")));
+ QVERIFY(waitForLoadSucceeded(webEngineView1));
+ window1->show();
+ webEngineView1->setVisible(true);
+
+ webEngineView2->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/basic_page.html")));
+ QVERIFY(waitForLoadSucceeded(webEngineView2));
+ window2->show();
+ webEngineView2->setVisible(true);
+ QTest::qWait(200);
+}
+
+void tst_QQuickWebEngineView::multipleWebEngineViews()
+{
+ showWebEngineView();
+
+ // This should not crash.
+ QScopedPointer<QQuickWebEngineView> webEngineView1(newWebEngineView());
+ webEngineView1->setParentItem(m_window->contentItem());
+ QScopedPointer<QQuickWebEngineView> webEngineView2(newWebEngineView());
+ webEngineView2->setParentItem(m_window->contentItem());
+
+ webEngineView1->setSize(QSizeF(300, 400));
+ webEngineView1->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/scroll.html")));
+ QVERIFY(waitForLoadSucceeded(webEngineView1.data()));
+ webEngineView1->setVisible(true);
+
+ webEngineView2->setSize(QSizeF(300, 400));
+ webEngineView2->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/basic_page.html")));
+ QVERIFY(waitForLoadSucceeded(webEngineView2.data()));
+ webEngineView2->setVisible(true);
+ QTest::qWait(200);
+}
+
+void tst_QQuickWebEngineView::basicRenderingSanity()
+{
+ showWebEngineView();
+
+ webEngineView()->setUrl(QUrl(QString::fromUtf8("data:text/html,<html><body bgcolor=\"#00ff00\"></body></html>")));
+ QVERIFY(waitForLoadSucceeded(webEngineView()));
+
+ // This should not crash.
+ webEngineView()->setVisible(true);
+ QTest::qWait(200);
+ QImage grabbedWindow = m_window->grabWindow();
+ QRgb testColor = qRgba(0, 0xff, 0, 0xff);
+ QVERIFY(grabbedWindow.pixel(10, 10) == testColor);
+ QVERIFY(grabbedWindow.pixel(100, 10) == testColor);
+ QVERIFY(grabbedWindow.pixel(10, 100) == testColor);
+ QVERIFY(grabbedWindow.pixel(100, 100) == testColor);
+}
+
+void tst_QQuickWebEngineView::titleUpdate()
+{
+ QSignalSpy titleSpy(webEngineView(), SIGNAL(titleChanged()));
+
+ // Load page with no title
+ webEngineView()->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/basic_page2.html")));
+ QVERIFY(waitForLoadSucceeded(webEngineView()));
+ QCOMPARE(titleSpy.size(), 1);
+
+ titleSpy.clear();
+
+ // No titleChanged signal for failed load
+ webEngineView()->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/file_that_does_not_exist.html")));
+ QVERIFY(waitForLoadFailed(webEngineView()));
+ QCOMPARE(titleSpy.size(), 0);
+
+}
+
+void tst_QQuickWebEngineView::transparentWebEngineViews()
+{
+
+ showWebEngineView();
+
+ // This should not crash.
+ QScopedPointer<QQuickWebEngineView> webEngineView1(newWebEngineView());
+ webEngineView1->setParentItem(m_window->contentItem());
+ QScopedPointer<QQuickWebEngineView> webEngineView2(newWebEngineView());
+ webEngineView2->setParentItem(m_window->contentItem());
+#if !defined(QQUICKWEBENGINEVIEW_EXPERIMENTAL_TRANSPARENTBACKGROUND)
+ QWARN("QQUICKWEBENGINEVIEW_EXPERIMENTAL_TRANSPARENTBACKGROUND");
+#else
+ QVERIFY(!webEngineView1->experimental()->transparentBackground());
+ webEngineView2->experimental()->setTransparentBackground(true);
+ QVERIFY(webEngineView2->experimental()->transparentBackground());
+#endif
+
+ webEngineView1->setSize(QSizeF(300, 400));
+ webEngineView1->loadHtml("<html><body bgcolor=\"red\"></body></html>");
+ QVERIFY(waitForLoadSucceeded(webEngineView1.data()));
+ webEngineView1->setVisible(true);
+
+ webEngineView2->setSize(QSizeF(300, 400));
+ webEngineView2->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "/html/basic_page.html")));
+ QVERIFY(waitForLoadSucceeded(webEngineView2.data()));
+ webEngineView2->setVisible(true);
+
+ QTest::qWait(200);
+ // FIXME: test actual rendering results; https://bugs.webkit.org/show_bug.cgi?id=80609.
+}
+
+void tst_QQuickWebEngineView::inputMethod()
+{
+#if !defined(QQUICKWEBENGINEVIEW_ITEMACCEPTSINPUTMETHOD)
+ QSKIP("QQUICKWEBENGINEVIEW_ITEMACCEPTSINPUTMETHOD");
+#else
+ QQuickWebEngineView *view = webEngineView();
+ view->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/inputmethod.html")));
+ QVERIFY(waitForLoadSucceeded(view));
+
+ QVERIFY(!view->flags().testFlag(QQuickItem::ItemAcceptsInputMethod));
+ runJavaScript("document.getElementById('inputField').focus();");
+ QVERIFY(view->flags().testFlag(QQuickItem::ItemAcceptsInputMethod));
+ runJavaScript("document.getElementById('inputField').blur();");
+ QVERIFY(!view->flags().testFlag(QQuickItem::ItemAcceptsInputMethod));
+#endif
+}
+
+void tst_QQuickWebEngineView::inputMethodHints()
+{
+#if !defined(QQUICKWEBENGINEVIEW_ITEMACCEPTSINPUTMETHOD)
+ QSKIP("QQUICKWEBENGINEVIEW_ITEMACCEPTSINPUTMETHOD");
+#else
+ QQuickWebEngineView *view = webEngineView();
+
+ view->setUrl(QUrl::fromLocalFile(QLatin1String(TESTS_SOURCE_DIR "html/inputmethod.html")));
+ QVERIFY(waitForLoadSucceeded(view));
+
+ // Setting focus on an input element results in an element in its shadow tree becoming the focus node.
+ // Input hints should not be set from this shadow tree node but from the input element itself.
+ runJavaScript("document.getElementById('emailInputField').focus();");
+ QVERIFY(view->flags().testFlag(QQuickItem::ItemAcceptsInputMethod));
+ QInputMethodQueryEvent query(Qt::ImHints);
+ QGuiApplication::sendEvent(view, &query);
+ Qt::InputMethodHints hints(query.value(Qt::ImHints).toUInt() & Qt::ImhExclusiveInputMask);
+ QCOMPARE(hints, Qt::ImhEmailCharactersOnly);
+
+ // The focus of an editable DIV is given directly to it, so no shadow root element
+ // is necessary. This tests the WebPage::editorState() method ability to get the
+ // right element without breaking.
+ runJavaScript("document.getElementById('editableDiv').focus();");
+ QVERIFY(view->flags().testFlag(QQuickItem::ItemAcceptsInputMethod));
+ query = QInputMethodQueryEvent(Qt::ImHints);
+ QGuiApplication::sendEvent(view, &query);
+ hints = Qt::InputMethodHints(query.value(Qt::ImHints).toUInt());
+ QCOMPARE(hints, Qt::ImhNone);
+#endif
+}
+
+QTEST_MAIN(tst_QQuickWebEngineView)
+#include "tst_qquickwebengineview.moc"
diff --git a/tests/auto/quick/quick.pro b/tests/auto/quick/quick.pro
index e9f83181e..5c9bb72b5 100644
--- a/tests/auto/quick/quick.pro
+++ b/tests/auto/quick/quick.pro
@@ -3,4 +3,5 @@ TEMPLATE = subdirs
SUBDIRS += \
publicapi \
qmltests \
+ qquickwebengineview \
qquickwebengineviewgraphics
diff --git a/tests/auto/quick/shared/testwindow.h b/tests/auto/quick/shared/testwindow.h
new file mode 100644
index 000000000..f5181ee97
--- /dev/null
+++ b/tests/auto/quick/shared/testwindow.h
@@ -0,0 +1,59 @@
+/*
+ Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef TESTWINDOW_H
+#define TESTWINDOW_H
+
+#if 0
+#pragma qt_no_master_include
+#endif
+
+#include <QResizeEvent>
+#include <QScopedPointer>
+#include <QtQuick/qquickitem.h>
+#include <QtQuick/qquickview.h>
+
+// TestWindow: Utility class to ignore QQuickView details.
+class TestWindow : public QQuickView {
+public:
+ inline TestWindow(QQuickItem *webEngineView);
+ QScopedPointer<QQuickItem> webEngineView;
+
+protected:
+ inline void resizeEvent(QResizeEvent*);
+};
+
+inline TestWindow::TestWindow(QQuickItem *webEngineView)
+ : webEngineView(webEngineView)
+{
+ Q_ASSERT(webEngineView);
+ webEngineView->setParentItem(contentItem());
+ resize(300, 400);
+}
+
+inline void TestWindow::resizeEvent(QResizeEvent *event)
+{
+ QQuickView::resizeEvent(event);
+ webEngineView->setX(0);
+ webEngineView->setY(0);
+ webEngineView->setWidth(event->size().width());
+ webEngineView->setHeight(event->size().height());
+}
+
+#endif /* TESTWINDOW_H */
diff --git a/tests/auto/quick/shared/util.h b/tests/auto/quick/shared/util.h
new file mode 100644
index 000000000..8f7a85f68
--- /dev/null
+++ b/tests/auto/quick/shared/util.h
@@ -0,0 +1,125 @@
+/*
+ Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef UTIL_H
+#define UTIL_H
+
+#include <QEventLoop>
+#include <QSignalSpy>
+#include <QTimer>
+#include <QtTest/QtTest>
+#include <private/qquickwebengineview_p.h>
+#include <private/qquickwebengineloadrequest_p.h>
+
+#if !defined(TESTS_SOURCE_DIR)
+#define TESTS_SOURCE_DIR ""
+#endif
+
+class LoadSpy : public QEventLoop {
+ Q_OBJECT
+
+public:
+ LoadSpy(QQuickWebEngineView *webEngineView)
+ {
+ connect(webEngineView, SIGNAL(loadingChanged(QQuickWebEngineLoadRequest*)), SLOT(onLoadingChanged(QQuickWebEngineLoadRequest*)));
+ }
+
+ ~LoadSpy() { }
+
+Q_SIGNALS:
+ void loadSucceeded();
+ void loadFailed();
+
+private Q_SLOTS:
+ void onLoadingChanged(QQuickWebEngineLoadRequest *loadRequest)
+ {
+ if (loadRequest->status() == QQuickWebEngineView::LoadSucceededStatus)
+ emit loadSucceeded();
+ else if (loadRequest->status() == QQuickWebEngineView::LoadFailedStatus)
+ emit loadFailed();
+ }
+};
+
+class LoadStartedCatcher : public QObject {
+ Q_OBJECT
+
+public:
+ LoadStartedCatcher(QQuickWebEngineView *webEngineView)
+ : m_webEngineView(webEngineView)
+ {
+ connect(m_webEngineView, SIGNAL(loadingChanged(QQuickWebEngineLoadRequest*)), this, SLOT(onLoadingChanged(QQuickWebEngineLoadRequest*)));
+ }
+
+ virtual ~LoadStartedCatcher() { }
+
+public Q_SLOTS:
+ void onLoadingChanged(QQuickWebEngineLoadRequest *loadRequest)
+ {
+ if (loadRequest->status() == QQuickWebEngineView::LoadStartedStatus)
+ QMetaObject::invokeMethod(this, "finished", Qt::QueuedConnection);
+ }
+
+Q_SIGNALS:
+ void finished();
+
+private:
+ QQuickWebEngineView *m_webEngineView;
+};
+
+/**
+ * Starts an event loop that runs until the given signal is received.
+ * Optionally the event loop
+ * can return earlier on a timeout.
+ *
+ * \return \p true if the requested signal was received
+ * \p false on timeout
+ */
+inline bool waitForSignal(QObject *obj, const char *signal, int timeout = 10000)
+{
+ QEventLoop loop;
+ QObject::connect(obj, signal, &loop, SLOT(quit()));
+ QTimer timer;
+ QSignalSpy timeoutSpy(&timer, SIGNAL(timeout()));
+ if (timeout > 0) {
+ QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
+ timer.setSingleShot(true);
+ timer.start(timeout);
+ }
+ loop.exec();
+ return timeoutSpy.isEmpty();
+}
+
+inline bool waitForLoadSucceeded(QQuickWebEngineView *webEngineView, int timeout = 10000)
+{
+ LoadSpy loadSpy(webEngineView);
+ return waitForSignal(&loadSpy, SIGNAL(loadSucceeded()), timeout);
+}
+
+inline bool waitForLoadFailed(QQuickWebEngineView *webEngineView, int timeout = 10000)
+{
+ LoadSpy loadSpy(webEngineView);
+ return waitForSignal(&loadSpy, SIGNAL(loadFailed()), timeout);
+}
+
+inline bool waitForViewportReady(QQuickWebEngineView *webEngineView, int timeout = 10000)
+{
+ return waitForSignal(reinterpret_cast<QObject *>(webEngineView->experimental()), SIGNAL(loadVisuallyCommitted()), timeout);
+}
+
+#endif /* UTIL_H */
diff --git a/tests/auto/quick/tests.pri b/tests/auto/quick/tests.pri
index 932407e66..b637c29c1 100644
--- a/tests/auto/quick/tests.pri
+++ b/tests/auto/quick/tests.pri
@@ -7,7 +7,9 @@ VPATH += $$_PRO_FILE_PWD_
TARGET = tst_$$TARGET
SOURCES += $${TARGET}.cpp
-INCLUDEPATH += $$PWD
+INCLUDEPATH += \
+ $$PWD \
+ ../shared
QT += testlib network quick webengine