Skip to content

WIP: QQuickWindow #28

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jan 21, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions inc/extension_qt/quick2_view_executor.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <QtCore/QXmlStreamWriter>
#include <QtQuick/QQuickView>
#include <QtQuick/QQuickItem>
#include <QtQuick/QQuickWindow>

namespace webdriver {

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

protected:
QQuickView* getView(const ViewId& viewId, Error** error);
QQuickWindow* getView(const ViewId& viewId, Error** error);
typedef QHash<QString, QQuickItem*> XMLElementMap;

QQuickItem* getElement(const ElementId &element, Error** error);
QQuickItem* getFocusItem(QQuickView* view);
QQuickItem* getFocusItem(QQuickWindow* view);
bool FilterElement(const QQuickItem* item, const std::string& locator, const std::string& query);
void FindElementsByXpath(QQuickItem* parent, const std::string &query, std::vector<ElementId>* elements, Error **error);
void FindElements(QQuickItem* parent, const std::string& locator, const std::string& query, std::vector<ElementId>* elements, Error** error);
void moveMouseInternal(QQuickView* view, QPointF& point);
void moveMouseInternal(QQuickWindow* view, QPointF& point);

private:
DISALLOW_COPY_AND_ASSIGN(Quick2ViewCmdExecutor);
Expand Down
65 changes: 63 additions & 2 deletions src/webdriver/extension_qt/qml_view_util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ QWindow* QQmlViewUtil::getQWindowView(Session* session, const ViewId& viewId) {
return qobject_cast<QWindow*>(qViewHandle->get());
}

QQuickView* QQmlViewUtil::getQMLView(Session* session, const ViewId& viewId) {
QQuickWindow* QQmlViewUtil::getQMLView(Session* session, const ViewId& viewId) {
ViewHandle* viewHandle = session->GetViewHandle(viewId);
if (NULL == viewHandle)
return NULL;
Expand All @@ -103,8 +103,69 @@ QQuickView* QQmlViewUtil::getQMLView(Session* session, const ViewId& viewId) {
if (NULL == qViewHandle)
return NULL;

return qobject_cast<QQuickView*>(qViewHandle->get());
return qobject_cast<QQuickWindow*>(qViewHandle->get());
}

QQmlEngine* QQmlViewUtil::getQMLEngine(QQuickWindow* qquickWindow) {
QQuickView* pView = qobject_cast<QQuickView*>(qquickWindow);

if (pView != NULL)
return pView->engine();

QQmlContext *rootContext = QQmlEngine::contextForObject(qquickWindow->contentItem());

return rootContext->engine();
}

void QQmlViewUtil::setSource(const Logger& logger, const QUrl &url, bool sync, QQuickWindow* qquickWindow) {
QQuickView* pView = qobject_cast<QQuickView*>(qquickWindow);

if (pView != NULL) {
if (sync) {
QEventLoop loop;
QObject::connect(pView, SIGNAL(statusChanged(QQuickView::Status)),&loop,SLOT(quit()));
pView->setSource(url);

if (QQuickView::Loading == pView->status()) {
loop.exec();
}

if (QQuickView::Ready != pView->status()) {
logger.Log(kWarningLogLevel, "QML sync load, smth wrong. View is not in READY state.");
}

} else {
pView->setSource(url);
logger.Log(kFineLogLevel, "QML async load - ");
}
}
else {
// TODO async / sync mode
QQmlEngine* engine = QQmlViewUtil::getQMLEngine(qquickWindow);
QQmlApplicationEngine* appEngine = qobject_cast<QQmlApplicationEngine*>(engine);

if (appEngine != NULL) {
appEngine->load(url);
}
}
}

const QUrl QQmlViewUtil::getSource(QQuickWindow* qquickWindow) {
QQuickView* pView = qobject_cast<QQuickView*>(qquickWindow);

if (pView != NULL) {
return pView->source();
}

QQmlEngine* engine = QQmlViewUtil::getQMLEngine(qquickWindow);
QQmlApplicationEngine* appEngine = qobject_cast<QQmlApplicationEngine*>(engine);

if (appEngine != NULL) {
return appEngine->baseUrl();
}
return QUrl();
}

#else
void QQmlViewUtil::removeInternalSuffixes(QString& str) {
str.remove(QRegExp(QLatin1String("_QMLTYPE_\\d+")));
Expand Down
8 changes: 7 additions & 1 deletion src/webdriver/extension_qt/qml_view_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,14 @@
#include <QtCore/QDebug>

#include "common_util.h"
#include "webdriver_logging.h"

#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
class QWindow;
class QQuickView;
#include <QtQuick/QQuickItem>
#include <QtQml/QQmlContext>
#include <QtQml/QQmlApplicationEngine>
#else
class QDeclarativeView;
#include <QtDeclarative/QDeclarativeItem>
Expand All @@ -49,7 +52,10 @@ class QQmlViewUtil {

#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
static QWindow* getQWindowView(Session* session, const ViewId& viewId);
static QQuickView* getQMLView(Session* session, const ViewId& viewId);
static QQuickWindow* getQMLView(Session* session, const ViewId& viewId);
static QQmlEngine* getQMLEngine(QQuickWindow* qquickWindow);
static void setSource(const Logger& logger, const QUrl &url, bool sync, QQuickWindow* qquickWindow);
static const QUrl getSource(QQuickWindow* qquickWindow);
#else
static QDeclarativeView* getQMLView(Session* session, const ViewId& viewId);
#endif
Expand Down
3 changes: 2 additions & 1 deletion src/webdriver/extension_qt/quick2_view_enumerator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include <QtGui/QGuiApplication>
#include <QtQml/QQmlEngine>
#include <QtQuick/QQuickView>
#include <QtQuick/QQuickWindow>

namespace webdriver {

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

QQuickView* pView = qobject_cast<QQuickView*>(pWindow);
QQuickWindow* pView = qobject_cast<QQuickWindow*>(pWindow);
if (pView != NULL) {
ViewHandlePtr handle(new QWindowViewHandle(pView));
ViewId viewId = session->GetViewForHandle(handle);
Expand Down
Loading