Skip to content

Commit acf966b

Browse files
author
hekra01
authored
Merge pull request #28 from cisco-open-source/WIP_QQuickWindow
Enable use of QQmlApplicationEngine by using QQuickWindow instead if QQuickView
2 parents fbf036d + d5a4766 commit acf966b

File tree

5 files changed

+138
-85
lines changed

5 files changed

+138
-85
lines changed

inc/extension_qt/quick2_view_executor.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <QtCore/QXmlStreamWriter>
2727
#include <QtQuick/QQuickView>
2828
#include <QtQuick/QQuickItem>
29+
#include <QtQuick/QQuickWindow>
2930

3031
namespace webdriver {
3132

@@ -137,15 +138,15 @@ class Quick2ViewCmdExecutor : public QWindowViewCmdExecutor {
137138
virtual void IsOnline(bool*, Error** error) NOT_SUPPORTED_IMPL;
138139

139140
protected:
140-
QQuickView* getView(const ViewId& viewId, Error** error);
141+
QQuickWindow* getView(const ViewId& viewId, Error** error);
141142
typedef QHash<QString, QQuickItem*> XMLElementMap;
142143

143144
QQuickItem* getElement(const ElementId &element, Error** error);
144-
QQuickItem* getFocusItem(QQuickView* view);
145+
QQuickItem* getFocusItem(QQuickWindow* view);
145146
bool FilterElement(const QQuickItem* item, const std::string& locator, const std::string& query);
146147
void FindElementsByXpath(QQuickItem* parent, const std::string &query, std::vector<ElementId>* elements, Error **error);
147148
void FindElements(QQuickItem* parent, const std::string& locator, const std::string& query, std::vector<ElementId>* elements, Error** error);
148-
void moveMouseInternal(QQuickView* view, QPointF& point);
149+
void moveMouseInternal(QQuickWindow* view, QPointF& point);
149150

150151
private:
151152
DISALLOW_COPY_AND_ASSIGN(Quick2ViewCmdExecutor);

src/webdriver/extension_qt/qml_view_util.cc

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ QWindow* QQmlViewUtil::getQWindowView(Session* session, const ViewId& viewId) {
9494
return qobject_cast<QWindow*>(qViewHandle->get());
9595
}
9696

97-
QQuickView* QQmlViewUtil::getQMLView(Session* session, const ViewId& viewId) {
97+
QQuickWindow* QQmlViewUtil::getQMLView(Session* session, const ViewId& viewId) {
9898
ViewHandle* viewHandle = session->GetViewHandle(viewId);
9999
if (NULL == viewHandle)
100100
return NULL;
@@ -103,8 +103,69 @@ QQuickView* QQmlViewUtil::getQMLView(Session* session, const ViewId& viewId) {
103103
if (NULL == qViewHandle)
104104
return NULL;
105105

106-
return qobject_cast<QQuickView*>(qViewHandle->get());
106+
return qobject_cast<QQuickWindow*>(qViewHandle->get());
107107
}
108+
109+
QQmlEngine* QQmlViewUtil::getQMLEngine(QQuickWindow* qquickWindow) {
110+
QQuickView* pView = qobject_cast<QQuickView*>(qquickWindow);
111+
112+
if (pView != NULL)
113+
return pView->engine();
114+
115+
QQmlContext *rootContext = QQmlEngine::contextForObject(qquickWindow->contentItem());
116+
117+
return rootContext->engine();
118+
}
119+
120+
void QQmlViewUtil::setSource(const Logger& logger, const QUrl &url, bool sync, QQuickWindow* qquickWindow) {
121+
QQuickView* pView = qobject_cast<QQuickView*>(qquickWindow);
122+
123+
if (pView != NULL) {
124+
if (sync) {
125+
QEventLoop loop;
126+
QObject::connect(pView, SIGNAL(statusChanged(QQuickView::Status)),&loop,SLOT(quit()));
127+
pView->setSource(url);
128+
129+
if (QQuickView::Loading == pView->status()) {
130+
loop.exec();
131+
}
132+
133+
if (QQuickView::Ready != pView->status()) {
134+
logger.Log(kWarningLogLevel, "QML sync load, smth wrong. View is not in READY state.");
135+
}
136+
137+
} else {
138+
pView->setSource(url);
139+
logger.Log(kFineLogLevel, "QML async load - ");
140+
}
141+
}
142+
else {
143+
// TODO async / sync mode
144+
QQmlEngine* engine = QQmlViewUtil::getQMLEngine(qquickWindow);
145+
QQmlApplicationEngine* appEngine = qobject_cast<QQmlApplicationEngine*>(engine);
146+
147+
if (appEngine != NULL) {
148+
appEngine->load(url);
149+
}
150+
}
151+
}
152+
153+
const QUrl QQmlViewUtil::getSource(QQuickWindow* qquickWindow) {
154+
QQuickView* pView = qobject_cast<QQuickView*>(qquickWindow);
155+
156+
if (pView != NULL) {
157+
return pView->source();
158+
}
159+
160+
QQmlEngine* engine = QQmlViewUtil::getQMLEngine(qquickWindow);
161+
QQmlApplicationEngine* appEngine = qobject_cast<QQmlApplicationEngine*>(engine);
162+
163+
if (appEngine != NULL) {
164+
return appEngine->baseUrl();
165+
}
166+
return QUrl();
167+
}
168+
108169
#else
109170
void QQmlViewUtil::removeInternalSuffixes(QString& str) {
110171
str.remove(QRegExp(QLatin1String("_QMLTYPE_\\d+")));

src/webdriver/extension_qt/qml_view_util.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,14 @@
2525
#include <QtCore/QDebug>
2626

2727
#include "common_util.h"
28+
#include "webdriver_logging.h"
2829

2930
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
3031
class QWindow;
3132
class QQuickView;
3233
#include <QtQuick/QQuickItem>
34+
#include <QtQml/QQmlContext>
35+
#include <QtQml/QQmlApplicationEngine>
3336
#else
3437
class QDeclarativeView;
3538
#include <QtDeclarative/QDeclarativeItem>
@@ -49,7 +52,10 @@ class QQmlViewUtil {
4952

5053
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
5154
static QWindow* getQWindowView(Session* session, const ViewId& viewId);
52-
static QQuickView* getQMLView(Session* session, const ViewId& viewId);
55+
static QQuickWindow* getQMLView(Session* session, const ViewId& viewId);
56+
static QQmlEngine* getQMLEngine(QQuickWindow* qquickWindow);
57+
static void setSource(const Logger& logger, const QUrl &url, bool sync, QQuickWindow* qquickWindow);
58+
static const QUrl getSource(QQuickWindow* qquickWindow);
5359
#else
5460
static QDeclarativeView* getQMLView(Session* session, const ViewId& viewId);
5561
#endif

src/webdriver/extension_qt/quick2_view_enumerator.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <QtGui/QGuiApplication>
3030
#include <QtQml/QQmlEngine>
3131
#include <QtQuick/QQuickView>
32+
#include <QtQuick/QQuickWindow>
3233

3334
namespace webdriver {
3435

@@ -39,7 +40,7 @@ void Quick2ViewEnumeratorImpl::EnumerateViews(Session* session, std::set<ViewId>
3940
{
4041
if (!pWindow->isVisible()) continue;
4142

42-
QQuickView* pView = qobject_cast<QQuickView*>(pWindow);
43+
QQuickWindow* pView = qobject_cast<QQuickWindow*>(pWindow);
4344
if (pView != NULL) {
4445
ViewHandlePtr handle(new QWindowViewHandle(pView));
4546
ViewId viewId = session->GetViewForHandle(handle);

0 commit comments

Comments
 (0)