diff options
108 files changed, 10781 insertions, 854 deletions
diff --git a/doc/src/declarative/tutorial2.qdoc b/doc/src/declarative/tutorial2.qdoc index ac63d9b..b198bc5 100644 --- a/doc/src/declarative/tutorial2.qdoc +++ b/doc/src/declarative/tutorial2.qdoc @@ -11,6 +11,7 @@ To avoid writing the same code multiple times, we first create a new \c Cell com A component provides a way of defining a new type that we can re-use in other QML files. A QML component is like a black-box and interacts with the outside world through properties, signals and slots and is generally defined in its own QML file (for more details, see \l components). +The component's filename must always start with a capital letter. Here is the QML code for \c Cell.qml: diff --git a/src/declarative/debugger/qmldebug.cpp b/src/declarative/debugger/qmldebug.cpp index b06a250..1403ffa 100644 --- a/src/declarative/debugger/qmldebug.cpp +++ b/src/declarative/debugger/qmldebug.cpp @@ -69,6 +69,7 @@ public: void decode(QDataStream &, QmlDebugContextReference &); void decode(QDataStream &, QmlDebugObjectReference &, bool simple); + static void remove(QmlEngineDebug *, QmlDebugEnginesQuery *); static void remove(QmlEngineDebug *, QmlDebugRootContextQuery *); static void remove(QmlEngineDebug *, QmlDebugObjectQuery *); @@ -133,6 +134,7 @@ void QmlEngineDebugPrivate::remove(QmlEngineDebug *c, QmlDebugExpressionQuery *q p->expressionQuery.remove(q->m_queryId); } + Q_DECLARE_METATYPE(QmlDebugObjectReference); void QmlEngineDebugPrivate::decode(QDataStream &ds, QmlDebugObjectReference &o, bool simple) @@ -345,6 +347,7 @@ QmlDebugPropertyWatch *QmlEngineDebug::addWatch(const QmlDebugPropertyReference if (d->client->isConnected()) { int queryId = d->getId(); watch->m_queryId = queryId; + watch->m_client = this; watch->m_objectDebugId = property.objectDebugId(); watch->m_name = property.name(); d->watched.insert(queryId, watch); @@ -373,6 +376,7 @@ QmlDebugObjectExpressionWatch *QmlEngineDebug::addWatch(const QmlDebugObjectRefe if (d->client->isConnected()) { int queryId = d->getId(); watch->m_queryId = queryId; + watch->m_client = this; watch->m_objectDebugId = object.debugId(); watch->m_expr = expr; d->watched.insert(queryId, watch); @@ -395,6 +399,7 @@ QmlDebugWatch *QmlEngineDebug::addWatch(const QmlDebugObjectReference &object, Q if (d->client->isConnected()) { int queryId = d->getId(); watch->m_queryId = queryId; + watch->m_client = this; watch->m_objectDebugId = object.debugId(); d->watched.insert(queryId, watch); @@ -544,8 +549,13 @@ QmlDebugExpressionQuery *QmlEngineDebug::queryExpressionResult(int objectDebugId } QmlDebugWatch::QmlDebugWatch(QObject *parent) -: QObject(parent), m_state(Waiting), m_queryId(-1), m_objectDebugId(-1) +: QObject(parent), m_state(Waiting), m_queryId(-1), m_client(0), m_objectDebugId(-1) +{ +} + +QmlDebugWatch::~QmlDebugWatch() { + m_client->removeWatch(this); } int QmlDebugWatch::queryId() const diff --git a/src/declarative/debugger/qmldebug_p.h b/src/declarative/debugger/qmldebug_p.h index d7e4f5a..4bc54e8 100644 --- a/src/declarative/debugger/qmldebug_p.h +++ b/src/declarative/debugger/qmldebug_p.h @@ -106,6 +106,7 @@ public: enum State { Waiting, Active, Inactive, Dead }; QmlDebugWatch(QObject *); + ~QmlDebugWatch(); int queryId() const; int objectDebugId() const; @@ -125,6 +126,7 @@ private: void setState(State); State m_state; int m_queryId; + QmlEngineDebug *m_client; int m_objectDebugId; }; diff --git a/src/declarative/graphicsitems/qmlgraphicsflickable.cpp b/src/declarative/graphicsitems/qmlgraphicsflickable.cpp index b030495..ea9c173 100644 --- a/src/declarative/graphicsitems/qmlgraphicsflickable.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsflickable.cpp @@ -1177,7 +1177,7 @@ void QmlGraphicsFlickable::setMaximumFlickVelocity(qreal v) } /*! - \qmlproperty real Flickable::maximumFlickVelocity + \qmlproperty real Flickable::flickDeceleration This property holds the rate at which a flick will decelerate. The default is 500. diff --git a/src/declarative/graphicsitems/qmlgraphicsflipable.cpp b/src/declarative/graphicsitems/qmlgraphicsflipable.cpp index 37929fa..862f414 100644 --- a/src/declarative/graphicsitems/qmlgraphicsflipable.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsflipable.cpp @@ -69,36 +69,27 @@ public: Flipable allows you to specify a front and a back and then flip between those sides. \qml - Flipable { - id: flipable - width: 40 - height: 40 - axis: Axis { - startX: 20 - startY: 0 - endX: 20 - endY: 40 +Flipable { + width: 40; height: 40 + + transform: Rotation { + id: rotation + origin.x: 20; origin.y: 120 + axis.x: 0; axis.y: 1; axis.z: 0 + angle: 0 } + front: Image { source: "front.png" } back: Image { source: "back.png" } - states: [ - State { - name: "back" - SetProperty { - target: flipable - property: "rotation" - value: 180 - } - } - ] - transitions: [ - Transition { - NumberAnimation { - easing: "easeInOutQuad" - properties: "rotation" - } - } - ] + + states: State { + name: "back" + SetProperties { target: rotation; angle: 180 } + } + + transitions: Transition { + NumberAnimation { easing: "easeInOutQuad"; matchProperties: "rotation" } + } } \endqml diff --git a/src/declarative/graphicsitems/qmlgraphicsgridview.cpp b/src/declarative/graphicsitems/qmlgraphicsgridview.cpp index f39f5c7..10050f2 100644 --- a/src/declarative/graphicsitems/qmlgraphicsgridview.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsgridview.cpp @@ -309,7 +309,7 @@ public: QmlComponent *highlightComponent; FxGridItem *highlight; FxGridItem *trackedItem; - enum MovementReason { Other, Key, Mouse }; + enum MovementReason { Other, SetIndex, Mouse }; MovementReason moveReason; int buffer; QmlEaseFollow *highlightXAnimator; @@ -338,7 +338,6 @@ void QmlGraphicsGridViewPrivate::clear() visibleIndex = 0; releaseItem(currentItem); currentItem = 0; - currentIndex = -1; createHighlight(); trackedItem = 0; } @@ -508,7 +507,6 @@ void QmlGraphicsGridViewPrivate::layout(bool removed) } } q->refill(); - q->trackedPositionChanged(); updateHighlight(); if (flow == QmlGraphicsGridView::LeftToRight) { q->setViewportHeight(endPosition() - startPosition()); @@ -547,6 +545,8 @@ void QmlGraphicsGridViewPrivate::updateTrackedItem() if (highlight) item = highlight; + FxGridItem *oldTracked = trackedItem; + if (trackedItem && item != trackedItem) { QObject::disconnect(trackedItem->item, SIGNAL(yChanged()), q, SLOT(trackedPositionChanged())); QObject::disconnect(trackedItem->item, SIGNAL(xChanged()), q, SLOT(trackedPositionChanged())); @@ -557,9 +557,8 @@ void QmlGraphicsGridViewPrivate::updateTrackedItem() trackedItem = item; QObject::connect(trackedItem->item, SIGNAL(yChanged()), q, SLOT(trackedPositionChanged())); QObject::connect(trackedItem->item, SIGNAL(xChanged()), q, SLOT(trackedPositionChanged())); - q->trackedPositionChanged(); } - if (trackedItem) + if (trackedItem && trackedItem != oldTracked) q->trackedPositionChanged(); } @@ -615,20 +614,20 @@ void QmlGraphicsGridViewPrivate::updateHighlight() { if ((!currentItem && highlight) || (currentItem && !highlight)) createHighlight(); - updateTrackedItem(); - if (currentItem && autoHighlight && highlight) { + if (currentItem && autoHighlight && highlight && !moving) { // auto-update highlight highlightXAnimator->setSourceValue(currentItem->item->x()); highlightYAnimator->setSourceValue(currentItem->item->y()); highlight->item->setWidth(currentItem->item->width()); highlight->item->setHeight(currentItem->item->height()); } + updateTrackedItem(); } void QmlGraphicsGridViewPrivate::updateCurrent(int modelIndex) { Q_Q(QmlGraphicsGridView); - if (!isValid() || modelIndex < 0 || modelIndex >= model->count()) { + if (!q->isComponentComplete() || !isValid() || modelIndex < 0 || modelIndex >= model->count()) { if (currentItem) { currentItem->attached->setIsCurrentItem(false); releaseItem(currentItem); @@ -799,16 +798,20 @@ void QmlGraphicsGridView::setModel(const QVariant &model) dataModel->setModel(model); } if (d->model) { - if (d->currentIndex >= d->model->count() || d->currentIndex < 0) - setCurrentIndex(0); - else - d->updateCurrent(d->currentIndex); + if (isComponentComplete()) { + refill(); + if (d->currentIndex >= d->model->count() || d->currentIndex < 0) { + setCurrentIndex(0); + } else { + d->moveReason = QmlGraphicsGridViewPrivate::SetIndex; + d->updateCurrent(d->currentIndex); + } + } connect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int))); connect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int))); connect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int))); connect(d->model, SIGNAL(createdItem(int, QmlGraphicsItem*)), this, SLOT(createdItem(int,QmlGraphicsItem*))); connect(d->model, SIGNAL(destroyingItem(QmlGraphicsItem*)), this, SLOT(destroyingItem(QmlGraphicsItem*))); - refill(); emit countChanged(); } } @@ -841,8 +844,11 @@ void QmlGraphicsGridView::setDelegate(QmlComponent *delegate) } if (QmlGraphicsVisualDataModel *dataModel = qobject_cast<QmlGraphicsVisualDataModel*>(d->model)) { dataModel->setDelegate(delegate); - d->updateCurrent(d->currentIndex); - refill(); + if (isComponentComplete()) { + refill(); + d->moveReason = QmlGraphicsGridViewPrivate::SetIndex; + d->updateCurrent(d->currentIndex); + } } } @@ -863,7 +869,8 @@ int QmlGraphicsGridView::currentIndex() const void QmlGraphicsGridView::setCurrentIndex(int index) { Q_D(QmlGraphicsGridView); - if (d->isValid() && index != d->currentIndex && index < d->model->count() && index >= 0) { + if (isComponentComplete() && d->isValid() && index != d->currentIndex && index < d->model->count() && index >= 0) { + d->moveReason = QmlGraphicsGridViewPrivate::SetIndex; cancelFlick(); d->updateCurrent(index); } else { @@ -1126,7 +1133,7 @@ void QmlGraphicsGridView::keyPressEvent(QKeyEvent *event) return; if (d->model && d->model->count() && d->interactive) { - d->moveReason = QmlGraphicsGridViewPrivate::Key; + d->moveReason = QmlGraphicsGridViewPrivate::SetIndex; int oldCurrent = currentIndex(); switch (event->key()) { case Qt::Key_Up: @@ -1250,9 +1257,11 @@ void QmlGraphicsGridView::componentComplete() Q_D(QmlGraphicsGridView); QmlGraphicsFlickable::componentComplete(); d->updateGrid(); + refill(); if (d->currentIndex < 0) d->updateCurrent(0); - refill(); + else + d->updateCurrent(d->currentIndex); } void QmlGraphicsGridView::trackedPositionChanged() @@ -1260,7 +1269,7 @@ void QmlGraphicsGridView::trackedPositionChanged() Q_D(QmlGraphicsGridView); if (!d->trackedItem) return; - if (!isFlicking() && !d->pressed && d->moveReason == QmlGraphicsGridViewPrivate::Key) { + if (!isFlicking() && !d->moving && d->moveReason != QmlGraphicsGridViewPrivate::Mouse) { if (d->trackedItem->rowPos() < d->position()) { d->setPosition(d->trackedItem->rowPos()); } else if (d->trackedItem->endRowPos() > d->position() + d->size()) { diff --git a/src/declarative/graphicsitems/qmlgraphicslistview.cpp b/src/declarative/graphicsitems/qmlgraphicslistview.cpp index a9bc721..53287a6 100644 --- a/src/declarative/graphicsitems/qmlgraphicslistview.cpp +++ b/src/declarative/graphicsitems/qmlgraphicslistview.cpp @@ -434,7 +434,6 @@ void QmlGraphicsListViewPrivate::clear() visibleIndex = 0; releaseItem(currentItem); currentItem = 0; - currentIndex = -1; createHighlight(); trackedItem = 0; } @@ -746,7 +745,7 @@ void QmlGraphicsListViewPrivate::updateCurrentSection() void QmlGraphicsListViewPrivate::updateCurrent(int modelIndex) { Q_Q(QmlGraphicsListView); - if (!isValid() || modelIndex < 0 || modelIndex >= model->count()) { + if (!q->isComponentComplete() || !isValid() || modelIndex < 0 || modelIndex >= model->count()) { if (currentItem) { currentItem->attached->setIsCurrentItem(false); releaseItem(currentItem); @@ -1114,16 +1113,20 @@ void QmlGraphicsListView::setModel(const QVariant &model) dataModel->setModel(model); } if (d->model) { - if (d->currentIndex >= d->model->count() || d->currentIndex < 0) - setCurrentIndex(0); - else - d->updateCurrent(d->currentIndex); + if (isComponentComplete()) { + refill(); + if (d->currentIndex >= d->model->count() || d->currentIndex < 0) { + setCurrentIndex(0); + } else { + d->moveReason = QmlGraphicsListViewPrivate::SetIndex; + d->updateCurrent(d->currentIndex); + } + } connect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int))); connect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int))); connect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int))); connect(d->model, SIGNAL(createdItem(int, QmlGraphicsItem*)), this, SLOT(createdItem(int,QmlGraphicsItem*))); connect(d->model, SIGNAL(destroyingItem(QmlGraphicsItem*)), this, SLOT(destroyingItem(QmlGraphicsItem*))); - refill(); emit countChanged(); } } @@ -1156,8 +1159,11 @@ void QmlGraphicsListView::setDelegate(QmlComponent *delegate) } if (QmlGraphicsVisualDataModel *dataModel = qobject_cast<QmlGraphicsVisualDataModel*>(d->model)) { dataModel->setDelegate(delegate); - d->updateCurrent(d->currentIndex); - refill(); + if (isComponentComplete()) { + refill(); + d->moveReason = QmlGraphicsListViewPrivate::SetIndex; + d->updateCurrent(d->currentIndex); + } } } @@ -1178,7 +1184,7 @@ int QmlGraphicsListView::currentIndex() const void QmlGraphicsListView::setCurrentIndex(int index) { Q_D(QmlGraphicsListView); - if (d->isValid() && index != d->currentIndex && index < d->model->count() && index >= 0) { + if (isComponentComplete() && d->isValid() && index != d->currentIndex && index < d->model->count() && index >= 0) { d->moveReason = QmlGraphicsListViewPrivate::SetIndex; cancelFlick(); d->updateCurrent(index); @@ -1254,7 +1260,7 @@ void QmlGraphicsListView::setHighlight(QmlComponent *highlight) is scrolled. This is because the view moves to maintain the highlight within the preferred highlight range (or visible viewport). - \sa highlight + \sa highlight, highlightMoveSpeed */ bool QmlGraphicsListView::highlightFollowsCurrentItem() const { @@ -1473,8 +1479,13 @@ QString QmlGraphicsListView::currentSection() const /*! \qmlproperty real ListView::highlightMoveSpeed + \qmlproperty real ListView::highlightResizeSpeed + These properties hold the move and resize animation speed of the highlight delegate. + + highlightFollowsCurrentItem must be true for these properties + to have effect. - This property holds the moving animation speed of the highlight delegate. + \sa highlightFollowsCurrentItem */ qreal QmlGraphicsListView::highlightMoveSpeed() const { @@ -1494,11 +1505,6 @@ void QmlGraphicsListView::setHighlightMoveSpeed(qreal speed) } } -/*! - \qmlproperty real ListView::highlightResizeSpeed - - This property holds the resizing animation speed of the highlight delegate. -*/ qreal QmlGraphicsListView::highlightResizeSpeed() const { Q_D(const QmlGraphicsListView);\ @@ -1670,9 +1676,11 @@ void QmlGraphicsListView::componentComplete() { Q_D(QmlGraphicsListView); QmlGraphicsFlickable::componentComplete(); + refill(); if (d->currentIndex < 0) d->updateCurrent(0); - refill(); + else + d->updateCurrent(d->currentIndex); d->fixupPosition(); } diff --git a/src/declarative/graphicsitems/qmlgraphicslistview_p.h b/src/declarative/graphicsitems/qmlgraphicslistview_p.h index 446d71a..3f46434 100644 --- a/src/declarative/graphicsitems/qmlgraphicslistview_p.h +++ b/src/declarative/graphicsitems/qmlgraphicslistview_p.h @@ -64,8 +64,11 @@ class Q_DECLARATIVE_EXPORT QmlGraphicsListView : public QmlGraphicsFlickable Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged) Q_PROPERTY(QmlGraphicsItem *currentItem READ currentItem NOTIFY currentIndexChanged) Q_PROPERTY(int count READ count NOTIFY countChanged) + Q_PROPERTY(QmlComponent *highlight READ highlight WRITE setHighlight) Q_PROPERTY(bool highlightFollowsCurrentItem READ highlightFollowsCurrentItem WRITE setHighlightFollowsCurrentItem) + Q_PROPERTY(qreal highlightMoveSpeed READ highlightMoveSpeed WRITE setHighlightMoveSpeed NOTIFY highlightMoveSpeedChanged) + Q_PROPERTY(qreal highlightResizeSpeed READ highlightResizeSpeed WRITE setHighlightResizeSpeed NOTIFY highlightResizeSpeedChanged) Q_PROPERTY(qreal preferredHighlightBegin READ preferredHighlightBegin WRITE setPreferredHighlightBegin) Q_PROPERTY(qreal preferredHighlightEnd READ preferredHighlightEnd WRITE setPreferredHighlightEnd) @@ -78,8 +81,6 @@ class Q_DECLARATIVE_EXPORT QmlGraphicsListView : public QmlGraphicsFlickable Q_PROPERTY(QString sectionExpression READ sectionExpression WRITE setSectionExpression NOTIFY sectionExpressionChanged) Q_PROPERTY(QString currentSection READ currentSection NOTIFY currentSectionChanged) - Q_PROPERTY(qreal highlightMoveSpeed READ highlightMoveSpeed WRITE setHighlightMoveSpeed NOTIFY highlightMoveSpeedChanged) - Q_PROPERTY(qreal highlightResizeSpeed READ highlightResizeSpeed WRITE setHighlightResizeSpeed NOTIFY highlightResizeSpeedChanged) Q_ENUMS(HighlightRangeMode) Q_ENUMS(Orientation) Q_CLASSINFO("DefaultProperty", "data") diff --git a/src/declarative/graphicsitems/qmlgraphicspathview.cpp b/src/declarative/graphicsitems/qmlgraphicspathview.cpp index f2b8d73..f664763 100644 --- a/src/declarative/graphicsitems/qmlgraphicspathview.cpp +++ b/src/declarative/graphicsitems/qmlgraphicspathview.cpp @@ -83,19 +83,6 @@ private: QmlOpenMetaObject *mo; }; - -/*! - \internal - \class QmlGraphicsPathView - \brief The QmlGraphicsPathView class lays out items provided by a model on a path. - - \ingroup group_views - - The model must be a \l QListModelInterface subclass. - - \sa QmlGraphicsPath -*/ - /*! \qmlclass PathView QmlGraphicsPathView \brief The PathView element lays out model-provided items on a path. diff --git a/src/declarative/graphicsitems/qmlgraphicspathview_p.h b/src/declarative/graphicsitems/qmlgraphicspathview_p.h index f1fed98..f713794 100644 --- a/src/declarative/graphicsitems/qmlgraphicspathview_p.h +++ b/src/declarative/graphicsitems/qmlgraphicspathview_p.h @@ -51,7 +51,6 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QListModelInterface; class QmlGraphicsPathViewPrivate; class Q_DECLARATIVE_EXPORT QmlGraphicsPathView : public QmlGraphicsItem { diff --git a/src/declarative/graphicsitems/qmlgraphicstextinput.cpp b/src/declarative/graphicsitems/qmlgraphicstextinput.cpp index e2b1725..cd7377e 100644 --- a/src/declarative/graphicsitems/qmlgraphicstextinput.cpp +++ b/src/declarative/graphicsitems/qmlgraphicstextinput.cpp @@ -252,10 +252,29 @@ void QmlGraphicsTextInput::setMaxLength(int ml) /*! \qmlproperty bool TextInput::cursorVisible - If true the text edit shows a cursor. + Set to true when the TextInput shows a cursor. - This property is set and unset when the line edit gets focus, but it can also - be set directly (useful, for example, if a KeyProxy might forward keys to it). + This property is set and unset when the TextInput gets focus, so that other + properties can be bound to whether the cursor is currently showing. As it + gets set and unset automatically, when you set the value yourself you must + keep in mind that your value may be overwritten. + + It can be set directly in script, for example if a KeyProxy might + forward keys to it and you desire it to look active when this happens + (but without actually giving it the focus). + + It should not be set directly on the element, like in the below QML, + as the specified value will be overridden an lost on focus changes. + + \code + TextInput { + text: "Text" + cursorVisible: false + } + \endcode + + In the above snippet the cursor will still become visible when the + TextInput gains focus. */ bool QmlGraphicsTextInput::isCursorVisible() const { diff --git a/src/declarative/graphicsitems/qmlgraphicswebview.cpp b/src/declarative/graphicsitems/qmlgraphicswebview.cpp index 5ce0ee8..214117f 100644 --- a/src/declarative/graphicsitems/qmlgraphicswebview.cpp +++ b/src/declarative/graphicsitems/qmlgraphicswebview.cpp @@ -464,7 +464,8 @@ void QmlGraphicsWebView::setPreferredWidth(int iw) /*! \qmlproperty int WebView::webPageWidth - This property holds the page width suggested to the web engine. + This property holds the page width suggested to the web engine. The zoomFactor + will be changed to fit this with in preferredWidth. */ int QmlGraphicsWebView::webPageWidth() const { @@ -906,20 +907,6 @@ QPixmap QmlGraphicsWebView::icon() const /*! - \qmlproperty real WebView::textSizeMultiplier - This property holds the multiplier used to scale the text in a Web page -*/ -void QmlGraphicsWebView::setTextSizeMultiplier(qreal factor) -{ - page()->mainFrame()->setTextSizeMultiplier(factor); -} - -qreal QmlGraphicsWebView::textSizeMultiplier() const -{ - return page()->mainFrame()->textSizeMultiplier(); -} - -/*! \qmlproperty real WebView::zoomFactor This property holds the multiplier used to scale the contents of a Web page. */ diff --git a/src/declarative/graphicsitems/qmlgraphicswebview_p.h b/src/declarative/graphicsitems/qmlgraphicswebview_p.h index 6852bb0..d574c59 100644 --- a/src/declarative/graphicsitems/qmlgraphicswebview_p.h +++ b/src/declarative/graphicsitems/qmlgraphicswebview_p.h @@ -88,7 +88,6 @@ class Q_DECLARATIVE_EXPORT QmlGraphicsWebView : public QmlGraphicsPaintedItem Q_PROPERTY(QString title READ title NOTIFY titleChanged) Q_PROPERTY(QPixmap icon READ icon NOTIFY iconChanged) - Q_PROPERTY(qreal textSizeMultiplier READ textSizeMultiplier WRITE setTextSizeMultiplier DESIGNABLE false) Q_PROPERTY(qreal zoomFactor READ zoomFactor WRITE setZoomFactor NOTIFY zoomFactorChanged) Q_PROPERTY(QString statusText READ statusText NOTIFY statusTextChanged) @@ -126,9 +125,6 @@ public: QPixmap icon() const; - qreal textSizeMultiplier() const; - void setTextSizeMultiplier(qreal); - qreal zoomFactor() const; void setZoomFactor(qreal); diff --git a/src/declarative/qml/qmlenginedebug.cpp b/src/declarative/qml/qmlenginedebug.cpp index 2d8acf7..20d6fc1 100644 --- a/src/declarative/qml/qmlenginedebug.cpp +++ b/src/declarative/qml/qmlenginedebug.cpp @@ -99,6 +99,7 @@ QmlEngineDebugServer::QmlObjectProperty QmlEngineDebugServer::propertyData(QObject *obj, int propIdx) { QmlObjectProperty rv; +; QMetaProperty prop = obj->metaObject()->property(propIdx); @@ -165,7 +166,7 @@ void QmlEngineDebugServer::buildObjectDump(QDataStream &message, int childrenCount = children.count(); for (int ii = 0; ii < children.count(); ++ii) { - if (QmlBoundSignal::cast(children[ii])) + if (qobject_cast<QmlContext*>(children[ii]) || QmlBoundSignal::cast(children[ii])) --childrenCount; } @@ -175,6 +176,8 @@ void QmlEngineDebugServer::buildObjectDump(QDataStream &message, for (int ii = 0; ii < children.count(); ++ii) { QObject *child = children.at(ii); + if (qobject_cast<QmlContext*>(child)) + continue; QmlBoundSignal *signal = QmlBoundSignal::cast(child); if (signal) { QmlObjectProperty prop; @@ -271,10 +274,18 @@ QmlEngineDebugServer::objectData(QObject *object) } rv.objectName = object->objectName(); - rv.objectType = QString::fromUtf8(object->metaObject()->className()); rv.objectId = QmlDebugService::idForObject(object); rv.contextId = QmlDebugService::idForObject(qmlContext(object)); + QmlType *type = QmlMetaType::qmlType(object->metaObject()); + if (type) { + QString typeName = type->qmlTypeName(); + int lastSlash = typeName.lastIndexOf(QLatin1Char('/')); + rv.objectType = lastSlash < 0 ? typeName : typeName.mid(lastSlash+1); + } else { + rv.objectType = QString::fromUtf8(object->metaObject()->className()); + } + return rv; } diff --git a/src/declarative/qml/qmlinfo.cpp b/src/declarative/qml/qmlinfo.cpp index f62f5fd..5ebcd8d 100644 --- a/src/declarative/qml/qmlinfo.cpp +++ b/src/declarative/qml/qmlinfo.cpp @@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE /*! - \fn void qmlInfo(const QString& message, QObject *object) + \fn void qmlInfo(const QString& message, const QObject *object) \brief Prints warnings messages that include the file and line number for QML types. @@ -73,7 +73,7 @@ QT_BEGIN_NAMESPACE \endcode */ -void qmlInfo(const QString& msg, QObject* object) +void qmlInfo(const QString& msg, const QObject* object) { QString pos = QLatin1String("QML"); if (object) { diff --git a/src/declarative/qml/qmlinfo.h b/src/declarative/qml/qmlinfo.h index 2e26ea4..1660aa2 100644 --- a/src/declarative/qml/qmlinfo.h +++ b/src/declarative/qml/qmlinfo.h @@ -50,7 +50,7 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -Q_DECLARATIVE_EXPORT void qmlInfo(const QString& msg, QObject *me=0); +Q_DECLARATIVE_EXPORT void qmlInfo(const QString& msg, const QObject *me=0); QT_END_NAMESPACE diff --git a/src/declarative/util/qmllistmodel.cpp b/src/declarative/util/qmllistmodel.cpp index afc6735..fbd957c 100644 --- a/src/declarative/util/qmllistmodel.cpp +++ b/src/declarative/util/qmllistmodel.cpp @@ -45,9 +45,11 @@ #include <private/qmlcustomparser_p.h> #include <private/qmlparser_p.h> #include "qmlopenmetaobject_p.h" +#include <private/qmlengine_p.h> #include <qmlcontext.h> #include "qmllistmodel_p.h" #include <QtScript/qscriptvalueiterator.h> +#include "qmlinfo.h" Q_DECLARE_METATYPE(QListModelInterface *) @@ -264,6 +266,7 @@ QT_END_NAMESPACE Q_DECLARE_METATYPE(ModelNode *) QT_BEGIN_NAMESPACE + void ModelNode::setObjectValue(const QScriptValue& valuemap) { QScriptValueIterator it(valuemap); while (it.hasNext()) { @@ -451,14 +454,17 @@ void QmlListModel::clear() */ void QmlListModel::remove(int index) { - if (_root) { - ModelNode *node = qvariant_cast<ModelNode *>(_root->values.at(index)); - _root->values.removeAt(index); - if (node) - delete node; - emit itemsRemoved(index,1); - emit countChanged(_root->values.count()); + if (!_root || index < 0 || index >= _root->values.count()) { + qmlInfo(tr("remove: index %1 out of range").arg(index),this); + return; } + + ModelNode *node = qvariant_cast<ModelNode *>(_root->values.at(index)); + _root->values.removeAt(index); + if (node) + delete node; + emit itemsRemoved(index,1); + emit countChanged(_root->values.count()); } /*! @@ -480,9 +486,11 @@ void QmlListModel::insert(int index, const QScriptValue& valuemap) { if (!_root) _root = new ModelNode; - if (index >= _root->values.count()) { + if (index >= _root->values.count() || index<0) { if (index == _root->values.count()) append(valuemap); + else + qmlInfo(tr("insert: index %1 out of range").arg(index),this); return; } ModelNode *mn = new ModelNode; @@ -508,8 +516,10 @@ void QmlListModel::insert(int index, const QScriptValue& valuemap) */ void QmlListModel::move(int from, int to, int n) { - if (from+n > count() || to+n > count() || n==0 || from==to || from < 0 || to < 0) + if (n==0 || from==to) return; + if (from+n > count() || to+n > count() || from < 0 || to < 0) + qmlInfo(tr("move: out of range"),this); int origfrom=from; // preserve actual move, so any animations are correct int origto=to; int orign=n; @@ -556,7 +566,7 @@ void QmlListModel::move(int from, int to, int n) void QmlListModel::append(const QScriptValue& valuemap) { if (!valuemap.isObject()) { - qWarning("ListModel::append: value is not an object"); + qmlInfo(tr("append: value is not an object"),this); return; } if (!_root) @@ -569,10 +579,43 @@ void QmlListModel::append(const QScriptValue& valuemap) } /*! + \qmlmethod dict ListModel::get(index) + + Returns the item at \a index in the list model. + + \code + FruitModel.append({"cost": 5.95, "name":"Pizza"}) + FruitModel.get(0).cost + \endcode + + The \a index must be an element in the list. + + \sa append() +*/ +QScriptValue QmlListModel::get(int index) const +{ + if (index >= count()) { + qmlInfo(tr("get: index %1 out of range").arg(index),this); + return 0; + } + + ModelNode *node = qvariant_cast<ModelNode *>(_root->values.at(index)); + if (!node) + return 0; + QmlEngine *eng = qmlEngine(this); + if (!eng) { + qWarning("Cannot call QmlListModel::get() without a QmlEngine"); + return 0; + } + return QmlEnginePrivate::qmlScriptObject(node->object(), eng); +} + +/*! \qmlmethod ListModel::set(index,dict) - Changes the item at \a index in the list model to the - values in \a dict. + Changes the item at \a index in the list model with the + values in \a dict. Properties not appearing in \a valuemap + are left unchanged. \code FruitModel.set(3, {"cost": 5.95, "name":"Pizza"}) @@ -586,8 +629,8 @@ void QmlListModel::set(int index, const QScriptValue& valuemap) { if (!_root) _root = new ModelNode; - if ( index >= _root->values.count()) { - qWarning() << "ListModel::set index out of range:" << index; + if ( index > _root->values.count()) { + qmlInfo(tr("set: index %1 out of range").arg(index),this); return; } if (index == _root->values.count()) @@ -628,7 +671,7 @@ void QmlListModel::set(int index, const QString& property, const QVariant& value if (!_root) _root = new ModelNode; if ( index >= _root->values.count()) { - qWarning() << "ListModel::set index out of range:" << index; + qmlInfo(tr("set: index %1 out of range").arg(index),this); return; } ModelNode *node = qvariant_cast<ModelNode *>(_root->values.at(index)); diff --git a/src/declarative/util/qmllistmodel_p.h b/src/declarative/util/qmllistmodel_p.h index 31365d1..34b1562 100644 --- a/src/declarative/util/qmllistmodel_p.h +++ b/src/declarative/util/qmllistmodel_p.h @@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) struct ModelNode; -class QmlListModel : public QListModelInterface +class Q_DECLARATIVE_EXPORT QmlListModel : public QListModelInterface { Q_OBJECT Q_PROPERTY(int count READ count NOTIFY countChanged) @@ -77,6 +77,7 @@ public: Q_INVOKABLE void remove(int index); Q_INVOKABLE void append(const QScriptValue&); Q_INVOKABLE void insert(int index, const QScriptValue&); + Q_INVOKABLE QScriptValue get(int index) const; Q_INVOKABLE void set(int index, const QScriptValue&); Q_INVOKABLE void set(int index, const QString& property, const QVariant& value); Q_INVOKABLE void move(int from, int to, int count); diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro index 000ceb3..134ae1b 100644 --- a/tests/auto/declarative/declarative.pro +++ b/tests/auto/declarative/declarative.pro @@ -13,12 +13,11 @@ SUBDIRS += \ parserstress \ # Cover pathview \ # Cover qfxloader \ # Cover - qfxtextedit \ # Cover - qfxtextinput \ # Cover qmetaobjectbuilder \ # Cover qmlbinding \ # Cover qmlconnection \ # Cover qmlcontext \ # Cover + qmldebug \ # Cover qmldom \ # Cover qmlecmascript \ # Cover qmlerror \ # Cover @@ -26,7 +25,10 @@ SUBDIRS += \ qmlgraphicsitem \ # Cover qmlgraphicsborderimage \ # Cover qmlgraphicsparticles \ # Cover + qmlgraphicspositioners \ # Cover qmlgraphicstext \ # Cover + qmlgraphicstextedit \ # Cover + qmlgraphicstextinput \ # Cover qmlgraphicswebview \ # Cover qmlinfo \ # Cover qmllanguage \ # Cover diff --git a/tests/auto/declarative/layouts/data/layouts.qml b/tests/auto/declarative/layouts/data/layouts.qml new file mode 100644 index 0000000..ccc8cfe --- /dev/null +++ b/tests/auto/declarative/layouts/data/layouts.qml @@ -0,0 +1,34 @@ +import Qt 4.6 + +Item { + id: resizable + width:300 + height:300 + + GraphicsObjectContainer { + anchors.fill:parent + + QGraphicsWidget { + size.width:parent.width + size.height:parent.height + + layout: QGraphicsLinearLayout { + spacing: 0 + LayoutItem { + objectName: "left" + minimumSize: "100x100" + maximumSize: "300x300" + preferredSize: "100x100" + Rectangle { objectName: "yellowRect"; color: "yellow"; anchors.fill: parent } + } + LayoutItem { + objectName: "right" + minimumSize: "100x100" + maximumSize: "400x400" + preferredSize: "200x200" + Rectangle { objectName: "greenRect"; color: "green"; anchors.fill: parent } + } + } + } + } +} diff --git a/tests/auto/declarative/layouts/tst_layouts.cpp b/tests/auto/declarative/layouts/tst_layouts.cpp index c0c067a..f619b57 100644 --- a/tests/auto/declarative/layouts/tst_layouts.cpp +++ b/tests/auto/declarative/layouts/tst_layouts.cpp @@ -41,7 +41,7 @@ #include <QtTest/QtTest> #include <private/qlistmodelinterface_p.h> #include <qmlview.h> -#include <private/qmlgraphicsrectangle_p.h> +#include <private/qmlgraphicslayoutitem_p.h> #include <qmlexpression.h> class tst_QmlGraphicsLayouts : public QObject @@ -51,17 +51,9 @@ public: tst_QmlGraphicsLayouts(); private slots: - void test_horizontal(); - void test_horizontal_spacing(); - void test_horizontal_animated(); - void test_vertical(); - void test_vertical_spacing(); - void test_vertical_animated(); - void test_grid(); - void test_grid_spacing(); - void test_grid_animated(); + void test_qml();//GraphicsLayout set up in Qml + void test_cpp();//GraphicsLayout set up in C++ - void test_repeater(); private: QmlView *createView(const QString &filename); }; @@ -70,385 +62,61 @@ tst_QmlGraphicsLayouts::tst_QmlGraphicsLayouts() { } -void tst_QmlGraphicsLayouts::test_horizontal() +void tst_QmlGraphicsLayouts::test_qml() { - QmlView *canvas = createView(SRCDIR "/data/horizontal.qml"); + QmlView *canvas = createView(SRCDIR "/data/layouts.qml"); canvas->execute(); qApp->processEvents(); - - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); - QVERIFY(one != 0); - - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); - QVERIFY(two != 0); - - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); - QVERIFY(three != 0); - - QCOMPARE(one->x(), 0.0); - QCOMPARE(one->y(), 0.0); - QCOMPARE(two->x(), 50.0); - QCOMPARE(two->y(), 0.0); - QCOMPARE(three->x(), 70.0); - QCOMPARE(three->y(), 0.0); + QmlGraphicsLayoutItem *left = qobject_cast<QmlGraphicsLayoutItem*>(canvas->root()->findChild<QmlGraphicsItem*>("left")); + QVERIFY(left != 0); + + QmlGraphicsLayoutItem *right = qobject_cast<QmlGraphicsLayoutItem*>(canvas->root()->findChild<QmlGraphicsItem*>("right")); + QVERIFY(right != 0); + + qreal gvMargin = 9.0; + //Preferred Size + canvas->root()->setWidth(300 + 2*gvMargin); + canvas->root()->setHeight(300 + 2*gvMargin); + + QCOMPARE(left->x(), gvMargin); + QCOMPARE(left->y(), gvMargin); + QCOMPARE(left->width(), 100.0); + QCOMPARE(left->height(), 300.0); + + QCOMPARE(right->x(), 100.0 + gvMargin); + QCOMPARE(right->y(), 0.0 + gvMargin); + QCOMPARE(right->width(), 200.0); + QCOMPARE(right->height(), 300.0); + + //Minimum Size + canvas->root()->setWidth(10+2*gvMargin); + canvas->root()->setHeight(10+2*gvMargin); + + QCOMPARE(left->x(), gvMargin); + QCOMPARE(left->width(), 100.0); + QCOMPARE(left->height(), 100.0); + + QCOMPARE(right->x(), 100.0 + gvMargin); + QCOMPARE(right->width(), 100.0); + QCOMPARE(right->height(), 100.0); + + //Maximum Size + canvas->root()->setWidth(1000 + 2*gvMargin); + canvas->root()->setHeight(1000 + 2*gvMargin); + + QCOMPARE(left->x(), gvMargin); + QCOMPARE(left->width(), 300.0); + QCOMPARE(left->height(), 300.0); + + QCOMPARE(right->x(), 300.0 + gvMargin); + QCOMPARE(right->width(), 400.0); + QCOMPARE(right->height(), 400.0); } -void tst_QmlGraphicsLayouts::test_horizontal_spacing() +void tst_QmlGraphicsLayouts::test_cpp() { - QmlView *canvas = createView(SRCDIR "/data/horizontal-spacing.qml"); - - canvas->execute(); - qApp->processEvents(); - - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); - QVERIFY(one != 0); - - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); - QVERIFY(two != 0); - - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); - QVERIFY(three != 0); - - QCOMPARE(one->x(), 0.0); - QCOMPARE(one->y(), 0.0); - QCOMPARE(two->x(), 60.0); - QCOMPARE(two->y(), 0.0); - QCOMPARE(three->x(), 90.0); - QCOMPARE(three->y(), 0.0); -} - -void tst_QmlGraphicsLayouts::test_horizontal_animated() -{ - QmlView *canvas = createView(SRCDIR "/data/horizontal-animated.qml"); - - canvas->execute(); - qApp->processEvents(); - - QTest::qWait(0);//Let the animation start - //Note that one and three animate in - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); - QVERIFY(one != 0); - QCOMPARE(one->x(), -100.0); - - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); - QVERIFY(two != 0); - QCOMPARE(two->x(), 0.0); - - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); - QVERIFY(three != 0); - QCOMPARE(three->x(), -100.0); - - QTest::qWait(300);//Let the animation complete - - QCOMPARE(one->x(), 0.0); - QCOMPARE(one->y(), 0.0); - QCOMPARE(two->opacity(), 0.0); - QCOMPARE(two->x(), 0.0); - QCOMPARE(two->y(), 0.0); - QCOMPARE(three->x(), 50.0); - QCOMPARE(three->y(), 0.0); - - //Add 'two' - two->setOpacity(1.0); - QCOMPARE(two->opacity(), 1.0); - QTest::qWait(0);//Let the animation start - QCOMPARE(two->x(), -100.0); - QCOMPARE(three->x(), 50.0); - QTest::qWait(300);//Let the animation complete - QCOMPARE(two->x(), 50.0); - QCOMPARE(three->x(), 100.0); - - //Remove 'two' - two->setOpacity(0.0); - QCOMPARE(two->opacity(), 0.0); - QCOMPARE(two->x(), 50.0); - QCOMPARE(three->x(), 100.0); - QTest::qWait(300);//Let the animation complete - QCOMPARE(two->x(), 50.0); - QCOMPARE(three->x(), 50.0); -} - -void tst_QmlGraphicsLayouts::test_vertical() -{ - QmlView *canvas = createView(SRCDIR "/data/vertical.qml"); - - canvas->execute(); - qApp->processEvents(); - - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); - QVERIFY(one != 0); - - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); - QVERIFY(two != 0); - - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); - QVERIFY(three != 0); - - QCOMPARE(one->x(), 0.0); - QCOMPARE(one->y(), 0.0); - QCOMPARE(two->x(), 0.0); - QCOMPARE(two->y(), 50.0); - QCOMPARE(three->x(), 0.0); - QCOMPARE(three->y(), 60.0); -} - -void tst_QmlGraphicsLayouts::test_vertical_spacing() -{ - QmlView *canvas = createView(SRCDIR "/data/vertical-spacing.qml"); - - canvas->execute(); - qApp->processEvents(); - - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); - QVERIFY(one != 0); - - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); - QVERIFY(two != 0); - - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); - QVERIFY(three != 0); - - QCOMPARE(one->x(), 0.0); - QCOMPARE(one->y(), 0.0); - QCOMPARE(two->x(), 0.0); - QCOMPARE(two->y(), 60.0); - QCOMPARE(three->x(), 0.0); - QCOMPARE(three->y(), 80.0); -} - -void tst_QmlGraphicsLayouts::test_vertical_animated() -{ - QmlView *canvas = createView(SRCDIR "/data/vertical-animated.qml"); - - canvas->execute(); - qApp->processEvents(); - - QTest::qWait(0);//Let the animation start - //Note that one and three animate in - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); - QVERIFY(one != 0); - QCOMPARE(one->y(), -100.0); - - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); - QVERIFY(two != 0); - QCOMPARE(two->y(), 0.0); - - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); - QVERIFY(three != 0); - QCOMPARE(three->y(), -100.0); - - QTest::qWait(300);//Let the animation complete - - QCOMPARE(one->y(), 0.0); - QCOMPARE(one->x(), 0.0); - QCOMPARE(two->opacity(), 0.0); - QCOMPARE(two->y(), 0.0); - QCOMPARE(two->x(), 0.0); - QCOMPARE(three->y(), 50.0); - QCOMPARE(three->x(), 0.0); - - //Add 'two' - two->setOpacity(1.0); - QCOMPARE(two->opacity(), 1.0); - QTest::qWait(0);//Let the animation start - QCOMPARE(two->y(), -100.0); - QCOMPARE(three->y(), 50.0); - QTest::qWait(300);//Let the animation complete - QCOMPARE(two->y(), 50.0); - QCOMPARE(three->y(), 100.0); - - //Remove 'two' - two->setOpacity(0.0); - QCOMPARE(two->opacity(), 0.0); - QCOMPARE(two->y(), 50.0); - QCOMPARE(three->y(), 100.0); - QTest::qWait(300);//Let the animation complete - QCOMPARE(two->y(), 50.0); - QCOMPARE(three->y(), 50.0); -} - -void tst_QmlGraphicsLayouts::test_grid() -{ - QmlView *canvas = createView("data/grid.qml"); - - canvas->execute(); - qApp->processEvents(); - - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); - QVERIFY(one != 0); - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); - QVERIFY(two != 0); - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); - QVERIFY(three != 0); - QmlGraphicsRectangle *four = canvas->root()->findChild<QmlGraphicsRectangle*>("four"); - QVERIFY(four != 0); - QmlGraphicsRectangle *five = canvas->root()->findChild<QmlGraphicsRectangle*>("five"); - QVERIFY(five != 0); - - QCOMPARE(one->x(), 0.0); - QCOMPARE(one->y(), 0.0); - QCOMPARE(two->x(), 50.0); - QCOMPARE(two->y(), 0.0); - QCOMPARE(three->x(), 70.0); - QCOMPARE(three->y(), 0.0); - QCOMPARE(four->x(), 0.0); - QCOMPARE(four->y(), 50.0); - QCOMPARE(five->x(), 50.0); - QCOMPARE(five->y(), 50.0); -} - -void tst_QmlGraphicsLayouts::test_grid_spacing() -{ - QmlView *canvas = createView("data/grid-spacing.qml"); - - canvas->execute(); - qApp->processEvents(); - - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); - QVERIFY(one != 0); - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); - QVERIFY(two != 0); - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); - QVERIFY(three != 0); - QmlGraphicsRectangle *four = canvas->root()->findChild<QmlGraphicsRectangle*>("four"); - QVERIFY(four != 0); - QmlGraphicsRectangle *five = canvas->root()->findChild<QmlGraphicsRectangle*>("five"); - QVERIFY(five != 0); - - QCOMPARE(one->x(), 0.0); - QCOMPARE(one->y(), 0.0); - QCOMPARE(two->x(), 54.0); - QCOMPARE(two->y(), 0.0); - QCOMPARE(three->x(), 78.0); - QCOMPARE(three->y(), 0.0); - QCOMPARE(four->x(), 0.0); - QCOMPARE(four->y(), 54.0); - QCOMPARE(five->x(), 54.0); - QCOMPARE(five->y(), 54.0); -} - -void tst_QmlGraphicsLayouts::test_grid_animated() -{ - QmlView *canvas = createView(SRCDIR "/data/grid-animated.qml"); - canvas->execute(); - qApp->processEvents(); - - QTest::qWait(0);//Let the animation start - //Note that all but two animate in - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); - QVERIFY(one != 0); - QCOMPARE(one->x(), -100.0); - QCOMPARE(one->y(), -100.0); - - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); - QVERIFY(two != 0); - QCOMPARE(two->x(), 0.0); - QCOMPARE(two->y(), 0.0); - - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); - QVERIFY(three != 0); - QCOMPARE(three->x(), -100.0); - QCOMPARE(three->y(), -100.0); - - QmlGraphicsRectangle *four = canvas->root()->findChild<QmlGraphicsRectangle*>("four"); - QVERIFY(four != 0); - QCOMPARE(four->x(), -100.0); - QCOMPARE(four->y(), -100.0); - - QmlGraphicsRectangle *five = canvas->root()->findChild<QmlGraphicsRectangle*>("five"); - QVERIFY(five != 0); - QCOMPARE(five->x(), -100.0); - QCOMPARE(five->y(), -100.0); - - QTest::qWait(300);//Let the animation complete - - QCOMPARE(one->y(), 0.0); - QCOMPARE(one->x(), 0.0); - QCOMPARE(two->opacity(), 0.0); - QCOMPARE(two->y(), 0.0); - QCOMPARE(two->x(), 0.0); - QCOMPARE(three->y(), 0.0); - QCOMPARE(three->x(), 50.0); - QCOMPARE(four->y(), 0.0); - QCOMPARE(four->x(), 100.0); - QCOMPARE(five->y(), 50.0); - QCOMPARE(five->x(), 0.0); - - //Add 'two' - two->setOpacity(1.0); - QCOMPARE(two->opacity(), 1.0); - QTest::qWait(0);//Let the animation start - QCOMPARE(two->x(), -100.0); - QCOMPARE(two->y(), -100.0); - QCOMPARE(one->x(), 0.0); - QCOMPARE(one->y(), 0.0); - QCOMPARE(three->x(), 50.0); - QCOMPARE(three->y(), 0.0); - QCOMPARE(four->x(), 100.0); - QCOMPARE(four->y(), 0.0); - QCOMPARE(five->x(), 0.0); - QCOMPARE(five->y(), 50.0); - QTest::qWait(300);//Let the animation complete - QCOMPARE(two->x(), 50.0); - QCOMPARE(two->y(), 0.0); - QCOMPARE(one->x(), 0.0); - QCOMPARE(one->y(), 0.0); - QCOMPARE(three->x(), 100.0); - QCOMPARE(three->y(), 0.0); - QCOMPARE(four->x(), 0.0); - QCOMPARE(four->y(), 50.0); - QCOMPARE(five->x(), 50.0); - QCOMPARE(five->y(), 50.0); - - //Remove 'two' - two->setOpacity(0.0); - QCOMPARE(two->opacity(), 0.0); - QCOMPARE(two->x(), 50.0); - QCOMPARE(two->y(), 0.0); - QCOMPARE(one->x(), 0.0); - QCOMPARE(one->y(), 0.0); - QCOMPARE(three->x(), 100.0); - QCOMPARE(three->y(), 0.0); - QCOMPARE(four->x(), 0.0); - QCOMPARE(four->y(), 50.0); - QCOMPARE(five->x(), 50.0); - QCOMPARE(five->y(), 50.0); - QTest::qWait(300);//Let the animation complete - QCOMPARE(two->x(), 50.0); - QCOMPARE(two->y(), 0.0); - QCOMPARE(one->x(), 0.0); - QCOMPARE(one->y(), 0.0); - QCOMPARE(three->x(), 50.0); - QCOMPARE(three->y(), 0.0); - QCOMPARE(four->x(), 100.0); - QCOMPARE(four->y(), 0.0); - QCOMPARE(five->x(), 0.0); - QCOMPARE(five->y(), 50.0); -} - -void tst_QmlGraphicsLayouts::test_repeater() -{ - QmlView *canvas = createView("data/repeater.qml"); - - canvas->execute(); - qApp->processEvents(); - - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); - QVERIFY(one != 0); - - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); - QVERIFY(two != 0); - - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); - QVERIFY(three != 0); - - QCOMPARE(one->x(), 0.0); - QCOMPARE(one->y(), 0.0); - QCOMPARE(two->x(), 50.0); - QCOMPARE(two->y(), 0.0); - QCOMPARE(three->x(), 100.0); - QCOMPARE(three->y(), 0.0); + //TODO: Waiting on QT-2407 to write this test } QmlView *tst_QmlGraphicsLayouts::createView(const QString &filename) diff --git a/tests/auto/declarative/qmldebug/qmldebug.pro b/tests/auto/declarative/qmldebug/qmldebug.pro new file mode 100644 index 0000000..61f821e --- /dev/null +++ b/tests/auto/declarative/qmldebug/qmldebug.pro @@ -0,0 +1,5 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += network declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_qmldebug.cpp diff --git a/tests/auto/declarative/qmldebug/tst_qmldebug.cpp b/tests/auto/declarative/qmldebug/tst_qmldebug.cpp new file mode 100644 index 0000000..a7573da --- /dev/null +++ b/tests/auto/declarative/qmldebug/tst_qmldebug.cpp @@ -0,0 +1,594 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <qtest.h> +#include <QSignalSpy> +#include <QTimer> +#include <QHostAddress> +#include <QDebug> +#include <QThread> +#include <QProcessEnvironment> +#include <QProcess> + +#include <QtDeclarative/qmlengine.h> +#include <QtDeclarative/qmlcontext.h> +#include <QtDeclarative/qmlcomponent.h> +#include <QtDeclarative/qmlexpression.h> + +#include <private/qmldebug_p.h> +#include <private/qmldebugclient_p.h> +#include <private/qmldebugservice_p.h> +#include <private/qmlgraphicsrectangle_p.h> +#include <private/qmlgraphicstext_p.h> + + +class tst_QmlDebug : public QObject +{ + Q_OBJECT + +public: + tst_QmlDebug(QmlDebugConnection *conn, QmlEngine *engine, QmlGraphicsItem *rootItem) + : m_conn(conn), m_dbg(0), m_engine(engine), m_rootItem(rootItem) {} + +protected slots: + void saveValueChange(const QByteArray &ba, const QVariant &v) + { + m_savedValueChanges[ba] = v; + } + +private: + QmlDebugConnection *m_conn; + QmlEngineDebug *m_dbg; + QmlEngine *m_engine; + QmlGraphicsItem *m_rootItem; + + QHash<QByteArray, QVariant> m_savedValueChanges; + + void waitForQuery(QmlDebugQuery *query) + { + QCOMPARE(query->parent(), this); + QEventLoop loop; + QTimer timer; + QVERIFY(query->state() == QmlDebugQuery::Waiting); + connect(query, SIGNAL(stateChanged(State)), &loop, SLOT(quit())); + connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); + timer.start(5000); + loop.exec(); + if (!timer.isActive()) + QFAIL("query timed out"); + } + + void verifyRootObject(const QmlDebugObjectReference &obj) + { + // verifies object according to component definition in main() + + QCOMPARE(obj.debugId(), QmlDebugService::idForObject(m_rootItem)); + QCOMPARE(obj.className(), QLatin1String("Item")); + QCOMPARE(obj.name(), m_rootItem->objectName()); + QCOMPARE(obj.contextDebugId(), QmlDebugService::idForObject(qmlContext(m_rootItem))); + + QmlDebugFileReference source = obj.source(); + QCOMPARE(source.url(), QUrl("file://")); + QCOMPARE(source.lineNumber(), 3); + QCOMPARE(source.columnNumber(), 3); + + QList<QmlDebugPropertyReference> props = obj.properties(); + QHash<QString, QVariant> expected; + + expected["width"] = 10; + expected["height"] = 20; + verifyProperties(props, expected); + } + + void verifyProperties(const QList<QmlDebugPropertyReference> &actual, const QHash<QString, QVariant> &expected) + { + foreach(const QmlDebugPropertyReference &p, actual) { + if (expected.contains(p.name())) + QCOMPARE(p.value(), expected[p.name()]); + } + } + + QmlDebugObjectReference findRootObject() + { + QmlDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); + + if (q_engines->engines().count() == 0) + return QmlDebugObjectReference(); + QmlDebugRootContextQuery *q_context = m_dbg->queryRootContexts(q_engines->engines()[0].debugId(), this); + waitForQuery(q_context); + + if (q_context->rootContext().objects().count() == 0) + return QmlDebugObjectReference(); + QmlDebugObjectQuery *q_obj = m_dbg->queryObject(q_context->rootContext().objects()[0], this); + waitForQuery(q_obj); + + QmlDebugObjectReference result = q_obj->object(); + + delete q_engines; + delete q_context; + delete q_obj; + + return result; + } + + QmlDebugPropertyReference findProperty(const QList<QmlDebugPropertyReference> &props, const QString &name) + { + foreach(const QmlDebugPropertyReference &p, props) { + if (p.name() == name) + return p; + } + return QmlDebugPropertyReference(); + } + + int countNotifiableProperties(const QObject *obj) + { + int count = 0; + for (int i=0; i<obj->metaObject()->propertyCount(); i++) { + QMetaProperty p = obj->metaObject()->property(i); + if (p.hasNotifySignal()) + count++; + } + return count; + } + +private slots: + void initTestCase(); + + void watch_property(); + void watch_object(); + void watch_expression(); + void watch_expression_data(); + + void queryAvailableEngines(); + void queryRootContexts(); + void queryObject(); + void queryObjectRecursive(); + void queryExpressionResult(); + void queryExpressionResult_data(); +}; + +void tst_QmlDebug::initTestCase() +{ + m_dbg = new QmlEngineDebug(m_conn, this); +} + +void tst_QmlDebug::watch_property() +{ + QmlDebugObjectReference obj = findRootObject(); + QmlDebugPropertyReference prop = findProperty(obj.properties(), "width"); + + QmlDebugPropertyWatch *watch = m_dbg->addWatch(prop, this); + QCOMPARE(watch->state(), QmlDebugWatch::Waiting); + QCOMPARE(watch->objectDebugId(), obj.debugId()); + QCOMPARE(watch->name(), prop.name()); + + QSignalSpy spy(watch, SIGNAL(valueChanged(QByteArray,QVariant))); + QEventLoop loop; + QTimer timer; + connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)), &loop, SLOT(quit())); + connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); + + int origWidth = m_rootItem->property("width").toInt(); + timer.start(5000); + m_rootItem->setProperty("width", origWidth*2); + loop.exec(); + + if (!timer.isActive()) + QFAIL("Did not receive valueChanged() for property"); + + m_dbg->removeWatch(watch); + delete watch; + + // restore original value and verify spy doesn't get a signal since watch has been removed + m_rootItem->setProperty("width", origWidth); + QTest::qWait(500); + QCOMPARE(spy.count(), 1); + + QCOMPARE(spy.at(0).at(0).value<QByteArray>(), prop.name().toUtf8()); + QCOMPARE(spy.at(0).at(1).value<QVariant>(), qVariantFromValue(origWidth*2)); +} + +void tst_QmlDebug::watch_object() +{ + QmlDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); + + QmlDebugRootContextQuery *q_context = m_dbg->queryRootContexts(q_engines->engines()[0].debugId(), this); + waitForQuery(q_context); + + QmlDebugObjectQuery *q_obj = m_dbg->queryObject(q_context->rootContext().objects()[0], this); + waitForQuery(q_obj); + + QmlDebugObjectReference obj = q_obj->object(); + + delete q_engines; + delete q_context; + delete q_obj; + + QmlDebugWatch *watch = m_dbg->addWatch(obj, this); + QCOMPARE(watch->state(), QmlDebugWatch::Waiting); + QCOMPARE(watch->objectDebugId(), obj.debugId()); + + m_savedValueChanges.clear(); + connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)), + SLOT(saveValueChange(QByteArray,QVariant))); + + int origWidth = m_rootItem->property("width").toInt(); + int origHeight = m_rootItem->property("height").toInt(); + m_rootItem->setProperty("width", origWidth*2); + m_rootItem->setProperty("height", origHeight*2); + + QEventLoop loop; + QTimer timer; + timer.start(5000); + while (timer.isActive() && + (!m_savedValueChanges.contains("width") || !m_savedValueChanges.contains("height"))) { + loop.processEvents(QEventLoop::AllEvents, 50); + } + + QVariant newWidth = m_savedValueChanges["width"]; + QVariant newHeight = m_savedValueChanges["height"]; + + m_dbg->removeWatch(watch); + delete watch; + + // since watch has been removed, restoring the original values should not trigger a valueChanged() + m_savedValueChanges.clear(); + m_rootItem->setProperty("width", origWidth); + m_rootItem->setProperty("height", origHeight); + QTest::qWait(500); + QCOMPARE(m_savedValueChanges.count(), 0); + + if (newWidth.isNull() || newHeight.isNull()) { + QString s = QString("Did not receive both width and height changes (width=%1, height=%2)") + .arg(newWidth.toString()).arg(newHeight.toString()); + QFAIL(qPrintable(s)); + } + + QCOMPARE(newWidth, qVariantFromValue(origWidth*2)); + QCOMPARE(newHeight, qVariantFromValue(origHeight*2)); +} + +void tst_QmlDebug::watch_expression() +{ + QFETCH(QString, expr); + QFETCH(int, increment); + QFETCH(int, incrementCount); + + int origWidth = m_rootItem->property("width").toInt(); + + QmlDebugObjectReference obj = findRootObject(); + QmlDebugPropertyReference prop; + + QmlDebugObjectExpressionWatch *watch = m_dbg->addWatch(obj, expr, this); + QCOMPARE(watch->state(), QmlDebugWatch::Waiting); + QCOMPARE(watch->objectDebugId(), obj.debugId()); + QCOMPARE(watch->expression(), expr); + + QSignalSpy spy(watch, SIGNAL(valueChanged(QByteArray,QVariant))); + int expectedSpyCount = incrementCount + 1; // should also get signal with expression's initial value + + int width = origWidth; + for (int i=0; i<incrementCount+1; i++) { + QTimer timer; + timer.start(5000); + if (i > 0) { + width += increment; + m_rootItem->setProperty("width", width); + } + QEventLoop loop; + connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); + connect(watch, SIGNAL(valueChanged(QByteArray,QVariant)), &loop, SLOT(quit())); + loop.exec(); + if (!timer.isActive()) + QFAIL("Did not receive valueChanged() signal for expression"); + } + + m_dbg->removeWatch(watch); + delete watch; + + // restore original value and verify spy doesn't get a signal since watch has been removed + m_rootItem->setProperty("width", origWidth); // may increase spy count before QCOMPARE() + QTest::qWait(500); + QCOMPARE(spy.count(), expectedSpyCount); + + width = origWidth + increment; + for (int i=0; i<spy.count(); i++) { + QCOMPARE(spy.at(i).at(1).value<QVariant>().toInt(), width); + width += increment; + } +} + +void tst_QmlDebug::watch_expression_data() +{ + QTest::addColumn<QString>("expr"); + QTest::addColumn<int>("increment"); + QTest::addColumn<int>("incrementCount"); + + QTest::newRow("width") << "width" << 0 << 0; + QTest::newRow("width+10") << "width + 10" << 10 << 5; +} + +void tst_QmlDebug::queryAvailableEngines() +{ + QmlDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); + + // TODO have multiple engines + QList<QmlDebugEngineReference> engines = q_engines->engines(); + QCOMPARE(engines.count(), 1); + + foreach(const QmlDebugEngineReference &e, engines) { + QCOMPARE(e.debugId(), QmlDebugService::idForObject(m_engine)); + QCOMPARE(e.name(), m_engine->objectName()); + } + + delete q_engines; +} + +void tst_QmlDebug::queryRootContexts() +{ + QmlDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); + + QmlDebugRootContextQuery *q_context = m_dbg->queryRootContexts(q_engines->engines()[0].debugId(), this); + waitForQuery(q_context); + + QmlContext *actualContext = m_engine->rootContext(); + QmlDebugContextReference context = q_context->rootContext(); + QCOMPARE(context.debugId(), QmlDebugService::idForObject(actualContext)); + QCOMPARE(context.name(), actualContext->objectName()); + + QCOMPARE(context.objects().count(), 1); + + // root context query sends only root object data - it doesn't fill in + // the children or property info + QCOMPARE(context.objects()[0].properties().count(), 0); + QCOMPARE(context.objects()[0].children().count(), 0); + + // TODO have multiple contexts + QCOMPARE(context.contexts().count(), 0); + + delete q_engines; + delete q_context; +} + +void tst_QmlDebug::queryObject() +{ + QmlDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); + + QmlDebugRootContextQuery *q_context = m_dbg->queryRootContexts(q_engines->engines()[0].debugId(), this); + waitForQuery(q_context); + + QmlDebugObjectQuery *q_obj = m_dbg->queryObject(q_context->rootContext().objects()[0], this); + waitForQuery(q_obj); + + QmlDebugObjectReference obj = q_obj->object(); + verifyRootObject(obj); + + QVERIFY(obj.children().count() >= 2); + + // non-recursive query, children data not available + foreach(const QmlDebugObjectReference &child, obj.children()) + QCOMPARE(child.properties().count(), 0); + + delete q_engines; + delete q_context; + delete q_obj; +} + +void tst_QmlDebug::queryObjectRecursive() +{ + QmlDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); + + QmlDebugRootContextQuery *q_context = m_dbg->queryRootContexts(q_engines->engines()[0].debugId(), this); + waitForQuery(q_context); + + QmlDebugObjectQuery *q_obj = m_dbg->queryObjectRecursive(q_context->rootContext().objects()[0], this); + waitForQuery(q_obj); + + QmlDebugObjectReference obj = q_obj->object(); + verifyRootObject(obj); + + delete q_engines; + delete q_context; + delete q_obj; + + QList<QmlDebugObjectReference> children = obj.children(); + QVERIFY(children.count() >= 2); // there may be additional properties e.g. StateGroup + + QList<QmlDebugPropertyReference> props; + QHash<QString, QVariant> expected; + + QmlDebugObjectReference rectRef; + QmlDebugObjectReference textRef; + foreach (const QmlDebugObjectReference &child, children) { + if (child.className() == "Rectangle") { + props = child.properties(); + QVERIFY(props.count() > 0); + expected.clear(); + expected["width"] = 500; + expected["height"] = 600; + expected["color"] = "blue"; + verifyProperties(props, expected); + rectRef = child; + } else if (child.className() == "Text") { + props = child.properties(); + QVERIFY(props.count() > 0); + expected.clear(); + expected["color"] = "red"; + verifyProperties(props, expected); + textRef = child; + } + } + + QVERIFY(!rectRef.className().isEmpty()); + QVERIFY(!textRef.className().isEmpty()); + + QObject *rectObj = 0; + QObject *textObj = 0; + foreach (QObject *o, m_rootItem->children()) { + if (o->metaObject()->className() == QmlGraphicsRectangle::staticMetaObject.className()) + rectObj = o; + else if (o->metaObject()->className() == QmlGraphicsText::staticMetaObject.className()) + textObj = o; + } + + QVERIFY(rectObj); + QVERIFY(textObj); + + for (int i=0; i<rectObj->metaObject()->propertyCount(); i++) { + QMetaProperty p = rectObj->metaObject()->property(i); + QmlDebugPropertyReference pd = findProperty(rectRef.properties(), p.name()); + if (!pd.name().isEmpty()) { + QCOMPARE(pd.name(), QString::fromUtf8(p.name())); + if (p.type() < QVariant::UserType) + QCOMPARE(pd.value(), p.read(rectObj)); + if (pd.name() != "parent") + QCOMPARE(pd.valueTypeName(), QString::fromUtf8(p.typeName())); + QCOMPARE(pd.hasNotifySignal(), p.hasNotifySignal()); + } + } +} + +void tst_QmlDebug::queryExpressionResult() +{ + QFETCH(QString, expr); + QFETCH(QVariant, result); + + QmlDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); + + QmlDebugRootContextQuery *q_context = m_dbg->queryRootContexts(q_engines->engines()[0].debugId(), this); + waitForQuery(q_context); + + QmlDebugExpressionQuery *q_expr = m_dbg->queryExpressionResult(q_context->rootContext().objects()[0].debugId(), expr, this); + QCOMPARE(q_expr->expression(), expr); + waitForQuery(q_expr); + + QCOMPARE(q_expr->result(), result); + + delete q_engines; + delete q_context; + delete q_expr; +} + +void tst_QmlDebug::queryExpressionResult_data() +{ + QTest::addColumn<QString>("expr"); + QTest::addColumn<QVariant>("result"); + + QTest::newRow("width + 50") << "width + 50" << qVariantFromValue(60); + QTest::newRow("blueRect.width") << "blueRect.width" << qVariantFromValue(500); + QTest::newRow("bad expr") << "aeaef" << qVariantFromValue(QString("<undefined>")); +} + + +class TestRunnerThread : public QThread +{ + Q_OBJECT +public: + void run() { + QTest::qWait(1000); + connectToEngine(); + } + + QPointer<QmlEngine> m_engine; + QPointer<QmlGraphicsItem> m_item; + +signals: + void testsFinished(); + +public slots: + + void connectToEngine() + { + QmlDebugConnection conn; + conn.connectToHost("127.0.0.1", 3768); + bool ok = conn.waitForConnected(5000); + Q_ASSERT(ok); + while (!m_engine && !m_item) + QTest::qWait(50); + + tst_QmlDebug test(&conn, m_engine, m_item); + QTest::qExec(&test); + emit testsFinished(); + } +}; + + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + qputenv("QML_DEBUG_SERVER_PORT", "3768"); + + TestRunnerThread thread; + QObject::connect(&thread, SIGNAL(testsFinished()), qApp, SLOT(quit())); + thread.start(); + + QmlEngine engine; // blocks until client connects + + QmlComponent component(&engine, + "import Qt 4.6\n" + "\n" // don't remove, line number is tested + " Item {\n" // don't remove spaces, column number is tested + "width: 10; height: 20;\n" + "Rectangle { id: blueRect; width: 500; height: 600; color: \"blue\"; }" + "Text { color: \"red\"; }" + "}\n", + QUrl("file://")); + Q_ASSERT(component.isReady()); + QObject *o = component.create(); + QObject::connect(&thread, SIGNAL(testsFinished()), o, SLOT(deleteLater())); + + // start the test + thread.m_engine = &engine; + thread.m_item = qobject_cast<QmlGraphicsItem*>(o); + + return app.exec(); + +} + +//QTEST_MAIN(tst_QmlDebug) + +#include "tst_qmldebug.moc" diff --git a/tests/auto/declarative/qmlgraphicsgridview/data/gridview-initCurrent.qml b/tests/auto/declarative/qmlgraphicsgridview/data/gridview-initCurrent.qml new file mode 100644 index 0000000..d9e9f27 --- /dev/null +++ b/tests/auto/declarative/qmlgraphicsgridview/data/gridview-initCurrent.qml @@ -0,0 +1,51 @@ +import Qt 4.6 + +Rectangle { + width: 240 + height: 320 + color: "#ffffff" + resources: [ + Component { + id: myDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + width: 80 + height: 60 + border.color: "blue" + Text { + text: index + } + Text { + x: 40 + text: wrapper.x + ", " + wrapper.y + } + Text { + y: 20 + id: textName + objectName: "textName" + text: name + } + Text { + y: 40 + id: textNumber + objectName: "textNumber" + text: number + } + color: GridView.isCurrentItem ? "lightsteelblue" : "white" + } + } + ] + GridView { + id: grid + objectName: "grid" + focus: true + width: 240 + height: 320 + currentIndex: 5 + cellWidth: 80 + cellHeight: 60 + model: testModel + delegate: myDelegate + } +} diff --git a/tests/auto/declarative/qmlgraphicsgridview/tst_qmlgraphicsgridview.cpp b/tests/auto/declarative/qmlgraphicsgridview/tst_qmlgraphicsgridview.cpp index c6ea25a..7c32d14 100644 --- a/tests/auto/declarative/qmlgraphicsgridview/tst_qmlgraphicsgridview.cpp +++ b/tests/auto/declarative/qmlgraphicsgridview/tst_qmlgraphicsgridview.cpp @@ -53,6 +53,7 @@ public: tst_QmlGraphicsGridView(); private slots: + void currentIndex(); void items(); void changed(); void inserted(); @@ -168,15 +169,6 @@ void tst_QmlGraphicsGridView::items() QCOMPARE(number->text(), model.number(i)); } - gridview->moveCurrentIndexRight(); - QCOMPARE(gridview->currentIndex(), 1); - gridview->moveCurrentIndexDown(); - QCOMPARE(gridview->currentIndex(), 4); - gridview->moveCurrentIndexUp(); - QCOMPARE(gridview->currentIndex(), 1); - gridview->moveCurrentIndexLeft(); - QCOMPARE(gridview->currentIndex(), 0); - // set an empty model and confirm that items are destroyed TestModel model2; ctxt->setContextProperty("testModel", &model2); @@ -515,6 +507,107 @@ void tst_QmlGraphicsGridView::moved() delete canvas; } +void tst_QmlGraphicsGridView::currentIndex() +{ + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), QString::number(i)); + + QmlView *canvas = new QmlView(0); + canvas->setFixedSize(240,320); + + QmlContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + QString filename(SRCDIR "/data/gridview-initCurrent.qml"); + QFile file(filename); + file.open(QFile::ReadOnly); + QString qml = file.readAll(); + canvas->setQml(qml, filename); + + canvas->execute(); + qApp->processEvents(); + + QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->root(), "grid"); + QVERIFY(gridview != 0); + + QmlGraphicsItem *viewport = gridview->viewport(); + QVERIFY(viewport != 0); + + // current item should be third item + QCOMPARE(gridview->currentIndex(), 5); + QCOMPARE(gridview->currentItem(), findItem<QmlGraphicsItem>(viewport, "wrapper", 5)); + + gridview->moveCurrentIndexRight(); + QCOMPARE(gridview->currentIndex(), 6); + gridview->moveCurrentIndexDown(); + QCOMPARE(gridview->currentIndex(), 9); + gridview->moveCurrentIndexUp(); + QCOMPARE(gridview->currentIndex(), 6); + gridview->moveCurrentIndexLeft(); + QCOMPARE(gridview->currentIndex(), 5); + + // no wrap + gridview->setCurrentIndex(0); + QCOMPARE(gridview->currentIndex(), 0); + + gridview->moveCurrentIndexUp(); + QCOMPARE(gridview->currentIndex(), 0); + + gridview->moveCurrentIndexLeft(); + QCOMPARE(gridview->currentIndex(), 0); + + gridview->setCurrentIndex(model.count()-1); + QTest::qWait(500); + QCOMPARE(gridview->currentIndex(), model.count()-1); + + gridview->moveCurrentIndexRight(); + QCOMPARE(gridview->currentIndex(), model.count()-1); + + gridview->moveCurrentIndexDown(); + QCOMPARE(gridview->currentIndex(), model.count()-1); + + // with wrap + gridview->setWrapEnabled(true); + + gridview->setCurrentIndex(0); + QCOMPARE(gridview->currentIndex(), 0); + QTest::qWait(500); + + gridview->moveCurrentIndexLeft(); + QCOMPARE(gridview->currentIndex(), model.count()-1); + + QTest::qWait(500); + QCOMPARE(gridview->viewportY(), 279.0); + + gridview->moveCurrentIndexRight(); + QCOMPARE(gridview->currentIndex(), 0); + + QTest::qWait(500); + QCOMPARE(gridview->viewportY(), 0.0); + + // Test keys + canvas->show(); + qApp->processEvents(); + + QEvent wa(QEvent::WindowActivate); + QApplication::sendEvent(canvas, &wa); + QFocusEvent fe(QEvent::FocusIn); + QApplication::sendEvent(canvas, &fe); + + QKeyEvent key(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + QCOMPARE(gridview->currentIndex(), 3); + + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + QCOMPARE(gridview->currentIndex(), 0); + + delete canvas; +} + QmlView *tst_QmlGraphicsGridView::createView(const QString &filename) { QmlView *canvas = new QmlView(0); diff --git a/tests/auto/declarative/qmlgraphicslistview/data/itemlist.qml b/tests/auto/declarative/qmlgraphicslistview/data/itemlist.qml new file mode 100644 index 0000000..36d3501 --- /dev/null +++ b/tests/auto/declarative/qmlgraphicslistview/data/itemlist.qml @@ -0,0 +1,43 @@ +// This example demonstrates placing items in a view using +// a VisualItemModel + +import Qt 4.6 + +Rectangle { + color: "lightgray" + width: 240 + height: 320 + + VisualItemModel { + id: itemModel + objectName: "itemModel" + Rectangle { + objectName: "item1" + height: view.height; width: view.width; color: "#FFFEF0" + Text { text: "Page 1"; font.bold: true; anchors.centerIn: parent } + } + Rectangle { + objectName: "item2" + height: view.height; width: view.width; color: "#F0FFF7" + Text { text: "Page 2"; font.bold: true; anchors.centerIn: parent } + } + Rectangle { + objectName: "item3" + height: view.height; width: view.width; color: "#F4F0FF" + Text { text: "Page 3"; font.bold: true; anchors.centerIn: parent } + } + } + + ListView { + id: view + objectName: "view" + anchors.fill: parent + anchors.bottomMargin: 30 + model: itemModel + preferredHighlightBegin: 0 + preferredHighlightEnd: 0 + highlightRangeMode: "StrictlyEnforceRange" + orientation: ListView.Horizontal + flickDeceleration: 2000 + } +} diff --git a/tests/auto/declarative/qmlgraphicslistview/data/listview.qml b/tests/auto/declarative/qmlgraphicslistview/data/listview.qml index 93a3ae3..3ef1be1 100644 --- a/tests/auto/declarative/qmlgraphicslistview/data/listview.qml +++ b/tests/auto/declarative/qmlgraphicslistview/data/listview.qml @@ -32,6 +32,11 @@ Rectangle { text: wrapper.y } color: ListView.isCurrentItem ? "lightsteelblue" : "white" + ListView.onRemove: SequentialAnimation { + PropertyAction { target: wrapper.ListView; property: "delayRemove"; value: true } + NumberAnimation { target: wrapper; property: "scale"; to: 0; duration: 250; easing: "easeInOutQuad" } + PropertyAction { target: wrapper.ListView; property: "delayRemove"; value: false } + } } } ] diff --git a/tests/auto/declarative/qmlgraphicslistview/tst_qmlgraphicslistview.cpp b/tests/auto/declarative/qmlgraphicslistview/tst_qmlgraphicslistview.cpp index 4a33770..afef47a 100644 --- a/tests/auto/declarative/qmlgraphicslistview/tst_qmlgraphicslistview.cpp +++ b/tests/auto/declarative/qmlgraphicslistview/tst_qmlgraphicslistview.cpp @@ -43,6 +43,7 @@ #include <qmlview.h> #include <private/qmlgraphicslistview_p.h> #include <private/qmlgraphicstext_p.h> +#include <private/qmlgraphicsvisualitemmodel_p.h> #include <qmlcontext.h> #include <qmlexpression.h> @@ -53,6 +54,7 @@ public: tst_QmlGraphicsListView(); private slots: + void itemList(); // Test both QListModelInterface and QAbstractItemModel model types void qListModelInterface_items(); void qAbstractItemModel_items(); @@ -69,10 +71,10 @@ private slots: void qListModelInterface_moved(); void qAbstractItemModel_moved(); + void currentIndex(); void enforceRange(); void spacing(); void sections(); - void currentIndex(); private: template <class T> void items(); @@ -766,15 +768,22 @@ void tst_QmlGraphicsListView::sections() void tst_QmlGraphicsListView::currentIndex() { - QmlView *canvas = createView(SRCDIR "/data/listview-initCurrent.qml"); - TestModel model; for (int i = 0; i < 30; i++) model.addItem("Item" + QString::number(i), QString::number(i)); + QmlView *canvas = new QmlView(0); + canvas->setFixedSize(240,320); + QmlContext *ctxt = canvas->rootContext(); ctxt->setContextProperty("testModel", &model); + QString filename(SRCDIR "/data/listview-initCurrent.qml"); + QFile file(filename); + file.open(QFile::ReadOnly); + QString qml = file.readAll(); + canvas->setQml(qml, filename); + canvas->execute(); qApp->processEvents(); @@ -785,6 +794,7 @@ void tst_QmlGraphicsListView::currentIndex() QVERIFY(viewport != 0); // current item should be third item + QCOMPARE(listview->currentIndex(), 3); QCOMPARE(listview->currentItem(), findItem<QmlGraphicsItem>(viewport, "wrapper", 3)); // no wrap @@ -836,6 +846,39 @@ void tst_QmlGraphicsListView::currentIndex() delete canvas; } +void tst_QmlGraphicsListView::itemList() +{ + QmlView *canvas = createView(SRCDIR "/data/itemlist.qml"); + + canvas->execute(); + qApp->processEvents(); + + QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "view"); + QVERIFY(listview != 0); + + QmlGraphicsItem *viewport = listview->viewport(); + QVERIFY(viewport != 0); + + QmlGraphicsVisualItemModel *model = canvas->root()->findChild<QmlGraphicsVisualItemModel*>("itemModel"); + QVERIFY(model != 0); + + QVERIFY(model->count() == 3); + QCOMPARE(listview->currentIndex(), 0); + + QmlGraphicsItem *item = findItem<QmlGraphicsItem>(viewport, "item1"); + QVERIFY(item); + QCOMPARE(item->x(), 0.0); + + listview->setCurrentIndex(2); + QTest::qWait(1000); + + item = findItem<QmlGraphicsItem>(viewport, "item3"); + QVERIFY(item); + QCOMPARE(item->x(), 480.0); + + delete canvas; +} + void tst_QmlGraphicsListView::qListModelInterface_items() { items<TestModel>(); diff --git a/tests/auto/declarative/qmlgraphicsparticles/tst_qmlgraphicsparticles.cpp b/tests/auto/declarative/qmlgraphicsparticles/tst_qmlgraphicsparticles.cpp index ed68eaf..c8d181b 100644 --- a/tests/auto/declarative/qmlgraphicsparticles/tst_qmlgraphicsparticles.cpp +++ b/tests/auto/declarative/qmlgraphicsparticles/tst_qmlgraphicsparticles.cpp @@ -96,6 +96,9 @@ void tst_QmlGraphicsParticles::properties() particles->setEmissionRate(12); QCOMPARE(particles->emissionRate(), 12); + + particles->setEmitting(false); + QCOMPARE(particles->emitting(), false); } void tst_QmlGraphicsParticles::runs() diff --git a/tests/auto/declarative/layouts/data/grid-animated.qml b/tests/auto/declarative/qmlgraphicspositioners/data/grid-animated.qml index 6b128ce..6b128ce 100644 --- a/tests/auto/declarative/layouts/data/grid-animated.qml +++ b/tests/auto/declarative/qmlgraphicspositioners/data/grid-animated.qml diff --git a/tests/auto/declarative/layouts/data/grid-spacing.qml b/tests/auto/declarative/qmlgraphicspositioners/data/grid-spacing.qml index 5b4a30d..5b4a30d 100644 --- a/tests/auto/declarative/layouts/data/grid-spacing.qml +++ b/tests/auto/declarative/qmlgraphicspositioners/data/grid-spacing.qml diff --git a/tests/auto/declarative/layouts/data/grid.qml b/tests/auto/declarative/qmlgraphicspositioners/data/grid.qml index 830df6a..830df6a 100644 --- a/tests/auto/declarative/layouts/data/grid.qml +++ b/tests/auto/declarative/qmlgraphicspositioners/data/grid.qml diff --git a/tests/auto/declarative/layouts/data/horizontal-animated.qml b/tests/auto/declarative/qmlgraphicspositioners/data/horizontal-animated.qml index c29d6df..c29d6df 100644 --- a/tests/auto/declarative/layouts/data/horizontal-animated.qml +++ b/tests/auto/declarative/qmlgraphicspositioners/data/horizontal-animated.qml diff --git a/tests/auto/declarative/layouts/data/horizontal-spacing.qml b/tests/auto/declarative/qmlgraphicspositioners/data/horizontal-spacing.qml index 32bf775..32bf775 100644 --- a/tests/auto/declarative/layouts/data/horizontal-spacing.qml +++ b/tests/auto/declarative/qmlgraphicspositioners/data/horizontal-spacing.qml diff --git a/tests/auto/declarative/layouts/data/horizontal.qml b/tests/auto/declarative/qmlgraphicspositioners/data/horizontal.qml index 06ae151..06ae151 100644 --- a/tests/auto/declarative/layouts/data/horizontal.qml +++ b/tests/auto/declarative/qmlgraphicspositioners/data/horizontal.qml diff --git a/tests/auto/declarative/layouts/data/repeater.qml b/tests/auto/declarative/qmlgraphicspositioners/data/repeater.qml index 2bc5e94..2bc5e94 100644 --- a/tests/auto/declarative/layouts/data/repeater.qml +++ b/tests/auto/declarative/qmlgraphicspositioners/data/repeater.qml diff --git a/tests/auto/declarative/layouts/data/vertical-animated.qml b/tests/auto/declarative/qmlgraphicspositioners/data/vertical-animated.qml index fcbc5f7..fcbc5f7 100644 --- a/tests/auto/declarative/layouts/data/vertical-animated.qml +++ b/tests/auto/declarative/qmlgraphicspositioners/data/vertical-animated.qml diff --git a/tests/auto/declarative/layouts/data/vertical-spacing.qml b/tests/auto/declarative/qmlgraphicspositioners/data/vertical-spacing.qml index 69a8256..69a8256 100644 --- a/tests/auto/declarative/layouts/data/vertical-spacing.qml +++ b/tests/auto/declarative/qmlgraphicspositioners/data/vertical-spacing.qml diff --git a/tests/auto/declarative/layouts/data/vertical.qml b/tests/auto/declarative/qmlgraphicspositioners/data/vertical.qml index 856c180..856c180 100644 --- a/tests/auto/declarative/layouts/data/vertical.qml +++ b/tests/auto/declarative/qmlgraphicspositioners/data/vertical.qml diff --git a/tests/auto/declarative/qmlgraphicspositioners/qmlgraphicspositioners.pro b/tests/auto/declarative/qmlgraphicspositioners/qmlgraphicspositioners.pro new file mode 100644 index 0000000..d151026 --- /dev/null +++ b/tests/auto/declarative/qmlgraphicspositioners/qmlgraphicspositioners.pro @@ -0,0 +1,7 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +SOURCES += tst_qmlgraphicspositioners.cpp +macx:CONFIG -= app_bundle + +# Define SRCDIR equal to test's source directory +DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/qmlgraphicspositioners/tst_qmlgraphicspositioners.cpp b/tests/auto/declarative/qmlgraphicspositioners/tst_qmlgraphicspositioners.cpp new file mode 100644 index 0000000..aca3579 --- /dev/null +++ b/tests/auto/declarative/qmlgraphicspositioners/tst_qmlgraphicspositioners.cpp @@ -0,0 +1,469 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QtTest/QtTest> +#include <private/qlistmodelinterface_p.h> +#include <qmlview.h> +#include <private/qmlgraphicsrectangle_p.h> +#include <qmlexpression.h> + +class tst_QmlGraphicsPositioners : public QObject +{ + Q_OBJECT +public: + tst_QmlGraphicsPositioners(); + +private slots: + void test_horizontal(); + void test_horizontal_spacing(); + void test_horizontal_animated(); + void test_vertical(); + void test_vertical_spacing(); + void test_vertical_animated(); + void test_grid(); + void test_grid_spacing(); + void test_grid_animated(); + + void test_repeater(); +private: + QmlView *createView(const QString &filename); +}; + +tst_QmlGraphicsPositioners::tst_QmlGraphicsPositioners() +{ +} + +void tst_QmlGraphicsPositioners::test_horizontal() +{ + QmlView *canvas = createView(SRCDIR "/data/horizontal.qml"); + + canvas->execute(); + qApp->processEvents(); + + QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QVERIFY(one != 0); + + QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QVERIFY(two != 0); + + QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QVERIFY(three != 0); + + QCOMPARE(one->x(), 0.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 50.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(three->x(), 70.0); + QCOMPARE(three->y(), 0.0); +} + +void tst_QmlGraphicsPositioners::test_horizontal_spacing() +{ + QmlView *canvas = createView(SRCDIR "/data/horizontal-spacing.qml"); + + canvas->execute(); + qApp->processEvents(); + + QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QVERIFY(one != 0); + + QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QVERIFY(two != 0); + + QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QVERIFY(three != 0); + + QCOMPARE(one->x(), 0.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 60.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(three->x(), 90.0); + QCOMPARE(three->y(), 0.0); +} + +void tst_QmlGraphicsPositioners::test_horizontal_animated() +{ + QmlView *canvas = createView(SRCDIR "/data/horizontal-animated.qml"); + + canvas->execute(); + qApp->processEvents(); + + QTest::qWait(0);//Let the animation start + //Note that one and three animate in + QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QVERIFY(one != 0); + QCOMPARE(one->x(), -100.0); + + QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QVERIFY(two != 0); + QCOMPARE(two->x(), 0.0); + + QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QVERIFY(three != 0); + QCOMPARE(three->x(), -100.0); + + QTest::qWait(300);//Let the animation complete + + QCOMPARE(one->x(), 0.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->opacity(), 0.0); + QCOMPARE(two->x(), 0.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(three->x(), 50.0); + QCOMPARE(three->y(), 0.0); + + //Add 'two' + two->setOpacity(1.0); + QCOMPARE(two->opacity(), 1.0); + QTest::qWait(0);//Let the animation start + QCOMPARE(two->x(), -100.0); + QCOMPARE(three->x(), 50.0); + QTest::qWait(300);//Let the animation complete + QCOMPARE(two->x(), 50.0); + QCOMPARE(three->x(), 100.0); + + //Remove 'two' + two->setOpacity(0.0); + QCOMPARE(two->opacity(), 0.0); + QCOMPARE(two->x(), 50.0); + QCOMPARE(three->x(), 100.0); + QTest::qWait(300);//Let the animation complete + QCOMPARE(two->x(), 50.0); + QCOMPARE(three->x(), 50.0); +} + +void tst_QmlGraphicsPositioners::test_vertical() +{ + QmlView *canvas = createView(SRCDIR "/data/vertical.qml"); + + canvas->execute(); + qApp->processEvents(); + + QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QVERIFY(one != 0); + + QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QVERIFY(two != 0); + + QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QVERIFY(three != 0); + + QCOMPARE(one->x(), 0.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 0.0); + QCOMPARE(two->y(), 50.0); + QCOMPARE(three->x(), 0.0); + QCOMPARE(three->y(), 60.0); +} + +void tst_QmlGraphicsPositioners::test_vertical_spacing() +{ + QmlView *canvas = createView(SRCDIR "/data/vertical-spacing.qml"); + + canvas->execute(); + qApp->processEvents(); + + QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QVERIFY(one != 0); + + QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QVERIFY(two != 0); + + QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QVERIFY(three != 0); + + QCOMPARE(one->x(), 0.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 0.0); + QCOMPARE(two->y(), 60.0); + QCOMPARE(three->x(), 0.0); + QCOMPARE(three->y(), 80.0); +} + +void tst_QmlGraphicsPositioners::test_vertical_animated() +{ + QmlView *canvas = createView(SRCDIR "/data/vertical-animated.qml"); + + canvas->execute(); + qApp->processEvents(); + + QTest::qWait(0);//Let the animation start + //Note that one and three animate in + QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QVERIFY(one != 0); + QCOMPARE(one->y(), -100.0); + + QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QVERIFY(two != 0); + QCOMPARE(two->y(), 0.0); + + QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QVERIFY(three != 0); + QCOMPARE(three->y(), -100.0); + + QTest::qWait(300);//Let the animation complete + + QCOMPARE(one->y(), 0.0); + QCOMPARE(one->x(), 0.0); + QCOMPARE(two->opacity(), 0.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(two->x(), 0.0); + QCOMPARE(three->y(), 50.0); + QCOMPARE(three->x(), 0.0); + + //Add 'two' + two->setOpacity(1.0); + QCOMPARE(two->opacity(), 1.0); + QTest::qWait(0);//Let the animation start + QCOMPARE(two->y(), -100.0); + QCOMPARE(three->y(), 50.0); + QTest::qWait(300);//Let the animation complete + QCOMPARE(two->y(), 50.0); + QCOMPARE(three->y(), 100.0); + + //Remove 'two' + two->setOpacity(0.0); + QCOMPARE(two->opacity(), 0.0); + QCOMPARE(two->y(), 50.0); + QCOMPARE(three->y(), 100.0); + QTest::qWait(300);//Let the animation complete + QCOMPARE(two->y(), 50.0); + QCOMPARE(three->y(), 50.0); +} + +void tst_QmlGraphicsPositioners::test_grid() +{ + QmlView *canvas = createView("data/grid.qml"); + + canvas->execute(); + qApp->processEvents(); + + QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QVERIFY(one != 0); + QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QVERIFY(two != 0); + QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QVERIFY(three != 0); + QmlGraphicsRectangle *four = canvas->root()->findChild<QmlGraphicsRectangle*>("four"); + QVERIFY(four != 0); + QmlGraphicsRectangle *five = canvas->root()->findChild<QmlGraphicsRectangle*>("five"); + QVERIFY(five != 0); + + QCOMPARE(one->x(), 0.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 50.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(three->x(), 70.0); + QCOMPARE(three->y(), 0.0); + QCOMPARE(four->x(), 0.0); + QCOMPARE(four->y(), 50.0); + QCOMPARE(five->x(), 50.0); + QCOMPARE(five->y(), 50.0); +} + +void tst_QmlGraphicsPositioners::test_grid_spacing() +{ + QmlView *canvas = createView("data/grid-spacing.qml"); + + canvas->execute(); + qApp->processEvents(); + + QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QVERIFY(one != 0); + QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QVERIFY(two != 0); + QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QVERIFY(three != 0); + QmlGraphicsRectangle *four = canvas->root()->findChild<QmlGraphicsRectangle*>("four"); + QVERIFY(four != 0); + QmlGraphicsRectangle *five = canvas->root()->findChild<QmlGraphicsRectangle*>("five"); + QVERIFY(five != 0); + + QCOMPARE(one->x(), 0.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 54.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(three->x(), 78.0); + QCOMPARE(three->y(), 0.0); + QCOMPARE(four->x(), 0.0); + QCOMPARE(four->y(), 54.0); + QCOMPARE(five->x(), 54.0); + QCOMPARE(five->y(), 54.0); +} + +void tst_QmlGraphicsPositioners::test_grid_animated() +{ + QmlView *canvas = createView(SRCDIR "/data/grid-animated.qml"); + canvas->execute(); + qApp->processEvents(); + + QTest::qWait(0);//Let the animation start + //Note that all but two animate in + QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QVERIFY(one != 0); + QCOMPARE(one->x(), -100.0); + QCOMPARE(one->y(), -100.0); + + QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QVERIFY(two != 0); + QCOMPARE(two->x(), 0.0); + QCOMPARE(two->y(), 0.0); + + QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QVERIFY(three != 0); + QCOMPARE(three->x(), -100.0); + QCOMPARE(three->y(), -100.0); + + QmlGraphicsRectangle *four = canvas->root()->findChild<QmlGraphicsRectangle*>("four"); + QVERIFY(four != 0); + QCOMPARE(four->x(), -100.0); + QCOMPARE(four->y(), -100.0); + + QmlGraphicsRectangle *five = canvas->root()->findChild<QmlGraphicsRectangle*>("five"); + QVERIFY(five != 0); + QCOMPARE(five->x(), -100.0); + QCOMPARE(five->y(), -100.0); + + QTest::qWait(300);//Let the animation complete + + QCOMPARE(one->y(), 0.0); + QCOMPARE(one->x(), 0.0); + QCOMPARE(two->opacity(), 0.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(two->x(), 0.0); + QCOMPARE(three->y(), 0.0); + QCOMPARE(three->x(), 50.0); + QCOMPARE(four->y(), 0.0); + QCOMPARE(four->x(), 100.0); + QCOMPARE(five->y(), 50.0); + QCOMPARE(five->x(), 0.0); + + //Add 'two' + two->setOpacity(1.0); + QCOMPARE(two->opacity(), 1.0); + QTest::qWait(0);//Let the animation start + QCOMPARE(two->x(), -100.0); + QCOMPARE(two->y(), -100.0); + QCOMPARE(one->x(), 0.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(three->x(), 50.0); + QCOMPARE(three->y(), 0.0); + QCOMPARE(four->x(), 100.0); + QCOMPARE(four->y(), 0.0); + QCOMPARE(five->x(), 0.0); + QCOMPARE(five->y(), 50.0); + QTest::qWait(300);//Let the animation complete + QCOMPARE(two->x(), 50.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(one->x(), 0.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(three->x(), 100.0); + QCOMPARE(three->y(), 0.0); + QCOMPARE(four->x(), 0.0); + QCOMPARE(four->y(), 50.0); + QCOMPARE(five->x(), 50.0); + QCOMPARE(five->y(), 50.0); + + //Remove 'two' + two->setOpacity(0.0); + QCOMPARE(two->opacity(), 0.0); + QCOMPARE(two->x(), 50.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(one->x(), 0.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(three->x(), 100.0); + QCOMPARE(three->y(), 0.0); + QCOMPARE(four->x(), 0.0); + QCOMPARE(four->y(), 50.0); + QCOMPARE(five->x(), 50.0); + QCOMPARE(five->y(), 50.0); + QTest::qWait(300);//Let the animation complete + QCOMPARE(two->x(), 50.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(one->x(), 0.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(three->x(), 50.0); + QCOMPARE(three->y(), 0.0); + QCOMPARE(four->x(), 100.0); + QCOMPARE(four->y(), 0.0); + QCOMPARE(five->x(), 0.0); + QCOMPARE(five->y(), 50.0); +} + +void tst_QmlGraphicsPositioners::test_repeater() +{ + QmlView *canvas = createView("data/repeater.qml"); + + canvas->execute(); + qApp->processEvents(); + + QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QVERIFY(one != 0); + + QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QVERIFY(two != 0); + + QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QVERIFY(three != 0); + + QCOMPARE(one->x(), 0.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 50.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(three->x(), 100.0); + QCOMPARE(three->y(), 0.0); +} + +QmlView *tst_QmlGraphicsPositioners::createView(const QString &filename) +{ + QmlView *canvas = new QmlView(0); + + QFile file(filename); + file.open(QFile::ReadOnly); + QString xml = file.readAll(); + canvas->setQml(xml, filename); + + return canvas; +} + + +QTEST_MAIN(tst_QmlGraphicsPositioners) + +#include "tst_qmlgraphicspositioners.moc" diff --git a/tests/auto/declarative/qfxtextedit/data/cursorTest.qml b/tests/auto/declarative/qmlgraphicstextedit/data/cursorTest.qml index e5df8f1..e5df8f1 100644 --- a/tests/auto/declarative/qfxtextedit/data/cursorTest.qml +++ b/tests/auto/declarative/qmlgraphicstextedit/data/cursorTest.qml diff --git a/tests/auto/declarative/qfxtextedit/data/navigation.qml b/tests/auto/declarative/qmlgraphicstextedit/data/navigation.qml index 5b8613f..5b8613f 100644 --- a/tests/auto/declarative/qfxtextedit/data/navigation.qml +++ b/tests/auto/declarative/qmlgraphicstextedit/data/navigation.qml diff --git a/tests/auto/declarative/qfxtextedit/qfxtextedit.pro b/tests/auto/declarative/qmlgraphicstextedit/qmlgraphicstextedit.pro index b5e0464..9e6a71a 100644 --- a/tests/auto/declarative/qfxtextedit/qfxtextedit.pro +++ b/tests/auto/declarative/qmlgraphicstextedit/qmlgraphicstextedit.pro @@ -2,7 +2,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative gui macx:CONFIG -= app_bundle -SOURCES += tst_qfxtextedit.cpp +SOURCES += tst_qmlgraphicstextedit.cpp # Define SRCDIR equal to test's source directory DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp b/tests/auto/declarative/qmlgraphicstextedit/tst_qmlgraphicstextedit.cpp index 19d5998..4287f01 100644 --- a/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp +++ b/tests/auto/declarative/qmlgraphicstextedit/tst_qmlgraphicstextedit.cpp @@ -51,12 +51,12 @@ #include <QFontMetrics> #include <QmlView> -class tst_qfxtextedit : public QObject +class tst_qmlgraphicstextedit : public QObject { Q_OBJECT public: - tst_qfxtextedit(); + tst_qmlgraphicstextedit(); private slots: void text(); @@ -91,7 +91,7 @@ private: QmlEngine engine; }; -tst_qfxtextedit::tst_qfxtextedit() +tst_qmlgraphicstextedit::tst_qmlgraphicstextedit() { standard << "the quick brown fox jumped over the lazy dog" << "the quick brown fox\n jumped over the lazy dog"; @@ -134,7 +134,7 @@ tst_qfxtextedit::tst_qfxtextedit() // } -void tst_qfxtextedit::text() +void tst_qmlgraphicstextedit::text() { { QmlComponent texteditComponent(&engine, "import Qt 4.6\nTextEdit { text: \"\" }", QUrl()); @@ -170,7 +170,7 @@ void tst_qfxtextedit::text() } } -void tst_qfxtextedit::width() +void tst_qmlgraphicstextedit::width() { // uses Font metrics to find the width for standard and document to find the width for rich { @@ -213,7 +213,7 @@ void tst_qfxtextedit::width() } } -void tst_qfxtextedit::wrap() +void tst_qmlgraphicstextedit::wrap() { // for specified width and wrap set true { @@ -247,7 +247,7 @@ void tst_qfxtextedit::wrap() } //the alignment tests may be trivial o.oa -void tst_qfxtextedit::hAlign() +void tst_qmlgraphicstextedit::hAlign() { //test one align each, and then test if two align fails. @@ -279,7 +279,7 @@ void tst_qfxtextedit::hAlign() } -void tst_qfxtextedit::vAlign() +void tst_qmlgraphicstextedit::vAlign() { //test one align each, and then test if two align fails. @@ -311,7 +311,7 @@ void tst_qfxtextedit::vAlign() } -void tst_qfxtextedit::font() +void tst_qmlgraphicstextedit::font() { //test size, then bold, then italic, then family { @@ -366,7 +366,7 @@ void tst_qfxtextedit::font() } } -void tst_qfxtextedit::color() +void tst_qmlgraphicstextedit::color() { //test style for (int i = 0; i < colorStrings.size(); i++) @@ -393,7 +393,7 @@ void tst_qfxtextedit::color() } } -void tst_qfxtextedit::selection() +void tst_qmlgraphicstextedit::selection() { QString testStr = standard[0];//TODO: What should happen for multiline/rich text? QString componentStr = "import Qt 4.6\nTextEdit { text: \""+ testStr +"\"; }"; @@ -473,7 +473,7 @@ void tst_qfxtextedit::selection() QVERIFY(textEditObject->selectedText().size() == 10); } -void tst_qfxtextedit::cursorDelegate() +void tst_qmlgraphicstextedit::cursorDelegate() { QmlView* view = createView(SRCDIR "/data/cursorTest.qml"); view->execute(); @@ -504,7 +504,7 @@ void tst_qfxtextedit::cursorDelegate() TextEdit element should only handle left/right keys until the cursor reaches the extent of the text, then they should ignore the keys. */ -void tst_qfxtextedit::navigation() +void tst_qmlgraphicstextedit::navigation() { QmlView *canvas = createView(SRCDIR "/data/navigation.qml"); canvas->execute(); @@ -528,7 +528,7 @@ void tst_qfxtextedit::navigation() QVERIFY(input->hasFocus() == true); } -void tst_qfxtextedit::simulateKey(QmlView *view, int key) +void tst_qmlgraphicstextedit::simulateKey(QmlView *view, int key) { QKeyEvent press(QKeyEvent::KeyPress, key, 0); QKeyEvent release(QKeyEvent::KeyRelease, key, 0); @@ -537,7 +537,7 @@ void tst_qfxtextedit::simulateKey(QmlView *view, int key) QApplication::sendEvent(view, &release); } -QmlView *tst_qfxtextedit::createView(const QString &filename) +QmlView *tst_qmlgraphicstextedit::createView(const QString &filename) { QmlView *canvas = new QmlView(0); @@ -550,6 +550,6 @@ QmlView *tst_qfxtextedit::createView(const QString &filename) } -QTEST_MAIN(tst_qfxtextedit) +QTEST_MAIN(tst_qmlgraphicstextedit) -#include "tst_qfxtextedit.moc" +#include "tst_qmlgraphicstextedit.moc" diff --git a/tests/auto/declarative/qfxtextinput/data/cursorTest.qml b/tests/auto/declarative/qmlgraphicstextinput/data/cursorTest.qml index ddc98cc..ddc98cc 100644 --- a/tests/auto/declarative/qfxtextinput/data/cursorTest.qml +++ b/tests/auto/declarative/qmlgraphicstextinput/data/cursorTest.qml diff --git a/tests/auto/declarative/qfxtextinput/data/navigation.qml b/tests/auto/declarative/qmlgraphicstextinput/data/navigation.qml index 282c52c..282c52c 100644 --- a/tests/auto/declarative/qfxtextinput/data/navigation.qml +++ b/tests/auto/declarative/qmlgraphicstextinput/data/navigation.qml diff --git a/tests/auto/declarative/qfxtextinput/qfxtextinput.pro b/tests/auto/declarative/qmlgraphicstextinput/qmlgraphicstextinput.pro index fe2e3e3..fd75fec 100644 --- a/tests/auto/declarative/qfxtextinput/qfxtextinput.pro +++ b/tests/auto/declarative/qmlgraphicstextinput/qmlgraphicstextinput.pro @@ -2,7 +2,7 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative gui macx:CONFIG -= app_bundle -SOURCES += tst_qfxtextinput.cpp +SOURCES += tst_qmlgraphicstextinput.cpp # Define SRCDIR equal to test's source directory DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/qfxtextinput/tst_qfxtextinput.cpp b/tests/auto/declarative/qmlgraphicstextinput/tst_qmlgraphicstextinput.cpp index 8eeb22d..8e9fa5e 100644 --- a/tests/auto/declarative/qfxtextinput/tst_qfxtextinput.cpp +++ b/tests/auto/declarative/qmlgraphicstextinput/tst_qmlgraphicstextinput.cpp @@ -46,12 +46,12 @@ #include <private/qmlgraphicstextinput_p.h> #include <QDebug> -class tst_qfxtextinput : public QObject +class tst_qmlgraphicstextinput : public QObject { Q_OBJECT public: - tst_qfxtextinput(); + tst_qmlgraphicstextinput(); private slots: void text(); @@ -76,7 +76,7 @@ private: QStringList colorStrings; }; -tst_qfxtextinput::tst_qfxtextinput() +tst_qmlgraphicstextinput::tst_qmlgraphicstextinput() { standard << "the quick brown fox jumped over the lazy dog" << "It's supercalifragisiticexpialidocious!" @@ -96,7 +96,7 @@ tst_qfxtextinput::tst_qfxtextinput() << "#2AC05F"; } -void tst_qfxtextinput::text() +void tst_qmlgraphicstextinput::text() { { QmlComponent textinputComponent(&engine, "import Qt 4.6\nTextInput { text: \"\" }", QUrl()); @@ -118,7 +118,7 @@ void tst_qfxtextinput::text() } -void tst_qfxtextinput::width() +void tst_qmlgraphicstextinput::width() { // uses Font metrics to find the width for standard { @@ -144,7 +144,7 @@ void tst_qfxtextinput::width() } } -void tst_qfxtextinput::font() +void tst_qmlgraphicstextinput::font() { //test size, then bold, then italic, then family { @@ -199,7 +199,7 @@ void tst_qfxtextinput::font() } } -void tst_qfxtextinput::color() +void tst_qmlgraphicstextinput::color() { //test style for (int i = 0; i < colorStrings.size(); i++) @@ -226,7 +226,7 @@ void tst_qfxtextinput::color() } } -void tst_qfxtextinput::selection() +void tst_qmlgraphicstextinput::selection() { QString testStr = standard[0]; QString componentStr = "import Qt 4.6\nTextInput { text: \""+ testStr +"\"; }"; @@ -306,7 +306,7 @@ void tst_qfxtextinput::selection() QVERIFY(textinputObject->selectedText().size() == 10); } -void tst_qfxtextinput::maxLength() +void tst_qmlgraphicstextinput::maxLength() { QString componentStr = "import Qt 4.6\nTextInput { maximumLength: 10; }"; QmlComponent textinputComponent(&engine, componentStr.toLatin1(), QUrl()); @@ -321,7 +321,7 @@ void tst_qfxtextinput::maxLength() //TODO: Simulated keypress input adding 11 chars at a time } -void tst_qfxtextinput::masks() +void tst_qmlgraphicstextinput::masks() { QString componentStr = "import Qt 4.6\nTextInput { maximumLength: 10; }"; QmlComponent textinputComponent(&engine, componentStr.toLatin1(), QUrl()); @@ -331,7 +331,7 @@ void tst_qfxtextinput::masks() //TODO: Me } -void tst_qfxtextinput::validators() +void tst_qmlgraphicstextinput::validators() { QString componentStr = "import Qt 4.6\nTextInput { maximumLength: 10; }"; QmlComponent textinputComponent(&engine, componentStr.toLatin1(), QUrl()); @@ -345,7 +345,7 @@ void tst_qfxtextinput::validators() TextInput element should only handle left/right keys until the cursor reaches the extent of the text, then they should ignore the keys. */ -void tst_qfxtextinput::navigation() +void tst_qmlgraphicstextinput::navigation() { QmlView *canvas = createView(SRCDIR "/data/navigation.qml"); canvas->execute(); @@ -368,7 +368,7 @@ void tst_qfxtextinput::navigation() QVERIFY(input->hasFocus() == true); } -void tst_qfxtextinput::cursorDelegate() +void tst_qmlgraphicstextinput::cursorDelegate() { QmlView* view = createView(SRCDIR "/data/cursorTest.qml"); view->execute(); @@ -396,7 +396,7 @@ void tst_qfxtextinput::cursorDelegate() QVERIFY(!textInputObject->findChild<QmlGraphicsItem*>("cursorInstance")); } -void tst_qfxtextinput::simulateKey(QmlView *view, int key) +void tst_qmlgraphicstextinput::simulateKey(QmlView *view, int key) { QKeyEvent press(QKeyEvent::KeyPress, key, 0); QKeyEvent release(QKeyEvent::KeyRelease, key, 0); @@ -405,7 +405,7 @@ void tst_qfxtextinput::simulateKey(QmlView *view, int key) QApplication::sendEvent(view, &release); } -QmlView *tst_qfxtextinput::createView(const QString &filename) +QmlView *tst_qmlgraphicstextinput::createView(const QString &filename) { QmlView *canvas = new QmlView(0); @@ -417,6 +417,6 @@ QmlView *tst_qfxtextinput::createView(const QString &filename) return canvas; } -QTEST_MAIN(tst_qfxtextinput) +QTEST_MAIN(tst_qmlgraphicstextinput) -#include "tst_qfxtextinput.moc" +#include "tst_qmlgraphicstextinput.moc" diff --git a/tests/auto/declarative/qmlgraphicswebview/data/basic.html b/tests/auto/declarative/qmlgraphicswebview/data/basic.html index c262f12..22e3e24 100644 --- a/tests/auto/declarative/qmlgraphicswebview/data/basic.html +++ b/tests/auto/declarative/qmlgraphicswebview/data/basic.html @@ -1,6 +1,11 @@ <html> <head><title>Basic</title> <link rel="icon" sizes="48x48" href="basic.png"> +<script type="text/javascript"> +<!-- +window.onload = function(){ window.status = "status here"; } +// --> +</script> </head> <body leftmargin="0" marginwidth="0"> <table width="123"> diff --git a/tests/auto/declarative/qmlgraphicswebview/data/javaScript.qml b/tests/auto/declarative/qmlgraphicswebview/data/javaScript.qml new file mode 100644 index 0000000..28742f3 --- /dev/null +++ b/tests/auto/declarative/qmlgraphicswebview/data/javaScript.qml @@ -0,0 +1,11 @@ +import Qt 4.6 + +WebView { + url: "javaScript.html" + javaScriptWindowObjects: [ + Object { + property string qmlprop: "qmlvalue" + WebView.windowObjectName: "myjsname" + } + ] +} diff --git a/tests/auto/declarative/qmlgraphicswebview/tst_qmlgraphicswebview.cpp b/tests/auto/declarative/qmlgraphicswebview/tst_qmlgraphicswebview.cpp index 864f4b5..c05f8a6 100644 --- a/tests/auto/declarative/qmlgraphicswebview/tst_qmlgraphicswebview.cpp +++ b/tests/auto/declarative/qmlgraphicswebview/tst_qmlgraphicswebview.cpp @@ -59,9 +59,9 @@ private slots: void historyNav(); void loadError(); void setHtml(); + void javaScript(); void cleanupTestCase(); - private: void checkNoErrors(const QmlComponent& component); QmlEngine engine; @@ -131,7 +131,7 @@ void tst_qmlgraphicswebview::basicProperties() QCOMPARE(wv->title(),QString("Basic")); QTRY_COMPARE(wv->icon().width(), 48); QCOMPARE(wv->icon(),QPixmap(SRCDIR "/data/basic.png")); - QCOMPARE(wv->statusText(),QString("")); + QCOMPARE(wv->statusText(),QString("status here")); QCOMPARE(strippedHtml(fileContents(SRCDIR "/data/basic.html")), strippedHtml(wv->html())); QCOMPARE(wv->width(), 123.0); QCOMPARE(wv->webPageWidth(), 0); @@ -147,6 +147,11 @@ void tst_qmlgraphicswebview::basicProperties() QVERIFY(!wv->forwardAction()->isEnabled()); QVERIFY(wv->stopAction()); QVERIFY(!wv->stopAction()->isEnabled()); + + wv->setPixelCacheSize(0); // mainly testing that it doesn't crash or anything! + QCOMPARE(wv->pixelCacheSize(),0); + wv->reloadAction()->trigger(); + QTRY_COMPARE(wv->progress(), 1.0); } void tst_qmlgraphicswebview::historyNav() @@ -162,7 +167,7 @@ void tst_qmlgraphicswebview::historyNav() QCOMPARE(wv->title(),QString("Basic")); QTRY_COMPARE(wv->icon().width(), 48); QCOMPARE(wv->icon(),QPixmap(SRCDIR "/data/basic.png")); - QCOMPARE(wv->statusText(),QString("")); + QCOMPARE(wv->statusText(),QString("status here")); QCOMPARE(strippedHtml(fileContents(SRCDIR "/data/basic.html")), strippedHtml(wv->html())); QCOMPARE(wv->width(), 123.0); QCOMPARE(wv->webPageWidth(), 0); @@ -188,6 +193,7 @@ void tst_qmlgraphicswebview::historyNav() QCOMPARE(strippedHtml(fileContents(SRCDIR "/data/forward.html")), strippedHtml(wv->html())); QCOMPARE(wv->url(), QUrl::fromLocalFile(SRCDIR "/data/forward.html")); QCOMPARE(wv->status(), QmlGraphicsWebView::Ready); + QCOMPARE(wv->statusText(),QString("")); QVERIFY(wv->reloadAction()); QVERIFY(wv->reloadAction()->isEnabled()); QVERIFY(wv->backAction()); @@ -242,6 +248,18 @@ void tst_qmlgraphicswebview::setHtml() QCOMPARE(wv->html(),QString("<html><head></head><body><p>This is a <b>string</b> set on the WebView</p></body></html>")); } +void tst_qmlgraphicswebview::javaScript() +{ + QmlComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/javaScript.qml")); + checkNoErrors(component); + QmlGraphicsWebView *wv = qobject_cast<QmlGraphicsWebView*>(component.create()); + QVERIFY(wv != 0); + QTRY_COMPARE(wv->progress(), 1.0); + QCOMPARE(wv->evaluateJavaScript("123").toInt(), 123); + QCOMPARE(wv->evaluateJavaScript("window.status").toString(), QString("status here")); + QCOMPARE(wv->evaluateJavaScript("window.myjsname.qmlprop").toString(), QString("qmlvalue")); +} + QTEST_MAIN(tst_qmlgraphicswebview) #include "tst_qmlgraphicswebview.moc" diff --git a/tests/auto/declarative/qmllistmodel/qmllistmodel.pro b/tests/auto/declarative/qmllistmodel/qmllistmodel.pro new file mode 100644 index 0000000..60b0c4b --- /dev/null +++ b/tests/auto/declarative/qmllistmodel/qmllistmodel.pro @@ -0,0 +1,6 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +QT += script +macx:CONFIG -= app_bundle + +SOURCES += tst_qmllistmodel.cpp diff --git a/tests/auto/declarative/qmllistmodel/tst_qmllistmodel.cpp b/tests/auto/declarative/qmllistmodel/tst_qmllistmodel.cpp new file mode 100644 index 0000000..9ce1a7c --- /dev/null +++ b/tests/auto/declarative/qmllistmodel/tst_qmllistmodel.cpp @@ -0,0 +1,138 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <qtest.h> +#include <QtDeclarative/private/qmllistmodel_p.h> +#include <QtDeclarative/private/qmlexpression_p.h> +#include <QDebug> + +class tst_QmlListModel : public QObject +{ + Q_OBJECT +public: + tst_QmlListModel() {} + +private slots: + void dynamic_data(); + void dynamic(); +}; + +void tst_QmlListModel::dynamic_data() +{ + QTest::addColumn<QString>("script"); + QTest::addColumn<int>("result"); + QTest::addColumn<QString>("warning"); + + // Simple flat model + + QTest::newRow("count") << "count" << 0 << ""; + + QTest::newRow("append1") << "{append({'foo':123});count}" << 1 << ""; + QTest::newRow("append2") << "{append({'foo':123,'bar':456});count}" << 1 << ""; + QTest::newRow("append3a") << "{append({'foo':123});append({'foo':456});get(0).foo}" << 123 << ""; + QTest::newRow("append3b") << "{append({'foo':123});append({'foo':456});get(1).foo}" << 456 << ""; + + QTest::newRow("clear1") << "{append({'foo':456});clear();count}" << 0 << ""; + QTest::newRow("clear2") << "{append({'foo':123});append({'foo':456});clear();count}" << 0 << ""; + QTest::newRow("clear2") << "{append({'foo':123});clear();get(0).foo}" << 0 << "QML QmlListModel (unknown location) get: index 0 out of range"; + + QTest::newRow("remove1") << "{append({'foo':123});remove(0);count}" << 0 << ""; + QTest::newRow("remove2a") << "{append({'foo':123});append({'foo':456});remove(0);count}" << 1 << ""; + QTest::newRow("remove2b") << "{append({'foo':123});append({'foo':456});remove(0);get(0).foo}" << 456 << ""; + QTest::newRow("remove2c") << "{append({'foo':123});append({'foo':456});remove(1);get(0).foo}" << 123 << ""; + QTest::newRow("remove3") << "{append({'foo':123});remove(0);get(0).foo}" << 0 << "QML QmlListModel (unknown location) get: index 0 out of range"; + + QTest::newRow("insert1") << "{insert(0,{'foo':123});count}" << 1 << ""; + QTest::newRow("insert2") << "{insert(1,{'foo':123});count}" << 0 << "QML QmlListModel (unknown location) insert: index 1 out of range"; + QTest::newRow("insert3a") << "{append({'foo':123});insert(1,{'foo':456});count}" << 2 << ""; + QTest::newRow("insert3b") << "{append({'foo':123});insert(1,{'foo':456});get(0).foo}" << 123 << ""; + QTest::newRow("insert3c") << "{append({'foo':123});insert(1,{'foo':456});get(1).foo}" << 456 << ""; + QTest::newRow("insert3d") << "{append({'foo':123});insert(0,{'foo':456});get(0).foo}" << 456 << ""; + QTest::newRow("insert3e") << "{append({'foo':123});insert(0,{'foo':456});get(1).foo}" << 123 << ""; + QTest::newRow("insert4") << "{append({'foo':123});insert(-1,{'foo':456})}" << 0 << "QML QmlListModel (unknown location) insert: index -1 out of range"; + + QTest::newRow("set1") << "{append({'foo':123});set(0,{'foo':456});count}" << 1 << ""; + QTest::newRow("set2") << "{append({'foo':123});set(0,{'foo':456});get(0).foo}" << 456 << ""; + QTest::newRow("set3a") << "{append({'foo':123,'bar':456});set(0,{'foo':999});get(0).foo}" << 999 << ""; + QTest::newRow("set3b") << "{append({'foo':123,'bar':456});set(0,{'foo':999});get(0).bar}" << 456 << ""; + + QTest::newRow("setprop1") << "{append({'foo':123});set(0,'foo',456);count}" << 1 << ""; + QTest::newRow("setprop2") << "{append({'foo':123});set(0,'foo',456);get(0).foo}" << 456 << ""; + QTest::newRow("setprop3a") << "{append({'foo':123,'bar':456});set(0,'foo',999);get(0).foo}" << 999 << ""; + QTest::newRow("setprop3b") << "{append({'foo':123,'bar':456});set(0,'foo',999);get(0).bar}" << 456 << ""; + + QTest::newRow("move1a") << "{append({'foo':123});append({'foo':456});move(0,1,1);count}" << 2 << ""; + QTest::newRow("move1b") << "{append({'foo':123});append({'foo':456});move(0,1,1);get(0).foo}" << 456 << ""; + QTest::newRow("move1c") << "{append({'foo':123});append({'foo':456});move(0,1,1);get(1).foo}" << 123 << ""; + QTest::newRow("move1d") << "{append({'foo':123});append({'foo':456});move(1,0,1);get(0).foo}" << 456 << ""; + QTest::newRow("move1e") << "{append({'foo':123});append({'foo':456});move(1,0,1);get(1).foo}" << 123 << ""; + QTest::newRow("move2a") << "{append({'foo':123});append({'foo':456});append({'foo':789});move(0,1,2);count}" << 3 << ""; + QTest::newRow("move2b") << "{append({'foo':123});append({'foo':456});append({'foo':789});move(0,1,2);get(0).foo}" << 789 << ""; + QTest::newRow("move2c") << "{append({'foo':123});append({'foo':456});append({'foo':789});move(0,1,2);get(1).foo}" << 123 << ""; + QTest::newRow("move2d") << "{append({'foo':123});append({'foo':456});append({'foo':789});move(0,1,2);get(2).foo}" << 456 << ""; + + // Structured model + + // XXX todo +} + +void tst_QmlListModel::dynamic() +{ + QFETCH(QString, script); + QFETCH(int, result); + QFETCH(QString, warning); + + QmlEngine engine; + QmlListModel model; + QmlEngine::setContextForObject(&model,engine.rootContext()); + engine.rootContext()->addDefaultObject(&model); + QmlExpression e(engine.rootContext(), script, &model); + if (!warning.isEmpty()) + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1()); + int actual = e.value().toInt(); + if (e.hasError()) + qDebug() << e.error(); // errors not expected + QVERIFY(!e.hasError()); + QCOMPARE(actual,result); +} + +QTEST_MAIN(tst_QmlListModel) + +#include "tst_qmllistmodel.moc" diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.0.png b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.0.png Binary files differnew file mode 100644 index 0000000..53a8b42 --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.0.png diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.1.png b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.1.png Binary files differnew file mode 100644 index 0000000..b7efe8c --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.1.png diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.2.png b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.2.png Binary files differnew file mode 100644 index 0000000..aa6d147 --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.2.png diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.3.png b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.3.png Binary files differnew file mode 100644 index 0000000..9d39713 --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.3.png diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.4.png b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.4.png Binary files differnew file mode 100644 index 0000000..98e8817 --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.4.png diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.5.png b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.5.png Binary files differnew file mode 100644 index 0000000..a3f9d8f --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.5.png diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.qml b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.qml new file mode 100644 index 0000000..4df180f --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/data/test-flipable.qml @@ -0,0 +1,1623 @@ +import Qt.VisualTest 4.6 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 32 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 48 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 64 + hash: "06d7f0befa7e06972983ffe87c162750" + } + Frame { + msec: 80 + hash: "51dff66a7767e3464fda60f2cf906700" + } + Frame { + msec: 96 + hash: "f8038dc4b67b92ef776a97589240e8c5" + } + Frame { + msec: 112 + hash: "692931f1db6ddf0b37eb64026ca830f8" + } + Frame { + msec: 128 + hash: "f01b7368e42381dda5eadf56482ea993" + } + Frame { + msec: 144 + hash: "9811f823e057882d384f36d7227fa12e" + } + Frame { + msec: 160 + hash: "9b40b6c75af876567ff49688bc710f2a" + } + Frame { + msec: 176 + hash: "e97a5d968da37789c28816608fa262a1" + } + Frame { + msec: 192 + hash: "2cd0627fdc63bb91f8dcac789d7a93b2" + } + Frame { + msec: 208 + hash: "ae2407f8da9a047d2725bcdcf8e568b2" + } + Frame { + msec: 224 + hash: "da2a1e5e988c27577ceb453cb0383703" + } + Frame { + msec: 240 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 256 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 272 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 288 + hash: "73c06997014af4e008b546b53fe349fb" + } + Frame { + msec: 304 + hash: "262404c6e55b93c4ab940582a49f7e18" + } + Frame { + msec: 320 + hash: "451a9408b04826ab35749d9120efd6bb" + } + Frame { + msec: 336 + hash: "451a9408b04826ab35749d9120efd6bb" + } + Frame { + msec: 352 + hash: "2d112d040fd425c59b511066737e494d" + } + Frame { + msec: 368 + hash: "769d2724656dbf0e793ecd8e42db3de2" + } + Frame { + msec: 384 + hash: "9e375cb3815723a2c5dda39c79325e96" + } + Frame { + msec: 400 + hash: "b21e92871bf63873b8ae48a2aff47be5" + } + Frame { + msec: 416 + hash: "00d08f4257f35c6236cde0597b0005e4" + } + Frame { + msec: 432 + hash: "8048f84221a02e7102cf3272445862a1" + } + Frame { + msec: 448 + hash: "f0d7b45f0b01319494616c1893aa940e" + } + Frame { + msec: 464 + hash: "457fad89140a1dda9e70549d451482e9" + } + Frame { + msec: 480 + hash: "ee0feb79e843cdb2adea72fa37ecab67" + } + Frame { + msec: 496 + hash: "ece02d3590147884e697dd5228dee8c4" + } + Frame { + msec: 512 + hash: "91c4ec19716a0883c8f5c25b9a0d1f42" + } + Frame { + msec: 528 + hash: "a7c9860dd4962b11b92c54370ba156ee" + } + Frame { + msec: 544 + hash: "a28f2590be1e8cde4cde5219367015ac" + } + Frame { + msec: 560 + hash: "3b641ba58f5e1f0e1f2f528acf38cb28" + } + Frame { + msec: 576 + hash: "d0b0969ad165d4784f763683de42278e" + } + Frame { + msec: 592 + hash: "93968dffda327a101e2bd07b80fff842" + } + Frame { + msec: 608 + hash: "08f5db4cd7f27178c67e6d973e4bb023" + } + Frame { + msec: 624 + hash: "0967cad0a3ae82307a049944e1bcdc3e" + } + Frame { + msec: 640 + hash: "d70ffd02b434e607bc11a95ca536c19a" + } + Frame { + msec: 656 + hash: "cd561b4d5e707bb6b9f6d493f9b99512" + } + Frame { + msec: 672 + hash: "58355ca37c6e4e54061664180faa11fb" + } + Frame { + msec: 688 + hash: "bd873f48c79286c50333c838e57d8ec7" + } + Frame { + msec: 704 + hash: "db89bc0e04ebefe5440748fe85e0bdf7" + } + Frame { + msec: 720 + hash: "c400bc1e6c02c792cc515a6dd8bbaa9b" + } + Frame { + msec: 736 + hash: "accf3567a161239cd8c18dd9d4527aaf" + } + Frame { + msec: 752 + hash: "2e3bcdf70f160bf8e3f1b77ee472b782" + } + Frame { + msec: 768 + hash: "929da0d629253478c322360c9a8dfc9e" + } + Frame { + msec: 784 + hash: "d5d4b7c52ba14e84bc9c34a8b55f84b7" + } + Frame { + msec: 800 + hash: "063ce927e9e7c5afb9131302ea5a968c" + } + Frame { + msec: 816 + hash: "b94b6fff850aacccdaf0f74d4e36ba67" + } + Frame { + msec: 832 + hash: "bac2b9b9be4b71fafe59868506aa8ab9" + } + Frame { + msec: 848 + hash: "a91fed41a5a07e84424e45477f463aa1" + } + Frame { + msec: 864 + hash: "370eefd369ef366f1d5930b261340d0b" + } + Frame { + msec: 880 + hash: "b04a87997d0eeb6ff2f91fc2f0d016f6" + } + Frame { + msec: 896 + hash: "09c3602a08d6d3e2afb654c328606871" + } + Frame { + msec: 912 + hash: "101e66b9d13b1b0872cfcc497c9d6ae3" + } + Frame { + msec: 928 + hash: "b5eaf952e40cf90ef32e8cb64ccce7d3" + } + Frame { + msec: 944 + hash: "b43b02133ebe5db93e5236c0307939c3" + } + Frame { + msec: 960 + image: "test-flipable.0.png" + } + Frame { + msec: 976 + hash: "7d1a0ff0eceb80ff64d828c34792a2d5" + } + Frame { + msec: 992 + hash: "a7492d8ab6fddb5c1d7af2621078230b" + } + Frame { + msec: 1008 + hash: "2ed3dc7f10cc8279a6fd926914cdb234" + } + Frame { + msec: 1024 + hash: "e9f76e419f6f682bcc9052183bb50607" + } + Frame { + msec: 1040 + hash: "fdee6990e101d4a628272e7b09a217a3" + } + Frame { + msec: 1056 + hash: "05e028b2f37a433343d373bc05f73756" + } + Frame { + msec: 1072 + hash: "a9ece04666d17979408dcd8690cd697c" + } + Frame { + msec: 1088 + hash: "a5d8c9bee6ac10fb45cedf3bc4325539" + } + Frame { + msec: 1104 + hash: "08f1ff1e515ec78f75efa13a39b21f56" + } + Frame { + msec: 1120 + hash: "f0bc6c649a195e2c433cf84c1b4f5bcb" + } + Frame { + msec: 1136 + hash: "2a548614a9b38867cd0fe44985ca443f" + } + Frame { + msec: 1152 + hash: "8c8272fc028ce5b403e636b4061351d3" + } + Frame { + msec: 1168 + hash: "df11678b255cc3f624fed24d7e6a24af" + } + Frame { + msec: 1184 + hash: "7dd5ce1cce200d7eede0f248f150873c" + } + Frame { + msec: 1200 + hash: "e5cb8e0e588854dce5e7572fd1e3a445" + } + Frame { + msec: 1216 + hash: "71937cd7d319174232797d05fe28bda5" + } + Frame { + msec: 1232 + hash: "021c3a598b008991114b25b26191e8ef" + } + Frame { + msec: 1248 + hash: "b372131d6fc29e7dbffc2c5f4e269ad7" + } + Frame { + msec: 1264 + hash: "2120fc188aed6888eba85e9d49139000" + } + Frame { + msec: 1280 + hash: "0523499bb4f4c6d0c3d2cd28fbac7056" + } + Frame { + msec: 1296 + hash: "19d1fc79802728d6b0af222050b59463" + } + Frame { + msec: 1312 + hash: "f48686053780376c7ab2e6481e3fd0ad" + } + Frame { + msec: 1328 + hash: "0f7c5ca70fec90e7e8b2fd50b791fd2e" + } + Frame { + msec: 1344 + hash: "93cd129be7cfebaa2ea8a074a77aaa7c" + } + Frame { + msec: 1360 + hash: "e6b149da031b1c0b842b1b7872bd2d91" + } + Frame { + msec: 1376 + hash: "5481248e889fb4fe9f4cf54f69d9f614" + } + Frame { + msec: 1392 + hash: "23bb444b6248901da3eb6a2e805438cb" + } + Frame { + msec: 1408 + hash: "1c9feb1c3ae76d4015c99d005ecfed60" + } + Frame { + msec: 1424 + hash: "41e5345dc90fd48476f35ceeab281948" + } + Frame { + msec: 1440 + hash: "89682a955a00e68031571ac765f9f5e3" + } + Frame { + msec: 1456 + hash: "8ff7cee41c6f19eeda417052c1b071d6" + } + Frame { + msec: 1472 + hash: "67a73129d828e8a05b1efc768cf40146" + } + Frame { + msec: 1488 + hash: "0800a78c97c92c697e44ded54fdcf934" + } + Frame { + msec: 1504 + hash: "d5d51263367f0c53b8d94a03d83338d9" + } + Frame { + msec: 1520 + hash: "ab749885f356683e17ca52f904ae582d" + } + Frame { + msec: 1536 + hash: "7f5a56f30222a9886d1e9d014b4f5cab" + } + Frame { + msec: 1552 + hash: "10c5e64eff104dce59f54f70c5564959" + } + Frame { + msec: 1568 + hash: "38b00c7544648ef06705acc2e9eca1f5" + } + Frame { + msec: 1584 + hash: "56bdfcb8fbb776b3799676ba7934a354" + } + Frame { + msec: 1600 + hash: "ea5349d337e397b3ee5e0db0c296f5e5" + } + Frame { + msec: 1616 + hash: "6bd784ca760edba5a6f0b4212237e1e8" + } + Frame { + msec: 1632 + hash: "77e7888a37a7724bded817903cbe777e" + } + Frame { + msec: 1648 + hash: "55213bdb2f1f2d25b5680db95e79bbac" + } + Frame { + msec: 1664 + hash: "6d62c7f7f76cc1d4e33c152234000da0" + } + Frame { + msec: 1680 + hash: "0f6aa29c172054887e4ddb6512ae43b1" + } + Frame { + msec: 1696 + hash: "75fd94508b77bbdde34a61b74ff49e12" + } + Frame { + msec: 1712 + hash: "0dfdd9a1d83a706a09318c83fd08b6fe" + } + Frame { + msec: 1728 + hash: "4f895ee983424c164be3e2db488a4e51" + } + Frame { + msec: 1744 + hash: "974fd5f390d33afb779ac754f0e30b2a" + } + Frame { + msec: 1760 + hash: "fd40e22c7d3cfceeee7dc668d1cf0a12" + } + Frame { + msec: 1776 + hash: "4e3c04b35bcc43a4295582da1674da2e" + } + Frame { + msec: 1792 + hash: "629888aae80ea85db07a383df352214a" + } + Frame { + msec: 1808 + hash: "9a92c68cfad54c313d24e38240ea072f" + } + Frame { + msec: 1824 + hash: "3e27569d19670ec99f11bfa46099456a" + } + Frame { + msec: 1840 + hash: "5d4be9ed8c4ba7faefde5427cdbffc73" + } + Frame { + msec: 1856 + hash: "232d4e03a57edf0386b06884482f9730" + } + Frame { + msec: 1872 + hash: "c45f959fd81ac08add219326cb6a8bfc" + } + Frame { + msec: 1888 + hash: "349111e36190f77afd53c50ee2e9ba94" + } + Frame { + msec: 1904 + hash: "ea5ed48b2bcdfd2a711a3a71a4ae37c3" + } + Frame { + msec: 1920 + image: "test-flipable.1.png" + } + Frame { + msec: 1936 + hash: "ae4e35413e462221b8cb48dd0350f873" + } + Frame { + msec: 1952 + hash: "63cc3851236d5de613c85a2971ef7145" + } + Frame { + msec: 1968 + hash: "45d5fdb92107a7074d56d97bda34756f" + } + Frame { + msec: 1984 + hash: "f74d9a3b53a629f7fccfdd255fdbba62" + } + Frame { + msec: 2000 + hash: "60c6a30e15ed4ad61c14f15f9f1f3790" + } + Frame { + msec: 2016 + hash: "b5f7c630f6e61c7ddac8493e17a1f53e" + } + Frame { + msec: 2032 + hash: "98558c7135fa84fa08d457c6064b8653" + } + Frame { + msec: 2048 + hash: "2858e39a9b39739bb5c0c1ce23e83b20" + } + Frame { + msec: 2064 + hash: "0b174f04215131cfa32b5d1a32170ac3" + } + Frame { + msec: 2080 + hash: "67e3618bab95519a034ed6c8c1543212" + } + Frame { + msec: 2096 + hash: "2012c5310f198022a3878c9ded08523d" + } + Frame { + msec: 2112 + hash: "1cb6a1f6d873d2bfde457828c17b4886" + } + Frame { + msec: 2128 + hash: "be3f28bd56d9d985408e32cc0aab0623" + } + Frame { + msec: 2144 + hash: "4aa07c4887f873f0f034930bd681f9dc" + } + Frame { + msec: 2160 + hash: "adeae071187b590aa0a142c27098d2f4" + } + Frame { + msec: 2176 + hash: "d777aaccd6143c2c1000bbfabdbefeb2" + } + Frame { + msec: 2192 + hash: "7b4785b9e6610f02c52b4c824bea8ecd" + } + Frame { + msec: 2208 + hash: "c539b3638272e46120edbe4a58e1d894" + } + Frame { + msec: 2224 + hash: "ae466024a1dd731b6730dda255e68eb8" + } + Frame { + msec: 2240 + hash: "f844a288b009cc4c6c28eb30d799c397" + } + Frame { + msec: 2256 + hash: "4fc8ca1992802f97dd431783db89c725" + } + Frame { + msec: 2272 + hash: "79b899461efae97b65b8c24c8820f348" + } + Frame { + msec: 2288 + hash: "cb1ce87ddc372e24e37b60c013310549" + } + Frame { + msec: 2304 + hash: "c8937aea34fd299c151706598828be6f" + } + Frame { + msec: 2320 + hash: "ed5c3a904dc3b72937c6eea475514b2d" + } + Frame { + msec: 2336 + hash: "09043e74a3ac60d05122675a1b253320" + } + Frame { + msec: 2352 + hash: "57677a33d8c60a45c64aea10a695e8d0" + } + Frame { + msec: 2368 + hash: "496fe0b0e420356e4205537fdf3adc2f" + } + Frame { + msec: 2384 + hash: "f4146ce8db5cf2c3da15715820c9f62f" + } + Frame { + msec: 2400 + hash: "b80bc46468695b874d401c4c9bd68932" + } + Frame { + msec: 2416 + hash: "b0cf0021232ab917301206614f61f0bf" + } + Frame { + msec: 2432 + hash: "b0abdf5b86e3fcb22a9254ac5b522380" + } + Frame { + msec: 2448 + hash: "c1624cb7e90ea26ab0c37cfe9919ca36" + } + Frame { + msec: 2464 + hash: "0ffd6a3b3e5f6db5a3a8df756caf713e" + } + Frame { + msec: 2480 + hash: "1604ad8e7a4aa4fa8dff1f37fc8c51d7" + } + Frame { + msec: 2496 + hash: "5bbca0b79c42e263162926e5c2fd3d82" + } + Frame { + msec: 2512 + hash: "9436b4f2ab902673ed067de55da5003e" + } + Frame { + msec: 2528 + hash: "3c7b5fa0970242a2ad308c72d761713b" + } + Frame { + msec: 2544 + hash: "15e451c53e8f5c70614f87f33fe0a2e6" + } + Frame { + msec: 2560 + hash: "7e8cbe203306d2f267a42fed1e4790ed" + } + Frame { + msec: 2576 + hash: "db21ae28564614b58a7dd5ccd97082e6" + } + Frame { + msec: 2592 + hash: "ff52e198874de749c46f9b34cfe40cfc" + } + Frame { + msec: 2608 + hash: "916d92d24a81ced07a54d68c46299d4c" + } + Frame { + msec: 2624 + hash: "2f6cf122e5f15fc5f5d3c92d92ca1384" + } + Frame { + msec: 2640 + hash: "6f328038e5d505c402651423c44986a5" + } + Frame { + msec: 2656 + hash: "6f328038e5d505c402651423c44986a5" + } + Frame { + msec: 2672 + hash: "78e0dca60c04d3defbd90457685dbab3" + } + Frame { + msec: 2688 + hash: "b915de1be0c1779e06fb9eea8237f91d" + } + Frame { + msec: 2704 + hash: "0ff9fd6b09fc14abacb794353b9500f6" + } + Frame { + msec: 2720 + hash: "5a1c9cd9da5492a61a3a1bc6ad37ef17" + } + Frame { + msec: 2736 + hash: "4c4a72eb4105903802de56a4a62d86cc" + } + Frame { + msec: 2752 + hash: "6d813ee777a5900c65aca5939c004d0c" + } + Frame { + msec: 2768 + hash: "6d813ee777a5900c65aca5939c004d0c" + } + Frame { + msec: 2784 + hash: "0acaa3ece071ad4461cf4a79d65a0f03" + } + Frame { + msec: 2800 + hash: "0acaa3ece071ad4461cf4a79d65a0f03" + } + Frame { + msec: 2816 + hash: "f5cf7e68edc5fcd9dd91882d3f9ba380" + } + Frame { + msec: 2832 + hash: "51f8508eddffbac2fad22bd3e8040c69" + } + Frame { + msec: 2848 + hash: "a09746c72df5330f6ca2a93d9b8e79f6" + } + Frame { + msec: 2864 + hash: "b2ef52b66896649413b3852bcf642e1c" + } + Frame { + msec: 2880 + image: "test-flipable.2.png" + } + Frame { + msec: 2896 + hash: "ae76d183491834e2b1d0371420d51ce5" + } + Frame { + msec: 2912 + hash: "b19d89aa671cc3a773f64a7bae21adb6" + } + Frame { + msec: 2928 + hash: "08eb7bd2e49fe600e922e49a3aa56e93" + } + Frame { + msec: 2944 + hash: "1e3a7bdd0bd9d5b84c2cb5b646d7fb45" + } + Frame { + msec: 2960 + hash: "be9f5091197899c0b89823e4403358f3" + } + Frame { + msec: 2976 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 2992 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 3008 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 3024 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 3040 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 3056 + hash: "1daeebce8e7eef80b135d2e4f83f780b" + } + Frame { + msec: 3072 + hash: "be9f5091197899c0b89823e4403358f3" + } + Frame { + msec: 3088 + hash: "be9f5091197899c0b89823e4403358f3" + } + Frame { + msec: 3104 + hash: "1e3a7bdd0bd9d5b84c2cb5b646d7fb45" + } + Frame { + msec: 3120 + hash: "b19d89aa671cc3a773f64a7bae21adb6" + } + Frame { + msec: 3136 + hash: "e7ed4449b5ea3288d5e8fecb33a4a422" + } + Frame { + msec: 3152 + hash: "186a2c1af03e7fa590ff3cd7422285e3" + } + Frame { + msec: 3168 + hash: "373141f99bc88c40ead161502c9750e9" + } + Frame { + msec: 3184 + hash: "0221e2ef4cf809ebfeba466206a77cce" + } + Frame { + msec: 3200 + hash: "51f8508eddffbac2fad22bd3e8040c69" + } + Frame { + msec: 3216 + hash: "f5cf7e68edc5fcd9dd91882d3f9ba380" + } + Frame { + msec: 3232 + hash: "0acaa3ece071ad4461cf4a79d65a0f03" + } + Frame { + msec: 3248 + hash: "0acaa3ece071ad4461cf4a79d65a0f03" + } + Frame { + msec: 3264 + hash: "6d813ee777a5900c65aca5939c004d0c" + } + Frame { + msec: 3280 + hash: "6d813ee777a5900c65aca5939c004d0c" + } + Frame { + msec: 3296 + hash: "6d813ee777a5900c65aca5939c004d0c" + } + Frame { + msec: 3312 + hash: "5a1c9cd9da5492a61a3a1bc6ad37ef17" + } + Frame { + msec: 3328 + hash: "0ff9fd6b09fc14abacb794353b9500f6" + } + Frame { + msec: 3344 + hash: "0ff9fd6b09fc14abacb794353b9500f6" + } + Frame { + msec: 3360 + hash: "6f328038e5d505c402651423c44986a5" + } + Frame { + msec: 3376 + hash: "6f328038e5d505c402651423c44986a5" + } + Frame { + msec: 3392 + hash: "dd04a76df90f27358f4162fd85cfa4cd" + } + Frame { + msec: 3408 + hash: "12df495b5e8bfd2c9dd13fbeccc69e08" + } + Frame { + msec: 3424 + hash: "4b6f9dcde7d5d88b9c3eff3187378036" + } + Frame { + msec: 3440 + hash: "712f3850c0efe45c60a3761f1354b90b" + } + Frame { + msec: 3456 + hash: "22215981f00790d7a409230eb730abca" + } + Frame { + msec: 3472 + hash: "a4a26f9736282ceb307f0f97735002eb" + } + Frame { + msec: 3488 + hash: "b41d7a18d84a8b220e99464cab86882d" + } + Frame { + msec: 3504 + hash: "c7c1961120f128cd0fcd6a7b61c98197" + } + Frame { + msec: 3520 + hash: "e56e7ba603d2620afb0fab6b19aff33e" + } + Frame { + msec: 3536 + hash: "1a258bed9a7a38452a746d7641016e73" + } + Frame { + msec: 3552 + hash: "a237b9c187bbbcb79f624d74def15db2" + } + Frame { + msec: 3568 + hash: "34a7afdebb7352ca65e0eaec61632d12" + } + Frame { + msec: 3584 + hash: "a5a98e932a30418bae62bb006afc1048" + } + Frame { + msec: 3600 + hash: "2ee25374cb9fef01e78d02c4131010b7" + } + Frame { + msec: 3616 + hash: "7956b07b848ba89905e5c609657503e2" + } + Frame { + msec: 3632 + hash: "0949a2b13f6475b3f11be04321c953a1" + } + Frame { + msec: 3648 + hash: "5a1ff901ecc7c3cd7f39cd07e0273dd4" + } + Frame { + msec: 3664 + hash: "44fcd7209b9f5b1c28c21e9aae408097" + } + Frame { + msec: 3680 + hash: "bee94f395239aebb0bacca3dbbee95e5" + } + Frame { + msec: 3696 + hash: "bd26b7e2b07bbcee3819fdacc35eea8d" + } + Frame { + msec: 3712 + hash: "d3707b90c5cd0d1061db4b97b6fcb96a" + } + Frame { + msec: 3728 + hash: "6f6ed6c7553b3f909d53e2146b3831d5" + } + Frame { + msec: 3744 + hash: "a3a1a03617d1cb5660c51bf2f18088bc" + } + Frame { + msec: 3760 + hash: "6d4646f0a53800ad60d173ab9cb9010a" + } + Frame { + msec: 3776 + hash: "126cae232e2fe49e3188393c2798065b" + } + Frame { + msec: 3792 + hash: "e1fa758d333ffe5208365c0babff33a0" + } + Frame { + msec: 3808 + hash: "f2a6156f7d6013bd4234b35c21adb074" + } + Frame { + msec: 3824 + hash: "0271f66eb6d9b91a3ab8da2d728b9581" + } + Frame { + msec: 3840 + image: "test-flipable.3.png" + } + Frame { + msec: 3856 + hash: "e18635d7c6c5de361e7406c2db357aca" + } + Frame { + msec: 3872 + hash: "56100e9ca8d1eb7e6334e5a05ef2b94d" + } + Frame { + msec: 3888 + hash: "3d15b8d662d3df82dd78590c43794337" + } + Frame { + msec: 3904 + hash: "9729b36fe9dbabf0c46e78b723885530" + } + Frame { + msec: 3920 + hash: "ccb8b51084cc1ef3d201887b824fb1ac" + } + Frame { + msec: 3936 + hash: "d9dc9d240a6f89603a54bccd66361530" + } + Frame { + msec: 3952 + hash: "0e52d92455c263493d32ffe93f242739" + } + Frame { + msec: 3968 + hash: "695ab932722844b975097779e26df55c" + } + Frame { + msec: 3984 + hash: "da285cba2e11db1e87d1d180e376ff8e" + } + Frame { + msec: 4000 + hash: "54bd12888fc4526d310fa0a66b5ba3be" + } + Frame { + msec: 4016 + hash: "c3e3db473bdb96fd619b078f0f6b3ceb" + } + Frame { + msec: 4032 + hash: "acfd8aaf0bb52ad3ef3116bb99f3656a" + } + Frame { + msec: 4048 + hash: "c5a0877ce86c26b30b642818e83d6118" + } + Frame { + msec: 4064 + hash: "b187fde9af2bad37f84f6324afcbb303" + } + Frame { + msec: 4080 + hash: "0dfe035424d7f31dda88be3b4bb30c8a" + } + Frame { + msec: 4096 + hash: "893bddc95fbf6e452ba61b06eab1a8c5" + } + Frame { + msec: 4112 + hash: "35fb89ea579819f4b3416ff1c1b1cc9d" + } + Frame { + msec: 4128 + hash: "316371649f9a1e12e336c5823408eaf9" + } + Frame { + msec: 4144 + hash: "ade751c6e497c73a920baf18f0752908" + } + Frame { + msec: 4160 + hash: "86720fa1eeae374c6cc67e107d27e23a" + } + Frame { + msec: 4176 + hash: "1a6f080227f1ccd03b6c4093b9fdadb3" + } + Frame { + msec: 4192 + hash: "f7d7398edba69716ec8c0699d5472dca" + } + Frame { + msec: 4208 + hash: "9e62c9dd25abb203f5c06c7bff0d8363" + } + Frame { + msec: 4224 + hash: "fd90404238b458fc86a4a17e6a976f9b" + } + Frame { + msec: 4240 + hash: "e39668dc347318fc61a365f9006aab3c" + } + Frame { + msec: 4256 + hash: "c40f41f635f10f5f9b04b42ba2dc5bb1" + } + Frame { + msec: 4272 + hash: "c0f971c75b7237de7e9b2f25cc3f34b2" + } + Frame { + msec: 4288 + hash: "a1c79481fd1632cfdc396aefb3592534" + } + Frame { + msec: 4304 + hash: "6eee76f40fc7ec1a1e3d77c849321740" + } + Frame { + msec: 4320 + hash: "0a36746ab17caef5946731c31af3823f" + } + Frame { + msec: 4336 + hash: "863dedd22df4e1d14e73eaeb851e9b66" + } + Frame { + msec: 4352 + hash: "318e8751f7056bb6a004c8a7ce7be870" + } + Frame { + msec: 4368 + hash: "8fb2809a366f42c86fad7aa5db3ff22c" + } + Frame { + msec: 4384 + hash: "8aaea666640cb3b27e3374f756fe411b" + } + Frame { + msec: 4400 + hash: "1f552095d26a8d145584e36237630916" + } + Frame { + msec: 4416 + hash: "cd5aa55715786cac0f7efc90c7c4b9d6" + } + Frame { + msec: 4432 + hash: "7a3153d9309ec338dce3437ecf667646" + } + Frame { + msec: 4448 + hash: "c7fa40e69148f1c5ec494ad159b6ce6c" + } + Frame { + msec: 4464 + hash: "e131bc8ca25ddc4b7dd6582ff034fe14" + } + Frame { + msec: 4480 + hash: "3174c672e62dae0341d5849e23031280" + } + Frame { + msec: 4496 + hash: "0b25fb7d33708a3292ede7c66e25a3d7" + } + Frame { + msec: 4512 + hash: "84b3cf92b3abc2f5acf07cfccf3c0202" + } + Frame { + msec: 4528 + hash: "fafbd14d296e4954bce7816d811ddd89" + } + Frame { + msec: 4544 + hash: "865018d8408863b741a7082a962236dc" + } + Frame { + msec: 4560 + hash: "f626082691429565b55ce9e04b14a665" + } + Frame { + msec: 4576 + hash: "8a02f7d3d53e98384d1f05dc7fc5fd37" + } + Frame { + msec: 4592 + hash: "6af3a8305b25a9a769b8cf00479c6ab3" + } + Frame { + msec: 4608 + hash: "b31470b0ac4a593317abc365acb2b281" + } + Frame { + msec: 4624 + hash: "efd00c43b1b8bbc4bc5496dcfa58c6b0" + } + Frame { + msec: 4640 + hash: "498cf6c20aeca609e9d9cea78f0cc6a3" + } + Frame { + msec: 4656 + hash: "b55661b5d9632bc0d7fc7ff3a421a2e7" + } + Frame { + msec: 4672 + hash: "2f1e402c5e4a0615528f91dd2e183ddd" + } + Frame { + msec: 4688 + hash: "d1c166cc7932e72ba22a73637cad65d6" + } + Frame { + msec: 4704 + hash: "374b703e0059fc80b67480113d584754" + } + Frame { + msec: 4720 + hash: "e8de71d4a2a253e366b2edf5d475824d" + } + Frame { + msec: 4736 + hash: "6a9d033b332f0c0285284fdaddf3bbdb" + } + Frame { + msec: 4752 + hash: "640c227fb62e40c666035e7465ac5c4e" + } + Frame { + msec: 4768 + hash: "9cf7dc6507befd6ae54f380a7d87a207" + } + Frame { + msec: 4784 + hash: "d1c7b2160c08e03e7a98d7d2db0116f7" + } + Frame { + msec: 4800 + image: "test-flipable.4.png" + } + Frame { + msec: 4816 + hash: "6e48e605ea1aed4028e02476328f182b" + } + Frame { + msec: 4832 + hash: "2dfa5fdfd07e7000caee6abf5fe84378" + } + Frame { + msec: 4848 + hash: "2b0c2f019b07f1f8b4e5af9a520ab061" + } + Frame { + msec: 4864 + hash: "33cb1aaeb7dafc2475e4337be7cc7892" + } + Frame { + msec: 4880 + hash: "91290d1435bedb5010ba135a7f99c0a2" + } + Frame { + msec: 4896 + hash: "df7434eb6c6e5d45935d6c6fd03f06d1" + } + Frame { + msec: 4912 + hash: "48dfe78dcdd65242132071454fb9ea33" + } + Frame { + msec: 4928 + hash: "1b288012e123cb6051bfa180ea2a2bc0" + } + Frame { + msec: 4944 + hash: "84b23d92987f59df336d9b269e3b7bbc" + } + Frame { + msec: 4960 + hash: "c413ca53240df702c3ba0c7f4dacca3b" + } + Frame { + msec: 4976 + hash: "339c06a2e1fc05ebfd3732097b9c5242" + } + Frame { + msec: 4992 + hash: "f1e647e274ac8c8458d2c1e576623688" + } + Frame { + msec: 5008 + hash: "a70dc2f51ecfc164595cfef61c1da245" + } + Frame { + msec: 5024 + hash: "b69f034a71b53c885cd177da422d5fc7" + } + Frame { + msec: 5040 + hash: "26c25a031944c677b30f69c8498ac6ce" + } + Frame { + msec: 5056 + hash: "ebc2328766e8736eac989e309968d8f9" + } + Frame { + msec: 5072 + hash: "41d55f53bfc74e614c906d3f6b813704" + } + Frame { + msec: 5088 + hash: "135e97adb3f19aa19d746ece1b2b3d02" + } + Frame { + msec: 5104 + hash: "85c4454dbe9a39b3005f32fd7a06b1b2" + } + Frame { + msec: 5120 + hash: "7561e0dd6970f7c81bcb53c9371d4405" + } + Frame { + msec: 5136 + hash: "c9961d5abf700a06ed294ce7aecb6147" + } + Frame { + msec: 5152 + hash: "29acf87effa3c21322334080776c566e" + } + Frame { + msec: 5168 + hash: "04990a79d5ff5cb41dcd48d3e3bf5b11" + } + Frame { + msec: 5184 + hash: "f40c78c37a26249ecb161af778631f7b" + } + Frame { + msec: 5200 + hash: "eddacaeae7c47d063db737f678896da1" + } + Frame { + msec: 5216 + hash: "5ae523dc1115fd0904875718e05aa2a5" + } + Frame { + msec: 5232 + hash: "f09c299412a9e2fd353c4937ad959f25" + } + Frame { + msec: 5248 + hash: "9caeae0abd3bc665bd307997baea6a48" + } + Frame { + msec: 5264 + hash: "e9d222c9d23773488b64b0a6323c1095" + } + Frame { + msec: 5280 + hash: "ad34c46ab3d418a2af7bffc59e720868" + } + Frame { + msec: 5296 + hash: "ff0d8cfd272fca5be34b663a7e52f283" + } + Frame { + msec: 5312 + hash: "55f95277276217de16b6b43090bbb807" + } + Frame { + msec: 5328 + hash: "387fadf4140d335c0b05cfee0c37a413" + } + Frame { + msec: 5344 + hash: "10a1a5a91c11aa8279ae4e57e4d3946b" + } + Frame { + msec: 5360 + hash: "414f7bf3a3ec05a9840cd104a13d5504" + } + Frame { + msec: 5376 + hash: "e027716402ead36450732c8350e614b5" + } + Frame { + msec: 5392 + hash: "0190f59275f01429ee6761b39ce99fc1" + } + Frame { + msec: 5408 + hash: "7f99dd337561f006a7c56babe3c10c38" + } + Frame { + msec: 5424 + hash: "4bbb76393e56b5da723c1f33a7694013" + } + Frame { + msec: 5440 + hash: "00eedf86916629fe90f3c2f36e0c689e" + } + Frame { + msec: 5456 + hash: "84d1f5a6604b75371f2fa7b60a59299b" + } + Frame { + msec: 5472 + hash: "00488220a460746be6d7d1b66d15c392" + } + Frame { + msec: 5488 + hash: "cae5a6d45425d641228210a47c5ee5f6" + } + Frame { + msec: 5504 + hash: "670a2132e65564ca2cfd58ec9842ba93" + } + Frame { + msec: 5520 + hash: "212b6cc9fa130bec9579cf218e1f7eeb" + } + Frame { + msec: 5536 + hash: "b159e67541b5b1b5071f6cd041c62293" + } + Frame { + msec: 5552 + hash: "8c4e62d26e19c32200772edefd329db3" + } + Frame { + msec: 5568 + hash: "1ff120d0444e398cc79190012b548b4b" + } + Frame { + msec: 5584 + hash: "1c75bccd5e19ee9a2644585b726db048" + } + Frame { + msec: 5600 + hash: "bc16aff96b1f9cfe3807e95e371a8f26" + } + Frame { + msec: 5616 + hash: "35a5fdb20bdbaf0122cac4cad60e7bb8" + } + Frame { + msec: 5632 + hash: "ea7ac72c81abff8af260be508b6cf117" + } + Frame { + msec: 5648 + hash: "2d112d040fd425c59b511066737e494d" + } + Frame { + msec: 5664 + hash: "769d2724656dbf0e793ecd8e42db3de2" + } + Frame { + msec: 5680 + hash: "1c25b3d65e8590f8c213afa76b722e97" + } + Frame { + msec: 5696 + hash: "760a103d4524f8b665c6ff42185a8ce7" + } + Frame { + msec: 5712 + hash: "451a9408b04826ab35749d9120efd6bb" + } + Frame { + msec: 5728 + hash: "3fad6b23b0b78f844e02fe307e20d376" + } + Frame { + msec: 5744 + hash: "451a9408b04826ab35749d9120efd6bb" + } + Frame { + msec: 5760 + image: "test-flipable.5.png" + } + Frame { + msec: 5776 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 5792 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 5808 + hash: "da2a1e5e988c27577ceb453cb0383703" + } + Frame { + msec: 5824 + hash: "ae2407f8da9a047d2725bcdcf8e568b2" + } + Frame { + msec: 5840 + hash: "ae2407f8da9a047d2725bcdcf8e568b2" + } + Frame { + msec: 5856 + hash: "e97a5d968da37789c28816608fa262a1" + } + Frame { + msec: 5872 + hash: "9becb90d9f8a61f5afacdc53d137ebcb" + } + Frame { + msec: 5888 + hash: "9811f823e057882d384f36d7227fa12e" + } + Frame { + msec: 5904 + hash: "1e7a308d18851db0a430542178944c67" + } + Frame { + msec: 5920 + hash: "692931f1db6ddf0b37eb64026ca830f8" + } + Frame { + msec: 5936 + hash: "2117c775960234c297187ea2e9d51e73" + } + Frame { + msec: 5952 + hash: "f8038dc4b67b92ef776a97589240e8c5" + } + Frame { + msec: 5968 + hash: "51dff66a7767e3464fda60f2cf906700" + } + Frame { + msec: 5984 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 6000 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 6016 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 6032 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 6048 + hash: "7e16e6360fc2e9db67dbf11d58042745" + } + Frame { + msec: 6064 + hash: "51dff66a7767e3464fda60f2cf906700" + } + Frame { + msec: 6080 + hash: "f8038dc4b67b92ef776a97589240e8c5" + } + Frame { + msec: 6096 + hash: "2117c775960234c297187ea2e9d51e73" + } + Frame { + msec: 6112 + hash: "692931f1db6ddf0b37eb64026ca830f8" + } + Frame { + msec: 6128 + hash: "f01b7368e42381dda5eadf56482ea993" + } + Frame { + msec: 6144 + hash: "9811f823e057882d384f36d7227fa12e" + } + Frame { + msec: 6160 + hash: "9b40b6c75af876567ff49688bc710f2a" + } + Frame { + msec: 6176 + hash: "e97a5d968da37789c28816608fa262a1" + } + Frame { + msec: 6192 + hash: "2cd0627fdc63bb91f8dcac789d7a93b2" + } + Frame { + msec: 6208 + hash: "ae2407f8da9a047d2725bcdcf8e568b2" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6224 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 6240 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 6256 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 6272 + hash: "90fb4e4ba04ac32b52c10b3258431c04" + } + Frame { + msec: 6288 + hash: "73c06997014af4e008b546b53fe349fb" + } + Frame { + msec: 6304 + hash: "451a9408b04826ab35749d9120efd6bb" + } + Frame { + msec: 6320 + hash: "451a9408b04826ab35749d9120efd6bb" + } + Frame { + msec: 6336 + hash: "3fad6b23b0b78f844e02fe307e20d376" + } + Frame { + msec: 6352 + hash: "1c25b3d65e8590f8c213afa76b722e97" + } + Frame { + msec: 6368 + hash: "769d2724656dbf0e793ecd8e42db3de2" + } + Frame { + msec: 6384 + hash: "9e375cb3815723a2c5dda39c79325e96" + } + Frame { + msec: 6400 + hash: "77a245991ed8e40163bd0224eb15f20e" + } + Frame { + msec: 6416 + hash: "e6936f1122c8c0a76b0eb61ad086a9f1" + } + Frame { + msec: 6432 + hash: "8048f84221a02e7102cf3272445862a1" + } +} diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/test-flipable.qml b/tests/auto/declarative/visual/qmlgraphicsflipable/test-flipable.qml new file mode 100644 index 0000000..64adb61 --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/test-flipable.qml @@ -0,0 +1,79 @@ +import Qt 4.6 + +Rectangle { + width: 400; height: 240 + color: "white" + + Timer { + interval: 3000; running: true; repeat: true; triggeredOnStart: true + onTriggered: { + if (flipable.state == '') flipable.state = 'back'; else flipable.state = '' + if (flipable2.state == '') flipable2.state = 'back'; else flipable2.state = '' + } + } + + Flipable { + id: flipable + width: 200; height: 200 + + transform: Rotation { + id: rotation; angle: 0 + origin.x: 100; origin.y: 100 + axis.x: 0; axis.y: 1; axis.z: 0 + } + + front: Rectangle { + color: "steelblue"; width: 200; height: 200 + } + + back: Rectangle { + color: "deeppink"; width: 200; height: 200 + } + + states: State { + name: "back" + PropertyChanges { target: rotation; angle: 180 } + } + + transitions: Transition { + NumberAnimation { easing: "easeInOutQuad"; matchProperties: "angle"; duration: 3000 } + } + } + + Flipable { + id: flipable2 + x: 200; width: 200; height: 200 + + transform: Rotation { + id: rotation2; angle: 0 + origin.x: 100; origin.y: 100 + axis.x: 1; axis.z: 0 + } + + front: Rectangle { + color: "deeppink"; width: 200; height: 200 + } + + back: Rectangle { + color: "steelblue"; width: 200; height: 200 + } + + states: State { + name: "back" + PropertyChanges { target: rotation2; angle: 180 } + } + + transitions: Transition { + NumberAnimation { easing: "easeInOutQuad"; matchProperties: "angle"; duration: 3000 } + } + } + + Rectangle { + x: 25; width: 150; y: 210; height: 20; color: "black" + visible: flipable.side == Flipable.Front + } + Rectangle { + x: 225; width: 150; y: 210; height: 20; color: "black" + visible: flipable2.side == Flipable.Back + } +} diff --git a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.0.png b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.0.png Binary files differindex 30bdefd..4cc937d 100644 --- a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.0.png +++ b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.0.png diff --git a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.1.png b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.1.png Binary files differindex 799e028..ea04224 100644 --- a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.1.png +++ b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.1.png diff --git a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.2.png b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.2.png Binary files differindex ed267c2..241fd20 100644 --- a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.2.png +++ b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.2.png diff --git a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.qml b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.qml index 3199f31..a4339f8 100644 --- a/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.qml +++ b/tests/auto/declarative/visual/qmlgraphicsparticles/data/particles.qml @@ -10,235 +10,235 @@ VisualTest { } Frame { msec: 32 - hash: "1c129b1c4a39412bed2f23d712f2bc90" + hash: "71e690f8339f1829efc113d88d1a9023" } Frame { msec: 48 - hash: "fbcc4bc3fea46a43453aa39b032264c6" + hash: "856a757f3e83e1ede00854d2dacd856a" } Frame { msec: 64 - hash: "2cb13275faca414b7c8ba9d70067fd1f" + hash: "2a7926b693b9950aabc4e3a1ebe4b2d0" } Frame { msec: 80 - hash: "b017afb05f96085ee3395d62e62e457b" + hash: "0564ce95b47a7c3314a56921855b9244" } Frame { msec: 96 - hash: "642851d10c549c8ae72c057563e99e64" + hash: "bf207596dd69e7a872a23448621100cc" } Frame { msec: 112 - hash: "494c0942f7410d455a4b113fb908e570" + hash: "a0bb920166e777ea96afb811353a3488" } Frame { msec: 128 - hash: "cb0a2f9980f27757c0c1d62ef3dcfde0" + hash: "3d6297c684562d099fdb9c413b3e93a3" } Frame { msec: 144 - hash: "2fb9cf782ea106006af8bcd66c62869c" + hash: "29139f93cbd55faa0ea18f11db364d56" } Frame { msec: 160 - hash: "bf68518323f03e4f407831e8b34f247b" + hash: "f3637e44bf1b6c3fd030898e14a15443" } Frame { msec: 176 - hash: "c99abe9c0384ae339fdfa0c75dc8047d" + hash: "d687ef38c1d0e8d12c03a2e7b462a5e5" } Frame { msec: 192 - hash: "96f2eb402633c1aca8a1a2b0d60af5fb" + hash: "0f1f227bbce76122d081759752edf47e" } Frame { msec: 208 - hash: "6cba51a856f1ba54ee702761f196b915" + hash: "1112e4f9ec18958caa4efadbf8b369bd" } Frame { msec: 224 - hash: "9188926caa6c6ba8cb3aee04de635b96" + hash: "5bb7fd7dc06d79aa5ca35fa551753a38" } Frame { msec: 240 - hash: "81132a5e8768de0630311813170f166e" + hash: "c59e159877613eb09ba353bc0ef46086" } Frame { msec: 256 - hash: "a638698d7ccb73f20f6eeba3857f417c" + hash: "b7c583f85d89c833861324b3d06a6c8b" } Frame { msec: 272 - hash: "4761ba6847f6f0769b916106c5f3245b" + hash: "147641f03d92a48f49e0cfb4972bc1c7" } Frame { msec: 288 - hash: "13bc0c681962bada7fcb3b722895ffaa" + hash: "1627827cd3733d1177f111c6c347ab49" } Frame { msec: 304 - hash: "505c5824be16d812b7c339f1f9b8a10b" + hash: "0edccffd718ef10a0ea476201fc00c39" } Frame { msec: 320 - hash: "d191d502d9c685f8497583669147ee73" + hash: "4b7f426aaa31bdabc6c065b298e59c9e" } Frame { msec: 336 - hash: "c17f55cc5d7bf541e235791a157aa8b9" + hash: "4814f77f57bbae8d3c20995e37ec95fb" } Frame { msec: 352 - hash: "3ef401f87830c53b9b277d4420a9a742" + hash: "030092297087df89ab40e894a01f0ee2" } Frame { msec: 368 - hash: "d04816400e66ebbf797f9985a53f7cfb" + hash: "30b0d547b580daee9b1c49f5069570c5" } Frame { msec: 384 - hash: "d7a7df7c2a92449f42d61c0572e7dbac" + hash: "eaee106eaa1505e7d79ed21c36f381fd" } Frame { msec: 400 - hash: "f49a3bcf3842f554136ff9bd5bb470ef" + hash: "6527d1d44a75015d7eb163a660e15b0b" } Frame { msec: 416 - hash: "27bccc5933d7bfaad6d5f6a10efd283b" + hash: "3a3a7b7b36ede4aa1261b5f28c99984c" } Frame { msec: 432 - hash: "3067ac00a4d58c67bb96d813c344871d" + hash: "d2349319b0feeceaa7ef9301ae87d348" } Frame { msec: 448 - hash: "d38d7192688feecc38fd63285d37ce49" + hash: "f483ae316491e367922f6ef7ebfa0298" } Frame { msec: 464 - hash: "4172d1b74cdd6ea89be718977775a9e0" + hash: "3d94b3e9b409a4ca2200df226a25b2d5" } Frame { msec: 480 - hash: "2761a7e58cbfa46fc6d306c8270e4f10" + hash: "ce289f478dafd295ba82ef0c9e13ff3d" } Frame { msec: 496 - hash: "58a851b9fbcb98afc7c1bc58c2f45e4a" + hash: "6d618658faa9403ff9909f6c6a677cb2" } Frame { msec: 512 - hash: "0f7789f04bf20708d9d6f1e818b6b88a" + hash: "9e12eda314483bc5ef5a14a1b1ac26d7" } Frame { msec: 528 - hash: "8d8b8d109dce4c7b05ecb603b4718859" + hash: "ed34b0d26a18145028a5ec4c99e9b569" } Frame { msec: 544 - hash: "0fc6fde589932ac41787e8ebfe3fcbe3" + hash: "ea91dc7e837fa540af260f75c0f8ba49" } Frame { msec: 560 - hash: "e08bffd5a56795488f090a475513e5db" + hash: "a5b277747454ddeda3d66f3702f45a53" } Frame { msec: 576 - hash: "e089ab7c5feefd3d745bb665e2ff49ee" + hash: "7601784afb80a79267ade99961122186" } Frame { msec: 592 - hash: "e7b787fb1b21e991c19ec88b3d985b69" + hash: "e52696c37cc3a245a555c98038b51e76" } Frame { msec: 608 - hash: "a6f4f32287bd926e0eeff68717b80512" + hash: "7d94071d225e0105c794a238eaa8117e" } Frame { msec: 624 - hash: "3344ca9c97473bd922bd8efd5d6ab212" + hash: "60ebfb611c6f7515568574aecdfdcb57" } Frame { msec: 640 - hash: "a330510a9f62acb4f2163728939d0bb5" + hash: "0ea41ef8a82e97e62ed7507606ab6bf4" } Frame { msec: 656 - hash: "1ec473936f2279f13675b6b5fe2ee392" + hash: "009a12491a5f6e4b30942062f93a3f8c" } Frame { msec: 672 - hash: "b193b7d2917ee00c4cb29bf244186bef" + hash: "2fa053880413fc76b53b26b733b2168f" } Frame { msec: 688 - hash: "75137e977941e357bad2ad9af2cbc898" + hash: "fb53a57559de18a5b6f13f21d1daf098" } Frame { msec: 704 - hash: "31773ba8979a31b1691860b7dafe28dc" + hash: "f65a62bf7d5e8fbd996f7151398109a6" } Frame { msec: 720 - hash: "d8922452edbba4f1092b83e87c0330ea" + hash: "b0802484661f6fe4606f4ff915c03f81" } Frame { msec: 736 - hash: "982c80305b54236d1259f5672098652d" + hash: "b63c61e63cb23147a8377d3428d5a4fa" } Frame { msec: 752 - hash: "d8b23fb0867fb75558960216c8d0f2aa" + hash: "a320dcfa3907c85fa983035953b79ba3" } Frame { msec: 768 - hash: "daf7833f93a216d1e025c9129b3a7caa" + hash: "6b94696073ab8e1ef6be1f0b5cb22720" } Frame { msec: 784 - hash: "bb08e8fe2ce74018fc702e5dad8927fe" + hash: "5ed4ff5011c421e40bd0e1d021974efc" } Frame { msec: 800 - hash: "22a30051c87d4de7e734d9de6ce7eed8" + hash: "b183261aca9e8f887f4d489d8c81f583" } Frame { msec: 816 - hash: "d8625628587feace367fc97c1f11aff8" + hash: "c4672d92bb4f0e8cb8e10fcef11a36e2" } Frame { msec: 832 - hash: "e9dbbf715fc094cb22ecd5c6df602f95" + hash: "beb2c18162ea197b486b217f15f784e7" } Frame { msec: 848 - hash: "ca69b2b9f8e6b16e3bc6d93598b6c75a" + hash: "9f5198e08dc16e80f500804ba8ae7afb" } Frame { msec: 864 - hash: "87e09752e39df5042aef163fe4ed0b47" + hash: "d892706fd28d55adcdacdf72a2f7ad83" } Frame { msec: 880 - hash: "80adfaf02838c8bd372e53d0483fbac5" + hash: "1ed182b5b27ed7ed59c56c450a73975d" } Frame { msec: 896 - hash: "9934a1aece14ba7369b00cf2620cd207" + hash: "74756064676c5d5c9eacaea31a7b357d" } Frame { msec: 912 - hash: "954a70a949fdcca4e4412174f30653c3" + hash: "64f79b420b38bda6e102163b90be5f4f" } Frame { msec: 928 - hash: "850fa936516f8b145465eac39c9a74a6" + hash: "0d1f92cafc507af799953771cee7c265" } Frame { msec: 944 - hash: "1d844e8a7c710ccbf31f47470cc9abf2" + hash: "887ef63951fb56fd50f4de9afe8db1a8" } Frame { msec: 960 @@ -246,239 +246,239 @@ VisualTest { } Frame { msec: 976 - hash: "33f4eee3f6e3fb715463254d727ef898" + hash: "f09fc1e1ebc8c627c89c741ac263e3f4" } Frame { msec: 992 - hash: "68648a3f75f58b34dd9770a9edc2caea" + hash: "30bb26df58c83ff70d767e01f0df5140" } Frame { msec: 1008 - hash: "ad0d431ab7e6cfbb43053050a1cf5e40" + hash: "dbd83b1749a42edd6d26097ade1c67ba" } Frame { msec: 1024 - hash: "d1ae74c9bf3826d30fb461ca2fd8e36a" + hash: "7fa50f111158dc6a3e245eb23e57a3f3" } Frame { msec: 1040 - hash: "bda9d77c68a30d491abdfbfcf854c5ea" + hash: "267ef8b555a62abb44e8b5cf88c83110" } Frame { msec: 1056 - hash: "386ea303f8102339f8cd5ae88fd5f6bc" + hash: "78b2d13be078f2e7e94d685994b6488e" } Frame { msec: 1072 - hash: "8c81d3992851ebeb3cb820bc4510af66" + hash: "1d47caf40c85bc1e23bf8d22160d333d" } Frame { msec: 1088 - hash: "566813e312ffdde4a7d3af4276bc8cdd" + hash: "abeaf0a9bedfd62e56f12fa612bf287f" } Frame { msec: 1104 - hash: "d9c8b391b12ee40aa393f4fb39c12a16" + hash: "0f66d12b082398c9f43ef868632529ab" } Frame { msec: 1120 - hash: "f2bf70bda626089437f0ab67ad62d8f6" + hash: "957340efea7ce168889c2ae1b867c6d0" } Frame { msec: 1136 - hash: "88b2d1ecd7d51d0bf8c947a3433b7013" + hash: "4d83e6160f5d9097a4b73bf4104fa11b" } Frame { msec: 1152 - hash: "e93e0553c5dcc6dcd21dad0932d1e3fa" + hash: "d2811de76d3c0cc8ebd67583e50deaae" } Frame { msec: 1168 - hash: "c1ec148772d399ea4934cdfc514f6980" + hash: "cb13f2d6985e841b2da453860d7ddd65" } Frame { msec: 1184 - hash: "14f286793de5452f4677e8b6fd5c1e7e" + hash: "1e48b355ff1e136bcd982a749ba49089" } Frame { msec: 1200 - hash: "220a7df0af53fc9a2442956128091ad8" + hash: "9f9abd7b167a834449510a02d368155b" } Frame { msec: 1216 - hash: "84c49512f5e9f138901b3833a5adbcab" + hash: "6a75c81527b3bb85f70c08f669d46139" } Frame { msec: 1232 - hash: "b05410caa120f5a4191a44b84aa17a8c" + hash: "eafd6f87fb88f6f51cf27d5dd4faa7c8" } Frame { msec: 1248 - hash: "e1f6db204f62394205c1d4d56bbf9f52" + hash: "ba43e681c7f2677b81fa4fe87a5e612c" } Frame { msec: 1264 - hash: "f45033d1350009e09f62e81aeec297a5" + hash: "f83f06320c3e7c2352dd8e8839d63063" } Frame { msec: 1280 - hash: "dfd88b1dba38ab8260e00b3810b89318" + hash: "713afe22640941e9ea4925158099c514" } Frame { msec: 1296 - hash: "17503276f68e365cde03607d66fe4c8e" + hash: "53766caa0ab92bbd2e3d69e6ab9a8fe7" } Frame { msec: 1312 - hash: "28f03c5c0fe5c4647c5b9d3b72a07c76" + hash: "af98650b68d48fd3776d0334904b9e75" } Frame { msec: 1328 - hash: "ea2082529b50543fab22497e01938102" + hash: "62439fba28fbc0d4a129ccd5edf81b8b" } Frame { msec: 1344 - hash: "a700a2f3721625b1ec68107884d1ce67" + hash: "75c67b227f23a3ef5c01aca285f3617c" } Frame { msec: 1360 - hash: "ce717f1f1d98158aeef1cc6a9485dc80" + hash: "3a5e1fe4a9454e9636fbebdfb005e3ac" } Frame { msec: 1376 - hash: "7febe7c67e1c159881de72f62800a505" + hash: "2e4cdc140a9faedc8fbc9a0ec20b1a4c" } Frame { msec: 1392 - hash: "474931cb44a8e18426b9c2cc9f6df482" + hash: "f937d5b14fb0360afb14dbcce1b0ad9a" } Frame { msec: 1408 - hash: "1085b4873b9a4934882a163be72a2710" + hash: "20cb9e30c1a89bae3081427328887361" } Frame { msec: 1424 - hash: "59e7911800e915e6f159cb111ce61a54" + hash: "67f19061f97630a35b59357dcba9c5f0" } Frame { msec: 1440 - hash: "6d0d780ffc726b04f9885c25b08d1009" + hash: "f1b4041797873b7ff9e318542186eaf8" } Frame { msec: 1456 - hash: "bf896d6403dc1ad26536cc1165e71e9e" + hash: "ecbdc77e1b58decad29a6dfc654fba20" } Frame { msec: 1472 - hash: "86397c7dcf5ed34edbbaa465ae6eab43" + hash: "6d0b821c08b024aa8fc71ec5c0e98c53" } Frame { msec: 1488 - hash: "ed1b4967bf14eead9cb4d2dcfbdb46c2" + hash: "5137c7ee6879b98478a4edb1b5a0d79c" } Frame { msec: 1504 - hash: "67b7e59c8f945d1f3bdb1944fa736ecf" + hash: "17c80c758e9d0721a3b791dbabe0d34f" } Frame { msec: 1520 - hash: "b5f95e89f39d1c4821ba38547b0f2e3b" + hash: "abc1fe8d97b87f891ac53673fe64bf0d" } Frame { msec: 1536 - hash: "5bc91c9e35afa255a2dda28db9802b1e" + hash: "fe8c8ce5f0cf676310e4ce85c1755f0f" } Frame { msec: 1552 - hash: "84fab4042e0ff891ca1998cbfbb60e5a" + hash: "40eff7ab7370e7a3de28a55e200812ca" } Frame { msec: 1568 - hash: "7c5ef5025a06e990171dac3e8fd93977" + hash: "8ff86cc730f4b7877ed7890f62dd8f17" } Frame { msec: 1584 - hash: "ab4cd0e103d71a35250668ad850a5213" + hash: "a87e34b8d9e75d03493c94a96ef97c25" } Frame { msec: 1600 - hash: "aa974c4b2290f7febb121344623de86d" + hash: "807a4b4652ed228084660bfdf98efd50" } Frame { msec: 1616 - hash: "ff6ee1b50ca356dc98038a459e318b32" + hash: "ca245fcf490c3bc17bef1a38d793f573" } Frame { msec: 1632 - hash: "022fe9c391514fdd98bc1c38bc383df2" + hash: "6662d0e4e7778f560c8956e9fe4aa079" } Frame { msec: 1648 - hash: "b1a33c9c9cbdcc1c8c9c982eef041ccd" + hash: "c47d90df3dbb1656ef425209f1b528b1" } Frame { msec: 1664 - hash: "0945e66ab5aa81beacf662eb82ec39ed" + hash: "c9dbf06207cf9b8d03cf20f4e4131979" } Frame { msec: 1680 - hash: "ae293f675dbdd88dec8f924140033cc9" + hash: "dfab00fee3cf9f0f76d66f64eed6de84" } Frame { msec: 1696 - hash: "5ace5013e3d51a8db338f65011dd10f8" + hash: "b38a29a29bf30c197e5434a942e805cf" } Frame { msec: 1712 - hash: "9466a4e96d647f2bd8845697fce89399" + hash: "589496ebac7f7ea699b869291db7ed45" } Frame { msec: 1728 - hash: "73bbbfc57e020c6a0acbd5fdfa711c30" + hash: "c7a037e3e755c1c8fecd17db7596a9cd" } Frame { msec: 1744 - hash: "d71d7182107c3d6b004a57a321caee96" + hash: "faca2e1e88556ffd1f71bbc5ceae5cb1" } Frame { msec: 1760 - hash: "0902867c89e536cffcde69bde2eb1994" + hash: "5837a888d83513fb4c0bce11a34fc3df" } Frame { msec: 1776 - hash: "39fc26943f6077272c36e93b7cbf6994" + hash: "07f8fe9ded8271396db503c3927244bb" } Frame { msec: 1792 - hash: "92931d5a6e57fb9df60785a64d3a6f78" + hash: "345fffbc210b55a4bd78cb8a4e12d025" } Frame { msec: 1808 - hash: "fffd632552f88f2979ef85de0ce585c2" + hash: "7b9aa96eb9a1fe77fbb8b607140885b7" } Frame { msec: 1824 - hash: "9f97bfcffbb5d127c5eee852b30a13c4" + hash: "d66748cc52a364231ac8a6a677d9bdc6" } Frame { msec: 1840 - hash: "ea9ee0293fbc45d3467e29c09e42adcd" + hash: "40cf9aece08870358aef6c9836013472" } Frame { msec: 1856 - hash: "b5b75c50f8fae3fb3b88efad536c911b" + hash: "2015ab3c133862222b1375c775af743b" } Frame { msec: 1872 - hash: "25dcd3fa30c057d1a42c19cee1ce444b" + hash: "41e519acb18ed9f7cda2d3cd88fddd2c" } Frame { msec: 1888 - hash: "862d42abe7abd49d4a38e38a8c33a657" + hash: "8e583b74b2b90d7f5c78357f66801358" } Frame { msec: 1904 - hash: "a335f3c8c797c1bb5537b57f952c19d1" + hash: "3a6755e25045d937743371a98792a546" } Frame { msec: 1920 @@ -486,239 +486,239 @@ VisualTest { } Frame { msec: 1936 - hash: "da1cf98fdfe5acbe30cfbe66389aa240" + hash: "f80a8f65def55d556732bfefe3debe72" } Frame { msec: 1952 - hash: "088f3209c0363c06cf0607c58d00ca2d" + hash: "308cbe6344b9aea4c6b7ad2ef606de59" } Frame { msec: 1968 - hash: "47ba3bf2604b21f331a2e00f05926aaf" + hash: "fd2d31f6f4a3b4ce1aec1e309c48ae94" } Frame { msec: 1984 - hash: "5ff0de383abdefad76380af144bd9d80" + hash: "a02ed4aa3783049ffbf7ef6dfb4e8926" } Frame { msec: 2000 - hash: "b972d1c85d3d8777f84b54dc118172fd" + hash: "dde64769b3affc776fe0e747a4d621ef" } Frame { msec: 2016 - hash: "37581c3fbef2088b7d14b6c7bbf3cdc3" + hash: "3fa830b629939520c071b3e6fe94156e" } Frame { msec: 2032 - hash: "4ad6a06ac6de9dea66e9ce873a6618c1" + hash: "ae582350cba12ce47306f2a967e396fd" } Frame { msec: 2048 - hash: "3a0379ad966235044508c144ffbc336b" + hash: "a4483eadd2bf3e3e9fae51279b50e18a" } Frame { msec: 2064 - hash: "cb5a9510400943d77c9a296066f037e2" + hash: "742fc008fab89087b1bceee33889db19" } Frame { msec: 2080 - hash: "7bd5673a1d2ad8079df2569149e5811e" + hash: "5da9546b147737dd671813725cb196f7" } Frame { msec: 2096 - hash: "bd327ff6b8a4081b3a41cb0035403037" + hash: "c979bccf2603c400b4c93d1be6f698d1" } Frame { msec: 2112 - hash: "f0f9f559251f7648cd60e66ac745962d" + hash: "b7c6391ce59e054ae53e3731788dfc05" } Frame { msec: 2128 - hash: "18827630a859b0ce497f682e33558fae" + hash: "0371e17fdaa7be7af0cff132f164d6b4" } Frame { msec: 2144 - hash: "e22d8110cbe34acddba799942872645d" + hash: "6973ce2af671f4d500da3c5a37534693" } Frame { msec: 2160 - hash: "11564e7221524cc3655c2c5f1d7e42b6" + hash: "f9128da47afa801c6b3670752847a8d1" } Frame { msec: 2176 - hash: "6468721ee38209aaf2c82a320bcd122e" + hash: "2e4a7001c3c1bb7153f631da1b273aa1" } Frame { msec: 2192 - hash: "19772d0f422fd206645ae6cf0be30b59" + hash: "65d41139c27a4a94a817e1b5c8aa765d" } Frame { msec: 2208 - hash: "48b6c7e1317b9a66238c17afceb5121f" + hash: "36652e407957b59bad2e0e9b2fa5a8fe" } Frame { msec: 2224 - hash: "82a1af78709b78cce2d9b4eed7f8477c" + hash: "c0fe78ff8fc3119b30a1d9e5b98fafbb" } Frame { msec: 2240 - hash: "36e2366eccbdd2d16c19829c34fbff87" + hash: "41b798eac11e696e5e690d13e8ce88b1" } Frame { msec: 2256 - hash: "271db39ca46c59ddc279fb41a9d191af" + hash: "20efbef05b6eed5a916e55ba25c10a59" } Frame { msec: 2272 - hash: "ee279a90e86aa89b1c3d745ab030180d" + hash: "dc897fb0d232a39215d5d004e322cb2a" } Frame { msec: 2288 - hash: "14e8c72d770644f4cec99e65aeff0d75" + hash: "33c1f9bb344a31a1a0973a527c22edac" } Frame { msec: 2304 - hash: "56fa1756eb11a30f07f8f31c22c99973" + hash: "0b54b02eedc60e8d7b147092b9bd6bca" } Frame { msec: 2320 - hash: "165af677ff3921f06b89b2c8d76a7924" + hash: "02cb9a222c9b109cbff956238a61b31b" } Frame { msec: 2336 - hash: "d64aa248d9b207b87e5ba14bdabf2f6c" + hash: "bfb067d4519861b22e20847083447a22" } Frame { msec: 2352 - hash: "33e9716eb9ca62fe5c5cb1b1ee0e9e68" + hash: "86f599f6844c2046148c682abfe6c417" } Frame { msec: 2368 - hash: "cff2316820c469b84c3bacabfcf1a551" + hash: "fa07ac104183fe94fd3a381595582d76" } Frame { msec: 2384 - hash: "9f1359c4bab95244602254ca3954e2b7" + hash: "8ee792f06fa7e877ce0b160bcf170e70" } Frame { msec: 2400 - hash: "d6246d2aaea895755eab4c839c35ca9d" + hash: "bb39f4374215e9b4eafbc3320d4144b6" } Frame { msec: 2416 - hash: "d446e1ac91fec10482b0c6d38ce86d17" + hash: "d91f778ced58466dd6b79f50cdbfe1a8" } Frame { msec: 2432 - hash: "99f443af76a9e0d2d03638bc9927fda3" + hash: "0fd47896c9d9d74e40c38d0f532aa537" } Frame { msec: 2448 - hash: "a9169e293b8154947332d9754fd23af3" + hash: "0b7ec227fc884616bd17439bf0d40ac1" } Frame { msec: 2464 - hash: "cc6851cc5864615c000fbc8d552eb593" + hash: "e88d4e76d353701c738120e169ccf2a8" } Frame { msec: 2480 - hash: "58a3a6edb5842c88cb73b79a8a187717" + hash: "1564432d4aea1826e543f41dfc9a8113" } Frame { msec: 2496 - hash: "42bcf77c98c9a80508446bd8c66e935b" + hash: "02825fa9174c0a45e19c564030ba9ad0" } Frame { msec: 2512 - hash: "0f99350ae151591fbda95158c046e072" + hash: "c7671a2bb3f0dcb2be48805ef1970dbd" } Frame { msec: 2528 - hash: "9e817e2fd8377b7117f908c4e87d4d57" + hash: "2fa407b026edbb8b9e0edc263fd9ecc5" } Frame { msec: 2544 - hash: "72c105bce75feeeb7a86f823945b4ff9" + hash: "211f3c82cff939cd1ed324180d40aab2" } Frame { msec: 2560 - hash: "653b858445bdd8afdf8abd27f5e53fb8" + hash: "0fb3de6e1865e49ac281ac12e2032f07" } Frame { msec: 2576 - hash: "18bf39154fbf4b42c4d3303e018a2f27" + hash: "a08e0127a0b6172715aa6a10d6e0799e" } Frame { msec: 2592 - hash: "5ed5d52ab7da7ae77e97f3ace09b3b8d" + hash: "57a3d1530042f0d6a6dbf84059a8d730" } Frame { msec: 2608 - hash: "1d382462e5746ee9b6df980364b1c96b" + hash: "9aae6364941f988409b8db63db72fccb" } Frame { msec: 2624 - hash: "2a0a561f38c113a0f177b1c2b99ee5e1" + hash: "9e466ce9c8b54dc95960d21b0b41fdd1" } Frame { msec: 2640 - hash: "0605d3e2dd9132d9c1d25b75a870d647" + hash: "189e0f3c60cd521a6bf52054fa6039c6" } Frame { msec: 2656 - hash: "a1def1576f386c90bb80d46e254bd384" + hash: "1020f18d41a4d83e0b5ae387b486b5ff" } Frame { msec: 2672 - hash: "cf38d4ae577047048d2bd0a4005abfe2" + hash: "26fcea12cc2de8c8cb8caf049937d7c6" } Frame { msec: 2688 - hash: "d7cb6715cd89978bbca5ce4c93b488e5" + hash: "e5b9e752dc668cd4f6803ea772bbb7b0" } Frame { msec: 2704 - hash: "9a5075ee794af14d4f17a52bdbc47f1e" + hash: "a0df9360ed11207076fc77810c1d8605" } Frame { msec: 2720 - hash: "fd3d803a1e5e9e3eeae7d5edcddd0072" + hash: "56dea4551a9532e80dfd6c79031ec08b" } Frame { msec: 2736 - hash: "445114e7d10581a475989e469323d83d" + hash: "900c62773477b2843464b75f67d50c90" } Frame { msec: 2752 - hash: "58328c1d4c0ee7fca78b684697f1922c" + hash: "177de9647549a276256a5e74d5ef7134" } Frame { msec: 2768 - hash: "433df4d872b9565b43af5afce1b42e15" + hash: "cb3eb956096de4f6b51ab249d184a6dd" } Frame { msec: 2784 - hash: "3b694f15722a087c2c9a860cad8bb6de" + hash: "6671e46d013f72bef5e3d0d95ba70301" } Frame { msec: 2800 - hash: "1986c8036bd548ca06a32aa98ab4fc83" + hash: "33910dc69eff13f9c144b7ff84187a59" } Frame { msec: 2816 - hash: "7845dbb0e38145f54a9e4e0bfbd608db" + hash: "dfa20711b0821b66cb2bdd2806e34d03" } Frame { msec: 2832 - hash: "caed393910ae7467c307a314bdf459ef" + hash: "16e2674c2449bf059aa2a0add077e040" } Frame { msec: 2848 - hash: "f3f6b41b7ed04dbc1693c169bdae3b13" + hash: "cdd2a820076cfa9529d93787de61267e" } Frame { msec: 2864 - hash: "b9a87d15d48f951b0a1d6962fb1d5995" + hash: "a851a1e017e90877d6d8027633401bcc" } Frame { msec: 2880 @@ -726,58 +726,50 @@ VisualTest { } Frame { msec: 2896 - hash: "954300274b6a5785e03a6cdae67238e9" + hash: "f159f17caa8df7ae09141462cd9b75ab" } Frame { msec: 2912 - hash: "5b7f51afad796107289369c7d3494843" + hash: "f6a8787008d24bffa6813799042a0d69" } Frame { msec: 2928 - hash: "41164f28cbb94528eda719d590d1cf75" + hash: "18e79f454a628098c41ff8882b663a53" } Frame { msec: 2944 - hash: "5953d4c9a4b4c83ba1dfd83a57ec2742" + hash: "74676f4f2d8612bc02f72e3bf855c060" } Frame { msec: 2960 - hash: "0be7c6187a26b44f12bf71587372a6c7" + hash: "8276c61e080635dd37954837998a14a6" } Frame { msec: 2976 - hash: "a7cab1faf0cdd5649c8ea3c26d2e80d0" + hash: "4cceb2274ce5584315109ac45ef8fce7" } Frame { msec: 2992 - hash: "5f91bef1865623030aea20805993319a" + hash: "c4e87037c2265f85fef3b681b840c6f9" } Frame { msec: 3008 - hash: "69d34e2a27c471ad44f8aba8d906a961" + hash: "aed160bb820dc5cdf1ee320b019436c4" } Frame { msec: 3024 - hash: "5a987879aff30d6c6712c0631bc2f43d" + hash: "593acf3e67bc3428f61b723996093d8d" } Frame { msec: 3040 - hash: "62b9132c58cd5fdcfe7f1bc5e64885cf" + hash: "694d197caff9144204a82a682d47724c" } Frame { msec: 3056 - hash: "d394ef9b504abf94c1d28a9fb7f3c28b" + hash: "12519eda928f8aef0e2a21e9fc0f8756" } Frame { msec: 3072 - hash: "a559cc25af950227fa5fdf70be7fd94c" - } - Frame { - msec: 3088 - hash: "318dde40fc72c5f8ee45b865a68922b1" - } - Frame { - msec: 3104 - hash: "3cbfd55773e52f48f01fe66c28c0b992" + hash: "ae8cba17b25e9567211f4cd20080cb09" } } diff --git a/tests/auto/declarative/visual/qmlgraphicsparticles/particles.qml b/tests/auto/declarative/visual/qmlgraphicsparticles/particles.qml index 8fb793f..a7a8143 100644 --- a/tests/auto/declarative/visual/qmlgraphicsparticles/particles.qml +++ b/tests/auto/declarative/visual/qmlgraphicsparticles/particles.qml @@ -3,11 +3,12 @@ import Qt 4.6 Rectangle { width: 640; height: 480; color: "black" + Particles { emitting: false } Particles { id:particlesA y:0; width: 260; height:30; source: "star.png"; lifeSpan:1000; count: 50; angle:70; angleDeviation:36; velocity:30; velocityDeviation:10; emissionRate: 10 - ParticleMotionWander { xvariance:30; pace:100 } + ParticleMotionWander { yvariance:5; xvariance:30; pace:100 } } Particles { id:particlesB diff --git a/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.0.png b/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.0.png Binary files differnew file mode 100644 index 0000000..442ba9f --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.0.png diff --git a/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.1.png b/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.1.png Binary files differnew file mode 100644 index 0000000..fa689f7 --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.1.png diff --git a/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.2.png b/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.2.png Binary files differnew file mode 100644 index 0000000..157bb99 --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.2.png diff --git a/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.3.png b/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.3.png Binary files differnew file mode 100644 index 0000000..8c49acb --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.3.png diff --git a/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.4.png b/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.4.png Binary files differnew file mode 100644 index 0000000..eb2bf54 --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.4.png diff --git a/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.qml b/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.qml new file mode 100644 index 0000000..837e0cc --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicspathview/data/test-pathview.qml @@ -0,0 +1,1495 @@ +import Qt.VisualTest 4.6 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 32 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 48 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 64 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 80 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 96 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 112 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 128 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 144 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 160 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 176 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 192 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 208 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 224 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 240 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 256 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 272 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 288 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 304 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 320 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 336 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 352 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 368 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 384 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 400 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 416 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 432 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 448 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 464 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 480 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 496 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 512 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 528 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 544 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 560 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 576 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 592 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 608 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 624 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 640 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 656 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 672 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 688 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 704 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 720 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 736 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 752 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 768 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 784 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 800 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 816 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 832 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 848 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 864 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 880 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 896 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 912 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 928 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 944 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 960 + image: "test-pathview.0.png" + } + Frame { + msec: 976 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 992 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 1008 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 1024 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 1040 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 1056 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 1072 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 1088 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 1104 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 1120 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 1136 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 734; y: 177 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1152 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Frame { + msec: 1168 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 732; y: 177 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1184 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 726; y: 179 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1200 + hash: "89bb697bb7b7fab38d3ff56e23e43959" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 716; y: 183 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1216 + hash: "42c141399fda1cbb2ae117788d87092a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 700; y: 190 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1232 + hash: "4d44343eb91838e3eb73e2e5326b5ac2" + } + Frame { + msec: 1248 + hash: "4d44343eb91838e3eb73e2e5326b5ac2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 677; y: 200 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1264 + hash: "15aaccb4f7961a4e3e6fe57260779d00" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 651; y: 209 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1280 + hash: "5628fa3ac9893f5c9690013aad4b881a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 619; y: 219 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1296 + hash: "384db58b6de773ac39ae81e6af4d547d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 579; y: 229 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1312 + hash: "2a15a27a138b9d3d646b827d026e8843" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 535; y: 237 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 535; y: 237 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1328 + hash: "098176f48a148eb2bc5ef67c307baa1c" + } + Frame { + msec: 1344 + hash: "098176f48a148eb2bc5ef67c307baa1c" + } + Frame { + msec: 1360 + hash: "f838ab4301bf9d3106cec529f855cecd" + } + Frame { + msec: 1376 + hash: "9725322067a04f83717b059d4970d610" + } + Frame { + msec: 1392 + hash: "3605cfbebc3a9eb4460efb2d4b9b6da2" + } + Frame { + msec: 1408 + hash: "4503a368d8db25d112503dbc3934541d" + } + Frame { + msec: 1424 + hash: "80894cc06c82264bf527398ea235da12" + } + Frame { + msec: 1440 + hash: "d4f9b90f886fc667309b33c9a296410c" + } + Frame { + msec: 1456 + hash: "889d01025cff679b61bff182a1ac9cbc" + } + Frame { + msec: 1472 + hash: "6147bc4455e7cb5ae55cd47be8dc4ad6" + } + Frame { + msec: 1488 + hash: "ddd10a294eb6b19698c4e9fe4f1508fe" + } + Frame { + msec: 1504 + hash: "748e8d9c1971f6258acee5133b7f114b" + } + Frame { + msec: 1520 + hash: "1ef3f32ec9ef950588266bacbe3554a0" + } + Frame { + msec: 1536 + hash: "57853ff47b65aba9e76f90b2efec4f8f" + } + Frame { + msec: 1552 + hash: "3985fea21d89d223c1461d5e96364c76" + } + Frame { + msec: 1568 + hash: "cb5f6a3caeeaed12e91efe43867f2c1f" + } + Frame { + msec: 1584 + hash: "cdd4176776d5969373e0fc9a117e3c87" + } + Frame { + msec: 1600 + hash: "3bac2e7506472db2ae11734240f1c3f4" + } + Frame { + msec: 1616 + hash: "bb572659d79ebda7134c039e40cf2633" + } + Frame { + msec: 1632 + hash: "e610181bfa17a85281f9c7417088f04f" + } + Frame { + msec: 1648 + hash: "eb23ff021909589b6d8ce47ebff2c3ed" + } + Frame { + msec: 1664 + hash: "c321dda3878c4b97cc63246c47368224" + } + Frame { + msec: 1680 + hash: "6a65cdfd50e1455356040d4cbc09905e" + } + Frame { + msec: 1696 + hash: "f2a44b12e4e5bae8283c4d227949e4e8" + } + Frame { + msec: 1712 + hash: "55418d661f3257b5b79a7dbb172b5b70" + } + Frame { + msec: 1728 + hash: "483d7111c86951918746d6ebe0dd9655" + } + Frame { + msec: 1744 + hash: "85c83ac3a294a9320bb04a6721ecf7d5" + } + Frame { + msec: 1760 + hash: "0d658b897b8e03397ddd8ffe475c2fc0" + } + Frame { + msec: 1776 + hash: "6ed9d7ea344b3c1b1d9196ee36b2f89a" + } + Frame { + msec: 1792 + hash: "6a1e7f6c03769c2c88e6343fb6c1a2a4" + } + Frame { + msec: 1808 + hash: "9dc51f46e072eac4494d7318f2ecb39b" + } + Frame { + msec: 1824 + hash: "59e833981c3fcd8a71f4a16d1c454b3a" + } + Frame { + msec: 1840 + hash: "29b953efdda00548d8cf6fb49fa60d13" + } + Frame { + msec: 1856 + hash: "fd4611f703f94ebefcc64781993ca85c" + } + Frame { + msec: 1872 + hash: "aa4789ede618963157b40f099ce84987" + } + Frame { + msec: 1888 + hash: "8a326b46ec536a67626ee2d2bc06aa9f" + } + Frame { + msec: 1904 + hash: "011ff557672d47591e4f0f5c5ee418f1" + } + Frame { + msec: 1920 + image: "test-pathview.1.png" + } + Frame { + msec: 1936 + hash: "69e854e8ac7f1bc1972588ffa01728b6" + } + Frame { + msec: 1952 + hash: "49182b7ae9ef5fb4b9234969abd05960" + } + Frame { + msec: 1968 + hash: "53de60f682574b7a9e6ffaee175fc9ff" + } + Frame { + msec: 1984 + hash: "2de74fe5b8848c5c781b796146871f45" + } + Frame { + msec: 2000 + hash: "33c87146d8c24dd9c2271d16a8ff5b53" + } + Frame { + msec: 2016 + hash: "fdb29214e20d744d9776907061f50358" + } + Frame { + msec: 2032 + hash: "8c7c920416c9b775e790e6da24c32927" + } + Frame { + msec: 2048 + hash: "86b456059e4701379447fffaf9e072f0" + } + Frame { + msec: 2064 + hash: "f92cc485ee03ef5bce3c4cdc35e00318" + } + Frame { + msec: 2080 + hash: "2fad58883cb20273cfd79ebca345a66d" + } + Frame { + msec: 2096 + hash: "84505ebbc6e12817f11f64aa6f61a0bf" + } + Frame { + msec: 2112 + hash: "ded83cacb89838cc0f3ba14bcc69b66b" + } + Frame { + msec: 2128 + hash: "5bb37e75bb45eaa6067c604b83ae13d7" + } + Frame { + msec: 2144 + hash: "4ee9e4c90c40dbc25a0ce884d9c2c37f" + } + Frame { + msec: 2160 + hash: "cb7148ff6f611038c29af36c8552b8c2" + } + Frame { + msec: 2176 + hash: "a591d8cb42570272dd264d5f1ce595ab" + } + Frame { + msec: 2192 + hash: "4e61657405d32dbcd39d3637f8af0958" + } + Frame { + msec: 2208 + hash: "9c7c1411dd5d3c1c8fb78e63e14061fe" + } + Frame { + msec: 2224 + hash: "ae83a37e99b578fa0872ed6bc2776bc0" + } + Frame { + msec: 2240 + hash: "e8cb5a8a40c1e78c87c616f77d8de270" + } + Frame { + msec: 2256 + hash: "9df093e4bcfa32be5924a0ca70bdaa3b" + } + Frame { + msec: 2272 + hash: "40c358066d508143bee1446d12fe7b89" + } + Frame { + msec: 2288 + hash: "a929ed6efc7fc68b38635f3c74242f52" + } + Frame { + msec: 2304 + hash: "86ff721a3178b689ea47b6bc274a2b41" + } + Frame { + msec: 2320 + hash: "ed1f680f6d05f54ceb75c9bae3a0716a" + } + Frame { + msec: 2336 + hash: "3f09a565df2beb51f366a1b3fb6adfe9" + } + Frame { + msec: 2352 + hash: "13468347bd26bab60f1db826fb17631c" + } + Frame { + msec: 2368 + hash: "9f7d085fea5788a457098973f17c36cb" + } + Frame { + msec: 2384 + hash: "4114b93246155b3434200831b2995330" + } + Frame { + msec: 2400 + hash: "487171bd1430f74e3d51b5e215c34b5c" + } + Frame { + msec: 2416 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2432 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2448 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2464 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2480 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2496 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2512 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2528 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2544 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2560 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2576 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2592 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2608 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2624 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2640 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2656 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2672 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2688 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2704 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2720 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2736 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2752 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2768 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2784 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2800 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2816 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2832 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2848 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2864 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2880 + image: "test-pathview.2.png" + } + Frame { + msec: 2896 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2912 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2928 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2944 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2960 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2976 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 2992 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 3008 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 3024 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 3040 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 3056 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 3072 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 3088 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 728; y: 181 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3104 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 3120 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Frame { + msec: 3136 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 727; y: 181 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3152 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 723; y: 181 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3168 + hash: "7ba9783ce63db6ad6b5f725a4ecd4eb8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 717; y: 184 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3184 + hash: "6dcec6cdaa35eba74607ba64d6ea2ec0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 705; y: 188 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3200 + hash: "16b7b4847fe86b25d8d6136106a4c400" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 686; y: 197 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3216 + hash: "d946d55b19c99fa25bf1c04f2b71026a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 661; y: 207 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3232 + hash: "96f40f5071365cde769c733fd1ef5a24" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 626; y: 221 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3248 + hash: "7004058b95b7eab3ebba5c80c0923982" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 582; y: 235 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3264 + hash: "2c78880237c414182f97f1709f1eef0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 532; y: 246 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3280 + hash: "c90a15ec9f88008ca8b0ec0185444d71" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 532; y: 246 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3296 + hash: "c90a15ec9f88008ca8b0ec0185444d71" + } + Frame { + msec: 3312 + hash: "36461e2a4cd860cac32223b8ee73c657" + } + Frame { + msec: 3328 + hash: "5f9b3ad9202fb02a4c6fea28c248ad22" + } + Frame { + msec: 3344 + hash: "d0d23c4e1ddb2d9ffa0ecc38030ae15c" + } + Frame { + msec: 3360 + hash: "8e2e2d3eaf557c453f34016b6614e495" + } + Frame { + msec: 3376 + hash: "7402c747fa7276293a0a72d48d342782" + } + Frame { + msec: 3392 + hash: "6090c30e4d722a32c083a25171fb11ff" + } + Frame { + msec: 3408 + hash: "f770d940cf287fec4b0803f7310292a8" + } + Frame { + msec: 3424 + hash: "558e4ce32df69357b70a8285b00fe347" + } + Frame { + msec: 3440 + hash: "8814168503c9a72ea8d3fa1e503f33d9" + } + Frame { + msec: 3456 + hash: "6f5513d22e545096fadc6f5c4112902e" + } + Frame { + msec: 3472 + hash: "43f11d8ac16fd3e8199e555528817e14" + } + Frame { + msec: 3488 + hash: "d64bafdbd26878a323dae918d5e0a36d" + } + Frame { + msec: 3504 + hash: "1c70bdddfc3751ae3864f008170f8b06" + } + Frame { + msec: 3520 + hash: "bb7a18691fcd371e9d382b5bba4a0573" + } + Frame { + msec: 3536 + hash: "547e15f5dea2d9aa3ed44640b25028b9" + } + Frame { + msec: 3552 + hash: "c11b86a256fac6be10b9a54564903d6f" + } + Frame { + msec: 3568 + hash: "0ada2dc586894d5e37de2632d2b37b15" + } + Frame { + msec: 3584 + hash: "0ae1a39ea196a0e734d80dbdea67b285" + } + Frame { + msec: 3600 + hash: "3cb70e64f9ab8aad841326dc2d2f1615" + } + Frame { + msec: 3616 + hash: "a8f8b5ff19df9163ea628b589b675a5e" + } + Frame { + msec: 3632 + hash: "26fcc73f477db0ea731bc18b00b4c791" + } + Frame { + msec: 3648 + hash: "8702e49f3f26e1e21970e78c8aa4040a" + } + Frame { + msec: 3664 + hash: "1a482a39d02779d8733e348b713f2312" + } + Frame { + msec: 3680 + hash: "c728cc4a8e4d0a8d983514f86a92eae0" + } + Frame { + msec: 3696 + hash: "82360ab373b08bf6a5d9e9ea9d0d18aa" + } + Frame { + msec: 3712 + hash: "6231a4bce6cfc1e26a9606cc041acdbc" + } + Frame { + msec: 3728 + hash: "6e3b48862fc749f15aa2dec1c17d1de0" + } + Frame { + msec: 3744 + hash: "6c9e79a5692a3810b2a9058790f54cd7" + } + Frame { + msec: 3760 + hash: "0652c67fedda0d5e55858ddefff2da9e" + } + Frame { + msec: 3776 + hash: "3b058c0efeb3a9da54a1de72a1792a83" + } + Frame { + msec: 3792 + hash: "96e6fb39c8dbfe4a00bf116bf80aac4d" + } + Frame { + msec: 3808 + hash: "979c0c78c41e0f337cfe1b384fbbe51a" + } + Frame { + msec: 3824 + hash: "8be0d6987a6d12864f30336b249e4b16" + } + Frame { + msec: 3840 + image: "test-pathview.3.png" + } + Frame { + msec: 3856 + hash: "31e665f804a52a4dc88eab5dba78ae5a" + } + Frame { + msec: 3872 + hash: "b7d4cf5a6a3ac79da3be101b50b38bc2" + } + Frame { + msec: 3888 + hash: "559b1b8467b611cdeb7f2ae660e3bf51" + } + Frame { + msec: 3904 + hash: "66abb5af85e793569382efb04744d0de" + } + Frame { + msec: 3920 + hash: "b64eff8bbea5a953d146333363825724" + } + Frame { + msec: 3936 + hash: "47b794c971c4d47baf15e1d63d65ac03" + } + Frame { + msec: 3952 + hash: "b3882fa14f3cb7428c660737656d7ea2" + } + Frame { + msec: 3968 + hash: "a6bd71c7d3a0f3f53674ea8e1334e560" + } + Frame { + msec: 3984 + hash: "0926d3cd53aabb789686e34d91ef23dc" + } + Frame { + msec: 4000 + hash: "914c4fa7264111b4a42c82a60701d652" + } + Frame { + msec: 4016 + hash: "84c1fa22440a61126b79c38605b6f9ca" + } + Frame { + msec: 4032 + hash: "b684fcf9f4725cfc02af0187454dfaf8" + } + Frame { + msec: 4048 + hash: "2e94c1ca74af4eb836a0c505d131f263" + } + Frame { + msec: 4064 + hash: "5f04912674e1bcdb16176976d10ce995" + } + Frame { + msec: 4080 + hash: "aaf0bcef4a15aa1c699eaa1ce817c8ed" + } + Frame { + msec: 4096 + hash: "97fd5bdcfa367191fbd3689658ab3273" + } + Frame { + msec: 4112 + hash: "d76d6c59411636a0e9ac2e0c847b3fe3" + } + Frame { + msec: 4128 + hash: "9cb88a76c962623b1a9cf4e7093d6e54" + } + Frame { + msec: 4144 + hash: "ec3d7075680296905b1bdd6fdd9fcc40" + } + Frame { + msec: 4160 + hash: "43c70dabc45ed059e8b876eb2ba5c66e" + } + Frame { + msec: 4176 + hash: "8f97ca5c3092a20009c5d00139105a22" + } + Frame { + msec: 4192 + hash: "d0f225d4b03495218f7916698e254338" + } + Frame { + msec: 4208 + hash: "f8725467353a8f27bc5570af157c93c7" + } + Frame { + msec: 4224 + hash: "749c8ca5c0a7774c81805b792e6b70e3" + } + Frame { + msec: 4240 + hash: "d353c4a8a5eecb1dce30f4a5b85b1ef4" + } + Frame { + msec: 4256 + hash: "a7105f3f1ddace730d0b4a12a3560208" + } + Frame { + msec: 4272 + hash: "918f480af8a35f6074ff1e202dae2660" + } + Frame { + msec: 4288 + hash: "ed98d08eb30db1b41aaf2a58f3b59398" + } + Frame { + msec: 4304 + hash: "c362cf053b3749a44d1fc33483f9952b" + } + Frame { + msec: 4320 + hash: "9b01b2c771ef86ff4a8ee3f6a4676e3c" + } + Frame { + msec: 4336 + hash: "70ccec3c9db95206b5589d43dcd52b13" + } + Frame { + msec: 4352 + hash: "57e7397c6aadd0d4d5c9d9d5fcdd8fde" + } + Frame { + msec: 4368 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4384 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4400 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4416 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4432 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4448 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4464 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4480 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4496 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4512 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4528 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4544 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4560 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4576 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4592 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4608 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4624 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4640 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4656 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4672 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4688 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4704 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4720 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4736 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4752 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4768 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4784 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4800 + image: "test-pathview.4.png" + } + Frame { + msec: 4816 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4832 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4848 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4864 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4880 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4896 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4912 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4928 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4944 + hash: "299b24eae7720e1711744b23335bca8c" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 4960 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4976 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 4992 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 5008 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 5024 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 5040 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 5056 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 5072 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 5088 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 5104 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 5120 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 5136 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 5152 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 5168 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 5184 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 5200 + hash: "299b24eae7720e1711744b23335bca8c" + } + Frame { + msec: 5216 + hash: "299b24eae7720e1711744b23335bca8c" + } +} diff --git a/tests/auto/declarative/visual/qmlgraphicspathview/test-pathview.qml b/tests/auto/declarative/visual/qmlgraphicspathview/test-pathview.qml new file mode 100644 index 0000000..1ffbe15 --- /dev/null +++ b/tests/auto/declarative/visual/qmlgraphicspathview/test-pathview.qml @@ -0,0 +1,60 @@ +import Qt 4.6 + +Rectangle { + width: 800; height: 450 + + ListModel { + id: rssModel + ListElement { lColor: "red" } + ListElement { lColor: "green" } + ListElement { lColor: "yellow" } + ListElement { lColor: "blue" } + ListElement { lColor: "purple" } + ListElement { lColor: "gray" } + ListElement { lColor: "brown" } + ListElement { lColor: "thistle" } + } + + Component { + id: photoDelegate + Rectangle { + id: wrapper + width: 85; height: 85; color: lColor + scale: wrapper.PathView.scale + + transform: Rotation { + id: itemRotation; origin.x: wrapper.width/2; origin.y: wrapper.height/2 + axis.y: 1; axis.z: 0; angle: wrapper.PathView.angle + } + } + } + + PathView { + id: photoPathView; model: rssModel; delegate: photoDelegate + y: 100; width: 800; height: 330; pathItemCount: 10; z: 1 + path: Path { + startX: -50; startY: 40; + + PathAttribute { name: "scale"; value: 0.5 } + PathAttribute { name: "angle"; value: -45 } + + PathCubic { + x: 400; y: 220 + control1X: 140; control1Y: 40 + control2X: 210; control2Y: 220 + } + + PathAttribute { name: "scale"; value: 1.2 } + PathAttribute { name: "angle"; value: 0 } + + PathCubic { + x: 850; y: 40 + control2X: 660; control2Y: 40 + control1X: 590; control1Y: 220 + } + + PathAttribute { name: "scale"; value: 0.5 } + PathAttribute { name: "angle"; value: 45 } + } + } +} diff --git a/tests/auto/declarative/visual/webview/embedding/egg.qml b/tests/auto/declarative/visual/webview/embedding/egg.qml new file mode 100644 index 0000000..a9019d1 --- /dev/null +++ b/tests/auto/declarative/visual/webview/embedding/egg.qml @@ -0,0 +1,27 @@ +import Qt 4.6 + +Item { + property var period : 250 + property var color : "black" + id: root + + Item { + x: root.width/2 + y: root.height/2 + Rectangle { + radius: width/2 + color: root.color + x: -width/2 + y: -height/2 + width: root.width*1.5 + height: root.height*1.5 + } + rotation: NumberAnimation { + from: 0 + to: 360 + repeat: true + running: true + duration: root.period + } + } +} diff --git a/tests/auto/declarative/visual/webview/embedding/nesting.html b/tests/auto/declarative/visual/webview/embedding/nesting.html new file mode 100644 index 0000000..6e81689 --- /dev/null +++ b/tests/auto/declarative/visual/webview/embedding/nesting.html @@ -0,0 +1,9 @@ +<html> +<head><title>Nesting</title> +<link rel="icon" sizes="48x48" href="basic.png"> +</head> +<body bgcolor="green"> +<h1>Nesting</h1> +This is a test... +<OBJECT data=egg.qml TYPE=application/x-qt-plugin width=50 height=70 period=2000 color=white></OBJECT> +... with a spinning QML egg nested in it. diff --git a/tests/auto/declarative/visual/webview/embedding/nesting.qml b/tests/auto/declarative/visual/webview/embedding/nesting.qml new file mode 100644 index 0000000..0d76579 --- /dev/null +++ b/tests/auto/declarative/visual/webview/embedding/nesting.qml @@ -0,0 +1,8 @@ +import Qt 4.6 + +WebView { + width: 300 + height: 200 + url: "nesting.html" + settings.pluginsEnabled: true +} diff --git a/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.0.png b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.0.png Binary files differnew file mode 100644 index 0000000..139aa9d --- /dev/null +++ b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.0.png diff --git a/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.1.png b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.1.png Binary files differnew file mode 100644 index 0000000..e2e1644 --- /dev/null +++ b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.1.png diff --git a/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.2.png b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.2.png Binary files differnew file mode 100644 index 0000000..aa2fb82 --- /dev/null +++ b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.2.png diff --git a/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.3.png b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.3.png Binary files differnew file mode 100644 index 0000000..1976430 --- /dev/null +++ b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.3.png diff --git a/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.4.png b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.4.png Binary files differnew file mode 100644 index 0000000..c895a0a --- /dev/null +++ b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.4.png diff --git a/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.5.png b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.5.png Binary files differnew file mode 100644 index 0000000..c895a0a --- /dev/null +++ b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.5.png diff --git a/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.6.png b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.6.png Binary files differnew file mode 100644 index 0000000..c895a0a --- /dev/null +++ b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.6.png diff --git a/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.7.png b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.7.png Binary files differnew file mode 100644 index 0000000..c895a0a --- /dev/null +++ b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.7.png diff --git a/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.8.png b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.8.png Binary files differnew file mode 100644 index 0000000..c895a0a --- /dev/null +++ b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.8.png diff --git a/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.qml b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.qml new file mode 100644 index 0000000..957f9d5 --- /dev/null +++ b/tests/auto/declarative/visual/webview/javascript/data/evaluateJavaScript.qml @@ -0,0 +1,3759 @@ +import Qt.VisualTest 4.6 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 32 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 48 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 64 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 80 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 96 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 112 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 128 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 144 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 160 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 176 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 192 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 208 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 224 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 240 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 256 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 272 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 288 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 304 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 320 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 336 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 352 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 368 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 384 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 400 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 416 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 195; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 187; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 432 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 153; y: 77 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 448 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 145; y: 87 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 139; y: 99 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 464 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 135; y: 111 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 129; y: 121 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 480 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 125; y: 131 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 121; y: 139 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 117; y: 149 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 496 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 111; y: 157 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 512 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 107; y: 165 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 101; y: 171 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 528 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 97; y: 177 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 95; y: 185 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 544 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 189 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 89; y: 195 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 560 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 199 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 201 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 576 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 203 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 204 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 81; y: 204 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 592 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 80; y: 204 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 608 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 79; y: 205 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 78; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 624 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 77; y: 207 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 76; y: 208 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 75; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 640 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 71; y: 216 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 656 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 218 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 220 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 672 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 69; y: 222 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 68; y: 224 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 688 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 67; y: 225 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 704 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 720 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 736 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 752 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 768 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 784 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 67; y: 225 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 800 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 66; y: 224 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 816 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 66; y: 222 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 832 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 65; y: 221 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 61; y: 217 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 848 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 60; y: 215 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 864 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 59; y: 214 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 57; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 880 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 55; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 896 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 912 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 928 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 944 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 960 + image: "evaluateJavaScript.0.png" + } + Frame { + msec: 976 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 992 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1008 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 55; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1024 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1040 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1056 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1072 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1088 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 55; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1104 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1120 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1136 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1152 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1168 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1184 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1200 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1216 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1232 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1248 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1264 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1280 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1296 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 57; y: 212 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1312 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 65; y: 210 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 67; y: 209 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1328 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 69; y: 208 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 71; y: 207 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1344 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 73; y: 207 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 206 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 75; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1360 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1376 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1392 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1408 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1424 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1440 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1456 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1472 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1488 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1504 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1520 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1536 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1552 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1568 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1584 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1600 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1616 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1632 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1648 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1664 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1680 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Frame { + msec: 1696 + hash: "f35c69aed43a795ff02b46d7b01ef64a" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 1712 + hash: "244200622435603a75f58366496daf8b" + } + Frame { + msec: 1728 + hash: "244200622435603a75f58366496daf8b" + } + Frame { + msec: 1744 + hash: "244200622435603a75f58366496daf8b" + } + Frame { + msec: 1760 + hash: "244200622435603a75f58366496daf8b" + } + Frame { + msec: 1776 + hash: "244200622435603a75f58366496daf8b" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 1792 + hash: "244200622435603a75f58366496daf8b" + } + Frame { + msec: 1808 + hash: "244200622435603a75f58366496daf8b" + } + Frame { + msec: 1824 + hash: "244200622435603a75f58366496daf8b" + } + Frame { + msec: 1840 + hash: "244200622435603a75f58366496daf8b" + } + Frame { + msec: 1856 + hash: "244200622435603a75f58366496daf8b" + } + Frame { + msec: 1872 + hash: "244200622435603a75f58366496daf8b" + } + Frame { + msec: 1888 + hash: "244200622435603a75f58366496daf8b" + } + Frame { + msec: 1904 + hash: "244200622435603a75f58366496daf8b" + } + Frame { + msec: 1920 + image: "evaluateJavaScript.1.png" + } + Frame { + msec: 1936 + hash: "244200622435603a75f58366496daf8b" + } + Frame { + msec: 1952 + hash: "244200622435603a75f58366496daf8b" + } + Frame { + msec: 1968 + hash: "244200622435603a75f58366496daf8b" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 1984 + hash: "44dc10a2914a391b57e68c2002a95adf" + } + Frame { + msec: 2000 + hash: "44dc10a2914a391b57e68c2002a95adf" + } + Frame { + msec: 2016 + hash: "44dc10a2914a391b57e68c2002a95adf" + } + Frame { + msec: 2032 + hash: "44dc10a2914a391b57e68c2002a95adf" + } + Frame { + msec: 2048 + hash: "44dc10a2914a391b57e68c2002a95adf" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 2064 + hash: "44dc10a2914a391b57e68c2002a95adf" + } + Frame { + msec: 2080 + hash: "44dc10a2914a391b57e68c2002a95adf" + } + Frame { + msec: 2096 + hash: "44dc10a2914a391b57e68c2002a95adf" + } + Frame { + msec: 2112 + hash: "44dc10a2914a391b57e68c2002a95adf" + } + Frame { + msec: 2128 + hash: "44dc10a2914a391b57e68c2002a95adf" + } + Frame { + msec: 2144 + hash: "44dc10a2914a391b57e68c2002a95adf" + } + Frame { + msec: 2160 + hash: "44dc10a2914a391b57e68c2002a95adf" + } + Frame { + msec: 2176 + hash: "44dc10a2914a391b57e68c2002a95adf" + } + Frame { + msec: 2192 + hash: "44dc10a2914a391b57e68c2002a95adf" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 2208 + hash: "c93921d0611e95373338c14cfcc17481" + } + Frame { + msec: 2224 + hash: "c93921d0611e95373338c14cfcc17481" + } + Frame { + msec: 2240 + hash: "c93921d0611e95373338c14cfcc17481" + } + Frame { + msec: 2256 + hash: "c93921d0611e95373338c14cfcc17481" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 2272 + hash: "c93921d0611e95373338c14cfcc17481" + } + Frame { + msec: 2288 + hash: "c93921d0611e95373338c14cfcc17481" + } + Frame { + msec: 2304 + hash: "c93921d0611e95373338c14cfcc17481" + } + Frame { + msec: 2320 + hash: "c93921d0611e95373338c14cfcc17481" + } + Frame { + msec: 2336 + hash: "c93921d0611e95373338c14cfcc17481" + } + Frame { + msec: 2352 + hash: "c93921d0611e95373338c14cfcc17481" + } + Frame { + msec: 2368 + hash: "c93921d0611e95373338c14cfcc17481" + } + Frame { + msec: 2384 + hash: "c93921d0611e95373338c14cfcc17481" + } + Frame { + msec: 2400 + hash: "c93921d0611e95373338c14cfcc17481" + } + Frame { + msec: 2416 + hash: "c93921d0611e95373338c14cfcc17481" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 2432 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2448 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2464 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2480 + hash: "9266775c7f2156977ff56fcd45246229" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 2496 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2512 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2528 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2544 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2560 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2576 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2592 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2608 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2624 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2640 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2656 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2672 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2688 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2704 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2720 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2736 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2752 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2768 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2784 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2800 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2816 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2832 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2848 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2864 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2880 + image: "evaluateJavaScript.2.png" + } + Frame { + msec: 2896 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2912 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2928 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2944 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2960 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2976 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 2992 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3008 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3024 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3040 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3056 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3072 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3088 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3104 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3120 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3136 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3152 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3168 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3184 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3200 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3216 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3232 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3248 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3264 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3280 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3296 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3312 + hash: "9266775c7f2156977ff56fcd45246229" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3328 + hash: "9266775c7f2156977ff56fcd45246229" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 72; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3344 + hash: "9266775c7f2156977ff56fcd45246229" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 206 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 68; y: 206 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 65; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3360 + hash: "9266775c7f2156977ff56fcd45246229" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3376 + hash: "9266775c7f2156977ff56fcd45246229" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 61; y: 206 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 59; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3392 + hash: "9266775c7f2156977ff56fcd45246229" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 57; y: 206 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 55; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3408 + hash: "9266775c7f2156977ff56fcd45246229" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 54; y: 206 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 53; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3424 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3440 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3456 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3472 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3488 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3504 + hash: "9266775c7f2156977ff56fcd45246229" + } + Frame { + msec: 3520 + hash: "9266775c7f2156977ff56fcd45246229" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 52; y: 206 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 52; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3536 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3552 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3568 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3584 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3600 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3616 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3632 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3648 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 52; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3664 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3680 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3696 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3712 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3728 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3744 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3760 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3776 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3792 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3808 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3824 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3840 + image: "evaluateJavaScript.3.png" + } + Frame { + msec: 3856 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3872 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3888 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3904 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3920 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3936 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3952 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3968 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Frame { + msec: 3984 + hash: "b62d9027299daa6ab8304d812ed00f83" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 4000 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4016 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4032 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4048 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4064 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4080 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4096 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4112 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 4128 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4144 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4160 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4176 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4192 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4208 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4224 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4240 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4256 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4272 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4288 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4304 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4320 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4336 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4352 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4368 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4384 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4400 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4416 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4432 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4448 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4464 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4480 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4496 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4512 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4528 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4544 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4560 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4576 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4592 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4608 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4624 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4640 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4656 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4672 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4688 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4704 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4720 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4736 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4752 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4768 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Frame { + msec: 4784 + hash: "6cea5b700e402072a9953c81b605ef22" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 4800 + image: "evaluateJavaScript.4.png" + } + Frame { + msec: 4816 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 4832 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 4848 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 4864 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 4880 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 4896 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 4912 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 4928 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 4944 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 4960 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 4976 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 4992 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5008 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5024 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5040 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5056 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5072 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5088 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5104 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5120 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5136 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5152 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5168 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5184 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5200 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5216 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5232 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5248 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5264 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5280 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5296 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5312 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5328 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5344 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5360 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5376 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5392 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5408 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5424 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5440 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5456 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5472 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5488 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5504 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5520 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5536 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5552 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5568 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5584 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5600 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5616 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5632 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5648 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5664 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5680 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5696 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5712 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5728 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5744 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5760 + image: "evaluateJavaScript.5.png" + } + Frame { + msec: 5776 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5792 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5808 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 5824 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 54; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5840 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 56; y: 206 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 204 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 65; y: 204 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5856 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 71; y: 202 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 79; y: 200 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5872 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 200 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 90; y: 196 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5888 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 192 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 102; y: 188 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5904 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 108; y: 182 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 112; y: 176 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5920 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 116; y: 168 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 120; y: 158 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5936 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 124; y: 148 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 128; y: 136 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5952 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 130; y: 124 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 134; y: 112 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5968 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 138; y: 100 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 142; y: 88 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5984 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 144; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6000 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 150; y: 68 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 154; y: 62 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 158; y: 56 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6016 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 162; y: 48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6032 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 166; y: 44 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 168; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 172; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6048 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 174; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 176; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6064 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 177; y: 18 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6080 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 178; y: 16 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 178; y: 14 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6096 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 178; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6112 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 178; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6128 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 178; y: 10 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6144 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 179; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6160 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 180; y: 7 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6176 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 181; y: 5 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 181; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6192 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 182; y: 2 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 183; y: 1 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6208 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6224 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6240 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6256 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6272 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6288 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6304 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6320 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6336 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6352 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6368 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6384 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6400 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6416 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6432 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6448 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6464 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6480 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6496 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6512 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6528 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6544 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6560 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6576 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6592 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6608 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6624 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6640 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6656 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6672 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6688 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6704 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6720 + image: "evaluateJavaScript.6.png" + } + Frame { + msec: 6736 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6752 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6768 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6784 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6800 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6816 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6832 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6848 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6864 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 176; y: 1 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 174; y: 15 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 172; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6880 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 166; y: 47 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 162; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6896 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 156; y: 81 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 150; y: 95 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6912 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 144; y: 107 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 138; y: 119 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6928 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 132; y: 127 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 126; y: 133 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6944 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 122; y: 137 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 120; y: 138 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6960 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 120; y: 139 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6976 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 6992 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7008 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7024 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7040 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7056 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7072 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 119; y: 137 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7088 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7104 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7120 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 117; y: 137 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7136 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 116; y: 139 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 115; y: 141 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7152 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 113; y: 149 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 109; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7168 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 107; y: 165 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 103; y: 171 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7184 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 99; y: 179 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 181 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7200 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 187 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 95; y: 189 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7216 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 95; y: 190 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7232 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7248 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7264 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7280 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 188 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7296 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 187 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 186 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7312 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 185 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 97; y: 184 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7328 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 97; y: 183 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 97; y: 182 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7344 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 180 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7360 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 178 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7376 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 99; y: 177 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 99; y: 176 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 99; y: 174 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7392 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7408 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 100; y: 172 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 100; y: 171 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7424 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 100; y: 170 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7440 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 100; y: 169 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7456 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 101; y: 167 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7472 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7488 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7504 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 101; y: 167 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7520 + hash: "04e2e16813a9cafc37077a675e279f5f" + } + Frame { + msec: 7536 + hash: "04e2e16813a9cafc37077a675e279f5f" + } + Frame { + msec: 7552 + hash: "04e2e16813a9cafc37077a675e279f5f" + } + Frame { + msec: 7568 + hash: "04e2e16813a9cafc37077a675e279f5f" + } + Frame { + msec: 7584 + hash: "04e2e16813a9cafc37077a675e279f5f" + } + Frame { + msec: 7600 + hash: "04e2e16813a9cafc37077a675e279f5f" + } + Frame { + msec: 7616 + hash: "04e2e16813a9cafc37077a675e279f5f" + } + Frame { + msec: 7632 + hash: "04e2e16813a9cafc37077a675e279f5f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 101; y: 166 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 101; y: 166 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7648 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7664 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7680 + image: "evaluateJavaScript.7.png" + } + Frame { + msec: 7696 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7712 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7728 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7744 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7760 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7776 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7792 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7808 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7824 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 103; y: 166 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7840 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 7856 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 166 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7872 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 106; y: 165 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 107; y: 164 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7888 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 108; y: 164 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 109; y: 163 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7904 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 111; y: 163 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 112; y: 162 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7920 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 116; y: 158 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7936 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 118; y: 157 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 122; y: 153 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7952 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 128; y: 147 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 134; y: 139 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7968 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 140; y: 133 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 146; y: 125 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 150; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7984 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 156; y: 109 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 160; y: 99 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8000 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 164; y: 89 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 166; y: 77 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8016 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 170; y: 67 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 172; y: 55 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8032 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 176; y: 45 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8048 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 178; y: 35 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 178; y: 27 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 180; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8064 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 180; y: 11 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 182; y: 5 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8080 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8096 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8112 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8128 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8144 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8160 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8176 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8192 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8208 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8224 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8240 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8256 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8272 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8288 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8304 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8320 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8336 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8352 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8368 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8384 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8400 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8416 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8432 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8448 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8464 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8480 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8496 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8512 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8528 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8544 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8560 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8576 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8592 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8608 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8624 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8640 + image: "evaluateJavaScript.8.png" + } + Frame { + msec: 8656 + hash: "792140067e09d04b31e78be1fc9a40a2" + } + Frame { + msec: 8672 + hash: "792140067e09d04b31e78be1fc9a40a2" + } +} diff --git a/tests/auto/declarative/visual/webview/javascript/evaluateJavaScript.qml b/tests/auto/declarative/visual/webview/javascript/evaluateJavaScript.qml new file mode 100644 index 0000000..d3cf578 --- /dev/null +++ b/tests/auto/declarative/visual/webview/javascript/evaluateJavaScript.qml @@ -0,0 +1,31 @@ +import Qt 4.6 + +Column { + WebView { + id: webview + width: 200 + height: 200 + url: "test-objects.html" + javaScriptWindowObjects: + Object { + property string text: btntext.text + WebView.windowObjectName: "qmltext" + onTextChanged: { + webview.evaluateJavaScript("{document.getElementById('button').value=window.qmltext.text}") + } + } + } + Row { + Text { text: "Input:" } + Rectangle { + width: btntext.width+10 + height: btntext.height+10 + border.color: "black" + TextInput { + id: btntext + text: "Blah" + cursorDelegate: Rectangle { width: 1; color: "red" } + } + } + } +} diff --git a/tests/auto/declarative/visual/webview/zooming/data/pageWidth.qml b/tests/auto/declarative/visual/webview/zooming/data/pageWidth.qml new file mode 100644 index 0000000..1a993e1 --- /dev/null +++ b/tests/auto/declarative/visual/webview/zooming/data/pageWidth.qml @@ -0,0 +1,227 @@ +import Qt.VisualTest 4.6 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 32 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 48 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 64 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 80 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 96 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 112 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 128 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 144 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 160 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 176 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 192 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 208 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 224 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 240 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 256 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 272 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 288 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 304 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 320 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 336 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 352 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 368 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 384 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 400 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 416 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 432 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 448 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 464 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 480 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 496 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 512 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 528 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 544 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 560 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 576 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 592 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 608 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 624 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 640 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 656 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 672 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 688 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 704 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 720 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 736 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 752 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 768 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 784 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 800 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 816 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 832 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 848 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 864 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } + Frame { + msec: 880 + hash: "9a2554b1b322ea71115fa91d0100d2ff" + } +} diff --git a/tests/auto/declarative/visual/webview/zooming/data/renderControl.0.png b/tests/auto/declarative/visual/webview/zooming/data/renderControl.0.png Binary files differnew file mode 100644 index 0000000..38df70e --- /dev/null +++ b/tests/auto/declarative/visual/webview/zooming/data/renderControl.0.png diff --git a/tests/auto/declarative/visual/webview/zooming/data/renderControl.qml b/tests/auto/declarative/visual/webview/zooming/data/renderControl.qml new file mode 100644 index 0000000..d3c5890 --- /dev/null +++ b/tests/auto/declarative/visual/webview/zooming/data/renderControl.qml @@ -0,0 +1,415 @@ +import Qt.VisualTest 4.6 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "4f999826cd5ebe4f58bfd255e1c22be0" + } + Frame { + msec: 32 + hash: "3aa9bd1bd75219f82578689ac6d81c7e" + } + Frame { + msec: 48 + hash: "19d5f48f1c73d52483be96c887d3fd76" + } + Frame { + msec: 64 + hash: "9b85eef4e0746cc43aaefd442efdd824" + } + Frame { + msec: 80 + hash: "fca0034fb720e40198ede95a0ab0fadb" + } + Frame { + msec: 96 + hash: "9f63ddbd927a4b08242f3410a9ed7283" + } + Frame { + msec: 112 + hash: "4f5804c3c3ee195470a462293307cfd5" + } + Frame { + msec: 128 + hash: "d0434f08a8097b97b76c1194317a38ba" + } + Frame { + msec: 144 + hash: "921880d300e56f9605923a13fcd8b967" + } + Frame { + msec: 160 + hash: "f5dc87abf36332c68fd4450a6236dcb4" + } + Frame { + msec: 176 + hash: "c54f220cd5768afa1c12579007e17eff" + } + Frame { + msec: 192 + hash: "e1c70c3896d5a937296f205b09991b31" + } + Frame { + msec: 208 + hash: "d135f70f761add1358062a0386c62d18" + } + Frame { + msec: 224 + hash: "53cb2ed2b65e77cf0cd70530f32854ad" + } + Frame { + msec: 240 + hash: "2ff4feb61d958a800b38b282c3400293" + } + Frame { + msec: 256 + hash: "59f5585ec472efa29c5eba8b972ab3bd" + } + Frame { + msec: 272 + hash: "3aef5e1ff6da15e0e9f2e620dbabbab2" + } + Frame { + msec: 288 + hash: "2931299f667752efe9fca727534385e1" + } + Frame { + msec: 304 + hash: "2ed90e61c41b994ccea924191b66fc71" + } + Frame { + msec: 320 + hash: "1424c634067c896973c2c10793957933" + } + Frame { + msec: 336 + hash: "c4d30d511053a7caeefdae753236cf5b" + } + Frame { + msec: 352 + hash: "32300e07e34e8f316770c790a5ef9f6d" + } + Frame { + msec: 368 + hash: "95312dc2a4d88a48605fea170712354d" + } + Frame { + msec: 384 + hash: "3d146357d1532640cefb64fbae75bc0d" + } + Frame { + msec: 400 + hash: "5b78740511a456a3647d8392b2008f7f" + } + Frame { + msec: 416 + hash: "dddb065cefa27a862d108429c9984191" + } + Frame { + msec: 432 + hash: "0857067a0ee381e0f462ef8aceb0b696" + } + Frame { + msec: 448 + hash: "1f5e7e064cc62ff2e0585c98875351df" + } + Frame { + msec: 464 + hash: "c7f6bb852bdb2b99cbb5a8ca34f1585a" + } + Frame { + msec: 480 + hash: "f2284dea5812f167cae08c687fc1a3e9" + } + Frame { + msec: 496 + hash: "deec54bc32c46921e5032bce7daa1dad" + } + Frame { + msec: 512 + hash: "1271d3704de17bfe463c76fd73c3132b" + } + Frame { + msec: 528 + hash: "0568b0ecd47cd1c34b9de477e68e5751" + } + Frame { + msec: 544 + hash: "f070dd88e42697a9e43573f9f41b3540" + } + Frame { + msec: 560 + hash: "f5ced2827b06ea514f05866f1e4099f0" + } + Frame { + msec: 576 + hash: "59f5585ec472efa29c5eba8b972ab3bd" + } + Frame { + msec: 592 + hash: "2ff4feb61d958a800b38b282c3400293" + } + Frame { + msec: 608 + hash: "53cb2ed2b65e77cf0cd70530f32854ad" + } + Frame { + msec: 624 + hash: "d135f70f761add1358062a0386c62d18" + } + Frame { + msec: 640 + hash: "e1c70c3896d5a937296f205b09991b31" + } + Frame { + msec: 656 + hash: "c54f220cd5768afa1c12579007e17eff" + } + Frame { + msec: 672 + hash: "f5dc87abf36332c68fd4450a6236dcb4" + } + Frame { + msec: 688 + hash: "921880d300e56f9605923a13fcd8b967" + } + Frame { + msec: 704 + hash: "d0434f08a8097b97b76c1194317a38ba" + } + Frame { + msec: 720 + hash: "4f5804c3c3ee195470a462293307cfd5" + } + Frame { + msec: 736 + hash: "9f63ddbd927a4b08242f3410a9ed7283" + } + Frame { + msec: 752 + hash: "fca0034fb720e40198ede95a0ab0fadb" + } + Frame { + msec: 768 + hash: "9b85eef4e0746cc43aaefd442efdd824" + } + Frame { + msec: 784 + hash: "19d5f48f1c73d52483be96c887d3fd76" + } + Frame { + msec: 800 + hash: "3aa9bd1bd75219f82578689ac6d81c7e" + } + Frame { + msec: 816 + hash: "4f999826cd5ebe4f58bfd255e1c22be0" + } + Frame { + msec: 832 + hash: "3aa9bd1bd75219f82578689ac6d81c7e" + } + Frame { + msec: 848 + hash: "19d5f48f1c73d52483be96c887d3fd76" + } + Frame { + msec: 864 + hash: "9b85eef4e0746cc43aaefd442efdd824" + } + Frame { + msec: 880 + hash: "fca0034fb720e40198ede95a0ab0fadb" + } + Frame { + msec: 896 + hash: "9f63ddbd927a4b08242f3410a9ed7283" + } + Frame { + msec: 912 + hash: "4f5804c3c3ee195470a462293307cfd5" + } + Frame { + msec: 928 + hash: "d0434f08a8097b97b76c1194317a38ba" + } + Frame { + msec: 944 + hash: "921880d300e56f9605923a13fcd8b967" + } + Frame { + msec: 960 + image: "renderControl.0.png" + } + Frame { + msec: 976 + hash: "c54f220cd5768afa1c12579007e17eff" + } + Frame { + msec: 992 + hash: "e1c70c3896d5a937296f205b09991b31" + } + Frame { + msec: 1008 + hash: "d135f70f761add1358062a0386c62d18" + } + Frame { + msec: 1024 + hash: "53cb2ed2b65e77cf0cd70530f32854ad" + } + Frame { + msec: 1040 + hash: "2ff4feb61d958a800b38b282c3400293" + } + Frame { + msec: 1056 + hash: "59f5585ec472efa29c5eba8b972ab3bd" + } + Frame { + msec: 1072 + hash: "3aef5e1ff6da15e0e9f2e620dbabbab2" + } + Frame { + msec: 1088 + hash: "2931299f667752efe9fca727534385e1" + } + Frame { + msec: 1104 + hash: "2ed90e61c41b994ccea924191b66fc71" + } + Frame { + msec: 1120 + hash: "1424c634067c896973c2c10793957933" + } + Frame { + msec: 1136 + hash: "c4d30d511053a7caeefdae753236cf5b" + } + Frame { + msec: 1152 + hash: "32300e07e34e8f316770c790a5ef9f6d" + } + Frame { + msec: 1168 + hash: "95312dc2a4d88a48605fea170712354d" + } + Frame { + msec: 1184 + hash: "3d146357d1532640cefb64fbae75bc0d" + } + Frame { + msec: 1200 + hash: "5b78740511a456a3647d8392b2008f7f" + } + Frame { + msec: 1216 + hash: "dddb065cefa27a862d108429c9984191" + } + Frame { + msec: 1232 + hash: "0857067a0ee381e0f462ef8aceb0b696" + } + Frame { + msec: 1248 + hash: "1f5e7e064cc62ff2e0585c98875351df" + } + Frame { + msec: 1264 + hash: "c7f6bb852bdb2b99cbb5a8ca34f1585a" + } + Frame { + msec: 1280 + hash: "f2284dea5812f167cae08c687fc1a3e9" + } + Frame { + msec: 1296 + hash: "deec54bc32c46921e5032bce7daa1dad" + } + Frame { + msec: 1312 + hash: "1271d3704de17bfe463c76fd73c3132b" + } + Frame { + msec: 1328 + hash: "0568b0ecd47cd1c34b9de477e68e5751" + } + Frame { + msec: 1344 + hash: "f070dd88e42697a9e43573f9f41b3540" + } + Frame { + msec: 1360 + hash: "f5ced2827b06ea514f05866f1e4099f0" + } + Frame { + msec: 1376 + hash: "59f5585ec472efa29c5eba8b972ab3bd" + } + Frame { + msec: 1392 + hash: "2ff4feb61d958a800b38b282c3400293" + } + Frame { + msec: 1408 + hash: "53cb2ed2b65e77cf0cd70530f32854ad" + } + Frame { + msec: 1424 + hash: "d135f70f761add1358062a0386c62d18" + } + Frame { + msec: 1440 + hash: "e1c70c3896d5a937296f205b09991b31" + } + Frame { + msec: 1456 + hash: "c54f220cd5768afa1c12579007e17eff" + } + Frame { + msec: 1472 + hash: "f5dc87abf36332c68fd4450a6236dcb4" + } + Frame { + msec: 1488 + hash: "921880d300e56f9605923a13fcd8b967" + } + Frame { + msec: 1504 + hash: "d0434f08a8097b97b76c1194317a38ba" + } + Frame { + msec: 1520 + hash: "4f5804c3c3ee195470a462293307cfd5" + } + Frame { + msec: 1536 + hash: "9f63ddbd927a4b08242f3410a9ed7283" + } + Frame { + msec: 1552 + hash: "fca0034fb720e40198ede95a0ab0fadb" + } + Frame { + msec: 1568 + hash: "9b85eef4e0746cc43aaefd442efdd824" + } + Frame { + msec: 1584 + hash: "19d5f48f1c73d52483be96c887d3fd76" + } + Frame { + msec: 1600 + hash: "3aa9bd1bd75219f82578689ac6d81c7e" + } + Frame { + msec: 1616 + hash: "4f999826cd5ebe4f58bfd255e1c22be0" + } + Frame { + msec: 1632 + hash: "3aa9bd1bd75219f82578689ac6d81c7e" + } +} diff --git a/tests/auto/declarative/visual/webview/zooming/data/zoomTextOnly.0.png b/tests/auto/declarative/visual/webview/zooming/data/zoomTextOnly.0.png Binary files differnew file mode 100644 index 0000000..4b9abb4 --- /dev/null +++ b/tests/auto/declarative/visual/webview/zooming/data/zoomTextOnly.0.png diff --git a/tests/auto/declarative/visual/webview/zooming/data/zoomTextOnly.1.png b/tests/auto/declarative/visual/webview/zooming/data/zoomTextOnly.1.png Binary files differnew file mode 100644 index 0000000..5ce9787 --- /dev/null +++ b/tests/auto/declarative/visual/webview/zooming/data/zoomTextOnly.1.png diff --git a/tests/auto/declarative/visual/webview/zooming/data/zoomTextOnly.qml b/tests/auto/declarative/visual/webview/zooming/data/zoomTextOnly.qml new file mode 100644 index 0000000..aaa7583 --- /dev/null +++ b/tests/auto/declarative/visual/webview/zooming/data/zoomTextOnly.qml @@ -0,0 +1,655 @@ +import Qt.VisualTest 4.6 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "4e401b5ebff6e442fa108e94a5dba668" + } + Frame { + msec: 32 + hash: "c2f8551d0442d0736b71c54fc965562b" + } + Frame { + msec: 48 + hash: "4fc1ef611b24ec5737310859b12c83d3" + } + Frame { + msec: 64 + hash: "7df07aea83bc5c3213e7871854661820" + } + Frame { + msec: 80 + hash: "0ae4ee18cc675749f008b897fe35cc40" + } + Frame { + msec: 96 + hash: "0ae4ee18cc675749f008b897fe35cc40" + } + Frame { + msec: 112 + hash: "f5c917c7ca26bb916dd4df84eafc8e94" + } + Frame { + msec: 128 + hash: "0696257de0441666bd264f8db6383d15" + } + Frame { + msec: 144 + hash: "0b43fdee23346c30c60b822a20131cc3" + } + Frame { + msec: 160 + hash: "98dbd004cf4809dbc90bfa9272378644" + } + Frame { + msec: 176 + hash: "32d0e9005ebb9dfd410d348e336bcd93" + } + Frame { + msec: 192 + hash: "8a64b18006ad0bd2c373a2a9395ce52e" + } + Frame { + msec: 208 + hash: "7dc26fd658f626b8fe18545cf93dc4ec" + } + Frame { + msec: 224 + hash: "6712be93cf1ed2b7b202367418b6d2d7" + } + Frame { + msec: 240 + hash: "524840a3453af4e97ac82b559308cce3" + } + Frame { + msec: 256 + hash: "11436091b24c02af94dfa75a5fd1a001" + } + Frame { + msec: 272 + hash: "d3689b53474b4b26630d70ba01c057b4" + } + Frame { + msec: 288 + hash: "16e2b66f28ed80d80d9b5264d89624d5" + } + Frame { + msec: 304 + hash: "87636076959de7e5a0a8bd8b31354ed4" + } + Frame { + msec: 320 + hash: "a6916da6bfac27aa87d75da2bbb73f31" + } + Frame { + msec: 336 + hash: "58cfba3aae4bf54a5b445e0e34571d2d" + } + Frame { + msec: 352 + hash: "1475ae722afd169cc0c8e1fde39eb6b7" + } + Frame { + msec: 368 + hash: "14d08c2ca430631af8ede1013f4f4da0" + } + Frame { + msec: 384 + hash: "ace9db9112d147569dc0cf1a1b680d6c" + } + Frame { + msec: 400 + hash: "08bc6815601417f3731eaae398d0861d" + } + Frame { + msec: 416 + hash: "809870dfd9b05ce07170edd945348ddf" + } + Frame { + msec: 432 + hash: "5784deb0f3270cf7a0d0964cd9d31458" + } + Frame { + msec: 448 + hash: "2f06ee407e5175d4b954e31c39c9522c" + } + Frame { + msec: 464 + hash: "48a7dbed293fbbd5ea202190837a411f" + } + Frame { + msec: 480 + hash: "abf3d90803cfa12d35d2752be7ea02d8" + } + Frame { + msec: 496 + hash: "a60edcf8d792f93a839e6ddbafbf993f" + } + Frame { + msec: 512 + hash: "7e8dfe86ea0849022355b12578d4cb1a" + } + Frame { + msec: 528 + hash: "3c84122b0933ee870f178d39469e51e2" + } + Frame { + msec: 544 + hash: "25f463e91febf5b6d8819fd5010bc1c2" + } + Frame { + msec: 560 + hash: "d423a9bc912237d0f20b924849ba0cb1" + } + Frame { + msec: 576 + hash: "5bd3cc309a5fce6183654975543250b2" + } + Frame { + msec: 592 + hash: "4e401b5ebff6e442fa108e94a5dba668" + } + Frame { + msec: 608 + hash: "9a4bf1400da038f2088dd4c49403d852" + } + Frame { + msec: 624 + hash: "a37024356613bd5d678e0b2f7b8f5959" + } + Frame { + msec: 640 + hash: "4f37d72c10e51f68a2359086094da249" + } + Frame { + msec: 656 + hash: "6093bcb7673f8e58fe5a7b0143638822" + } + Frame { + msec: 672 + hash: "c272aeea2b9c450fbd732305ccc01b93" + } + Frame { + msec: 688 + hash: "6a4e2ee45b26037421e2a5f2d6ee517e" + } + Frame { + msec: 704 + hash: "d912afcbce6c9d879a07ffc3c51b36d1" + } + Frame { + msec: 720 + hash: "2578335ac6f21c8aec2c87515562c321" + } + Frame { + msec: 736 + hash: "5b77af55f0a723ba762d283f41e91c98" + } + Frame { + msec: 752 + hash: "b420fc71b22fa608a9c0cdbbbc61c447" + } + Frame { + msec: 768 + hash: "3f7a9cecf2a590e8728137fabfd3f5f3" + } + Frame { + msec: 784 + hash: "c51f12a2f438f137785c70e3af4922fd" + } + Frame { + msec: 800 + hash: "5d97175fc4d986e5b21758d4ac785025" + } + Frame { + msec: 816 + hash: "94f922f3460ad76cd05cb5b321977a94" + } + Frame { + msec: 832 + hash: "5747adbc4f0b22ed359793d72d3e7d1f" + } + Frame { + msec: 848 + hash: "255d1d45d3343972f156dfab7d13ce41" + } + Frame { + msec: 864 + hash: "e5b54132ffb83acad30622e969405bc0" + } + Frame { + msec: 880 + hash: "2c05cf00e3417883e789f58c2728dc97" + } + Frame { + msec: 896 + hash: "9d66290b1aae1de3025d24d3efc4ca1c" + } + Frame { + msec: 912 + hash: "5e9b0783b1b4221145a4febbae56b30f" + } + Frame { + msec: 928 + hash: "21eea497c26600b03d868661232b3ebe" + } + Frame { + msec: 944 + hash: "2383c415170ac6444f1c193ed698f682" + } + Frame { + msec: 960 + image: "zoomTextOnly.0.png" + } + Frame { + msec: 976 + hash: "4ed0f85dec4eb0bb740ac3780b6872c0" + } + Frame { + msec: 992 + hash: "0a18bccca4efeadfced8e5cb1715a1f3" + } + Frame { + msec: 1008 + hash: "823e65df9075eb0e9a3aad6b15ec3342" + } + Frame { + msec: 1024 + hash: "823e65df9075eb0e9a3aad6b15ec3342" + } + Frame { + msec: 1040 + hash: "0a18bccca4efeadfced8e5cb1715a1f3" + } + Frame { + msec: 1056 + hash: "4ed0f85dec4eb0bb740ac3780b6872c0" + } + Frame { + msec: 1072 + hash: "fae77663566351fa3bb506b459496a9d" + } + Frame { + msec: 1088 + hash: "2383c415170ac6444f1c193ed698f682" + } + Frame { + msec: 1104 + hash: "2e05365256bebbdf3229f99b94263b6c" + } + Frame { + msec: 1120 + hash: "5e9b0783b1b4221145a4febbae56b30f" + } + Frame { + msec: 1136 + hash: "9d66290b1aae1de3025d24d3efc4ca1c" + } + Frame { + msec: 1152 + hash: "2c05cf00e3417883e789f58c2728dc97" + } + Frame { + msec: 1168 + hash: "e5b54132ffb83acad30622e969405bc0" + } + Frame { + msec: 1184 + hash: "255d1d45d3343972f156dfab7d13ce41" + } + Frame { + msec: 1200 + hash: "5747adbc4f0b22ed359793d72d3e7d1f" + } + Frame { + msec: 1216 + hash: "94f922f3460ad76cd05cb5b321977a94" + } + Frame { + msec: 1232 + hash: "5d97175fc4d986e5b21758d4ac785025" + } + Frame { + msec: 1248 + hash: "c51f12a2f438f137785c70e3af4922fd" + } + Frame { + msec: 1264 + hash: "3f7a9cecf2a590e8728137fabfd3f5f3" + } + Frame { + msec: 1280 + hash: "b420fc71b22fa608a9c0cdbbbc61c447" + } + Frame { + msec: 1296 + hash: "5b77af55f0a723ba762d283f41e91c98" + } + Frame { + msec: 1312 + hash: "2578335ac6f21c8aec2c87515562c321" + } + Frame { + msec: 1328 + hash: "a9b5438bd48dbafd307d571877416003" + } + Frame { + msec: 1344 + hash: "6a4e2ee45b26037421e2a5f2d6ee517e" + } + Frame { + msec: 1360 + hash: "c272aeea2b9c450fbd732305ccc01b93" + } + Frame { + msec: 1376 + hash: "37c7e50c270e8feb4dd9018580284a85" + } + Frame { + msec: 1392 + hash: "4f37d72c10e51f68a2359086094da249" + } + Frame { + msec: 1408 + hash: "a37024356613bd5d678e0b2f7b8f5959" + } + Frame { + msec: 1424 + hash: "9a4bf1400da038f2088dd4c49403d852" + } + Frame { + msec: 1440 + hash: "4e401b5ebff6e442fa108e94a5dba668" + } + Frame { + msec: 1456 + hash: "5bd3cc309a5fce6183654975543250b2" + } + Frame { + msec: 1472 + hash: "d423a9bc912237d0f20b924849ba0cb1" + } + Frame { + msec: 1488 + hash: "25f463e91febf5b6d8819fd5010bc1c2" + } + Frame { + msec: 1504 + hash: "3c84122b0933ee870f178d39469e51e2" + } + Frame { + msec: 1520 + hash: "7e8dfe86ea0849022355b12578d4cb1a" + } + Frame { + msec: 1536 + hash: "a60edcf8d792f93a839e6ddbafbf993f" + } + Frame { + msec: 1552 + hash: "abf3d90803cfa12d35d2752be7ea02d8" + } + Frame { + msec: 1568 + hash: "48a7dbed293fbbd5ea202190837a411f" + } + Frame { + msec: 1584 + hash: "2f06ee407e5175d4b954e31c39c9522c" + } + Frame { + msec: 1600 + hash: "5784deb0f3270cf7a0d0964cd9d31458" + } + Frame { + msec: 1616 + hash: "809870dfd9b05ce07170edd945348ddf" + } + Frame { + msec: 1632 + hash: "08bc6815601417f3731eaae398d0861d" + } + Frame { + msec: 1648 + hash: "ace9db9112d147569dc0cf1a1b680d6c" + } + Frame { + msec: 1664 + hash: "14d08c2ca430631af8ede1013f4f4da0" + } + Frame { + msec: 1680 + hash: "1475ae722afd169cc0c8e1fde39eb6b7" + } + Frame { + msec: 1696 + hash: "58cfba3aae4bf54a5b445e0e34571d2d" + } + Frame { + msec: 1712 + hash: "a6916da6bfac27aa87d75da2bbb73f31" + } + Frame { + msec: 1728 + hash: "87636076959de7e5a0a8bd8b31354ed4" + } + Frame { + msec: 1744 + hash: "16e2b66f28ed80d80d9b5264d89624d5" + } + Frame { + msec: 1760 + hash: "d3689b53474b4b26630d70ba01c057b4" + } + Frame { + msec: 1776 + hash: "11436091b24c02af94dfa75a5fd1a001" + } + Frame { + msec: 1792 + hash: "524840a3453af4e97ac82b559308cce3" + } + Frame { + msec: 1808 + hash: "6712be93cf1ed2b7b202367418b6d2d7" + } + Frame { + msec: 1824 + hash: "7dc26fd658f626b8fe18545cf93dc4ec" + } + Frame { + msec: 1840 + hash: "8a64b18006ad0bd2c373a2a9395ce52e" + } + Frame { + msec: 1856 + hash: "32d0e9005ebb9dfd410d348e336bcd93" + } + Frame { + msec: 1872 + hash: "98dbd004cf4809dbc90bfa9272378644" + } + Frame { + msec: 1888 + hash: "0b43fdee23346c30c60b822a20131cc3" + } + Frame { + msec: 1904 + hash: "0696257de0441666bd264f8db6383d15" + } + Frame { + msec: 1920 + image: "zoomTextOnly.1.png" + } + Frame { + msec: 1936 + hash: "0ae4ee18cc675749f008b897fe35cc40" + } + Frame { + msec: 1952 + hash: "0ae4ee18cc675749f008b897fe35cc40" + } + Frame { + msec: 1968 + hash: "7df07aea83bc5c3213e7871854661820" + } + Frame { + msec: 1984 + hash: "4fc1ef611b24ec5737310859b12c83d3" + } + Frame { + msec: 2000 + hash: "c2f8551d0442d0736b71c54fc965562b" + } + Frame { + msec: 2016 + hash: "4ec29787e437f9619ce0f0a0f4889d0f" + } + Frame { + msec: 2032 + hash: "c2f8551d0442d0736b71c54fc965562b" + } + Frame { + msec: 2048 + hash: "4fc1ef611b24ec5737310859b12c83d3" + } + Frame { + msec: 2064 + hash: "7df07aea83bc5c3213e7871854661820" + } + Frame { + msec: 2080 + hash: "0ae4ee18cc675749f008b897fe35cc40" + } + Frame { + msec: 2096 + hash: "0ae4ee18cc675749f008b897fe35cc40" + } + Frame { + msec: 2112 + hash: "f5c917c7ca26bb916dd4df84eafc8e94" + } + Frame { + msec: 2128 + hash: "0696257de0441666bd264f8db6383d15" + } + Frame { + msec: 2144 + hash: "0b43fdee23346c30c60b822a20131cc3" + } + Frame { + msec: 2160 + hash: "98dbd004cf4809dbc90bfa9272378644" + } + Frame { + msec: 2176 + hash: "32d0e9005ebb9dfd410d348e336bcd93" + } + Frame { + msec: 2192 + hash: "8a64b18006ad0bd2c373a2a9395ce52e" + } + Frame { + msec: 2208 + hash: "7dc26fd658f626b8fe18545cf93dc4ec" + } + Frame { + msec: 2224 + hash: "6712be93cf1ed2b7b202367418b6d2d7" + } + Frame { + msec: 2240 + hash: "524840a3453af4e97ac82b559308cce3" + } + Frame { + msec: 2256 + hash: "11436091b24c02af94dfa75a5fd1a001" + } + Frame { + msec: 2272 + hash: "d3689b53474b4b26630d70ba01c057b4" + } + Frame { + msec: 2288 + hash: "16e2b66f28ed80d80d9b5264d89624d5" + } + Frame { + msec: 2304 + hash: "87636076959de7e5a0a8bd8b31354ed4" + } + Frame { + msec: 2320 + hash: "a6916da6bfac27aa87d75da2bbb73f31" + } + Frame { + msec: 2336 + hash: "58cfba3aae4bf54a5b445e0e34571d2d" + } + Frame { + msec: 2352 + hash: "1475ae722afd169cc0c8e1fde39eb6b7" + } + Frame { + msec: 2368 + hash: "14d08c2ca430631af8ede1013f4f4da0" + } + Frame { + msec: 2384 + hash: "ace9db9112d147569dc0cf1a1b680d6c" + } + Frame { + msec: 2400 + hash: "08bc6815601417f3731eaae398d0861d" + } + Frame { + msec: 2416 + hash: "809870dfd9b05ce07170edd945348ddf" + } + Frame { + msec: 2432 + hash: "5784deb0f3270cf7a0d0964cd9d31458" + } + Frame { + msec: 2448 + hash: "2f06ee407e5175d4b954e31c39c9522c" + } + Frame { + msec: 2464 + hash: "48a7dbed293fbbd5ea202190837a411f" + } + Frame { + msec: 2480 + hash: "abf3d90803cfa12d35d2752be7ea02d8" + } + Frame { + msec: 2496 + hash: "a60edcf8d792f93a839e6ddbafbf993f" + } + Frame { + msec: 2512 + hash: "7e8dfe86ea0849022355b12578d4cb1a" + } + Frame { + msec: 2528 + hash: "3c84122b0933ee870f178d39469e51e2" + } + Frame { + msec: 2544 + hash: "25f463e91febf5b6d8819fd5010bc1c2" + } + Frame { + msec: 2560 + hash: "d423a9bc912237d0f20b924849ba0cb1" + } + Frame { + msec: 2576 + hash: "5bd3cc309a5fce6183654975543250b2" + } + Frame { + msec: 2592 + hash: "4e401b5ebff6e442fa108e94a5dba668" + } +} diff --git a/tests/auto/declarative/visual/webview/zooming/pageWidth.qml b/tests/auto/declarative/visual/webview/zooming/pageWidth.qml new file mode 100644 index 0000000..86dd7d2 --- /dev/null +++ b/tests/auto/declarative/visual/webview/zooming/pageWidth.qml @@ -0,0 +1,9 @@ +import Qt 4.6 + +WebView { + width: 200 + height: 250 + url: "resolution.html" + webPageWidth: 400 + preferredWidth: 200 +} diff --git a/tests/auto/declarative/visual/webview/zooming/renderControl.qml b/tests/auto/declarative/visual/webview/zooming/renderControl.qml new file mode 100644 index 0000000..c2f2c02 --- /dev/null +++ b/tests/auto/declarative/visual/webview/zooming/renderControl.qml @@ -0,0 +1,21 @@ +import Qt 4.6 + +Rectangle { + width: 200 + height: 250 + clip: true + WebView { + id: webview + width: 400 + url: "renderControl.html" + x: SequentialAnimation { + running: true + repeat: true + NumberAnimation { from: 100; to: 0; duration: 200 } + PropertyAction { target: webview; property: "renderingEnabled"; value: false } + NumberAnimation { from: 0; to: -100; duration: 200 } + PropertyAction { target: webview; property: "renderingEnabled"; value: true } + NumberAnimation { from: -100; to: 100; duration: 400 } + } + } +} diff --git a/tests/auto/declarative/visual/webview/zooming/zoomTextOnly.html b/tests/auto/declarative/visual/webview/zooming/zoomTextOnly.html new file mode 100644 index 0000000..4997712 --- /dev/null +++ b/tests/auto/declarative/visual/webview/zooming/zoomTextOnly.html @@ -0,0 +1,7 @@ +<html> +<body> +<h1>Zoom Text Only</h1> +<p> +This test shows how zooming can be done just +on text, not images. +<img src="qtlogo.png"> diff --git a/tests/auto/declarative/visual/webview/zooming/zoomTextOnly.qml b/tests/auto/declarative/visual/webview/zooming/zoomTextOnly.qml new file mode 100644 index 0000000..55cd9bc --- /dev/null +++ b/tests/auto/declarative/visual/webview/zooming/zoomTextOnly.qml @@ -0,0 +1,15 @@ +import Qt 4.6 + +WebView { + width: 200 + height: 250 + url: "zoomTextOnly.html" + settings.zoomTextOnly: true + zoomFactor: + SequentialAnimation { + running: true + repeat: true + NumberAnimation { from: 2; to: 0.25; duration: 1000 } + NumberAnimation { from: 0.25; to: 2; duration: 1000 } + } +} diff --git a/tools/qmldebugger/creatorplugin/creatorplugin.pro b/tools/qmldebugger/creatorplugin/creatorplugin.pro index d191a37..ff7f3da 100644 --- a/tools/qmldebugger/creatorplugin/creatorplugin.pro +++ b/tools/qmldebugger/creatorplugin/creatorplugin.pro @@ -25,5 +25,6 @@ IDE_BUILD_TREE=$$(CREATOR_BUILD_DIR) include($$(CREATOR_SRC_DIR)/src/qtcreatorplugin.pri) include($$(CREATOR_SRC_DIR)/src/plugins/projectexplorer/projectexplorer.pri) include($$(CREATOR_SRC_DIR)/src/plugins/coreplugin/coreplugin.pri) +include($$(CREATOR_SRC_DIR)/src/plugins/texteditor/texteditor.pri) LIBS += -L$$(CREATOR_BUILD_DIR)/lib/qtcreator diff --git a/tools/qmldebugger/creatorplugin/qmlinspectormode.cpp b/tools/qmldebugger/creatorplugin/qmlinspectormode.cpp index a1ca2fc..ce8ef30 100644 --- a/tools/qmldebugger/creatorplugin/qmlinspectormode.cpp +++ b/tools/qmldebugger/creatorplugin/qmlinspectormode.cpp @@ -65,6 +65,8 @@ #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/actionmanager/actionmanager.h> +#include <texteditor/itexteditor.h> + #include <projectexplorer/runconfiguration.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorerconstants.h> @@ -435,8 +437,12 @@ void QmlInspectorMode::initWidgets() WatchTableHeaderView *header = new WatchTableHeaderView(m_watchTableModel); m_watchTableView->setHorizontalHeader(header); + connect(m_objectTreeWidget, SIGNAL(activated(QmlDebugObjectReference)), + this, SLOT(treeObjectActivated(QmlDebugObjectReference))); + connect(m_objectTreeWidget, SIGNAL(currentObjectChanged(QmlDebugObjectReference)), m_propertiesWidget, SLOT(reload(QmlDebugObjectReference))); + connect(m_objectTreeWidget, SIGNAL(expressionWatchRequested(QmlDebugObjectReference,QString)), m_watchTableModel, SLOT(expressionWatchRequested(QmlDebugObjectReference,QString))); @@ -536,6 +542,24 @@ void QmlInspectorMode::contextChanged() delete m_contextQuery; m_contextQuery = 0; } +void QmlInspectorMode::treeObjectActivated(const QmlDebugObjectReference &obj) +{ + QmlDebugFileReference source = obj.source(); + QString fileName = source.url().toLocalFile(); + + if (source.lineNumber() < 0 || !QFile::exists(fileName)) + return; + + Core::EditorManager *editorManager = Core::EditorManager::instance(); + TextEditor::ITextEditor *editor = qobject_cast<TextEditor::ITextEditor*>(editorManager->openEditor(fileName)); + if (editor) { + editorManager->ensureEditorManagerVisible(); + editorManager->addCurrentPositionToNavigationHistory(); + editor->gotoLine(source.lineNumber()); + editor->widget()->setFocus(); + } +} + QT_END_NAMESPACE #include "qmlinspectormode.moc" diff --git a/tools/qmldebugger/creatorplugin/qmlinspectormode.h b/tools/qmldebugger/creatorplugin/qmlinspectormode.h index 93c2e44..b4158f1 100644 --- a/tools/qmldebugger/creatorplugin/qmlinspectormode.h +++ b/tools/qmldebugger/creatorplugin/qmlinspectormode.h @@ -57,6 +57,7 @@ class QmlEngineDebug; class QmlDebugConnection; class QmlDebugEnginesQuery; class QmlDebugRootContextQuery; +class QmlDebugObjectReference; class ObjectTree; class WatchTableModel; class WatchTableView; @@ -92,6 +93,7 @@ private slots: void enginesChanged(); void queryEngineContext(int); void contextChanged(); + void treeObjectActivated(const QmlDebugObjectReference &obj); private: struct Actions { diff --git a/tools/qmldebugger/standalone/canvasframerate.cpp b/tools/qmldebugger/standalone/canvasframerate.cpp index 408e8d0..d956029 100644 --- a/tools/qmldebugger/standalone/canvasframerate.cpp +++ b/tools/qmldebugger/standalone/canvasframerate.cpp @@ -38,23 +38,29 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#include "canvasframerate.h" -#include <QtGui/qwidget.h> -#include <QtGui/qpainter.h> -#include <QtGui/qscrollbar.h> -#include <private/qmldebugclient_p.h> #include <QtCore/qdebug.h> #include <QtCore/qstringlist.h> #include <QtCore/qdatastream.h> +#include <QtCore/qmargins.h> + +#include <QtGui/qapplication.h> +#include <QtGui/qpainter.h> +#include <QtGui/qtooltip.h> +#include <QtGui/qslider.h> +#include <QtGui/qscrollbar.h> +#include <QtGui/qspinbox.h> +#include <QtGui/qgroupbox.h> #include <QtGui/qboxlayout.h> +#include <QtGui/qlabel.h> +#include <QtGui/qlineedit.h> +#include <QtGui/qpushbutton.h> +#include <QtGui/qtabwidget.h> + #include <QResizeEvent> #include <QShowEvent> -#include <QTabWidget> -#include <QPushButton> -#include <QLineEdit> -#include <QCheckBox> -#include <QSpinBox> -#include <QLabel> + +#include <private/qmldebugclient_p.h> +#include "canvasframerate.h" QT_BEGIN_NAMESPACE @@ -62,75 +68,103 @@ class QLineGraph : public QWidget { Q_OBJECT public: - QLineGraph(QWidget * = 0); + QLineGraph(QAbstractSlider *slider, QWidget * = 0); void setPosition(int); public slots: void addSample(int, int, int, bool); void setResolutionForHeight(int); + void clear(); protected: virtual void paintEvent(QPaintEvent *); + virtual void mouseMoveEvent(QMouseEvent *); + virtual void leaveEvent(QEvent *); + virtual void wheelEvent(QWheelEvent *event); private slots: - void scrollbarChanged(int); + void sliderChanged(int); private: - void updateScrollbar(); - void drawSample(QPainter *, int, const QRect &); + void updateSlider(); + void drawSample(QPainter *, int, const QRect &, QList<QRect> *); void drawTime(QPainter *, const QRect &); + QRect findContainingRect(const QList<QRect> &rects, const QPoint &pos) const; struct Sample { int sample[3]; bool isBreak; }; QList<Sample> _samples; - QScrollBar sb; + QAbstractSlider *slider; int position; int samplesPerWidth; int resolutionForHeight; bool ignoreScroll; + QMargins graphMargins; + + QList<QRect> rectsPaintTime; // time to do a paintEvent() + QList<QRect> rectsTimeBetween; // time between frames + QRect highlightedBar; }; -QLineGraph::QLineGraph(QWidget *parent) -: QWidget(parent), sb(Qt::Horizontal, this), position(-1), samplesPerWidth(99), resolutionForHeight(50), ignoreScroll(false) +QLineGraph::QLineGraph(QAbstractSlider *slider, QWidget *parent) +: QWidget(parent), slider(slider), position(-1), samplesPerWidth(99), resolutionForHeight(50), + ignoreScroll(false), graphMargins(65, 10, 71, 35) { - setMinimumHeight(200); - - sb.setMaximum(0); - sb.setMinimum(0); - sb.setSingleStep(1); + setMouseTracking(true); - QVBoxLayout *layout = new QVBoxLayout; - setLayout(layout); - layout->addStretch(2); - layout->addWidget(&sb); - QObject::connect(&sb, SIGNAL(valueChanged(int)), this, SLOT(scrollbarChanged(int))); + slider->setMaximum(0); + slider->setMinimum(0); + slider->setSingleStep(1); + + connect(slider, SIGNAL(valueChanged(int)), this, SLOT(sliderChanged(int))); } -void QLineGraph::scrollbarChanged(int v) +void QLineGraph::sliderChanged(int v) { if(ignoreScroll) return; - if (v == sb.maximum()) + if (v == slider->maximum()) position = -1; else position = v; + update(); + + // update highlightedRect + QPoint pos = mapFromGlobal(QCursor::pos()); + if (geometry().contains(pos)) { + QMouseEvent *me = new QMouseEvent(QEvent::MouseMove, pos, + Qt::NoButton, Qt::NoButton, Qt::NoModifier); + QApplication::postEvent(this, me); + } } -void QLineGraph::updateScrollbar() +void QLineGraph::clear() +{ + _samples.clear(); + rectsPaintTime.clear(); + rectsTimeBetween.clear(); + highlightedBar = QRect(); + position = -1; + + updateSlider(); + update(); +} + +void QLineGraph::updateSlider() { ignoreScroll = true; - sb.setMaximum(qMax(0, _samples.count() - samplesPerWidth - 1)); + slider->setMaximum(qMax(0, _samples.count() - samplesPerWidth - 1)); if(position == -1) { - sb.setValue(sb.maximum()); + slider->setValue(slider->maximum()); } else { - sb.setValue(position); - } + slider->setValue(position); + } ignoreScroll = false; } @@ -142,13 +176,13 @@ void QLineGraph::addSample(int a, int b, int d, bool isBreak) s.sample[1] = b; s.sample[2] = d; _samples << s; - updateScrollbar(); + updateSlider(); update(); } void QLineGraph::setPosition(int p) { - scrollbarChanged(p); + sliderChanged(p); } void QLineGraph::drawTime(QPainter *p, const QRect &rect) @@ -182,7 +216,7 @@ void QLineGraph::drawTime(QPainter *p, const QRect &rect) } -void QLineGraph::drawSample(QPainter *p, int s, const QRect &rect) +void QLineGraph::drawSample(QPainter *p, int s, const QRect &rect, QList<QRect> *record) { if(_samples.isEmpty()) return; @@ -205,8 +239,11 @@ void QLineGraph::drawSample(QPainter *p, int s, const QRect &rect) xEnd = rect.left() + scaleX * (ii - first); int yEnd = rect.bottom() - _samples.at(ii).sample[s] * scaleY; - if (!(s == 0 && _samples.at(ii).isBreak)) - p->drawRect(QRect(lastXEnd, yEnd, scaleX, _samples.at(ii).sample[s] * scaleY)); + if (!(s == 0 && _samples.at(ii).isBreak)) { + QRect bar(lastXEnd, yEnd, scaleX, _samples.at(ii).sample[s] * scaleY); + record->append(bar); + p->drawRect(bar); + } lastXEnd = xEnd; } @@ -218,16 +255,33 @@ void QLineGraph::paintEvent(QPaintEvent *) QPainter p(this); p.setRenderHint(QPainter::Antialiasing); - QRect r(50, 10, width() - 60, height() - 60); + QRect r(graphMargins.left(), graphMargins.top(), + width() - graphMargins.right(), height() - graphMargins.bottom()); + + p.save(); + p.rotate(-90); + p.translate(-r.height()/2 - r.width()/2 - graphMargins.right(), -r.height()/2); + p.drawText(r, Qt::AlignCenter, tr("Frame rate")); + p.restore(); + p.setBrush(QColor("lightsteelblue")); - drawSample(&p, 0, r); + rectsTimeBetween.clear(); + drawSample(&p, 0, r, &rectsTimeBetween); p.setBrush(QColor("pink")); - drawSample(&p, 1, r); + rectsPaintTime.clear(); + drawSample(&p, 1, r, &rectsPaintTime); + + if (!highlightedBar.isNull()) { + p.setBrush(Qt::darkGreen); + p.drawRect(highlightedBar); + } p.setBrush(Qt::NoBrush); p.drawRect(r); + slider->setGeometry(x() + r.x(), slider->y(), r.width(), slider->height()); + for(int ii = 0; ii <= resolutionForHeight; ++ii) { int y = 1 + r.bottom() - ii * r.height() / resolutionForHeight; @@ -243,15 +297,117 @@ void QLineGraph::paintEvent(QPaintEvent *) drawTime(&p, r); } +void QLineGraph::mouseMoveEvent(QMouseEvent *event) +{ + QPoint pos = event->pos(); + + QRect rect = findContainingRect(rectsPaintTime, pos); + if (rect.isNull()) + rect = findContainingRect(rectsTimeBetween, pos); + + if (!highlightedBar.isNull()) + update(highlightedBar.adjusted(-1, -1, 1, 1)); + highlightedBar = rect; + + if (!rect.isNull()) { + QRect graph(graphMargins.left(), graphMargins.top(), + width() - graphMargins.right(), height() - graphMargins.bottom()); + qreal scaleY = qreal(graph.height()) / resolutionForHeight; + QToolTip::showText(event->globalPos(), QString::number(qRound(rect.height() / scaleY)), this, rect); + update(rect.adjusted(-1, -1, 1, 1)); + } +} + +void QLineGraph::leaveEvent(QEvent *) +{ + if (!highlightedBar.isNull()) { + QRect bar = highlightedBar.adjusted(-1, -1, 1, 1); + highlightedBar = QRect(); + update(bar); + } +} + +void QLineGraph::wheelEvent(QWheelEvent *event) +{ + QWheelEvent we(QPoint(0,0), event->delta(), event->buttons(), event->modifiers(), event->orientation()); + QApplication::sendEvent(slider, &we); +} + void QLineGraph::setResolutionForHeight(int resolution) { resolutionForHeight = resolution; update(); } +QRect QLineGraph::findContainingRect(const QList<QRect> &rects, const QPoint &pos) const +{ + for (int i=0; i<rects.count(); i++) { + if (rects[i].contains(pos)) + return rects[i]; + } + return QRect(); +} + + +class GraphWindow : public QWidget +{ + Q_OBJECT +public: + GraphWindow(QWidget *parent = 0); + + virtual QSize sizeHint() const; + +public slots: + void addSample(int, int, int, bool); + void setResolutionForHeight(int); + void clear(); + +private: + QLineGraph *m_graph; +}; + +GraphWindow::GraphWindow(QWidget *parent) + : QWidget(parent) +{ + QSlider *scroll = new QSlider(Qt::Horizontal); + scroll->setFocusPolicy(Qt::WheelFocus); + m_graph = new QLineGraph(scroll); + + setFocusPolicy(Qt::WheelFocus); + setFocusProxy(scroll); + + QVBoxLayout *layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 5, 0); + layout->setSpacing(0); + layout->addWidget(m_graph, 2); + layout->addWidget(new QLabel(tr("Total time elapsed (ms)")), 0, Qt::AlignHCenter); + layout->addWidget(scroll); +} + +void GraphWindow::addSample(int a, int b, int d, bool isBreak) +{ + m_graph->addSample(a, b, d, isBreak); +} + +void GraphWindow::setResolutionForHeight(int res) +{ + m_graph->setResolutionForHeight(res); +} + +void GraphWindow::clear() +{ + m_graph->clear(); +} + +QSize GraphWindow::sizeHint() const +{ + return QSize(400, 220); +} + + class CanvasFrameRatePlugin : public QmlDebugClient { -Q_OBJECT + Q_OBJECT public: CanvasFrameRatePlugin(QmlDebugConnection *client); @@ -290,38 +446,46 @@ CanvasFrameRate::CanvasFrameRate(QWidget *parent) : QWidget(parent), m_plugin(0) { - QVBoxLayout *layout = new QVBoxLayout; - layout->setContentsMargins(0,0,0,0); - layout->setSpacing(0); - setLayout(layout); - m_tabs = new QTabWidget(this); - layout->addWidget(m_tabs); QHBoxLayout *bottom = new QHBoxLayout; - bottom->setContentsMargins(5, 0, 5, 0); + bottom->setMargin(0); bottom->setSpacing(10); - layout->addLayout(bottom); - - QLabel *label = new QLabel("Resolution", this); - bottom->addWidget(label); - m_spin = new QSpinBox(this); - m_spin->setRange(50,200); - m_spin->setValue(50); - m_spin->setSuffix("ms"); - bottom->addWidget(m_spin); + m_res = new QSpinBox; + m_res->setRange(30, 200); + m_res->setValue(m_res->minimum()); + m_res->setSingleStep(10); + m_res->setSuffix(QLatin1String("ms")); + bottom->addWidget(new QLabel(tr("Resolution:"))); + bottom->addWidget(m_res); - bottom->addStretch(2); + bottom->addStretch(); - m_enabledCheckBox = new QCheckBox("Enable", this); - bottom->addWidget(m_enabledCheckBox); - QObject::connect(m_enabledCheckBox, SIGNAL(stateChanged(int)), - this, SLOT(enabledStateChanged(int))); + m_clearButton = new QPushButton(tr("Clear")); + connect(m_clearButton, SIGNAL(clicked()), SLOT(clearGraph())); + bottom->addWidget(m_clearButton); - QPushButton *pb = new QPushButton(tr("New Tab"), this); - QObject::connect(pb, SIGNAL(clicked()), this, SLOT(newTab())); + QPushButton *pb = new QPushButton(tr("New Graph"), this); + connect(pb, SIGNAL(clicked()), this, SLOT(newTab())); bottom->addWidget(pb); + + m_group = new QGroupBox(tr("Enabled")); + m_group->setCheckable(true); + m_group->setChecked(false); + connect(m_group, SIGNAL(toggled(bool)), SLOT(enabledToggled(bool))); + + QVBoxLayout *groupLayout = new QVBoxLayout(m_group); + groupLayout->setContentsMargins(5, 0, 5, 0); + groupLayout->setSpacing(2); + groupLayout->addWidget(m_tabs); + groupLayout->addLayout(bottom); + + QVBoxLayout *layout = new QVBoxLayout; + layout->setContentsMargins(0, 10, 0, 0); + layout->setSpacing(0); + layout->addWidget(m_group); + setLayout(layout); } void CanvasFrameRate::reset(QmlDebugConnection *conn) @@ -358,7 +522,7 @@ void CanvasFrameRate::handleConnected(QmlDebugConnection *conn) { delete m_plugin; m_plugin = new CanvasFrameRatePlugin(conn); - enabledStateChanged(m_enabledCheckBox->checkState()); + enabledToggled(m_group->isChecked()); newTab(); } @@ -372,6 +536,15 @@ QSize CanvasFrameRate::sizeHint() const return m_sizeHint; } +void CanvasFrameRate::clearGraph() +{ + if (m_tabs->count()) { + GraphWindow *w = qobject_cast<GraphWindow*>(m_tabs->currentWidget()); + if (w) + w->clear(); + } +} + void CanvasFrameRate::newTab() { if (!m_plugin) @@ -383,22 +556,22 @@ void CanvasFrameRate::newTab() w, SLOT(addSample(int,int,int,bool))); } - int id = m_tabs->count(); + int count = m_tabs->count(); - QLineGraph *graph = new QLineGraph(this); - QObject::connect(m_plugin, SIGNAL(sample(int,int,int,bool)), - graph, SLOT(addSample(int,int,int,bool))); - QObject::connect(m_spin, SIGNAL(valueChanged(int)), graph, SLOT(setResolutionForHeight(int))); + GraphWindow *graph = new GraphWindow; + graph->setResolutionForHeight(m_res->value()); + connect(m_plugin, SIGNAL(sample(int,int,int,bool)), + graph, SLOT(addSample(int,int,int,bool))); + connect(m_res, SIGNAL(valueChanged(int)), + graph, SLOT(setResolutionForHeight(int))); - QString name = QLatin1String("Graph ") + QString::number(id); + QString name = QLatin1String("Graph ") + QString::number(count + 1); m_tabs->addTab(graph, name); - m_tabs->setCurrentIndex(id); + m_tabs->setCurrentIndex(count); } -void CanvasFrameRate::enabledStateChanged(int s) +void CanvasFrameRate::enabledToggled(bool checked) { - bool checked = s != 0; - if (m_plugin) static_cast<QmlDebugClient *>(m_plugin)->setEnabled(checked); } diff --git a/tools/qmldebugger/standalone/canvasframerate.h b/tools/qmldebugger/standalone/canvasframerate.h index be6bbc6..f8eec59 100644 --- a/tools/qmldebugger/standalone/canvasframerate.h +++ b/tools/qmldebugger/standalone/canvasframerate.h @@ -49,8 +49,11 @@ QT_BEGIN_NAMESPACE class QTabWidget; +class QSlider; +class QGroupBox; +class QLabel; class QSpinBox; -class QCheckBox; +class QPushButton; class CanvasFrameRatePlugin; @@ -66,18 +69,20 @@ public: virtual QSize sizeHint() const; private slots: + void clearGraph(); void newTab(); - void enabledStateChanged(int); + void enabledToggled(bool); void connectionStateChanged(QAbstractSocket::SocketState state); private: void handleConnected(QmlDebugConnection *conn); + QGroupBox *m_group; QTabWidget *m_tabs; - QSpinBox *m_spin; + QSpinBox *m_res; + QPushButton *m_clearButton; CanvasFrameRatePlugin *m_plugin; QSize m_sizeHint; - QCheckBox *m_enabledCheckBox; }; QT_END_NAMESPACE diff --git a/tools/qmldebugger/standalone/main.cpp b/tools/qmldebugger/standalone/main.cpp index 2f2a30e..715837e 100644 --- a/tools/qmldebugger/standalone/main.cpp +++ b/tools/qmldebugger/standalone/main.cpp @@ -45,6 +45,9 @@ int main(int argc, char ** argv) { QApplication app(argc, argv); + app.setApplicationName("QtQmlDebugger"); + app.setOrganizationName("Nokia"); + app.setOrganizationDomain("nokia.com"); QStringList args = app.arguments(); diff --git a/tools/qmldebugger/standalone/objecttree.cpp b/tools/qmldebugger/standalone/objecttree.cpp index b06d377..4dbc1a7 100644 --- a/tools/qmldebugger/standalone/objecttree.cpp +++ b/tools/qmldebugger/standalone/objecttree.cpp @@ -59,9 +59,12 @@ ObjectTree::ObjectTree(QmlEngineDebug *client, QWidget *parent) { setHeaderHidden(true); setMinimumWidth(250); + setExpandsOnDoubleClick(false); connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), - this, SLOT(currentItemChanged(QTreeWidgetItem *))); + SLOT(currentItemChanged(QTreeWidgetItem *))); + connect(this, SIGNAL(itemActivated(QTreeWidgetItem *, int)), + SLOT(activated(QTreeWidgetItem *))); } void ObjectTree::setEngineDebug(QmlEngineDebug *client) @@ -113,11 +116,18 @@ void ObjectTree::currentItemChanged(QTreeWidgetItem *item) return; QmlDebugObjectReference obj = item->data(0, Qt::UserRole).value<QmlDebugObjectReference>(); - if (obj.debugId() < 0) { - qWarning("QML Object Tree: bad object id"); + if (obj.debugId() >= 0) + emit currentObjectChanged(obj); +} + +void ObjectTree::activated(QTreeWidgetItem *item) +{ + if (!item) return; - } - emit currentObjectChanged(obj); + + QmlDebugObjectReference obj = item->data(0, Qt::UserRole).value<QmlDebugObjectReference>(); + if (obj.debugId() >= 0) + emit activated(obj); } void ObjectTree::buildTree(const QmlDebugObjectReference &obj, QTreeWidgetItem *parent) diff --git a/tools/qmldebugger/standalone/objecttree.h b/tools/qmldebugger/standalone/objecttree.h index f7b3a3f..c8d625c 100644 --- a/tools/qmldebugger/standalone/objecttree.h +++ b/tools/qmldebugger/standalone/objecttree.h @@ -64,6 +64,7 @@ public: signals: void currentObjectChanged(const QmlDebugObjectReference &); + void activated(const QmlDebugObjectReference &); void expressionWatchRequested(const QmlDebugObjectReference &, const QString &); public slots: @@ -76,6 +77,7 @@ protected: private slots: void objectFetched(); void currentItemChanged(QTreeWidgetItem *); + void activated(QTreeWidgetItem *); private: QTreeWidgetItem *findItemByObjectId(int debugId) const; diff --git a/tools/qmldebugger/standalone/qmldebugger.cpp b/tools/qmldebugger/standalone/qmldebugger.cpp index afcf84c..4d86377 100644 --- a/tools/qmldebugger/standalone/qmldebugger.cpp +++ b/tools/qmldebugger/standalone/qmldebugger.cpp @@ -40,12 +40,14 @@ ****************************************************************************/ #include <QtCore/qtimer.h> #include <QtCore/qdebug.h> -#include <QVBoxLayout> -#include <QPushButton> -#include <QLineEdit> -#include <QTabWidget> -#include <QSpinBox> -#include <QLabel> +#include <QtCore/qsettings.h> + +#include <QtGui/qlayout.h> +#include <QtGui/qpushbutton.h> +#include <QtGui/qlineedit.h> +#include <QtGui/qtabwidget.h> +#include <QtGui/qspinbox.h> +#include <QtGui/qlabel.h> #include "canvasframerate.h" #include "engine.h" @@ -64,12 +66,10 @@ QmlDebugger::QmlDebugger(QWidget *parent) m_connectionState = new QLabel(this); connectLayout->addWidget(m_connectionState); m_host = new QLineEdit(this); - m_host->setText("127.0.0.1"); connectLayout->addWidget(m_host); m_port = new QSpinBox(this); m_port->setMinimum(1024); m_port->setMaximum(20000); - m_port->setValue(3768); connectLayout->addWidget(m_port); m_connectButton = new QPushButton(tr("Connect"), this); QObject::connect(m_connectButton, SIGNAL(clicked()), @@ -99,7 +99,9 @@ QmlDebugger::QmlDebugger(QWidget *parent) QObject::connect(&client, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(connectionError(QAbstractSocket::SocketError))); - m_tabs->setCurrentIndex(1); + QSettings settings; + m_host->setText(settings.value("Host", "127.0.0.1").toString()); + m_port->setValue(settings.value("Port", 3768).toInt()); connectToHost(); } @@ -119,6 +121,15 @@ void QmlDebugger::showEngineTab() m_tabs->setCurrentWidget(m_enginePane); } +void QmlDebugger::closeEvent(QCloseEvent *event) +{ + QSettings settings; + settings.setValue("Host", m_host->text()); + settings.setValue("Port", m_port->value()); + + QWidget::closeEvent(event); +} + void QmlDebugger::connectionStateChanged() { switch (client.state()) { diff --git a/tools/qmldebugger/standalone/qmldebugger.h b/tools/qmldebugger/standalone/qmldebugger.h index 7bacce7..da95ef9 100644 --- a/tools/qmldebugger/standalone/qmldebugger.h +++ b/tools/qmldebugger/standalone/qmldebugger.h @@ -67,6 +67,9 @@ public slots: void connectToHost(); void disconnectFromHost(); +protected: + void closeEvent(QCloseEvent *); + private slots: void connectionStateChanged(); void connectionError(QAbstractSocket::SocketError socketError); |